diff options
author | Emery Hemingway <ehmry@posteo.net> | 2024-02-09 12:00:40 +0000 |
---|---|---|
committer | Emery Hemingway <ehmry@posteo.net> | 2024-02-09 12:00:40 +0000 |
commit | 1bbad171d047923009063a517e52e0075c0566ed (patch) | |
tree | 7e971e5ca2856b0a0c3054283a3130bb7c69b6b0 /pkgs/by-name/cc | |
parent | fe0309c1425729e6985fc120d497743084647137 (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.patch | 29 | ||||
-rw-r--r-- | pkgs/by-name/cc/ccache/package.nix | 142 |
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; + }; +}) |