parent
9f7f85a3cd
commit
3d132be83e
@ -0,0 +1,83 @@ |
||||
{ config, pkgs, lib, ... }: |
||||
|
||||
with lib; |
||||
let |
||||
cfg = config.programs.ccache; |
||||
in { |
||||
options.programs.ccache = { |
||||
# host configuration |
||||
enable = mkEnableOption "CCache"; |
||||
cacheDir = mkOption { |
||||
type = types.path; |
||||
description = "CCache directory"; |
||||
default = "/var/cache/ccache"; |
||||
}; |
||||
# target configuration |
||||
packageNames = mkOption { |
||||
type = types.listOf types.str; |
||||
description = "Nix top-level packages to be compiled using CCache"; |
||||
default = []; |
||||
example = [ "wxGTK30" "qt48" "ffmpeg_3_3" "libav_all" ]; |
||||
}; |
||||
}; |
||||
|
||||
config = mkMerge [ |
||||
# host configuration |
||||
(mkIf cfg.enable { |
||||
systemd.tmpfiles.rules = [ "d ${cfg.cacheDir} 0770 root nixbld -" ]; |
||||
|
||||
# "nix-ccache --show-stats" and "nix-ccache --clear" |
||||
security.wrappers.nix-ccache = { |
||||
group = "nixbld"; |
||||
setgid = true; |
||||
source = pkgs.writeScript "nix-ccache.pl" '' |
||||
#!${pkgs.perl}/bin/perl |
||||
|
||||
%ENV=( CCACHE_DIR => '${cfg.cacheDir}' ); |
||||
sub untaint { |
||||
my $v = shift; |
||||
return '-C' if $v eq '-C' || $v eq '--clear'; |
||||
return '-V' if $v eq '-V' || $v eq '--version'; |
||||
return '-s' if $v eq '-s' || $v eq '--show-stats'; |
||||
return '-z' if $v eq '-z' || $v eq '--zero-stats'; |
||||
exec('${pkgs.ccache}/bin/ccache', '-h'); |
||||
} |
||||
exec('${pkgs.ccache}/bin/ccache', map { untaint $_ } @ARGV); |
||||
''; |
||||
}; |
||||
}) |
||||
|
||||
# target configuration |
||||
(mkIf (cfg.packageNames != []) { |
||||
nixpkgs.overlays = [ |
||||
(self: super: genAttrs cfg.packageNames (pn: super.${pn}.override { stdenv = builtins.trace "with ccache: ${pn}" self.ccacheStdenv; })) |
||||
|
||||
(self: super: { |
||||
ccacheWrapper = super.ccacheWrapper.override { |
||||
extraConfig = '' |
||||
export CCACHE_COMPRESS=1 |
||||
export CCACHE_DIR="${cfg.cacheDir}" |
||||
export CCACHE_UMASK=007 |
||||
if [ ! -d "$CCACHE_DIR" ]; then |
||||
echo "=====" |
||||
echo "Directory '$CCACHE_DIR' does not exist" |
||||
echo "Please create it with:" |
||||
echo " sudo mkdir -m0770 '$CCACHE_DIR'" |
||||
echo " sudo chown root:nixbld '$CCACHE_DIR'" |
||||
echo "=====" |
||||
exit 1 |
||||
fi |
||||
if [ ! -w "$CCACHE_DIR" ]; then |
||||
echo "=====" |
||||
echo "Directory '$CCACHE_DIR' is not accessible for user $(whoami)" |
||||
echo "Please verify its access permissions" |
||||
echo "=====" |
||||
exit 1 |
||||
fi |
||||
''; |
||||
}; |
||||
}) |
||||
]; |
||||
}) |
||||
]; |
||||
} |
Loading…
Reference in new issue