summary refs log tree commit diff
path: root/pkgs/development/tools/misc/ccache
diff options
context:
space:
mode:
authorDmitry Kalinkin <dmitry.kalinkin@gmail.com>2016-09-18 14:54:12 -0400
committerDmitry Kalinkin <dmitry.kalinkin@gmail.com>2016-09-18 14:54:12 -0400
commit96d2a6c4348950eb29e26927cb08a45b415d484c (patch)
tree6cd6df77b574c23b7bf4a54eeddc1fc8567a5d99 /pkgs/development/tools/misc/ccache
parent3afe2061a2fada629c315c11947f419aaf895548 (diff)
downloadnixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.tar
nixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.tar.gz
nixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.tar.bz2
nixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.tar.lz
nixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.tar.xz
nixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.tar.zst
nixpkgs-96d2a6c4348950eb29e26927cb08a45b415d484c.zip
ccache: improve compiler wrapper
* move compiler detection logic from nix to bash
* robust inheritance of isGNU/isClang

Fixes: d3274e8ae3 ('ccache: support clang in ccache.links')
Fixes: 634824d50b ('ccache: fix references to stdenv.cc.cc.isClang')
Diffstat (limited to 'pkgs/development/tools/misc/ccache')
-rw-r--r--pkgs/development/tools/misc/ccache/default.nix52
1 files changed, 27 insertions, 25 deletions
diff --git a/pkgs/development/tools/misc/ccache/default.nix b/pkgs/development/tools/misc/ccache/default.nix
index c90e356e044..99348e907a9 100644
--- a/pkgs/development/tools/misc/ccache/default.nix
+++ b/pkgs/development/tools/misc/ccache/default.nix
@@ -18,44 +18,46 @@ let ccache = stdenv.mkDerivation rec {
   doCheck = !stdenv.isDarwin;
 
   passthru = let
-      cc = stdenv.cc.cc;
-      ccname = if stdenv.cc.isClang then "clang" else "gcc";
-      cxxname = if stdenv.cc.isClang then "clang++" else "g++";
+      unwrappedCC = stdenv.cc.cc;
     in {
     # A derivation that provides gcc and g++ commands, but that
     # will end up calling ccache for the given cacheDir
     links = extraConfig: stdenv.mkDerivation rec {
       name = "ccache-links";
       passthru = {
-        inherit (stdenv.cc) isClang;
-        inherit (cc) isGNU;
+        isClang = unwrappedCC.isClang or false;
+        isGNU = unwrappedCC.isGNU or false;
       };
-      inherit (cc) lib;
+      inherit (unwrappedCC) lib;
       buildCommand = ''
         mkdir -p $out/bin
-        if [ -x "${cc}/bin/${ccname}" ]; then
-          cat > $out/bin/${ccname} << EOF
-          #!/bin/sh
-          ${extraConfig}
-          exec ${ccache}/bin/ccache ${cc}/bin/${ccname} "\$@"
-        EOF
-          chmod +x $out/bin/${ccname}
-        fi
-        if [ -x "${cc}/bin/${cxxname}" ]; then
-          cat > $out/bin/${cxxname} << EOF
-          #!/bin/sh
-          ${extraConfig}
-          exec ${ccache}/bin/ccache ${cc}/bin/${cxxname} "\$@"
+
+        wrap() {
+          local cname="$1"
+          if [ -x "${unwrappedCC}/bin/$cname" ]; then
+            cat > $out/bin/$cname << EOF
+        #!/bin/sh
+        ${extraConfig}
+        exec ${ccache}/bin/ccache ${unwrappedCC}/bin/$cname "\$@"
         EOF
-          chmod +x $out/bin/${cxxname}
-        fi
-        for executable in $(ls ${cc}/bin); do
+            chmod +x $out/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 ${cc}/bin/$executable $out/bin/$executable
+            ln -s ${unwrappedCC}/bin/$executable $out/bin/$executable
           fi
         done
-        for file in $(ls ${cc} | grep -vw bin); do
-          ln -s ${cc}/$file $out/$file
+        for file in $(ls ${unwrappedCC} | grep -vw bin); do
+          ln -s ${unwrappedCC}/$file $out/$file
         done
       '';
     };