diff --git a/pkgs/development/tools/build-managers/bear/default.nix b/pkgs/development/tools/build-managers/bear/default.nix index 880184880db11ab..2789d3cefaffe71 100644 --- a/pkgs/development/tools/build-managers/bear/default.nix +++ b/pkgs/development/tools/build-managers/bear/default.nix @@ -2,6 +2,7 @@ , fetchFromGitHub , fetchpatch , cmake +, ninja , pkg-config , grpc , protobuf @@ -13,6 +14,9 @@ , zlib , sqlite , re2 +, lit +, python3 +, coreutils }: stdenv.mkDerivation rec { @@ -26,7 +30,15 @@ stdenv.mkDerivation rec { hash = "sha256-1nZPzgLWcmaRkOUXdm16IW2Nw/p1w8GBGEfZX/v+En0="; }; - nativeBuildInputs = [ cmake pkg-config ]; + nativeBuildInputs = [ + cmake + ninja + pkg-config + + # Used for functional tests, which run during buildPhase. + lit + python3 + ]; buildInputs = [ grpc @@ -41,13 +53,32 @@ stdenv.mkDerivation rec { re2 ]; + cmakeFlags = [ + # Build system and generated files concatenate install prefix and + # CMAKE_INSTALL_{BIN,LIB}DIR, which breaks if these are absolute paths. + "-DCMAKE_INSTALL_BINDIR=bin" + "-DCMAKE_INSTALL_LIBDIR=lib" + (lib.cmakeBool "ENABLE_UNIT_TESTS" false) + (lib.cmakeBool "ENABLE_FUNC_TESTS" false) + ]; + patches = [ - # Default libexec would be set to /nix/store/*-bear//nix/store/*-bear/libexec/... - ./no-double-relative.patch + # Fix toolchain environment variable handling and the Darwin SIP check. + ./fix-functional-tests.patch ]; + postPatch = '' + patchShebangs test/bin + + # /usr/bin/env is used in test commands and embedded scripts. + find test -name '*.sh' \ + -exec sed -ie 's|/usr/bin/env|${coreutils}/bin/env|g' {} + + ''; + + # Functional tests use loopback networking. + __darwinAllowLocalNetworking = true; + meta = with lib; { - broken = stdenv.isDarwin; description = "Tool that generates a compilation database for clang tooling"; longDescription = '' Note: the bear command is very useful to generate compilation commands diff --git a/pkgs/development/tools/build-managers/bear/fix-functional-tests.patch b/pkgs/development/tools/build-managers/bear/fix-functional-tests.patch new file mode 100644 index 000000000000000..99d64f26d077ebf --- /dev/null +++ b/pkgs/development/tools/build-managers/bear/fix-functional-tests.patch @@ -0,0 +1,32 @@ +diff --git a/test/lit.cfg b/test/lit.cfg +index 118c979..b69fecc 100644 +--- a/test/lit.cfg ++++ b/test/lit.cfg +@@ -207,13 +207,8 @@ def is_preload_disabled(): + if is_windows: + return True + elif sys.platform == 'darwin': +- command = ['csrutil', 'status'] +- pattern = re.compile(r'System Integrity Protection status:\s+enabled') +- try: +- output = subprocess.check_output(command, stderr=subprocess.STDOUT) +- return any(pattern.match(line) for line in output.decode('utf-8').splitlines()) +- except (OSError, subprocess.CalledProcessError): +- return False ++ # csrutil(8) isn't available in the Nix build sandbox. ++ return True + else: + return False + +@@ -221,6 +216,11 @@ def is_preload_disabled(): + if not is_preload_disabled(): + config.available_features.add('preload') + ++# Preserve the variables required for the Nix toolchain wrappers. ++for var, value in os.environ.items(): ++ if var.startswith('NIX_'): ++ config.environment[var] = value ++ + print(config.substitutions) + print(config.environment) + print(config.available_features) diff --git a/pkgs/development/tools/build-managers/bear/no-double-relative.patch b/pkgs/development/tools/build-managers/bear/no-double-relative.patch deleted file mode 100644 index e8087feb1afb2b8..000000000000000 --- a/pkgs/development/tools/build-managers/bear/no-double-relative.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/source/config.h.in b/source/config.h.in -index 6b659c2..f7bdf22 100644 ---- a/source/config.h.in -+++ b/source/config.h.in -@@ -108,8 +108,8 @@ namespace cmd { - } - - namespace wrapper { -- constexpr char DEFAULT_PATH[] = "@ROOT_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/bear/wrapper"; -- constexpr char DEFAULT_DIR_PATH[] = "@ROOT_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/bear/wrapper.d"; -+ constexpr char DEFAULT_PATH[] = "@CMAKE_INSTALL_LIBDIR@/bear/wrapper"; -+ constexpr char DEFAULT_DIR_PATH[] = "@CMAKE_INSTALL_LIBDIR@/bear/wrapper.d"; - - constexpr char FLAG_VERBOSE[] = "--verbose"; - constexpr char FLAG_DESTINATION[] = "--destination"; -@@ -134,9 +134,9 @@ namespace cmd { - // And use the `libexec.so` path default value with a single path, - // that matches both. (The match can be achieved by the $LIB token - // expansion from the dynamic loader. See `man ld.so` for more.) -- constexpr char DEFAULT_PATH[] = "@ROOT_INSTALL_PREFIX@/$LIB/bear/@CMAKE_SHARED_LIBRARY_PREFIX@exec@CMAKE_SHARED_LIBRARY_SUFFIX@"; -+ constexpr char DEFAULT_PATH[] = "$LIB/bear/@CMAKE_SHARED_LIBRARY_PREFIX@exec@CMAKE_SHARED_LIBRARY_SUFFIX@"; - #else -- constexpr char DEFAULT_PATH[] = "@ROOT_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/bear/@CMAKE_SHARED_LIBRARY_PREFIX@exec@CMAKE_SHARED_LIBRARY_SUFFIX@"; -+ constexpr char DEFAULT_PATH[] = "@CMAKE_INSTALL_LIBDIR@/bear/@CMAKE_SHARED_LIBRARY_PREFIX@exec@CMAKE_SHARED_LIBRARY_SUFFIX@"; - #endif - constexpr char KEY_REPORTER[] = "INTERCEPT_REPORT_COMMAND"; - constexpr char KEY_DESTINATION[] = "INTERCEPT_REPORT_DESTINATION";