Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
125 lines
4.4 KiB
Nix
125 lines
4.4 KiB
Nix
{
|
|
lib,
|
|
stdenv,
|
|
fetchFromGitHub,
|
|
autoreconfHook,
|
|
# doc: https://github.com/bdwgc/bdwgc/blob/v8.2.8/doc/README.macros (LARGE_CONFIG)
|
|
enableLargeConfig ? false,
|
|
enableMmap ? true,
|
|
enableStatic ? false,
|
|
# Allows derivation users to increase the initial mark stack size to avoid stack overflows,
|
|
# since these inhibit parallel marking (see `GC_mark_some()` in `mark.c`.)
|
|
#
|
|
# Run Nix with the `GC_PRINT_STATS=1` environment set to check if the mark stack is too small.
|
|
# Look for messages such as `Mark stack overflow`, `No room to copy back mark stack`, and
|
|
# `Grew mark stack to ... frames`.
|
|
#
|
|
# If this parameter is set to `null`, the default from upstream is used, which is 4096 as of 8.2.8
|
|
initialMarkStackSize ? null,
|
|
nixVersions,
|
|
}:
|
|
|
|
stdenv.mkDerivation (finalAttrs: {
|
|
pname = "boehm-gc";
|
|
version = "8.2.8";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "bdwgc";
|
|
repo = "bdwgc";
|
|
rev = "v${finalAttrs.version}";
|
|
hash = "sha256-UQSLK/05uPal6/m+HMz0QwXVII1leonlmtSZsXjJ+/c=";
|
|
};
|
|
|
|
outputs = [
|
|
"out"
|
|
"dev"
|
|
"doc"
|
|
];
|
|
separateDebugInfo = stdenv.hostPlatform.isLinux && stdenv.hostPlatform.libc != "musl";
|
|
|
|
__structuredAttrs = true;
|
|
|
|
nativeBuildInputs = [
|
|
autoreconfHook
|
|
];
|
|
|
|
configureFlags = [
|
|
"--enable-cplusplus"
|
|
"--with-libatomic-ops=none"
|
|
]
|
|
++ lib.optional enableStatic "--enable-static"
|
|
++ lib.optional enableMmap "--enable-mmap"
|
|
++ lib.optional enableLargeConfig "--enable-large-config";
|
|
|
|
makeFlags =
|
|
let
|
|
defineFlag = flag: "-D${flag}";
|
|
|
|
# This stanza can be dropped when a release fixes this issue:
|
|
# https://github.com/bdwgc/bdwgc/issues/376
|
|
# The version is checked with == instead of versionAtLeast so we
|
|
# don't forget to disable the fix (and if the next release does
|
|
# not fix the problem the test failure will be a reminder to
|
|
# extend the set of versions requiring the workaround).
|
|
noSoftVDB =
|
|
lib.optional (stdenv.hostPlatform.isPower64 && finalAttrs.version == "8.2.8")
|
|
# do not use /proc primitives to track dirty bits; see:
|
|
# https://github.com/bdwgc/bdwgc/issues/479#issuecomment-1279687537
|
|
# https://github.com/bdwgc/bdwgc/blob/54522af853de28f45195044dadfd795c4e5942aa/include/private/gcconfig.h#L741
|
|
"NO_SOFT_VDB";
|
|
|
|
initialMarkStackSizeFlag = lib.optionals (initialMarkStackSize != null) [
|
|
"INITIAL_MARK_STACK_SIZE=${toString initialMarkStackSize}"
|
|
];
|
|
|
|
cflagsExtra = noSoftVDB ++ initialMarkStackSizeFlag;
|
|
in
|
|
lib.optionals (cflagsExtra != [ ]) [
|
|
"CFLAGS_EXTRA=${lib.concatMapStringsSep " " defineFlag cflagsExtra}"
|
|
];
|
|
|
|
# OpenBSD patches lld (!!!!) to inject this symbol into every linker invocation.
|
|
# We are obviously not doing that.
|
|
postConfigure = lib.optionalString stdenv.hostPlatform.isOpenBSD ''
|
|
echo >$TMP/openbsd.ldscript "__data_start = ADDR(.data);"
|
|
export NIX_LDFLAGS="$NIX_LDFLAGS -T $TMP/openbsd.ldscript"
|
|
'';
|
|
|
|
# `gctest` fails under x86_64 emulation on aarch64-darwin
|
|
# and also on aarch64-linux (qemu-user)
|
|
doCheck =
|
|
!(
|
|
(stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64)
|
|
|| (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64)
|
|
);
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
passthru.tests = nixVersions;
|
|
|
|
meta = {
|
|
homepage = "https://hboehm.info/gc/";
|
|
description = "Boehm-Demers-Weiser conservative garbage collector for C and C++";
|
|
longDescription = ''
|
|
The Boehm-Demers-Weiser conservative garbage collector can be used as a
|
|
garbage collecting replacement for C malloc or C++ new. It allows you
|
|
to allocate memory basically as you normally would, without explicitly
|
|
deallocating memory that is no longer useful. The collector
|
|
automatically recycles memory when it determines that it can no longer
|
|
be otherwise accessed.
|
|
|
|
The collector is also used by a number of programming language
|
|
implementations that either use C as intermediate code, want to
|
|
facilitate easier interoperation with C libraries, or just prefer the
|
|
simple collector interface.
|
|
|
|
Alternatively, the garbage collector may be used as a leak detector for
|
|
C or C++ programs, though that is not its primary goal.
|
|
'';
|
|
changelog = "https://github.com/bdwgc/bdwgc/blob/v${finalAttrs.version}/ChangeLog";
|
|
license = lib.licenses.boehmGC;
|
|
maintainers = [ ];
|
|
platforms = lib.platforms.all;
|
|
};
|
|
})
|