about summary refs log tree commit diff
path: root/pkgs/by-name/cc
diff options
context:
space:
mode:
authorEmery Hemingway <ehmry@posteo.net>2024-02-09 12:00:40 +0000
committerEmery Hemingway <ehmry@posteo.net>2024-02-09 12:00:40 +0000
commit1bbad171d047923009063a517e52e0075c0566ed (patch)
tree7e971e5ca2856b0a0c3054283a3130bb7c69b6b0 /pkgs/by-name/cc
parentfe0309c1425729e6985fc120d497743084647137 (diff)
ccache: move to pkgs/by-name
Diffstat (limited to 'pkgs/by-name/cc')
-rw-r--r--pkgs/by-name/cc/ccache/fix-objdump-path.patch29
-rw-r--r--pkgs/by-name/cc/ccache/package.nix142
2 files changed, 171 insertions, 0 deletions
diff --git a/pkgs/by-name/cc/ccache/fix-objdump-path.patch b/pkgs/by-name/cc/ccache/fix-objdump-path.patch
new file mode 100644
index 0000000000000..04c431aafb740
--- /dev/null
+++ b/pkgs/by-name/cc/ccache/fix-objdump-path.patch
@@ -0,0 +1,29 @@
+diff --git a/test/run b/test/run
+index 43a57312..398be8d8 100755
+--- a/test/run
++++ b/test/run
+@@ -148,21 +148,17 @@ file_size() {
+ objdump_cmd() {
+     local file="$1"
+ 
+-    if $HOST_OS_APPLE; then
+-        xcrun dwarfdump -r 0 "$file"
+-    elif $HOST_OS_WINDOWS || $HOST_OS_CYGWIN; then
++    if $HOST_OS_WINDOWS || $HOST_OS_CYGWIN; then
+         # For some reason objdump only shows the basename of the file, so fall
+         # back to brute force and ignorance.
+         strings "$1"
+     else
+-        objdump -W "$file"
++        @objdump@ -W "$file"
+     fi
+ }
+ 
+ objdump_grep_cmd() {
+-    if $HOST_OS_APPLE; then
+-        grep -Fq "\"$1\""
+-    elif $HOST_OS_WINDOWS || $HOST_OS_CYGWIN; then
++    if $HOST_OS_WINDOWS || $HOST_OS_CYGWIN; then
+         grep -Fq "$1"
+     else
+         grep -Fq ": $1"
diff --git a/pkgs/by-name/cc/ccache/package.nix b/pkgs/by-name/cc/ccache/package.nix
new file mode 100644
index 0000000000000..fe6e49dfad0ea
--- /dev/null
+++ b/pkgs/by-name/cc/ccache/package.nix
@@ -0,0 +1,142 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, substituteAll
+, binutils
+, asciidoctor
+, cmake
+, perl
+, zstd
+, bashInteractive
+, xcodebuild
+, makeWrapper
+, nix-update-script
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "ccache";
+  version = "4.9";
+
+  src = fetchFromGitHub {
+    owner = "ccache";
+    repo = "ccache";
+    rev = "refs/tags/v${finalAttrs.version}";
+    sha256 = "sha256-/R9ReX1l3okUuVD93IdomoaBTYdKvuIuggyk0sJoYmg=";
+  };
+
+  outputs = [ "out" "man" ];
+
+  patches = [
+    # When building for Darwin, test/run uses dwarfdump, whereas on
+    # Linux it uses objdump. We don't have dwarfdump packaged for
+    # Darwin, so this patch updates the test to also use objdump on
+    # Darwin.
+    # Additionally, when cross compiling, the correct target prefix
+    # needs to be set.
+    (substituteAll {
+      src = ./fix-objdump-path.patch;
+      objdump = "${binutils.bintools}/bin/${binutils.targetPrefix}objdump";
+    })
+  ];
+
+  nativeBuildInputs = [ asciidoctor cmake perl ];
+  buildInputs = [ zstd ];
+
+  cmakeFlags = [
+    # Build system does not autodetect redis library presence.
+    # Requires explicit flag.
+    "-DREDIS_STORAGE_BACKEND=OFF"
+  ];
+
+  doCheck = true;
+  nativeCheckInputs = [
+    # test/run requires the compgen function which is available in
+    # bashInteractive, but not bash.
+    bashInteractive
+  ] ++ lib.optional stdenv.isDarwin xcodebuild;
+
+  checkPhase =
+    let
+      badTests = [
+        "test.trim_dir" # flaky on hydra (possibly filesystem-specific?)
+      ] ++ lib.optionals stdenv.isDarwin [
+        "test.basedir"
+        "test.fileclone" # flaky on hydra (possibly filesystem-specific?)
+        "test.multi_arch"
+        "test.nocpp2"
+      ];
+    in
+    ''
+      runHook preCheck
+      export HOME=$(mktemp -d)
+      ctest --output-on-failure -E '^(${lib.concatStringsSep "|" badTests})$'
+      runHook postCheck
+    '';
+
+  passthru = {
+    # A derivation that provides gcc and g++ commands, but that
+    # will end up calling ccache for the given cacheDir
+    links = { unwrappedCC, extraConfig }: stdenv.mkDerivation {
+      pname = "ccache-links";
+      inherit (finalAttrs) version;
+      passthru = {
+        isClang = unwrappedCC.isClang or false;
+        isGNU = unwrappedCC.isGNU or false;
+        isCcache = true;
+      };
+      inherit (unwrappedCC) lib;
+      nativeBuildInputs = [ makeWrapper ];
+      # Unwrapped clang does not have a targetPrefix because it is multi-target
+      # target is decided with argv0.
+      buildCommand = let
+        targetPrefix = if unwrappedCC.isClang or false
+          then
+            ""
+          else
+            (lib.optionalString (unwrappedCC ? targetConfig && unwrappedCC.targetConfig != null && unwrappedCC.targetConfig != "") "${unwrappedCC.targetConfig}-");
+      in ''
+        mkdir -p $out/bin
+
+        wrap() {
+          local cname="${targetPrefix}$1"
+          if [ -x "${unwrappedCC}/bin/$cname" ]; then
+            makeWrapper ${finalAttrs.finalPackage}/bin/ccache $out/bin/$cname \
+              --run ${lib.escapeShellArg extraConfig} \
+              --add-flags ${unwrappedCC}/bin/$cname
+          fi
+        }
+
+        wrap cc
+        wrap c++
+        wrap gcc
+        wrap g++
+        wrap clang
+        wrap clang++
+
+        for executable in $(ls ${unwrappedCC}/bin); do
+          if [ ! -x "$out/bin/$executable" ]; then
+            ln -s ${unwrappedCC}/bin/$executable $out/bin/$executable
+          fi
+        done
+        for file in $(ls ${unwrappedCC} | grep -vw bin); do
+          ln -s ${unwrappedCC}/$file $out/$file
+        done
+      '';
+    };
+
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    description = "Compiler cache for fast recompilation of C/C++ code";
+    homepage = "https://ccache.dev";
+    downloadPage = "https://ccache.dev/download.html";
+    changelog = "https://ccache.dev/releasenotes.html#_ccache_${
+      builtins.replaceStrings [ "." ] [ "_" ] finalAttrs.version
+    }";
+    license = licenses.gpl3Plus;
+    mainProgram = "ccache";
+    maintainers = with maintainers; [ kira-bruneau r-burns ];
+    platforms = platforms.unix;
+  };
+})