From 3e578866201831ae1e83dcf86fec1f54de751e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Sat, 22 Dec 2012 19:35:15 +0100 Subject: [PATCH 1/4] Adding wrappers for distcc, similar to those of ccache. --- .../development/tools/misc/distcc/default.nix | 41 +++++++++++++++---- pkgs/top-level/all-packages.nix | 17 ++++++++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/pkgs/development/tools/misc/distcc/default.nix b/pkgs/development/tools/misc/distcc/default.nix index 8af8e0ca800..6101650c6de 100644 --- a/pkgs/development/tools/misc/distcc/default.nix +++ b/pkgs/development/tools/misc/distcc/default.nix @@ -1,13 +1,12 @@ -{ stdenv, fetchurl, popt, avahi, pkgconfig, python, gtk +{ stdenv, fetchurl, popt, avahi, pkgconfig, python, gtk, runCommand, gcc , sysconfDir ? "" # set this parameter to override the default value $out/etc , static ? false }: -let name = "distcc"; - version = "3.1"; -in - -stdenv.mkDerivation { +let +name = "distcc"; +version = "3.1"; +distcc = stdenv.mkDerivation { name = "${name}-${version}"; src = fetchurl { url = "http://distcc.googlecode.com/files/${name}-${version}.tar.bz2"; @@ -36,6 +35,32 @@ stdenv.mkDerivation { # The test suite fails because it uses hard-coded paths, i.e. /usr/bin/gcc. doCheck = false; + passthru = { + # A derivation that provides gcc and g++ commands, but that + # will end up calling distcc for the given cacheDir + links = extraConfig : (runCommand "distcc-links" + { inherit (gcc) langC langCC; } + '' + mkdir -p $out/bin + if [ $langC -eq 1 ]; then + cat > $out/bin/gcc << EOF + #!/bin/sh + ${extraConfig} + exec ${distcc}/bin/distcc gcc "\$@" + EOF + chmod +x $out/bin/gcc + fi + if [ $langCC -eq 1 ]; then + cat > $out/bin/g++ << EOF + #!/bin/sh + ${extraConfig} + exec ${distcc}/bin/distcc g++ "\$@" + EOF + chmod +x $out/bin/g++ + fi + ''); + }; + meta = { description = "a fast, free distributed C/C++ compiler"; homepage = "http://distcc.org"; @@ -44,4 +69,6 @@ stdenv.mkDerivation { platforms = stdenv.lib.platforms.linux; maintainers = [ stdenv.lib.maintainers.simons ]; }; -} +}; +in +distcc diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b251c703e8b..719a12695cc 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -3075,6 +3075,23 @@ let distcc = callPackage ../development/tools/misc/distcc { }; + # distccWrapper: wrapper that works as gcc or g++ + # It can be used by setting in nixpkgs config like this, for example: + # replaceStdenv = { pkgs }: pkgs.distccStdenv; + # But if you build in chroot, a default 'nix' will create + # a new net namespace, and won't have network access. + # You can use an override in packageOverrides to set extraConfig: + # packageOverrides = pkgs: { + # distccWrapper = pkgs.distccWrapper.override { + # extraConfig = '' + # DISTCC_HOSTS="myhost1 myhost2" + # ''; + # }; + # + distccWrapper = makeOverridable ({ extraConfig ? "" }: + wrapGCC (distcc.links extraConfig)) {}; + distccStdenv = lowPrio (overrideGCC stdenv distccWrapper); + docutils = builderDefsPackage (import ../development/tools/documentation/docutils) { inherit python pil makeWrapper; }; From ea5f15813c13fb68275e16d6296c5096335bc2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Sat, 22 Dec 2012 20:01:05 +0100 Subject: [PATCH 2/4] distcc: Adding a derivation that prepares a masquerade for distccd --- pkgs/development/tools/misc/distcc/masq.nix | 29 +++++++++++++++++++++ pkgs/top-level/all-packages.nix | 4 +++ 2 files changed, 33 insertions(+) create mode 100644 pkgs/development/tools/misc/distcc/masq.nix diff --git a/pkgs/development/tools/misc/distcc/masq.nix b/pkgs/development/tools/misc/distcc/masq.nix new file mode 100644 index 00000000000..1a1219aac97 --- /dev/null +++ b/pkgs/development/tools/misc/distcc/masq.nix @@ -0,0 +1,29 @@ +{ stdenv, gccRaw }: + +stdenv.mkDerivation { + name = "distcc-masq-${gccRaw.name}"; + + phases = [ "installPhase" ]; + installPhase = '' + ensureDir $out/bin + + bin=${gccRaw}/bin + + shopt -s nullglob + if [ -f $bin/gcc ]; then + ln -s $bin/gcc $out/bin + else + for a in $bin/*-g++; do + ln -s $bin/*-gcc $out/bin/gcc + done + fi + + if [ -f $bin/g++ ]; then + ln -s $bin/g++ $out/bin + else + for a in $bin/*-g++; do + ln -sf $bin/*-g++ $out/bin/g++ + done + fi + ''; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 719a12695cc..61baf5434af 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -3092,6 +3092,10 @@ let wrapGCC (distcc.links extraConfig)) {}; distccStdenv = lowPrio (overrideGCC stdenv distccWrapper); + distccMasquerade = callPackage ../development/tools/misc/distcc/masq.nix { + gccRaw = gcc.gcc; + }; + docutils = builderDefsPackage (import ../development/tools/documentation/docutils) { inherit python pil makeWrapper; }; From d779fc2da97bce157c9cc3a932afd70e2c1f9500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Sat, 22 Dec 2012 20:35:51 +0100 Subject: [PATCH 3/4] distccMasquerade: some fixes --- pkgs/development/tools/misc/distcc/masq.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/development/tools/misc/distcc/masq.nix b/pkgs/development/tools/misc/distcc/masq.nix index 1a1219aac97..fe2c4193e25 100644 --- a/pkgs/development/tools/misc/distcc/masq.nix +++ b/pkgs/development/tools/misc/distcc/masq.nix @@ -13,8 +13,9 @@ stdenv.mkDerivation { if [ -f $bin/gcc ]; then ln -s $bin/gcc $out/bin else - for a in $bin/*-g++; do + for a in $bin/*-gcc; do ln -s $bin/*-gcc $out/bin/gcc + ln -s $bin/*-gcc $out/bin/cc done fi @@ -23,6 +24,7 @@ stdenv.mkDerivation { else for a in $bin/*-g++; do ln -sf $bin/*-g++ $out/bin/g++ + ln -sf $bin/*-g++ $out/bin/c++ done fi ''; From 67c73aafe81cd510da97f9d38d9eccc91985aff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Sat, 22 Dec 2012 22:04:43 +0100 Subject: [PATCH 4/4] Fixing distccMasquerade to have gas too --- pkgs/development/tools/misc/distcc/masq.nix | 12 +++++++++++- pkgs/top-level/all-packages.nix | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkgs/development/tools/misc/distcc/masq.nix b/pkgs/development/tools/misc/distcc/masq.nix index fe2c4193e25..117480670c3 100644 --- a/pkgs/development/tools/misc/distcc/masq.nix +++ b/pkgs/development/tools/misc/distcc/masq.nix @@ -1,4 +1,4 @@ -{ stdenv, gccRaw }: +{ stdenv, gccRaw, binutils }: stdenv.mkDerivation { name = "distcc-masq-${gccRaw.name}"; @@ -27,5 +27,15 @@ stdenv.mkDerivation { ln -sf $bin/*-g++ $out/bin/c++ done fi + + bbin=${binutils}/bin + if [ -f $bbin/as ]; then + ln -s $bbin/as $out/bin + else + for a in $bbin/*-as; do + ln -sf $bbin/*-as $out/bin/as + done + fi + ''; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 61baf5434af..5b50a494de3 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -3094,6 +3094,7 @@ let distccMasquerade = callPackage ../development/tools/misc/distcc/masq.nix { gccRaw = gcc.gcc; + binutils = binutils; }; docutils = builderDefsPackage (import ../development/tools/documentation/docutils) {