chromium,chromedriver: 129.0.6668.91 -> 129.0.6668.100
[NixPkgs.git] / pkgs / by-name / cc / ccache / package.nix
blobc30543cdbdd1888b673e0bb2e2c217c23682064d
2   lib,
3   stdenv,
4   fetchFromGitHub,
5   substituteAll,
6   binutils,
7   asciidoctor,
8   cmake,
9   perl,
10   fmt,
11   hiredis,
12   xxHash,
13   zstd,
14   bashInteractive,
15   doctest,
16   xcodebuild,
17   makeWrapper,
18   nix-update-script,
21 stdenv.mkDerivation (finalAttrs: {
22   pname = "ccache";
23   version = "4.10.2";
25   src = fetchFromGitHub {
26     owner = "ccache";
27     repo = "ccache";
28     rev = "refs/tags/v${finalAttrs.version}";
29     # `git archive` replaces `$Format:%H %D$` in cmake/CcacheVersion.cmake
30     # we need to replace it with something reproducible
31     # see https://github.com/NixOS/nixpkgs/pull/316524
32     postFetch = ''
33       sed -i -E \
34         's/version_info "([0-9a-f]{40}) .*(tag: v[^,]+).*"/version_info "\1 \2"/g w match' \
35         $out/cmake/CcacheVersion.cmake
36       if [ -s match ]; then
37         rm match
38       else # pattern didn't match
39         exit 1
40       fi
41     '';
42     hash = "sha256-j7Cjr5R/fN/1C6hR9400Y/hwgG++qjPvo9PYyetzrx0=";
43   };
45   outputs = [
46     "out"
47     "man"
48   ];
50   patches = [
51     # When building for Darwin, test/run uses dwarfdump, whereas on
52     # Linux it uses objdump. We don't have dwarfdump packaged for
53     # Darwin, so this patch updates the test to also use objdump on
54     # Darwin.
55     # Additionally, when cross compiling, the correct target prefix
56     # needs to be set.
57     (substituteAll {
58       src = ./fix-objdump-path.patch;
59       objdump = "${binutils.bintools}/bin/${binutils.targetPrefix}objdump";
60     })
61   ];
63   strictDeps = true;
65   nativeBuildInputs = [
66     asciidoctor
67     cmake
68     perl
69   ];
71   buildInputs = [
72     fmt
73     hiredis
74     xxHash
75     zstd
76   ];
78   cmakeFlags = lib.optional (!finalAttrs.finalPackage.doCheck) "-DENABLE_TESTING=OFF";
80   doCheck = true;
82   nativeCheckInputs = [
83     # test/run requires the compgen function which is available in
84     # bashInteractive, but not bash.
85     bashInteractive
86   ] ++ lib.optional stdenv.hostPlatform.isDarwin xcodebuild;
88   checkInputs = [
89     doctest
90   ];
92   checkPhase =
93     let
94       badTests =
95         [
96           "test.trim_dir" # flaky on hydra (possibly filesystem-specific?)
97         ]
98         ++ lib.optionals stdenv.hostPlatform.isDarwin [
99           "test.basedir"
100           "test.fileclone" # flaky on hydra (possibly filesystem-specific?)
101           "test.multi_arch"
102           "test.nocpp2"
103         ];
104     in
105     ''
106       runHook preCheck
107       export HOME=$(mktemp -d)
108       ctest --output-on-failure -E '^(${lib.concatStringsSep "|" badTests})$'
109       runHook postCheck
110     '';
112   passthru = {
113     # A derivation that provides gcc and g++ commands, but that
114     # will end up calling ccache for the given cacheDir
115     links =
116       { unwrappedCC, extraConfig }:
117       stdenv.mkDerivation {
118         pname = "ccache-links";
119         inherit (finalAttrs) version;
120         passthru = {
121           isClang = unwrappedCC.isClang or false;
122           isGNU = unwrappedCC.isGNU or false;
123           isCcache = true;
124         };
125         inherit (unwrappedCC) lib;
126         nativeBuildInputs = [ makeWrapper ];
127         # Unwrapped clang does not have a targetPrefix because it is multi-target
128         # target is decided with argv0.
129         buildCommand =
130           let
131             targetPrefix =
132               if unwrappedCC.isClang or false then
133                 ""
134               else
135                 (lib.optionalString (
136                   unwrappedCC ? targetConfig && unwrappedCC.targetConfig != null && unwrappedCC.targetConfig != ""
137                 ) "${unwrappedCC.targetConfig}-");
138           in
139           ''
140             mkdir -p $out/bin
142             wrap() {
143               local cname="${targetPrefix}$1"
144               if [ -x "${unwrappedCC}/bin/$cname" ]; then
145                 makeWrapper ${finalAttrs.finalPackage}/bin/ccache $out/bin/$cname \
146                   --run ${lib.escapeShellArg extraConfig} \
147                   --add-flags ${unwrappedCC}/bin/$cname
148               fi
149             }
151             wrap cc
152             wrap c++
153             wrap gcc
154             wrap g++
155             wrap clang
156             wrap clang++
158             for executable in $(ls ${unwrappedCC}/bin); do
159               if [ ! -x "$out/bin/$executable" ]; then
160                 ln -s ${unwrappedCC}/bin/$executable $out/bin/$executable
161               fi
162             done
163             for file in $(ls ${unwrappedCC} | grep -vw bin); do
164               ln -s ${unwrappedCC}/$file $out/$file
165             done
166           '';
167       };
169     updateScript = nix-update-script { };
170   };
172   meta = with lib; {
173     description = "Compiler cache for fast recompilation of C/C++ code";
174     homepage = "https://ccache.dev";
175     downloadPage = "https://ccache.dev/download.html";
176     changelog = "https://ccache.dev/releasenotes.html#_ccache_${
177       builtins.replaceStrings [ "." ] [ "_" ] finalAttrs.version
178     }";
179     license = licenses.gpl3Plus;
180     maintainers = with maintainers; [
181       kira-bruneau
182       r-burns
183     ];
184     platforms = platforms.unix;
185     mainProgram = "ccache";
186   };