about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/build-managers/bear
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/tools/build-managers/bear')
-rw-r--r--nixpkgs/pkgs/development/tools/build-managers/bear/default.nix93
-rw-r--r--nixpkgs/pkgs/development/tools/build-managers/bear/fix-functional-tests.patch32
2 files changed, 125 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/build-managers/bear/default.nix b/nixpkgs/pkgs/development/tools/build-managers/bear/default.nix
new file mode 100644
index 000000000000..431f7b1773f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/build-managers/bear/default.nix
@@ -0,0 +1,93 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, ninja
+, pkg-config
+, grpc
+, protobuf
+, openssl
+, nlohmann_json
+, gtest
+, spdlog
+, c-ares
+, zlib
+, sqlite
+, re2
+, lit
+, python3
+, coreutils
+}:
+
+stdenv.mkDerivation rec {
+  pname = "bear";
+  version = "3.1.3";
+
+  src = fetchFromGitHub {
+    owner = "rizsotto";
+    repo = pname;
+    rev = version;
+    hash = "sha256-1nZPzgLWcmaRkOUXdm16IW2Nw/p1w8GBGEfZX/v+En0=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pkg-config
+
+    # Used for functional tests, which run during buildPhase.
+    lit
+    python3
+  ];
+
+  buildInputs = [
+    grpc
+    protobuf
+    openssl
+    nlohmann_json
+    gtest
+    spdlog
+    c-ares
+    zlib
+    sqlite
+    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 = [
+    # 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; {
+    description = "Tool that generates a compilation database for clang tooling";
+    longDescription = ''
+      Note: the bear command is very useful to generate compilation commands
+      e.g. for YouCompleteMe.  You just enter your development nix-shell
+      and run `bear make`.  It's not perfect, but it gets a long way.
+    '';
+    homepage = "https://github.com/rizsotto/Bear";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ babariviere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/tools/build-managers/bear/fix-functional-tests.patch b/nixpkgs/pkgs/development/tools/build-managers/bear/fix-functional-tests.patch
new file mode 100644
index 000000000000..99d64f26d077
--- /dev/null
+++ b/nixpkgs/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)