From 1472989242fc4c22e9b86e3860a317f72ad77003 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Tue, 1 Oct 2013 13:10:40 +0200 Subject: [PATCH 01/40] Make glibc compilation more pure. Remove datetime from nscd. --- pkgs/development/libraries/glibc/2.19/common.nix | 8 ++++++++ .../glibc-remove-date-from-compilation-banner.patch | 12 ++++++++++++ .../glibc/2.19/glibc-remove-datetime-from-nscd.patch | 11 +++++++++++ 3 files changed, 31 insertions(+) create mode 100644 pkgs/development/libraries/glibc/2.19/glibc-remove-date-from-compilation-banner.patch create mode 100644 pkgs/development/libraries/glibc/2.19/glibc-remove-datetime-from-nscd.patch diff --git a/pkgs/development/libraries/glibc/2.19/common.nix b/pkgs/development/libraries/glibc/2.19/common.nix index cd1ba747d7c67..c5e02ab1c4b26 100644 --- a/pkgs/development/libraries/glibc/2.19/common.nix +++ b/pkgs/development/libraries/glibc/2.19/common.nix @@ -60,6 +60,14 @@ stdenv.mkDerivation ({ ./fix-math.patch ./cve-2014-0475.patch + + /* Remove references to the compilation date. */ + ./glibc-remove-date-from-compilation-banner.patch + + /* Remove the date and time from nscd. It is used as a protocol + compatibility check, but we assume nix takes care of that for + us. */ + ./glibc-remove-datetime-from-nscd.patch ]; postPatch = '' diff --git a/pkgs/development/libraries/glibc/2.19/glibc-remove-date-from-compilation-banner.patch b/pkgs/development/libraries/glibc/2.19/glibc-remove-date-from-compilation-banner.patch new file mode 100644 index 0000000000000..5d0b1a51762e9 --- /dev/null +++ b/pkgs/development/libraries/glibc/2.19/glibc-remove-date-from-compilation-banner.patch @@ -0,0 +1,12 @@ +diff -ur glibc-2.17.orig/csu/Makefile glibc-2.17/csu/Makefile +--- glibc-2.17.orig/csu/Makefile 2012-12-25 04:02:13.000000000 +0100 ++++ glibc-2.17/csu/Makefile 2013-08-19 16:01:57.132378550 +0200 +@@ -172,7 +172,7 @@ + os=Linux; \ + fi; \ + printf '"Compiled on a %s %s system on %s.\\n"\n' \ +- "$$os" "$$version" "`date +%Y-%m-%d`";; \ ++ "$$os" "$$version";; \ + *) ;; \ + esac; \ + files="$(all-Banner-files)"; \ diff --git a/pkgs/development/libraries/glibc/2.19/glibc-remove-datetime-from-nscd.patch b/pkgs/development/libraries/glibc/2.19/glibc-remove-datetime-from-nscd.patch new file mode 100644 index 0000000000000..83b61799c4c74 --- /dev/null +++ b/pkgs/development/libraries/glibc/2.19/glibc-remove-datetime-from-nscd.patch @@ -0,0 +1,11 @@ +--- a/nscd/nscd_stat.c 2014-04-08 20:35:24.253715420 +0200 ++++ b/nscd/nscd_stat.c 2014-04-08 20:38:32.526634400 +0200 +@@ -37,7 +37,7 @@ + + + /* We use this to make sure the receiver is the same. */ +-static const char compilation[21] = __DATE__ " " __TIME__; ++static const char compilation[21] = "Thu 1 1970 00:00:01"; /* __DATE__ " " __TIME__; */ + + /* Statistic data for one database. */ + struct dbstat From 2410fa14c38e999ea502c50b4031b12d5e4f84d9 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Mon, 7 Apr 2014 08:04:26 +0200 Subject: [PATCH 02/40] Make perl 5.16 binary deterministic. --- .../interpreters/perl/5.16/default.nix | 29 +++++++++++++++++++ .../perl/5.16/fixed-man-page-date.patch | 11 +++++++ .../perl/5.16/no-date-in-perl-binary.patch | 11 +++++++ .../perl/5.16/no-impure-config-time.patch | 11 +++++++ 4 files changed, 62 insertions(+) create mode 100644 pkgs/development/interpreters/perl/5.16/fixed-man-page-date.patch create mode 100644 pkgs/development/interpreters/perl/5.16/no-date-in-perl-binary.patch create mode 100644 pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch diff --git a/pkgs/development/interpreters/perl/5.16/default.nix b/pkgs/development/interpreters/perl/5.16/default.nix index 600884db5e67d..a98db56d45649 100644 --- a/pkgs/development/interpreters/perl/5.16/default.nix +++ b/pkgs/development/interpreters/perl/5.16/default.nix @@ -21,6 +21,9 @@ stdenv.mkDerivation rec { patches = [ # Do not look in /usr etc. for dependencies. ./no-sys-dirs.patch + ./no-impure-config-time.patch + ./fixed-man-page-date.patch + ./no-date-in-perl-binary.patch ] ++ optional stdenv.isSunOS ./ld-shared.patch ++ stdenv.lib.optional stdenv.isDarwin [ ./cpp-precomp.patch ./no-libutil.patch ] ; @@ -64,5 +67,31 @@ stdenv.mkDerivation rec { setupHook = ./setup-hook.sh; + doCheck = !stdenv.isDarwin; + + # some network-related tests don't work, mostly probably due to our sandboxing + # man-heading.t is skipped due to output determinism (no dates) + testsToSkip = '' + lib/Net/hostent.t \ + dist/IO/t/{io_multihomed.t,io_sock.t} \ + dist/Net-Ping/t/*.t \ + cpan/autodie/t/truncate.t \ + t/porting/{maintainers.t,regen.t} \ + cpan/Socket/t/get{name,addr}info.t \ + cpan/podlators/t/man-heading.t \ + '' + optionalString stdenv.isFreeBSD '' + cpan/CPANPLUS/t/04_CPANPLUS-Module.t \ + cpan/CPANPLUS/t/20_CPANPLUS-Dist-MM.t \ + '' + " "; + + postPatch = optionalString (!stdenv.isDarwin) /* this failed on Darwin, no idea why */ '' + for test in ${testsToSkip}; do + echo "Removing test" $test + rm "$test" + pat=`echo "$test" | sed 's,/,\\\\/,g'` # just escape slashes + sed "/^$pat/d" -i MANIFEST + done + ''; + passthru.libPrefix = "lib/perl5/site_perl"; } diff --git a/pkgs/development/interpreters/perl/5.16/fixed-man-page-date.patch b/pkgs/development/interpreters/perl/5.16/fixed-man-page-date.patch new file mode 100644 index 0000000000000..79f9bc3658e36 --- /dev/null +++ b/pkgs/development/interpreters/perl/5.16/fixed-man-page-date.patch @@ -0,0 +1,11 @@ +--- a/cpan/podlators/lib/Pod/Man.pm 2014-04-07 06:25:23.730505243 +0200 ++++ b/cpan/podlators/lib/Pod/Man.pm 2014-04-07 06:26:40.816552603 +0200 +@@ -768,7 +768,7 @@ + } else { + ($name, $section) = $self->devise_title; + } +- my $date = $$self{date} || $self->devise_date; ++ my $date = "1970-01-01"; # Fixed date for NixOS, orig: $$self{date} || $self->devise_date; + $self->preamble ($name, $section, $date) + unless $self->bare_output or DEBUG > 9; + diff --git a/pkgs/development/interpreters/perl/5.16/no-date-in-perl-binary.patch b/pkgs/development/interpreters/perl/5.16/no-date-in-perl-binary.patch new file mode 100644 index 0000000000000..00ea47ae45f60 --- /dev/null +++ b/pkgs/development/interpreters/perl/5.16/no-date-in-perl-binary.patch @@ -0,0 +1,11 @@ +--- a/perl.c 2014-04-07 07:58:01.402831615 +0200 ++++ b/perl.c 2014-04-07 07:59:38.556945298 +0200 +@@ -1754,7 +1754,7 @@ + PUSHs(Perl_newSVpvn_flags(aTHX_ non_bincompat_options, + sizeof(non_bincompat_options) - 1, SVs_TEMP)); + +-#ifdef __DATE__ ++#if 0 + # ifdef __TIME__ + PUSHs(Perl_newSVpvn_flags(aTHX_ + STR_WITH_LEN("Compiled at " __DATE__ " " __TIME__), diff --git a/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch b/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch new file mode 100644 index 0000000000000..2bf1841e9dd2c --- /dev/null +++ b/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch @@ -0,0 +1,11 @@ +--- a/Configure 2014-04-05 20:21:33.714635700 +0200 ++++ b/Configure 2014-04-05 20:23:23.377441026 +0200 +@@ -3609,6 +3609,8 @@ + + : who configured the system + cf_time=`LC_ALL=C; LANGUAGE=C; export LC_ALL; export LANGUAGE; $date 2>&1` ++cf_time='Thu Jan 1 00:00:00 UTC 1970' ++ + case "$cf_by" in + "") + cf_by=`(logname) 2>/dev/null` From 61c55ad1e57c12114a9fb0f7ad9c9d65dc019940 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Tue, 8 Apr 2014 16:17:05 +0200 Subject: [PATCH 03/40] Make the linux bootstrap environments more deterministic. This includes two changes: 1) Fix a bug where the bootstrap-tools is always used instead of binutils 2) Enable strip --enable-deterministic-archives as soon as a new binutils is available. --- pkgs/stdenv/linux/default.nix | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index 23cccf223f4f5..4f2af41a610d7 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -69,20 +69,29 @@ rec { # This function builds the various standard environments used during # the bootstrap. stdenvBootFun = - {gcc, extraAttrs ? {}, overrides ? (pkgs: {}), extraPath ? [], fetchurl}: + {gcc, extraAttrs ? {}, overrides ? (pkgs: {}), extraPath ? [], fetchurl, + deterministic ? false, bootnum ? "", binutils}: import ../generic { inherit system config; - name = "stdenv-linux-boot"; + name = "stdenv-linux-boot" + bootnum; preHook = '' # Don't patch #!/interpreter because it leads to retained # dependencies on the bootstrapTools in the final stdenv. dontPatchShebangs=1 ${commonPreHook} + '' + + lib.optionalString deterministic '' + # Make "strip" produce deterministic output, by setting + # timestamps etc. to a fixed value. + commonStripFlags="--enable-deterministic-archives" ''; + shell = "${bootstrapTools}/bin/sh"; - initialPath = [bootstrapTools] ++ extraPath; + # We put binutils before bootstrapTools so that we gradually use less from bootstrapTools. + # Also, deterministic builds require a fresh binutils (strip). + initialPath = [binutils] ++ [bootstrapTools] ++ extraPath; fetchurlBoot = fetchurl; inherit gcc; # Having the proper 'platform' in all the stdenvs allows getting proper @@ -97,7 +106,9 @@ rec { # because we need a stdenv to build the GCC wrapper and fetchurl. stdenvLinuxBoot0 = stdenvBootFun { gcc = "/no-such-path"; + bootnum = "0"; fetchurl = null; + binutils = null; }; @@ -142,6 +153,10 @@ rec { binutils = bootstrapTools; coreutils = bootstrapTools; }; + bootnum = "1"; + # The bootstrap tools might not support a deterministic strip + deterministic = false; + binutils = bootstrapTools; inherit fetchurl; }; @@ -168,6 +183,9 @@ rec { overrides = pkgs: { inherit (stdenvLinuxBoot1Pkgs) perl; }; + bootnum = "2"; + deterministic = true; + binutils = binutils1; inherit fetchurl; }; @@ -211,6 +229,9 @@ rec { glibc = stdenvLinuxGlibc; # Required by gcc47 build }; extraPath = [ stdenvLinuxBoot1Pkgs.paxctl ]; + bootnum = "3"; + deterministic = true; + binutils = binutils1; inherit fetchurl; }; @@ -238,6 +259,9 @@ rec { inherit (stdenvLinuxBoot1Pkgs) perl; inherit (stdenvLinuxBoot3Pkgs) gettext gnum4 gmp; }; + bootnum = "4"; + deterministic = true; + binutils = binutils1; inherit fetchurl; }; From 0d6467c04146f9c02cbf3af84960b43fbe98ed2d Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 9 Apr 2014 01:04:50 +0200 Subject: [PATCH 04/40] Improve python library determinism. 1) Make the core python libraries deterministic. 2) Make the python libraries created by glib deterministic. --- pkgs/development/interpreters/python/2.7/default.nix | 1 + pkgs/development/libraries/glib/default.nix | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/development/interpreters/python/2.7/default.nix b/pkgs/development/interpreters/python/2.7/default.nix index c19430862c214..05fb8134f854e 100644 --- a/pkgs/development/interpreters/python/2.7/default.nix +++ b/pkgs/development/interpreters/python/2.7/default.nix @@ -72,6 +72,7 @@ let ''; NIX_CFLAGS_COMPILE = optionalString stdenv.isDarwin "-msse2"; + DETERMINISTIC_BUILD = 1; setupHook = ./setup-hook.sh; diff --git a/pkgs/development/libraries/glib/default.nix b/pkgs/development/libraries/glib/default.nix index 839ba7cfa951a..d3de4c18399b4 100644 --- a/pkgs/development/libraries/glib/default.nix +++ b/pkgs/development/libraries/glib/default.nix @@ -99,7 +99,7 @@ stdenv.mkDerivation rec { sed -e '/g_subprocess_launcher_set_environ (launcher, envp);/a g_subprocess_launcher_setenv (launcher, "PATH", g_getenv("PATH"), TRUE);' -i gio/tests/gsubprocess.c ''; - postInstall = ''rm -rvf $out/share/gtk-doc''; + DETERMINISTIC_BUILD = 1; passthru = { gioModuleDir = "lib/gio/modules"; From 84a9791367f9d724233f8198cd86e155e81f9299 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 9 Apr 2014 01:15:38 +0200 Subject: [PATCH 05/40] Improve determinism for libgcrypt, libgpg-error, and busybox. --- pkgs/development/libraries/libgcrypt/default.nix | 2 ++ .../libraries/libgcrypt/no-build-timestamp.patch | 12 ++++++++++++ pkgs/development/libraries/libgpg-error/default.nix | 2 ++ .../libraries/libgpg-error/no-build-timestamp.patch | 11 +++++++++++ pkgs/os-specific/linux/busybox/default.nix | 1 + 5 files changed, 28 insertions(+) create mode 100644 pkgs/development/libraries/libgcrypt/no-build-timestamp.patch create mode 100644 pkgs/development/libraries/libgpg-error/no-build-timestamp.patch diff --git a/pkgs/development/libraries/libgcrypt/default.nix b/pkgs/development/libraries/libgcrypt/default.nix index ed267e23c87b5..b47709940dd5e 100644 --- a/pkgs/development/libraries/libgcrypt/default.nix +++ b/pkgs/development/libraries/libgcrypt/default.nix @@ -18,6 +18,8 @@ stdenv.mkDerivation (rec { make check ''; + patches = [ ./no-build-timestamp.patch ]; + meta = { description = "General-pupose cryptographic library"; diff --git a/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch b/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch new file mode 100644 index 0000000000000..6ae708f059d77 --- /dev/null +++ b/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch @@ -0,0 +1,12 @@ +diff -ur libgcrypt-1.5.3.orig/configure libgcrypt-1.5.3/configure +--- libgcrypt-1.5.3.orig/configure 2013-07-25 11:22:47.000000000 +0200 ++++ libgcrypt-1.5.3/configure 2014-04-09 00:17:58.659147199 +0200 +@@ -16520,6 +16520,7 @@ + + + BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date` ++BUILD_TIMESTAMP=1970-01-01T00:00+0000 + + + cat >>confdefs.h <<_ACEOF +Only in libgcrypt-1.5.3: out diff --git a/pkgs/development/libraries/libgpg-error/default.nix b/pkgs/development/libraries/libgpg-error/default.nix index 663bd944fb924..03662571adeb8 100644 --- a/pkgs/development/libraries/libgpg-error/default.nix +++ b/pkgs/development/libraries/libgpg-error/default.nix @@ -14,6 +14,8 @@ stdenv.mkDerivation (rec { doCheck = true; + patches = [ ./no-build-timestamp.patch ]; + meta = { description = "Libgpg-error, a small library that defines common error values for all GnuPG components"; diff --git a/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch b/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch new file mode 100644 index 0000000000000..c8350a278ec4a --- /dev/null +++ b/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch @@ -0,0 +1,11 @@ +diff -ur libgpg-error-1.12.orig/configure libgpg-error-1.12/configure +--- libgpg-error-1.12.orig/configure 2013-06-24 06:42:28.000000000 +0200 ++++ libgpg-error-1.12/configure 2014-04-09 00:12:47.867856520 +0200 +@@ -14585,6 +14585,7 @@ + + + BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date` ++BUILD_TIMESTAMP=1970-01-01T00:00+0000 + + + cat >>confdefs.h <<_ACEOF diff --git a/pkgs/os-specific/linux/busybox/default.nix b/pkgs/os-specific/linux/busybox/default.nix index 98fedb2d3f4f4..34eb19380d4a3 100644 --- a/pkgs/os-specific/linux/busybox/default.nix +++ b/pkgs/os-specific/linux/busybox/default.nix @@ -49,6 +49,7 @@ stdenv.mkDerivation rec { }; configurePhase = '' + export KCONFIG_NOTIMESTAMP=1 make defconfig ${configParser} cat << EOF | parseconfig From 7f014c7d2550a0d2431cfcb65fe5ff219a00fc95 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 9 Apr 2014 15:05:48 +0200 Subject: [PATCH 06/40] Make openssl deterministic. --- pkgs/development/libraries/openssl/default.nix | 2 ++ .../libraries/openssl/no-date-in-library.patch | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 pkgs/development/libraries/openssl/no-date-in-library.patch diff --git a/pkgs/development/libraries/openssl/default.nix b/pkgs/development/libraries/openssl/default.nix index 8c88df984f059..559bce7b2f5b7 100644 --- a/pkgs/development/libraries/openssl/default.nix +++ b/pkgs/development/libraries/openssl/default.nix @@ -19,6 +19,8 @@ let # cannot be overriden per-process. For security, the # environment variable is ignored for setuid binaries. ./cert-file.patch + # Remove the compilation time from the library + ./no-date-in-library.patch ] ++ stdenv.lib.optionals (isCross && opensslCrossSystem == "hurd-x86") diff --git a/pkgs/development/libraries/openssl/no-date-in-library.patch b/pkgs/development/libraries/openssl/no-date-in-library.patch new file mode 100644 index 0000000000000..3eb501dfa0206 --- /dev/null +++ b/pkgs/development/libraries/openssl/no-date-in-library.patch @@ -0,0 +1,12 @@ +diff -ur openssl-1.0.1f.orig/crypto/Makefile openssl-1.0.1f/crypto/Makefile +--- openssl-1.0.1f.orig/crypto/Makefile 2014-01-06 15:35:56.000000000 +0100 ++++ openssl-1.0.1f/crypto/Makefile 2014-04-09 13:05:28.071346204 +0200 +@@ -57,7 +57,7 @@ + echo ' /* auto-generated by crypto/Makefile for crypto/cversion.c */'; \ + echo ' #define CFLAGS "$(CC) $(CFLAG)"'; \ + echo ' #define PLATFORM "$(PLATFORM)"'; \ +- echo " #define DATE \"`LC_ALL=C LC_TIME=C date`\""; \ ++ echo " #define DATE \"Thu Jan 1 00:00:01 UTC 1970\""; \ + echo '#endif' ) >buildinf.h + + x86cpuid.s: x86cpuid.pl perlasm/x86asm.pl From 30a92c4b687c01637fa22ef75e41ed5d04230403 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 9 Apr 2014 15:09:06 +0200 Subject: [PATCH 07/40] Make groff and opensp deterministic. --- pkgs/tools/text/groff/default.nix | 8 ++++++++ pkgs/tools/text/sgml/opensp/default.nix | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/pkgs/tools/text/groff/default.nix b/pkgs/tools/text/groff/default.nix index 97cc3c611733f..cd1d719bdaf5b 100644 --- a/pkgs/tools/text/groff/default.nix +++ b/pkgs/tools/text/groff/default.nix @@ -28,6 +28,14 @@ stdenv.mkDerivation rec { ''; }; + postInstall = '' + # Remove example output with (random?) colors to + # avoid non-determinism in the output + rm $out/share/doc/${name}/examples/hdtbl/*color*ps + # Remove creation date + find $out/share/doc/${name} -type f -print0 | xargs -0 sed -i -e 's/%%CreationDate: .*//' + ''; + meta = { homepage = "http://www.gnu.org/software/groff/"; description = "GNU Troff, a typesetting package that reads plain text and produces formatted output"; diff --git a/pkgs/tools/text/sgml/opensp/default.nix b/pkgs/tools/text/sgml/opensp/default.nix index 59b9b7bc13d13..23ce8ccc5a885 100644 --- a/pkgs/tools/text/sgml/opensp/default.nix +++ b/pkgs/tools/text/sgml/opensp/default.nix @@ -13,8 +13,16 @@ stdenv.mkDerivation { docsrc/*.xml ''; + setupHook = ./setup-hook.sh; + postFixup = '' + # Remove random ids in the release notes + sed -i -e 's/href="#idm.*"//g' $out/share/doc/OpenSP/releasenotes.html + sed -i -e 's/name="idm.*"//g' $out/share/doc/OpenSP/releasenotes.html + ''; + + buildInputs = [ xmlto docbook_xml_dtd_412 libxslt docbook_xsl ]; meta = { From 3dba999c62011e64222e593f835f63ebd3f0f47e Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 9 Apr 2014 17:12:33 +0200 Subject: [PATCH 08/40] Make __DATE__/__TIME__ deterministic when NIX_ENFORCE_PURITY=1 --- pkgs/build-support/gcc-wrapper/gcc-wrapper.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh b/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh index c53fd44207d00..3d7ae32a06688 100644 --- a/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh +++ b/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh @@ -85,6 +85,16 @@ fi extraAfter=($NIX_CFLAGS_COMPILE) extraBefore=() +# When enforcing purity, pretend gcc can't find the current date and +# time +if test "$NIX_ENFORCE_PURITY" = "1"; then + extraAfter=(-D__DATE__=\"???-??-????\" + -D__TIME__=\"??:??:??\" + -Wno-builtin-macro-redefined + "${extraAfter[@]}") +fi + + if test "$dontLink" != "1"; then # Add the flags that should only be passed to the compiler when From 31e433be2858e6cb6d78d072df91d8555d63e222 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Thu, 10 Apr 2014 10:41:30 +0200 Subject: [PATCH 09/40] Added a fixed time using libfaketime to stdenv. --- .../libraries/libfaketime/default.nix | 36 ++++++++++++++++++ .../libfaketime/libfaketime-v0.9.5.tar.gz | Bin 0 -> 45898 bytes pkgs/stdenv/generic/builder.sh | 1 + pkgs/stdenv/generic/default.nix | 13 ++++--- pkgs/stdenv/generic/setup.sh | 27 ++++++++----- pkgs/stdenv/linux/default.nix | 5 ++- pkgs/top-level/all-packages.nix | 2 + 7 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 pkgs/development/libraries/libfaketime/default.nix create mode 100644 pkgs/development/libraries/libfaketime/libfaketime-v0.9.5.tar.gz diff --git a/pkgs/development/libraries/libfaketime/default.nix b/pkgs/development/libraries/libfaketime/default.nix new file mode 100644 index 0000000000000..44a849f9d641b --- /dev/null +++ b/pkgs/development/libraries/libfaketime/default.nix @@ -0,0 +1,36 @@ +{stdenv, fetchurl }: + +stdenv.mkDerivation rec +{ + version = "0.9.5"; + name = "libfaketime-${version}"; + +# src = fetchgit { +# url = "https://github.com/wolfcw/libfaketime.git"; +# rev = "4c23ee273006e72a26dcbba62317ab05645e892d"; +# sha256 = "efa231e0091e8c7785385149dc97b2d8dc24aba65f4b0974b8ed7f62b7596ad3"; +# }; + +# Need http-only storing facility, like tarballs.nixos.org +# src = fetchurl { +# url = http://github.com/wolfcw/libfaketime/archive/v0.9.5.tar.gz; +# sha256 = "efa231e0091e8c7785385149dc97b2d8dc24aba65f4b0974b8ed7f62b7596ad3"; +# }; + + src = ./libfaketime-v0.9.5.tar.gz; + +# buildInputs = [ ]; + + preBuild = '' + makeFlags="PREFIX=$out LIBDIRNAME=/lib" + ''; + + meta = + { + homepage = "https://github.com/wolfcw/libfaketime"; + description = "libfaketime modifies the system time for a single application"; + license = stdenv.lib.licenses.gpl2; + platforms = stdenv.lib.platforms.linux; + maintainers = [ ]; + }; +} \ No newline at end of file diff --git a/pkgs/development/libraries/libfaketime/libfaketime-v0.9.5.tar.gz b/pkgs/development/libraries/libfaketime/libfaketime-v0.9.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f07a19379a48cc4c6c60f35df8c4b83d86f7a730 GIT binary patch literal 45898 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 ASO5S3 literal 0 HcmV?d00001 diff --git a/pkgs/stdenv/generic/builder.sh b/pkgs/stdenv/generic/builder.sh index 60360e7b8256b..e1a8dc152a059 100644 --- a/pkgs/stdenv/generic/builder.sh +++ b/pkgs/stdenv/generic/builder.sh @@ -13,6 +13,7 @@ sed -e "s^@initialPath@^$initialPath^g" \ -e "s^@gcc@^$gcc^g" \ -e "s^@shell@^$shell^g" \ -e "s^@needsPax@^$needsPax^g" \ + -e "s^@libfaketime@^$libfaketime^g" \ < $out/setup > $out/setup.tmp mv $out/setup.tmp $out/setup diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index 11731c1c1c105..6289189ed52e0 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -1,7 +1,7 @@ let lib = import ../../../lib; in lib.makeOverridable ( { system, name ? "stdenv", preHook ? "", initialPath, gcc, shell -, extraAttrs ? {}, overrides ? (pkgs: {}), config +, libfaketime, extraAttrs ? {}, overrides ? (pkgs: {}), config , # The `fetchurl' to use for downloading curl and its dependencies # (see all-packages.nix). @@ -58,12 +58,13 @@ let setup = setupScript; - inherit preHook initialPath gcc shell; + inherit preHook initialPath gcc shell libfaketime; # Whether we should run paxctl to pax-mark binaries needsPax = result.isLinux && !skipPaxMarking; propagatedUserEnvPkgs = [gcc] ++ + lib.optionals (libfaketime != null) [libfaketime] ++ lib.filter lib.isDerivation initialPath; } @@ -115,12 +116,14 @@ let __ignoreNulls = true; # Inputs built by the cross compiler. - buildInputs = lib.optionals (crossConfig != null) (buildInputs ++ extraBuildInputs); + buildInputs = lib.optionals (crossConfig != null) (buildInputs ++ extraBuildInputs) ++ + lib.optionals (libfaketime != null) [libfaketime]; propagatedBuildInputs = lib.optionals (crossConfig != null) propagatedBuildInputs; # Inputs built by the usual native compiler. - nativeBuildInputs = nativeBuildInputs ++ lib.optionals (crossConfig == null) (buildInputs ++ extraBuildInputs); + nativeBuildInputs = nativeBuildInputs ++ lib.optionals (crossConfig == null) (buildInputs ++ extraBuildInputs) ++ lib.optionals (libfaketime != null) [libfaketime]; propagatedNativeBuildInputs = propagatedNativeBuildInputs ++ - lib.optionals (crossConfig == null) propagatedBuildInputs; + lib.optionals (crossConfig == null) propagatedBuildInputs ++ + lib.optionals (libfaketime != null) [libfaketime]; }))) ( { # The meta attribute is passed in the resulting attribute set, diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index c3b9033b49a6a..58263e39e0b11 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -100,6 +100,14 @@ if [ "$NIX_DEBUG" = 1 ]; then echo "initial path: $PATH" fi +# By setting useFakeTime, the time can be overridden. +# The following example sets the time to 1 for gcc and date +# FAKETIME="1970-01-01\ 00:00:01" +# FAKETIME_ONLY_CMDS="gcc,date" +if [ "$NIX_ENFORCE_PURITY" = "1" -a -n "@libfaketime@" -a + -n "$useFakeTime" ]; then + makePreloads=(${makePreloads[@]} LD_PRELOAD=@libfaketime@/lib/libfaketime.so.1) +fi # Execute the pre-hook. export SHELL=@shell@ @@ -632,10 +640,10 @@ buildPhase() { makeFlags="SHELL=$SHELL $makeFlags" echo "make flags: $makeFlags ${makeFlagsArray[@]} $buildFlags ${buildFlagsArray[@]}" - make ${makefile:+-f $makefile} \ + eval $(echo "${makePreloads[@]}") 'make ${makefile:+-f $makefile} \ ${enableParallelBuilding:+-j${NIX_BUILD_CORES} -l${NIX_BUILD_CORES}} \ $makeFlags "${makeFlagsArray[@]}" \ - $buildFlags "${buildFlagsArray[@]}" + $buildFlags "${buildFlagsArray[@]}"' runHook postBuild } @@ -645,10 +653,10 @@ checkPhase() { runHook preCheck echo "check flags: $makeFlags ${makeFlagsArray[@]} $checkFlags ${checkFlagsArray[@]}" - make ${makefile:+-f $makefile} \ + eval $(echo "${makePreloads[@]}") 'make ${makefile:+-f $makefile} \ ${enableParallelBuilding:+-j${NIX_BUILD_CORES} -l${NIX_BUILD_CORES}} \ $makeFlags "${makeFlagsArray[@]}" \ - ${checkFlags:-VERBOSE=y} "${checkFlagsArray[@]}" ${checkTarget:-check} + ${checkFlags:-VERBOSE=y} "${checkFlagsArray[@]}" ${checkTarget:-check}' runHook postCheck } @@ -735,9 +743,9 @@ installPhase() { installTargets=${installTargets:-install} echo "install flags: $installTargets $makeFlags ${makeFlagsArray[@]} $installFlags ${installFlagsArray[@]}" - make ${makefile:+-f $makefile} $installTargets \ + eval $(echo "${makePreloads[@]}") 'make ${makefile:+-f $makefile} $installTargets \ $makeFlags "${makeFlagsArray[@]}" \ - $installFlags "${installFlagsArray[@]}" + $installFlags "${installFlagsArray[@]}"' runHook postInstall } @@ -840,10 +848,10 @@ installCheckPhase() { runHook preInstallCheck echo "installcheck flags: $makeFlags ${makeFlagsArray[@]} $installCheckFlags ${installCheckFlagsArray[@]}" - make ${makefile:+-f $makefile} \ + eval $(echo "${makePreloads[@]}") 'make ${makefile:+-f $makefile} \ ${enableParallelBuilding:+-j${NIX_BUILD_CORES} -l${NIX_BUILD_CORES}} \ $makeFlags "${makeFlagsArray[@]}" \ - $installCheckFlags "${installCheckFlagsArray[@]}" ${installCheckTarget:-installcheck} + $installCheckFlags "${installCheckFlagsArray[@]}" ${installCheckTarget:-installcheck}' runHook postInstallCheck } @@ -853,7 +861,8 @@ distPhase() { runHook preDist echo "dist flags: $distFlags ${distFlagsArray[@]}" - make ${makefile:+-f $makefile} $distFlags "${distFlagsArray[@]}" ${distTarget:-dist} + eval $("${makePreloads[@]}") 'make ${makefile:+-f $makefile} $distFlags "${distFlagsArray[@]}" \ + ${distTarget:-dist}' if [ "$dontCopyDist" != 1 ]; then mkdir -p "$out/tarballs" diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index 4f2af41a610d7..8ab7212caa393 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -93,6 +93,7 @@ rec { # Also, deterministic builds require a fresh binutils (strip). initialPath = [binutils] ++ [bootstrapTools] ++ extraPath; fetchurlBoot = fetchurl; + libfaketime = null; inherit gcc; # Having the proper 'platform' in all the stdenvs allows getting proper # linuxHeaders for example. @@ -313,13 +314,15 @@ rec { shellPackage = stdenvLinuxBoot4Pkgs.bash; }; + inherit (stdenvLinuxBoot4Pkgs) libfaketime; + overrides = pkgs: { inherit gcc; inherit (stdenvLinuxBoot3Pkgs) glibc; inherit (stdenvLinuxBoot4Pkgs) binutils; inherit (stdenvLinuxBoot4Pkgs) gzip bzip2 xz bash coreutils diffutils findutils gawk - gnumake gnused gnutar gnugrep gnupatch patchelf + gnumake gnused gnutar gnugrep gnupatch libfaketime patchelf attr acl paxctl; }; }; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d2d0f69132c47..ee93b6626bf15 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5291,6 +5291,8 @@ let libf2c = callPackage ../development/libraries/libf2c {}; + libfaketime = callPackage ../development/libraries/libfaketime {}; + libfixposix = callPackage ../development/libraries/libfixposix {}; libffcall = builderDefsPackage (import ../development/libraries/libffcall) { From cb8bd05a0172db9c02ba0067b21bbc0ce17cc522 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 15:46:27 +0200 Subject: [PATCH 10/40] Make libfaketime deterministic. Also, do not link with rt to avoid duplicate definition error. This was apparently something others have seen as well: https://github.com/wolfcw/libfaketime/blob/master/packaging/Linux/Debian/avoid-spurious-lrt.patch --- .../libraries/libfaketime/avoid-spurious-lrt.patch | 12 ++++++++++++ pkgs/development/libraries/libfaketime/default.nix | 7 ++++++- .../libfaketime/no-date-in-gzip-man-page.patch | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 pkgs/development/libraries/libfaketime/avoid-spurious-lrt.patch create mode 100644 pkgs/development/libraries/libfaketime/no-date-in-gzip-man-page.patch diff --git a/pkgs/development/libraries/libfaketime/avoid-spurious-lrt.patch b/pkgs/development/libraries/libfaketime/avoid-spurious-lrt.patch new file mode 100644 index 0000000000000..90eb88f3655f7 --- /dev/null +++ b/pkgs/development/libraries/libfaketime/avoid-spurious-lrt.patch @@ -0,0 +1,12 @@ +diff -ur libfaketime-0.9.5.orig/src/Makefile libfaketime-0.9.5/src/Makefile +--- libfaketime-0.9.5.orig/src/Makefile 2013-10-13 11:19:30.000000000 +0200 ++++ libfaketime-0.9.5/src/Makefile 2014-04-11 21:58:06.285435083 +0200 +@@ -69,7 +69,7 @@ + + CFLAGS += -std=gnu99 -Wall -Wextra -Werror -DFAKE_STAT -DFAKE_SLEEP -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -DPREFIX='"'$(PREFIX)'"' -DLIBDIRNAME='"'$(LIBDIRNAME)'"' + LIB_LDFLAGS += -shared +-LDFLAGS += -Wl,--version-script=libfaketime.map -lrt ++LDFLAGS += -Wl,--version-script=libfaketime.map + LDADD += -ldl -lm -lpthread -lrt + + SRC = libfaketime.c diff --git a/pkgs/development/libraries/libfaketime/default.nix b/pkgs/development/libraries/libfaketime/default.nix index 44a849f9d641b..3e8c874d44493 100644 --- a/pkgs/development/libraries/libfaketime/default.nix +++ b/pkgs/development/libraries/libfaketime/default.nix @@ -25,6 +25,11 @@ stdenv.mkDerivation rec makeFlags="PREFIX=$out LIBDIRNAME=/lib" ''; + patches = [ + ./avoid-spurious-lrt.patch + ./no-date-in-gzip-man-page.patch + ]; + meta = { homepage = "https://github.com/wolfcw/libfaketime"; @@ -33,4 +38,4 @@ stdenv.mkDerivation rec platforms = stdenv.lib.platforms.linux; maintainers = [ ]; }; -} \ No newline at end of file +} diff --git a/pkgs/development/libraries/libfaketime/no-date-in-gzip-man-page.patch b/pkgs/development/libraries/libfaketime/no-date-in-gzip-man-page.patch new file mode 100644 index 0000000000000..7b7e362fbf0f8 --- /dev/null +++ b/pkgs/development/libraries/libfaketime/no-date-in-gzip-man-page.patch @@ -0,0 +1,12 @@ +diff -ur libfaketime-0.9.5.orig/man/Makefile libfaketime-0.9.5/man/Makefile +--- libfaketime-0.9.5.orig/man/Makefile 2013-10-13 11:19:30.000000000 +0200 ++++ libfaketime-0.9.5/man/Makefile 2014-04-13 01:22:14.362296519 +0200 +@@ -6,7 +6,7 @@ + + install: + $(INSTALL) -Dm0644 faketime.1 "${DESTDIR}${PREFIX}/share/man/man1/faketime.1" +- gzip -f "${DESTDIR}${PREFIX}/share/man/man1/faketime.1" ++ gzip -9nf "${DESTDIR}${PREFIX}/share/man/man1/faketime.1" + + uninstall: + rm -f "${DESTDIR}${PREFIX}/share/man/man1/faketime.1.gz" From f82b30f68a52c045da38a12776c6d0d9ee4ca5cf Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Thu, 10 Apr 2014 13:45:26 +0200 Subject: [PATCH 11/40] perl-modules: Do not create perllocal.pod, for determinism. --- pkgs/development/perl-modules/generic/default.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/development/perl-modules/generic/default.nix b/pkgs/development/perl-modules/generic/default.nix index 96094ab4e5388..6cd4134cc9c41 100644 --- a/pkgs/development/perl-modules/generic/default.nix +++ b/pkgs/development/perl-modules/generic/default.nix @@ -11,6 +11,9 @@ perl.stdenv.mkDerivation ( # Prevent CPAN downloads. PERL_AUTOINSTALL = "--skipdeps"; + # Avoid creating perllocal.pod, which contains a timestamp + installTargets = "pure_install"; + # From http://wiki.cpantesters.org/wiki/CPANAuthorNotes: "allows # authors to skip certain tests (or include certain tests) when # the results are not being monitored by a human being." From 2919ceee0e88e105566a4dfed080b914f8263182 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Thu, 10 Apr 2014 13:46:15 +0200 Subject: [PATCH 12/40] Remove dates from kernel 3.10.35 --- .../linux/kernel/linux-3-10-35-no-dates.patch | 52 +++++++++++++++++++ pkgs/os-specific/linux/kernel/linux-3.10.nix | 11 +++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 pkgs/os-specific/linux/kernel/linux-3-10-35-no-dates.patch diff --git a/pkgs/os-specific/linux/kernel/linux-3-10-35-no-dates.patch b/pkgs/os-specific/linux/kernel/linux-3-10-35-no-dates.patch new file mode 100644 index 0000000000000..34cc454a4c2fe --- /dev/null +++ b/pkgs/os-specific/linux/kernel/linux-3-10-35-no-dates.patch @@ -0,0 +1,52 @@ +diff -ur linux-3.10.35.orig/drivers/mtd/nand/denali_pci.c linux-3.10.35/drivers/mtd/nand/denali_pci.c +--- linux-3.10.35.orig/drivers/mtd/nand/denali_pci.c 2014-03-31 18:58:38.000000000 +0200 ++++ linux-3.10.35/drivers/mtd/nand/denali_pci.c 2014-04-09 13:11:10.424424289 +0200 +@@ -132,7 +132,7 @@ + + static int denali_init_pci(void) + { +- pr_info("Spectra MTD driver built on %s @ %s\n", __DATE__, __TIME__); ++ pr_info("Spectra MTD driver\n"); + return pci_register_driver(&denali_pci_driver); + } + module_init(denali_init_pci); +diff -ur linux-3.10.35.orig/drivers/staging/csr/drv.c linux-3.10.35/drivers/staging/csr/drv.c +--- linux-3.10.35.orig/drivers/staging/csr/drv.c 2014-03-31 18:58:38.000000000 +0200 ++++ linux-3.10.35/drivers/staging/csr/drv.c 2014-04-09 13:15:25.923936184 +0200 +@@ -2104,9 +2104,8 @@ + { + int r; + +- printk("UniFi SDIO Driver: %s %s %s\n", +- CSR_WIFI_VERSION, +- __DATE__, __TIME__); ++ printk("UniFi SDIO Driver: %s\n", ++ CSR_WIFI_VERSION); + + #ifdef CSR_SME_USERSPACE + #ifdef CSR_SUPPORT_WEXT +diff -ur linux-3.10.35.orig/drivers/staging/csr/io.c linux-3.10.35/drivers/staging/csr/io.c +--- linux-3.10.35.orig/drivers/staging/csr/io.c 2014-03-31 18:58:38.000000000 +0200 ++++ linux-3.10.35/drivers/staging/csr/io.c 2014-04-09 13:15:45.603976856 +0200 +@@ -878,8 +878,8 @@ + if (!priv) + return 0; + +- seq_printf(m, "UniFi SDIO Driver: %s %s %s\n", +- CSR_WIFI_VERSION, __DATE__, __TIME__); ++ seq_printf(m, "UniFi SDIO Driver: %s\n", ++ CSR_WIFI_VERSION); + #ifdef CSR_SME_USERSPACE + seq_puts(m, "SME: CSR userspace "); + #ifdef CSR_SUPPORT_WEXT +diff -ur linux-3.10.35.orig/drivers/staging/rts5139/rts51x_scsi.c linux-3.10.35/drivers/staging/rts5139/rts51x_scsi.c +--- linux-3.10.35.orig/drivers/staging/rts5139/rts51x_scsi.c 2014-03-31 18:58:38.000000000 +0200 ++++ linux-3.10.35/drivers/staging/rts5139/rts51x_scsi.c 2014-04-09 13:14:21.906550886 +0200 +@@ -1985,7 +1985,6 @@ + SPRINTF(" Vendor: Realtek Corp.\n"); + SPRINTF(" Product: RTS51xx USB Card Reader\n"); + SPRINTF(" Version: %s\n", DRIVER_VERSION); +- SPRINTF(" Build: %s\n", __TIME__); + return 0; + } + diff --git a/pkgs/os-specific/linux/kernel/linux-3.10.nix b/pkgs/os-specific/linux/kernel/linux-3.10.nix index 8fa684e407cff..65d74fcbf1bd2 100644 --- a/pkgs/os-specific/linux/kernel/linux-3.10.nix +++ b/pkgs/os-specific/linux/kernel/linux-3.10.nix @@ -1,4 +1,11 @@ -{ stdenv, fetchurl, ... } @ args: +{ stdenv, fetchurl, kernelPatches ? [], ... } @ args: + +let + patches = kernelPatches ++ + [{ name = "remove-driver-compilation-dates"; + patch = ./linux-3-10-35-no-dates.patch; + }]; +in import ./generic.nix (args // rec { version = "3.10.53"; @@ -9,6 +16,8 @@ import ./generic.nix (args // rec { sha256 = "1sxa6ppgpy9fgj4lyj8d53y309v6r5nmifbrcf5pqs6l944frhq6"; }; + kernelPatches = patches; + features.iwlwifi = true; features.efiBootStub = true; features.needsCifsUtils = true; From c232efa244cb0ca38bba6392a7d5a88b609f9b92 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Thu, 10 Apr 2014 16:14:28 +0200 Subject: [PATCH 13/40] Add a fake date utility together with setup. --- pkgs/stdenv/generic/builder.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkgs/stdenv/generic/builder.sh b/pkgs/stdenv/generic/builder.sh index e1a8dc152a059..4722f3ce1009b 100644 --- a/pkgs/stdenv/generic/builder.sh +++ b/pkgs/stdenv/generic/builder.sh @@ -5,10 +5,22 @@ for i in $initialPath; do done mkdir $out +mkdir $out/bin echo "$preHook" > $out/setup cat "$setup" >> $out/setup +real_date=$(type -Pa date | sed 1d) + +if test -n "$real_date"; then + cat >$out/bin/date < Date: Thu, 10 Apr 2014 20:25:36 +0200 Subject: [PATCH 14/40] Fix typo/breakage in setup.sh --- pkgs/stdenv/generic/setup.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 58263e39e0b11..d0e41fb915918 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -104,8 +104,7 @@ fi # The following example sets the time to 1 for gcc and date # FAKETIME="1970-01-01\ 00:00:01" # FAKETIME_ONLY_CMDS="gcc,date" -if [ "$NIX_ENFORCE_PURITY" = "1" -a -n "@libfaketime@" -a - -n "$useFakeTime" ]; then +if [ "$NIX_ENFORCE_PURITY" = "1" -a -n "@libfaketime@" -a -n "$useFakeTime" ]; then makePreloads=(${makePreloads[@]} LD_PRELOAD=@libfaketime@/lib/libfaketime.so.1) fi From 36bba24214e49377dda6fbd99493d1e8d09aedd6 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Fri, 11 Apr 2014 02:36:03 +0200 Subject: [PATCH 15/40] Use real address for __DATE__ and __TIME__. --- pkgs/build-support/gcc-wrapper/gcc-wrapper.sh | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh b/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh index 3d7ae32a06688..33c14527f51a9 100644 --- a/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh +++ b/pkgs/build-support/gcc-wrapper/gcc-wrapper.sh @@ -88,10 +88,10 @@ extraBefore=() # When enforcing purity, pretend gcc can't find the current date and # time if test "$NIX_ENFORCE_PURITY" = "1"; then - extraAfter=(-D__DATE__=\"???-??-????\" - -D__TIME__=\"??:??:??\" + extraBefore=(-D__DATE__=\"Jan\ \ 1\ 1970\" + -D__TIME__=\"00:00:01\" -Wno-builtin-macro-redefined - "${extraAfter[@]}") + "${extraBefore[@]}") fi @@ -99,18 +99,18 @@ if test "$dontLink" != "1"; then # Add the flags that should only be passed to the compiler when # linking. - extraAfter=(${extraAfter[@]} $NIX_CFLAGS_LINK) + extraAfter=("${extraAfter[@]}" $NIX_CFLAGS_LINK) # Add the flags that should be passed to the linker (and prevent # `ld-wrapper' from adding NIX_LDFLAGS again). for i in $NIX_LDFLAGS_BEFORE; do - extraBefore=(${extraBefore[@]} "-Wl,$i") + extraBefore=("${extraBefore[@]}" "-Wl,$i") done for i in $NIX_LDFLAGS; do if test "${i:0:3}" = "-L/"; then - extraAfter=(${extraAfter[@]} "$i") + extraAfter=("${extraAfter[@]}" "$i") else - extraAfter=(${extraAfter[@]} "-Wl,$i") + extraAfter=("${extraAfter[@]}" "-Wl,$i") fi done export NIX_LDFLAGS_SET=1 @@ -132,11 +132,11 @@ if test "$NIX_DEBUG" = "1"; then echo " $i" >&2 done echo "extraBefore flags to @gccProg@:" >&2 - for i in ${extraBefore[@]}; do + for i in "${extraBefore[@]}"; do echo " $i" >&2 done echo "extraAfter flags to @gccProg@:" >&2 - for i in ${extraAfter[@]}; do + for i in "${extraAfter[@]}"; do echo " $i" >&2 done fi @@ -150,9 +150,9 @@ fi # `-B' flags, since they confuse some programs. Deep bash magic to # apply grep to stderr (by swapping stdin/stderr twice). if test -z "$NIX_GCC_NEEDS_GREP"; then - @gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} + @gccProg@ "${extraBefore[@]}" "${params[@]}" "${extraAfter[@]}" else - (@gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} 3>&2 2>&1 1>&3- \ + (@gccProg@ "${extraBefore[@]}" "${params[@]}" "${extraAfter[@]}" 3>&2 2>&1 1>&3- \ | (grep -v 'file path prefix' || true); exit ${PIPESTATUS[0]}) 3>&2 2>&1 1>&3- exit $? fi From 64ef7aaf03cfbd77ed4ff5de0593766e918179dc Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Fri, 11 Apr 2014 10:05:37 +0200 Subject: [PATCH 16/40] Remove libfaketime from propagatedUserEnvPkgs and propagatedNativeBuildInputs. --- pkgs/stdenv/generic/default.nix | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index 6289189ed52e0..aa9b3fbc14aab 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -64,7 +64,6 @@ let needsPax = result.isLinux && !skipPaxMarking; propagatedUserEnvPkgs = [gcc] ++ - lib.optionals (libfaketime != null) [libfaketime] ++ lib.filter lib.isDerivation initialPath; } @@ -122,8 +121,7 @@ let # Inputs built by the usual native compiler. nativeBuildInputs = nativeBuildInputs ++ lib.optionals (crossConfig == null) (buildInputs ++ extraBuildInputs) ++ lib.optionals (libfaketime != null) [libfaketime]; propagatedNativeBuildInputs = propagatedNativeBuildInputs ++ - lib.optionals (crossConfig == null) propagatedBuildInputs ++ - lib.optionals (libfaketime != null) [libfaketime]; + lib.optionals (crossConfig == null) propagatedBuildInputs; }))) ( { # The meta attribute is passed in the resulting attribute set, From 673415edf8e44817a22447144de91a5b7ec4a7fc Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Fri, 11 Apr 2014 10:06:07 +0200 Subject: [PATCH 17/40] When useFakeTime, set FAKETIME unless set. --- pkgs/stdenv/generic/setup.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index d0e41fb915918..0e7bfd656de7b 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -105,7 +105,14 @@ fi # FAKETIME="1970-01-01\ 00:00:01" # FAKETIME_ONLY_CMDS="gcc,date" if [ "$NIX_ENFORCE_PURITY" = "1" -a -n "@libfaketime@" -a -n "$useFakeTime" ]; then - makePreloads=(${makePreloads[@]} LD_PRELOAD=@libfaketime@/lib/libfaketime.so.1) + makePreloads=("${makePreloads[@]}" LD_PRELOAD=@libfaketime@/lib/libfaketime.so.1) + if [ -z "$FAKETIME" ]; then + export FAKETIME="1970-01-01 00:00:01" + fi + echo "using libfaketime: FAKETIME_SKIP_CMDS:'$FAKETIME_SKIP_CMDS'" + echo "using libfaketime: FAKETIME_ONLY_CMDS:'$FAKETIME_ONLY_CMDS'" + echo "using libfaketime: FAKETIME_ONLY_CMDS:'$FAKETIME_ONLY_CMDS'" + echo "using libfaketime: FAKETIME:'$FAKETIME'" fi # Execute the pre-hook. From 139262e8029153794cd4fc75aaad965badd3af61 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Fri, 11 Apr 2014 10:07:07 +0200 Subject: [PATCH 18/40] Add useFakeTime for python, groff, kernel. --- pkgs/development/interpreters/python/2.7/default.nix | 2 +- pkgs/os-specific/linux/kernel/generic.nix | 1 + pkgs/tools/text/groff/default.nix | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/development/interpreters/python/2.7/default.nix b/pkgs/development/interpreters/python/2.7/default.nix index 05fb8134f854e..8e01ec994f04d 100644 --- a/pkgs/development/interpreters/python/2.7/default.nix +++ b/pkgs/development/interpreters/python/2.7/default.nix @@ -73,7 +73,7 @@ let NIX_CFLAGS_COMPILE = optionalString stdenv.isDarwin "-msse2"; DETERMINISTIC_BUILD = 1; - + useFakeTime = 1; setupHook = ./setup-hook.sh; postInstall = diff --git a/pkgs/os-specific/linux/kernel/generic.nix b/pkgs/os-specific/linux/kernel/generic.nix index 13250e45494fc..800af8355e301 100644 --- a/pkgs/os-specific/linux/kernel/generic.nix +++ b/pkgs/os-specific/linux/kernel/generic.nix @@ -57,6 +57,7 @@ let autoModules = stdenv.platform.kernelAutoModules; arch = stdenv.platform.kernelArch; + useFakeTime = 1; crossAttrs = let cp = stdenv.cross.platform; in { diff --git a/pkgs/tools/text/groff/default.nix b/pkgs/tools/text/groff/default.nix index cd1d719bdaf5b..99c191fdc3ae1 100644 --- a/pkgs/tools/text/groff/default.nix +++ b/pkgs/tools/text/groff/default.nix @@ -28,6 +28,7 @@ stdenv.mkDerivation rec { ''; }; + useFakeTime = 1; postInstall = '' # Remove example output with (random?) colors to # avoid non-determinism in the output From 67a921d2a0c627893b12b3a9cf894dd8ce2c3ab0 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Fri, 11 Apr 2014 15:04:53 +0200 Subject: [PATCH 19/40] Do not introduce indeterminism when compressing initrd. --- pkgs/top-level/all-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index ee93b6626bf15..4e8cd35358d01 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -366,7 +366,7 @@ let inherit lib; }; - makeInitrd = {contents, compressor ? "gzip -9"}: + makeInitrd = {contents, compressor ? "gzip -9n"}: import ../build-support/kernel/make-initrd.nix { inherit stdenv perl perlArchiveCpio cpio contents ubootChooser compressor; }; From 62f00195fce20b946e0bb40ddb2005d7db006091 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:10:15 +0200 Subject: [PATCH 20/40] Fix non-deterministic id-generation for the nixos-manual. --- nixos/doc/manual/default.nix | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/nixos/doc/manual/default.nix b/nixos/doc/manual/default.nix index 47e01437ccc41..085299ba9cb5c 100644 --- a/nixos/doc/manual/default.nix +++ b/nixos/doc/manual/default.nix @@ -55,7 +55,7 @@ in rec { inherit sources; - buildInputs = [ libxml2 libxslt ]; + buildInputs = [ libxml2 libxslt perl ]; buildCommand = '' ${copySources} @@ -83,6 +83,21 @@ in rec { --nonet --xinclude --output $dst/ \ ${docbook5_xsl}/xml/xsl/docbook/xhtml/chunkfast.xsl ./manual.xml + # Fix the non-deterministic id-generation used by xsltproc + # !!! Move this somewhere else + perl -0777 -pi -e ' + # xsltproc html output id remapping + # pretty weird that xsltproc cannot do this + # Author: Alexander Kjeldaas + my @parts = split(/(href="#|id="|href="#ftn.|id="ftn.)(id.\d+")/g, $_); + my %remap = {}; + for (my $i = 0; $i < @parts; $i += 3) { + my $id = @parts[ $i+2 ]; + $remap{$id} = $i unless exists $remap{$id}; + @parts[ $i+2 ] = "idp$remap{$id}\""; + } + $_ = join "", @parts; ' $dst/manual.html + mkdir -p $dst/images/callouts cp ${docbook5_xsl}/xml/xsl/docbook/images/callouts/*.gif $dst/images/callouts/ From dc2fe8335e62a9a7d2ae557396d4a22fbc7c56cb Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:11:45 +0200 Subject: [PATCH 21/40] Make python 2.7 deterministic. Unfortunately this kills the wininst feature as I could not figure out how to get the .exe files deterministic. --- pkgs/development/interpreters/python/2.7/default.nix | 8 ++++++++ .../interpreters/python/2.7/no-time-wininst.patch | 12 ++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 pkgs/development/interpreters/python/2.7/no-time-wininst.patch diff --git a/pkgs/development/interpreters/python/2.7/default.nix b/pkgs/development/interpreters/python/2.7/default.nix index 8e01ec994f04d..d8ac3fb22019b 100644 --- a/pkgs/development/interpreters/python/2.7/default.nix +++ b/pkgs/development/interpreters/python/2.7/default.nix @@ -19,6 +19,9 @@ let [ # Look in C_INCLUDE_PATH and LIBRARY_PATH for stuff. ./search-path.patch + # No time in the bdist wininst + ./no-time-wininst.patch + # Python recompiles a Python if the mtime stored *in* the # pyc/pyo file differs from the mtime of the source file. This # doesn't work in Nix because Nix changes the mtime of files in @@ -84,6 +87,11 @@ let ln -s $out/share/man/man1/{python2.7.1.gz,python.1.gz} paxmark E $out/bin/python${majorVersion} + # !!! This is a stopgap measure for getting deterministic builds. + # It disables creation of windows installers and the lib2to3 which + # can rewrite python2-programs to python3. + rm $out/lib/python${majorVersion}/distutils/command/wininst-*.exe + rm $out/lib/python${majorVersion}/lib2to3/Grammar2.7.6.final.0.pickle ''; passthru = rec { diff --git a/pkgs/development/interpreters/python/2.7/no-time-wininst.patch b/pkgs/development/interpreters/python/2.7/no-time-wininst.patch new file mode 100644 index 0000000000000..ccac20386fe0f --- /dev/null +++ b/pkgs/development/interpreters/python/2.7/no-time-wininst.patch @@ -0,0 +1,12 @@ +diff -ur Python-2.7.6.orig/Lib/distutils/command/bdist_wininst.py Python-2.7.6/Lib/distutils/command/bdist_wininst.py +--- Python-2.7.6.orig/Lib/distutils/command/bdist_wininst.py 2013-11-10 08:36:40.000000000 +0100 ++++ Python-2.7.6/Lib/distutils/command/bdist_wininst.py 2014-04-11 14:49:49.789235982 +0200 +@@ -245,7 +245,7 @@ + import time + import distutils + build_info = "Built %s with distutils-%s" % \ +- (time.ctime(time.time()), distutils.__version__) ++ (time.ctime(0), distutils.__version__) + lines.append("build_info=%s" % build_info) + return string.join(lines, "\n") + From 969208bb85513a97980c82e239a6fa3e30fd16c8 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:12:48 +0200 Subject: [PATCH 22/40] Make apr-util deterministic. --- pkgs/development/libraries/apr-util/default.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkgs/development/libraries/apr-util/default.nix b/pkgs/development/libraries/apr-util/default.nix index 229529f08cecf..d427d5e21502f 100644 --- a/pkgs/development/libraries/apr-util/default.nix +++ b/pkgs/development/libraries/apr-util/default.nix @@ -35,6 +35,11 @@ stdenv.mkDerivation rec { # Give apr1 access to sed for runtime invocations postInstall = '' + # Determinism changes + sed -i -e 's/APU_SOURCE_DIR=".*"/APU_SOURCE_DIR="unknown"/g' \ + -e 's/APU_BUILD_DIR=".*"/APU_BUILD_DIR="unknown"/g' \ + $out/bin/apu-1-config + wrapProgram $out/bin/apu-1-config --prefix PATH : "${gnused}/bin" ''; From 4b78a5b5fb8584347999832b3c67d1276488140b Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:13:20 +0200 Subject: [PATCH 23/40] Make the system tarball deterministic. --- nixos/lib/make-system-tarball.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nixos/lib/make-system-tarball.sh b/nixos/lib/make-system-tarball.sh index 2eb668115a6ff..c68e3ea75e50b 100644 --- a/nixos/lib/make-system-tarball.sh +++ b/nixos/lib/make-system-tarball.sh @@ -50,7 +50,12 @@ done mkdir -p $out/tarball -tar cvJf $out/tarball/$fileName.tar.xz * $extraArgs + +rm ./env-vars + +find * ! -type d -print0 | sort -z | + tar -cv --mtime='1970-01-01' -T- --null -f- $extraArgs | + xz -c > $out/tarball/$fileName.tar.xz mkdir -p $out/nix-support echo $system > $out/nix-support/system From 15cb459727a9325edd57702c362efd812168ccde Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:16:19 +0200 Subject: [PATCH 24/40] Not patching elf binaries result in non-deterministic builds. I have no idea why dontPatchELF was set. If it was not important enough to comment on it might have been a spurious issue. --- pkgs/development/libraries/openldap/default.nix | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkgs/development/libraries/openldap/default.nix b/pkgs/development/libraries/openldap/default.nix index 01a4e2e21daf2..7d87034fe4a6b 100644 --- a/pkgs/development/libraries/openldap/default.nix +++ b/pkgs/development/libraries/openldap/default.nix @@ -16,8 +16,6 @@ stdenv.mkDerivation rec { ] ++ stdenv.lib.optional (openssl == null) "--without-tls" ++ stdenv.lib.optional (cyrus_sasl == null) "--without-cyrus-sasl"; - dontPatchELF = 1; # !!! - meta = with stdenv.lib; { homepage = http://www.openldap.org/; description = "An open source implementation of the Lightweight Directory Access Protocol"; From d6eefe62244407e33ab5c382d8999932750e507f Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:17:48 +0200 Subject: [PATCH 25/40] Fix date in version string. ntp cannot be safely built with useFakeTime because the version construction system detects how many times the version string is constructed, and it can be constructed more than once when the time is fixed by libfaketime. --- pkgs/tools/networking/ntp/default.nix | 5 +++++ .../ntp/fixed-date-in-version-string.patch | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 pkgs/tools/networking/ntp/fixed-date-in-version-string.patch diff --git a/pkgs/tools/networking/ntp/default.nix b/pkgs/tools/networking/ntp/default.nix index 465f15184f143..1f9c01f501bbc 100644 --- a/pkgs/tools/networking/ntp/default.nix +++ b/pkgs/tools/networking/ntp/default.nix @@ -16,6 +16,11 @@ stdenv.mkDerivation rec { ''; buildInputs = stdenv.lib.optional stdenv.isLinux libcap; + # Do not useFakeTime here, as this can create indeterminism + # in the version string, because ntp records how many times a + # certain file is regenerated, and with libfaketime it can + # happen more than once. + patches = [ ./fixed-date-in-version-string.patch ]; meta = { homepage = http://www.ntp.org/; diff --git a/pkgs/tools/networking/ntp/fixed-date-in-version-string.patch b/pkgs/tools/networking/ntp/fixed-date-in-version-string.patch new file mode 100644 index 0000000000000..b9f3545edf610 --- /dev/null +++ b/pkgs/tools/networking/ntp/fixed-date-in-version-string.patch @@ -0,0 +1,12 @@ +diff -ur ntp-4.2.6p5.orig/scripts/mkver.in ntp-4.2.6p5/scripts/mkver.in +--- ntp-4.2.6p5.orig/scripts/mkver.in 2010-01-24 11:01:47.000000000 +0100 ++++ ntp-4.2.6p5/scripts/mkver.in 2014-04-13 00:01:02.262030824 +0200 +@@ -17,7 +17,7 @@ + *) ConfStr="${ConfStr}-?" ;; + esac + +-ConfStr="$ConfStr `LC_TIME=C TZ=UTC date`" ++ConfStr="${ConfStr}Thu Jan 1 00:00:01 UTC 1970" + + if [ ! -f .version ]; then + echo 0 > .version From fd1101ab949606f1c2b808432aa15329200321ab Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:18:28 +0200 Subject: [PATCH 26/40] Make smartmontools deterministic. --- pkgs/tools/system/smartmontools/default.nix | 6 +++++- .../system/smartmontools/no-dates-in-binary.patch | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 pkgs/tools/system/smartmontools/no-dates-in-binary.patch diff --git a/pkgs/tools/system/smartmontools/default.nix b/pkgs/tools/system/smartmontools/default.nix index 0290d1961ce53..61150b127036d 100644 --- a/pkgs/tools/system/smartmontools/default.nix +++ b/pkgs/tools/system/smartmontools/default.nix @@ -16,11 +16,15 @@ stdenv.mkDerivation rec { sha256 = "0nq6jvfh8nqwfrvp6fb6qs2rdydi3i9xgpi7p7vb83xvg42ncvs8"; }; - patchPhase = '' + prePatch = '' : cp ${driverdb} drivedb.h sed -i -e 's@which which >/dev/null || exit 1@alias which="type -p"@' update-smart-drivedb.in ''; + patches = [ ./no-dates-in-binary.patch ]; + + useFakeTime = 1; + meta = { description = "Tools for monitoring the health of hard drivers"; homepage = "http://smartmontools.sourceforge.net/"; diff --git a/pkgs/tools/system/smartmontools/no-dates-in-binary.patch b/pkgs/tools/system/smartmontools/no-dates-in-binary.patch new file mode 100644 index 0000000000000..4ccad7c50de07 --- /dev/null +++ b/pkgs/tools/system/smartmontools/no-dates-in-binary.patch @@ -0,0 +1,12 @@ +diff -ur smartmontools-6.2.orig/configure smartmontools-6.2/configure +--- smartmontools-6.2.orig/configure 2013-07-26 19:39:04.000000000 +0200 ++++ smartmontools-6.2/configure 2014-04-12 17:30:57.023293078 +0200 +@@ -2390,6 +2390,8 @@ + + + smartmontools_configure_date=`date -u +'%Y-%m-%d %T %Z'` ++smartmontools_configure_date="1970-01-01 00:00:01 UTC" ++ + smartmontools_cvs_tag=`echo '$Id: configure.ac 3841 2013-07-26 17:38:57Z chrfranke $'` + smartmontools_release_date=2013-07-26 + smartmontools_release_time="17:38:20 UTC" From 5b814578d371c527a8cef5695bcf335a2503fcee Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 00:20:58 +0200 Subject: [PATCH 27/40] Set useFakeTime on a set of derivations. This might not be the best of ideas as this can cause build problems. However, it makes the build deterministic for now. --- pkgs/development/libraries/icu/default.nix | 1 + .../libraries/libjpeg-turbo/default.nix | 2 + pkgs/development/libraries/nspr/default.nix | 1 + .../linux/cpufrequtils/default.nix | 1 + pkgs/os-specific/linux/iputils/default.nix | 2 + pkgs/os-specific/linux/kexectools/default.nix | 2 + pkgs/servers/x11/xorg/default.nix | 70 +++++++++++++++++++ 7 files changed, 79 insertions(+) diff --git a/pkgs/development/libraries/icu/default.nix b/pkgs/development/libraries/icu/default.nix index a029eab6f1218..f22a0845df2fd 100644 --- a/pkgs/development/libraries/icu/default.nix +++ b/pkgs/development/libraries/icu/default.nix @@ -34,6 +34,7 @@ stdenv.mkDerivation { stdenv.lib.optionalString stdenv.isDarwin " --enable-rpath"; enableParallelBuilding = true; + useFakeTime = 1; meta = { description = "Unicode and globalization support library"; diff --git a/pkgs/development/libraries/libjpeg-turbo/default.nix b/pkgs/development/libraries/libjpeg-turbo/default.nix index bf27e074dd58b..076d366dd8502 100644 --- a/pkgs/development/libraries/libjpeg-turbo/default.nix +++ b/pkgs/development/libraries/libjpeg-turbo/default.nix @@ -13,6 +13,8 @@ stdenv.mkDerivation rec { doCheck = true; checkTarget = "test"; + useFakeTime = 1; + meta = { homepage = http://libjpeg-turbo.virtualgl.org/; description = "A faster (using SIMD) libjpeg implementation"; diff --git a/pkgs/development/libraries/nspr/default.nix b/pkgs/development/libraries/nspr/default.nix index 0355ce25c62cf..6531e915f1a8d 100644 --- a/pkgs/development/libraries/nspr/default.nix +++ b/pkgs/development/libraries/nspr/default.nix @@ -20,6 +20,7 @@ stdenv.mkDerivation { ''; enableParallelBuilding = true; + useFakeTime = 1; meta = { homepage = http://www.mozilla.org/projects/nspr/; diff --git a/pkgs/os-specific/linux/cpufrequtils/default.nix b/pkgs/os-specific/linux/cpufrequtils/default.nix index d056e60f2da37..eb431683308af 100644 --- a/pkgs/os-specific/linux/cpufrequtils/default.nix +++ b/pkgs/os-specific/linux/cpufrequtils/default.nix @@ -21,6 +21,7 @@ stdenv.mkDerivation rec { -i Makefile ''; + useFakeTime = 1; buildInputs = [ stdenv.gcc.libc.kernelHeaders libtool gettext ]; meta = { diff --git a/pkgs/os-specific/linux/iputils/default.nix b/pkgs/os-specific/linux/iputils/default.nix index 5ca3a6a0a5c76..d0293d99f768d 100644 --- a/pkgs/os-specific/linux/iputils/default.nix +++ b/pkgs/os-specific/linux/iputils/default.nix @@ -27,6 +27,8 @@ stdenv.mkDerivation rec { # Stdenv doesn't handle symlinks well for that dontGzipMan = true; + useFakeTime = 1; + installPhase = '' mkdir -p $out/sbin $out/bin diff --git a/pkgs/os-specific/linux/kexectools/default.nix b/pkgs/os-specific/linux/kexectools/default.nix index 09594a5c59eb3..4b322b8967b64 100644 --- a/pkgs/os-specific/linux/kexectools/default.nix +++ b/pkgs/os-specific/linux/kexectools/default.nix @@ -10,6 +10,8 @@ stdenv.mkDerivation rec { buildInputs = [ zlib ]; + useFakeTime = 1; + meta = { homepage = http://horms.net/projects/kexec/kexec-tools; description = "Tools related to the kexec Linux feature"; diff --git a/pkgs/servers/x11/xorg/default.nix b/pkgs/servers/x11/xorg/default.nix index c4dfa983f55fc..b1d2ba513c483 100644 --- a/pkgs/servers/x11/xorg/default.nix +++ b/pkgs/servers/x11/xorg/default.nix @@ -17,6 +17,7 @@ let applewmproto = (mkDerivation "applewmproto" { name = "applewmproto-1.4.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/applewmproto-1.4.2.tar.bz2; sha256 = "1zi4p07mp6jmk030p4gmglwxcwp0lzs5mi31y1b4rp8lsqxdxizw"; @@ -27,6 +28,7 @@ let bdftopcf = (mkDerivation "bdftopcf" { name = "bdftopcf-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/app/bdftopcf-1.0.4.tar.bz2; sha256 = "1617zmgnx50n7vxlqyj84fl7vnk813jjqmi6jpigyz1xp9br1xga"; @@ -37,6 +39,7 @@ let bigreqsproto = (mkDerivation "bigreqsproto" { name = "bigreqsproto-1.1.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/bigreqsproto-1.1.2.tar.bz2; sha256 = "07hvfm84scz8zjw14riiln2v4w03jlhp756ypwhq27g48jmic8a6"; @@ -47,6 +50,7 @@ let compositeproto = (mkDerivation "compositeproto" { name = "compositeproto-0.4.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/compositeproto-0.4.2.tar.bz2; sha256 = "1z0crmf669hirw4s7972mmp8xig80kfndja9h559haqbpvq5k4q4"; @@ -57,6 +61,7 @@ let damageproto = (mkDerivation "damageproto" { name = "damageproto-1.2.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/damageproto-1.2.1.tar.bz2; sha256 = "0nzwr5pv9hg7c21n995pdiv0zqhs91yz3r8rn3aska4ykcp12z2w"; @@ -67,6 +72,7 @@ let dmxproto = (mkDerivation "dmxproto" { name = "dmxproto-2.3.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/dmxproto-2.3.1.tar.bz2; sha256 = "02b5x9dkgajizm8dqyx2w6hmqx3v25l67mgf35nj6sz0lgk52877"; @@ -77,6 +83,7 @@ let dri2proto = (mkDerivation "dri2proto" { name = "dri2proto-2.8"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/proto/dri2proto-2.8.tar.bz2; sha256 = "015az1vfdqmil1yay5nlsmpf6cf7vcbpslxjb72cfkzlvrv59dgr"; @@ -87,6 +94,7 @@ let dri3proto = (mkDerivation "dri3proto" { name = "dri3proto-1.0"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/proto/dri3proto-1.0.tar.bz2; sha256 = "0x609xvnl8jky5m8jdklw4nymx3irkv32w99dfd8nl800bblkgh1"; @@ -97,6 +105,7 @@ let encodings = (mkDerivation "encodings" { name = "encodings-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/encodings-1.0.4.tar.bz2; sha256 = "0ffmaw80vmfwdgvdkp6495xgsqszb6s0iira5j0j6pd4i0lk3mnf"; @@ -107,6 +116,7 @@ let fixesproto = (mkDerivation "fixesproto" { name = "fixesproto-5.0"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/fixesproto-5.0.tar.bz2; sha256 = "1ki4wiq2iivx5g4w5ckzbjbap759kfqd72yg18m3zpbb4hqkybxs"; @@ -117,6 +127,7 @@ let fontadobe100dpi = (mkDerivation "fontadobe100dpi" { name = "font-adobe-100dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-adobe-100dpi-1.0.3.tar.bz2; sha256 = "0m60f5bd0caambrk8ksknb5dks7wzsg7g7xaf0j21jxmx8rq9h5j"; @@ -127,6 +138,7 @@ let fontadobe75dpi = (mkDerivation "fontadobe75dpi" { name = "font-adobe-75dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-adobe-75dpi-1.0.3.tar.bz2; sha256 = "02advcv9lyxpvrjv8bjh1b797lzg6jvhipclz49z8r8y98g4l0n6"; @@ -137,6 +149,7 @@ let fontadobeutopia100dpi = (mkDerivation "fontadobeutopia100dpi" { name = "font-adobe-utopia-100dpi-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-adobe-utopia-100dpi-1.0.4.tar.bz2; sha256 = "19dd9znam1ah72jmdh7i6ny2ss2r6m21z9v0l43xvikw48zmwvyi"; @@ -147,6 +160,7 @@ let fontadobeutopia75dpi = (mkDerivation "fontadobeutopia75dpi" { name = "font-adobe-utopia-75dpi-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-adobe-utopia-75dpi-1.0.4.tar.bz2; sha256 = "152wigpph5wvl4k9m3l4mchxxisgsnzlx033mn5iqrpkc6f72cl7"; @@ -157,6 +171,7 @@ let fontadobeutopiatype1 = (mkDerivation "fontadobeutopiatype1" { name = "font-adobe-utopia-type1-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-adobe-utopia-type1-1.0.4.tar.bz2; sha256 = "0xw0pdnzj5jljsbbhakc6q9ha2qnca1jr81zk7w70yl9bw83b54p"; @@ -167,6 +182,7 @@ let fontalias = (mkDerivation "fontalias" { name = "font-alias-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-alias-1.0.3.tar.bz2; sha256 = "16ic8wfwwr3jicaml7b5a0sk6plcgc1kg84w02881yhwmqm3nicb"; @@ -177,6 +193,7 @@ let fontarabicmisc = (mkDerivation "fontarabicmisc" { name = "font-arabic-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-arabic-misc-1.0.3.tar.bz2; sha256 = "1x246dfnxnmflzf0qzy62k8jdpkb6jkgspcjgbk8jcq9lw99npah"; @@ -187,6 +204,7 @@ let fontbh100dpi = (mkDerivation "fontbh100dpi" { name = "font-bh-100dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bh-100dpi-1.0.3.tar.bz2; sha256 = "10cl4gm38dw68jzln99ijix730y7cbx8np096gmpjjwff1i73h13"; @@ -197,6 +215,7 @@ let fontbh75dpi = (mkDerivation "fontbh75dpi" { name = "font-bh-75dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bh-75dpi-1.0.3.tar.bz2; sha256 = "073jmhf0sr2j1l8da97pzsqj805f7mf9r2gy92j4diljmi8sm1il"; @@ -207,6 +226,7 @@ let fontbhlucidatypewriter100dpi = (mkDerivation "fontbhlucidatypewriter100dpi" { name = "font-bh-lucidatypewriter-100dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bh-lucidatypewriter-100dpi-1.0.3.tar.bz2; sha256 = "1fqzckxdzjv4802iad2fdrkpaxl4w0hhs9lxlkyraq2kq9ik7a32"; @@ -217,6 +237,7 @@ let fontbhlucidatypewriter75dpi = (mkDerivation "fontbhlucidatypewriter75dpi" { name = "font-bh-lucidatypewriter-75dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bh-lucidatypewriter-75dpi-1.0.3.tar.bz2; sha256 = "0cfbxdp5m12cm7jsh3my0lym9328cgm7fa9faz2hqj05wbxnmhaa"; @@ -227,6 +248,7 @@ let fontbhttf = (mkDerivation "fontbhttf" { name = "font-bh-ttf-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bh-ttf-1.0.3.tar.bz2; sha256 = "0pyjmc0ha288d4i4j0si4dh3ncf3jiwwjljvddrb0k8v4xiyljqv"; @@ -237,6 +259,7 @@ let fontbhtype1 = (mkDerivation "fontbhtype1" { name = "font-bh-type1-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bh-type1-1.0.3.tar.bz2; sha256 = "1hb3iav089albp4sdgnlh50k47cdjif9p4axm0kkjvs8jyi5a53n"; @@ -247,6 +270,7 @@ let fontbitstream100dpi = (mkDerivation "fontbitstream100dpi" { name = "font-bitstream-100dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bitstream-100dpi-1.0.3.tar.bz2; sha256 = "1kmn9jbck3vghz6rj3bhc3h0w6gh0qiaqm90cjkqsz1x9r2dgq7b"; @@ -257,6 +281,7 @@ let fontbitstream75dpi = (mkDerivation "fontbitstream75dpi" { name = "font-bitstream-75dpi-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bitstream-75dpi-1.0.3.tar.bz2; sha256 = "13plbifkvfvdfym6gjbgy9wx2xbdxi9hfrl1k22xayy02135wgxs"; @@ -267,6 +292,7 @@ let fontbitstreamtype1 = (mkDerivation "fontbitstreamtype1" { name = "font-bitstream-type1-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-bitstream-type1-1.0.3.tar.bz2; sha256 = "1256z0jhcf5gbh1d03593qdwnag708rxqa032izmfb5dmmlhbsn6"; @@ -277,6 +303,7 @@ let fontcronyxcyrillic = (mkDerivation "fontcronyxcyrillic" { name = "font-cronyx-cyrillic-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-cronyx-cyrillic-1.0.3.tar.bz2; sha256 = "0ai1v4n61k8j9x2a1knvfbl2xjxk3xxmqaq3p9vpqrspc69k31kf"; @@ -287,6 +314,7 @@ let fontcursormisc = (mkDerivation "fontcursormisc" { name = "font-cursor-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-cursor-misc-1.0.3.tar.bz2; sha256 = "0dd6vfiagjc4zmvlskrbjz85jfqhf060cpys8j0y1qpcbsrkwdhp"; @@ -297,6 +325,7 @@ let fontdaewoomisc = (mkDerivation "fontdaewoomisc" { name = "font-daewoo-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-daewoo-misc-1.0.3.tar.bz2; sha256 = "1s2bbhizzgbbbn5wqs3vw53n619cclxksljvm759h9p1prqdwrdw"; @@ -307,6 +336,7 @@ let fontdecmisc = (mkDerivation "fontdecmisc" { name = "font-dec-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-dec-misc-1.0.3.tar.bz2; sha256 = "0yzza0l4zwyy7accr1s8ab7fjqkpwggqydbm2vc19scdby5xz7g1"; @@ -317,6 +347,7 @@ let fontibmtype1 = (mkDerivation "fontibmtype1" { name = "font-ibm-type1-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-ibm-type1-1.0.3.tar.bz2; sha256 = "1pyjll4adch3z5cg663s6vhi02k8m6488f0mrasg81ssvg9jinzx"; @@ -327,6 +358,7 @@ let fontisasmisc = (mkDerivation "fontisasmisc" { name = "font-isas-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-isas-misc-1.0.3.tar.bz2; sha256 = "0rx8q02rkx673a7skkpnvfkg28i8gmqzgf25s9yi0lar915sn92q"; @@ -337,6 +369,7 @@ let fontjismisc = (mkDerivation "fontjismisc" { name = "font-jis-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-jis-misc-1.0.3.tar.bz2; sha256 = "0rdc3xdz12pnv951538q6wilx8mrdndpkphpbblszsv7nc8cw61b"; @@ -347,6 +380,7 @@ let fontmicromisc = (mkDerivation "fontmicromisc" { name = "font-micro-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-micro-misc-1.0.3.tar.bz2; sha256 = "1dldxlh54zq1yzfnrh83j5vm0k4ijprrs5yl18gm3n9j1z0q2cws"; @@ -357,6 +391,7 @@ let fontmisccyrillic = (mkDerivation "fontmisccyrillic" { name = "font-misc-cyrillic-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-misc-cyrillic-1.0.3.tar.bz2; sha256 = "0q2ybxs8wvylvw95j6x9i800rismsmx4b587alwbfqiw6biy63z4"; @@ -367,6 +402,7 @@ let fontmiscethiopic = (mkDerivation "fontmiscethiopic" { name = "font-misc-ethiopic-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-misc-ethiopic-1.0.3.tar.bz2; sha256 = "19cq7iq0pfad0nc2v28n681fdq3fcw1l1hzaq0wpkgpx7bc1zjsk"; @@ -377,6 +413,7 @@ let fontmiscmeltho = (mkDerivation "fontmiscmeltho" { name = "font-misc-meltho-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-misc-meltho-1.0.3.tar.bz2; sha256 = "148793fqwzrc3bmh2vlw5fdiwjc2n7vs25cic35gfp452czk489p"; @@ -387,6 +424,7 @@ let fontmiscmisc = (mkDerivation "fontmiscmisc" { name = "font-misc-misc-1.1.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-misc-misc-1.1.2.tar.bz2; sha256 = "150pq6n8n984fah34n3k133kggn9v0c5k07igv29sxp1wi07krxq"; @@ -397,6 +435,7 @@ let fontmuttmisc = (mkDerivation "fontmuttmisc" { name = "font-mutt-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-mutt-misc-1.0.3.tar.bz2; sha256 = "13qghgr1zzpv64m0p42195k1kc77pksiv059fdvijz1n6kdplpxx"; @@ -407,6 +446,7 @@ let fontschumachermisc = (mkDerivation "fontschumachermisc" { name = "font-schumacher-misc-1.1.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-schumacher-misc-1.1.2.tar.bz2; sha256 = "0nkym3n48b4v36y4s927bbkjnsmicajarnf6vlp7wxp0as304i74"; @@ -417,6 +457,7 @@ let fontscreencyrillic = (mkDerivation "fontscreencyrillic" { name = "font-screen-cyrillic-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-screen-cyrillic-1.0.4.tar.bz2; sha256 = "0yayf1qlv7irf58nngddz2f1q04qkpr5jwp4aja2j5gyvzl32hl2"; @@ -427,6 +468,7 @@ let fontsonymisc = (mkDerivation "fontsonymisc" { name = "font-sony-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-sony-misc-1.0.3.tar.bz2; sha256 = "1xfgcx4gsgik5mkgkca31fj3w72jw9iw76qyrajrsz1lp8ka6hr0"; @@ -437,6 +479,7 @@ let fontsproto = (mkDerivation "fontsproto" { name = "fontsproto-2.1.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/fontsproto-2.1.2.tar.bz2; sha256 = "1ab8mbqxdwvdz4k5x4xb9c4n5w7i1xw276cbpk4z7a1nlpjrg746"; @@ -447,6 +490,7 @@ let fontsunmisc = (mkDerivation "fontsunmisc" { name = "font-sun-misc-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-sun-misc-1.0.3.tar.bz2; sha256 = "1q6jcqrffg9q5f5raivzwx9ffvf7r11g6g0b125na1bhpz5ly7s8"; @@ -457,6 +501,7 @@ let fontutil = (mkDerivation "fontutil" { name = "font-util-1.3.0"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-util-1.3.0.tar.bz2; sha256 = "15cijajwhjzpy3ydc817zz8x5z4gbkyv3fps687jbq544mbfbafz"; @@ -467,6 +512,7 @@ let fontwinitzkicyrillic = (mkDerivation "fontwinitzkicyrillic" { name = "font-winitzki-cyrillic-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-winitzki-cyrillic-1.0.3.tar.bz2; sha256 = "181n1bgq8vxfxqicmy1jpm1hnr6gwn1kdhl6hr4frjigs1ikpldb"; @@ -477,6 +523,7 @@ let fontxfree86type1 = (mkDerivation "fontxfree86type1" { name = "font-xfree86-type1-1.0.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/font-xfree86-type1-1.0.4.tar.bz2; sha256 = "0jp3zc0qfdaqfkgzrb44vi9vi0a8ygb35wp082yz7rvvxhmg9sya"; @@ -487,6 +534,7 @@ let gccmakedep = (mkDerivation "gccmakedep" { name = "gccmakedep-1.0.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/util/gccmakedep-1.0.3.tar.bz2; sha256 = "1r1fpy5ni8chbgx7j5sz0008fpb6vbazpy1nifgdhgijyzqxqxdj"; @@ -497,6 +545,7 @@ let glamoregl = (mkDerivation "glamoregl" { name = "glamor-egl-0.6.0"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/driver/glamor-egl-0.6.0.tar.bz2; sha256 = "1jg5clihklb9drh1jd7nhhdsszla6nv7xmbvm8yvakh5wrb1nlv6"; @@ -507,6 +556,7 @@ let glproto = (mkDerivation "glproto" { name = "glproto-1.4.17"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/proto/glproto-1.4.17.tar.bz2; sha256 = "0h5ykmcddwid5qj6sbrszgkcypwn3mslvswxpgy2n2iixnyr9amd"; @@ -517,6 +567,7 @@ let iceauth = (mkDerivation "iceauth" { name = "iceauth-1.0.6"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/app/iceauth-1.0.6.tar.bz2; sha256 = "1x72y99dxf2fxnlyf0yrf9yzd8xzimxshy6l8mprwhrv6lvhi6dx"; @@ -527,6 +578,7 @@ let imake = (mkDerivation "imake" { name = "imake-1.0.7"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/util/imake-1.0.7.tar.bz2; sha256 = "0zpk8p044jh14bis838shbf4100bjg7mccd7bq54glpsq552q339"; @@ -537,6 +589,7 @@ let inputproto = (mkDerivation "inputproto" { name = "inputproto-2.3.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/proto/inputproto-2.3.1.tar.bz2; sha256 = "1lf1jlxp0fc8h6fjdffhd084dqab94966l1zm3rwwsis0mifwiss"; @@ -547,6 +600,7 @@ let kbproto = (mkDerivation "kbproto" { name = "kbproto-1.0.6"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/kbproto-1.0.6.tar.bz2; sha256 = "0yal11hhpiisy3w8wmacsdzzzcnc3xwnswxz8k7zri40xc5aqz03"; @@ -557,6 +611,7 @@ let libAppleWM = (mkDerivation "libAppleWM" { name = "libAppleWM-1.4.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/libAppleWM-1.4.1.tar.bz2; sha256 = "0r8x28n45q89x91mz8mv0zkkcxi8wazkac886fyvflhiv2y8ap2y"; @@ -567,6 +622,7 @@ let libFS = (mkDerivation "libFS" { name = "libFS-1.0.6"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libFS-1.0.6.tar.bz2; sha256 = "1mxfsvj9m3pn8cdkcn4kg190zp665mf4pv0083g6xykvsgxzq1wh"; @@ -577,6 +633,7 @@ let libICE = (mkDerivation "libICE" { name = "libICE-1.0.9"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libICE-1.0.9.tar.bz2; sha256 = "00p2b6bsg6kcdbb39bv46339qcywxfl4hsrz8asm4hy6q7r34w4g"; @@ -587,6 +644,7 @@ let libSM = (mkDerivation "libSM" { name = "libSM-1.2.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libSM-1.2.2.tar.bz2; sha256 = "1gc7wavgs435g9qkp9jw4lhmaiq6ip9llv49f054ad6ryp4sib0b"; @@ -597,6 +655,7 @@ let libWindowsWM = (mkDerivation "libWindowsWM" { name = "libWindowsWM-1.0.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/libWindowsWM-1.0.1.tar.bz2; sha256 = "1p0flwb67xawyv6yhri9w17m1i4lji5qnd0gq8v1vsfb8zw7rw15"; @@ -607,6 +666,7 @@ let libX11 = (mkDerivation "libX11" { name = "libX11-1.6.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libX11-1.6.2.tar.bz2; sha256 = "05mx0s0vqzds3qjc1gmjr2s6x2ll37z4lfhgm7p2w7936zl2g81a"; @@ -617,6 +677,7 @@ let libXScrnSaver = (mkDerivation "libXScrnSaver" { name = "libXScrnSaver-1.2.2"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/libXScrnSaver-1.2.2.tar.bz2; sha256 = "07ff4r20nkkrj7h08f9fwamds9b3imj8jz5iz6y38zqw6jkyzwcg"; @@ -627,6 +688,7 @@ let libXau = (mkDerivation "libXau" { name = "libXau-1.0.8"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXau-1.0.8.tar.bz2; sha256 = "1wm4pv12f36cwzhldpp7vy3lhm3xdcnp4f184xkxsp7b18r7gm7x"; @@ -637,6 +699,7 @@ let libXaw = (mkDerivation "libXaw" { name = "libXaw-1.0.12"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXaw-1.0.12.tar.bz2; sha256 = "1xnv7jy86j9vhmw74frkzcraynqbw1p1s79jasargsgwfi433z4n"; @@ -647,6 +710,7 @@ let libXcomposite = (mkDerivation "libXcomposite" { name = "libXcomposite-0.4.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXcomposite-0.4.4.tar.bz2; sha256 = "0y21nfpa5s8qmx0srdlilyndas3sgl0c6rc26d5fx2vx436m1qpd"; @@ -657,6 +721,7 @@ let libXcursor = (mkDerivation "libXcursor" { name = "libXcursor-1.1.14"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXcursor-1.1.14.tar.bz2; sha256 = "1prkdicl5y5yx32h1azh6gjfbijvjp415javv8dsakd13jrarilv"; @@ -667,6 +732,7 @@ let libXdamage = (mkDerivation "libXdamage" { name = "libXdamage-1.1.4"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXdamage-1.1.4.tar.bz2; sha256 = "1bamagq7g6s0d23l8rb3nppj8ifqj05f7z9bhbs4fdg8az3ffgvw"; @@ -677,6 +743,7 @@ let libXdmcp = (mkDerivation "libXdmcp" { name = "libXdmcp-1.1.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/X11R7.7/src/everything/libXdmcp-1.1.1.tar.bz2; sha256 = "13highx4xpgkiwykpcl7z2laslrjc4pzi4h617ny9p7r6116vkls"; @@ -687,6 +754,7 @@ let libXext = (mkDerivation "libXext" { name = "libXext-1.3.3"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXext-1.3.3.tar.bz2; sha256 = "0dbfn5bznnrhqzvkrcmw4c44yvvpwdcsrvzxf4rk27r36b9x865m"; @@ -697,6 +765,7 @@ let libXfixes = (mkDerivation "libXfixes" { name = "libXfixes-5.0.1"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXfixes-5.0.1.tar.bz2; sha256 = "0rs7qgzr6dpr62db7sd91c1b47hzhzfr010qwnpcm8sg122w1gk3"; @@ -707,6 +776,7 @@ let libXfont = (mkDerivation "libXfont" { name = "libXfont-1.4.8"; builder = ./builder.sh; + useFakeTime = 1; src = fetchurl { url = mirror://xorg/individual/lib/libXfont-1.4.8.tar.bz2; sha256 = "01fh2hnnaby8x6mv57x78nsqwhls70gwykldzd8b43vrpzzd8s2m"; From 1462666362c05dce2c4d2e2d75c50ee077d96fb0 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 15:44:17 +0200 Subject: [PATCH 28/40] Do not set nlink when cleaning cpio archives. --- pkgs/build-support/kernel/cpio-clean.pl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/build-support/kernel/cpio-clean.pl b/pkgs/build-support/kernel/cpio-clean.pl index ddc6435a5a819..459eac9aa1754 100644 --- a/pkgs/build-support/kernel/cpio-clean.pl +++ b/pkgs/build-support/kernel/cpio-clean.pl @@ -9,8 +9,11 @@ my $cpio = Archive::Cpio->new; my $IN = \*STDIN; my $ino = 1; +my %ino_remap = {}; $cpio->read_with_handler($IN, sub { my ($e) = @_; + $ino_remap{$e->{inode}} = $ino++ unless exists $ino_remap{$e->{inode}}; + $e->{inode} = $ino_remap{$e->{inode}}; $e->{mtime} = 1; $cpio->write_one(\*STDOUT, $e); }); From 3d28eb3d5ee3560a7dbd2e0b7ab0545dc101dbd6 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 15:45:31 +0200 Subject: [PATCH 29/40] Create consistent initrd cpio archive. 1) Sort the files 2) Set uid/gid to 0.0 --- pkgs/build-support/kernel/make-initrd.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/build-support/kernel/make-initrd.sh b/pkgs/build-support/kernel/make-initrd.sh index 17b261f984073..e7bad57e4ba40 100644 --- a/pkgs/build-support/kernel/make-initrd.sh +++ b/pkgs/build-support/kernel/make-initrd.sh @@ -36,7 +36,11 @@ storePaths=$(perl $pathsFromGraph closure-*) # Put the closure in a gzipped cpio archive. mkdir -p $out -(cd root && find * -print0 | cpio -o -H newc --null | perl $cpioClean | $compressor > $out/initrd) +(cd root && find * ! -type d -print0 | + sort -z | + cpio -o -H newc -R 0.0 --null | + perl $cpioClean | + $compressor > $out/initrd) if [ -n "$makeUInitrd" ]; then mv $out/initrd $out/initrd.gz From 855843bf74818ee6cce7f942dd33478b9681a9a5 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 15:45:57 +0200 Subject: [PATCH 30/40] Disable useFakeTime for smartmontools. --- pkgs/tools/system/smartmontools/default.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/tools/system/smartmontools/default.nix b/pkgs/tools/system/smartmontools/default.nix index 61150b127036d..2c4cdbcccfdee 100644 --- a/pkgs/tools/system/smartmontools/default.nix +++ b/pkgs/tools/system/smartmontools/default.nix @@ -23,7 +23,8 @@ stdenv.mkDerivation rec { patches = [ ./no-dates-in-binary.patch ]; - useFakeTime = 1; + # This package does not handle useFakeTime well + # useFakeTime = 1; meta = { description = "Tools for monitoring the health of hard drivers"; From a8e7ddd1dfaae4b3ce97fdefe4614a3e31c04501 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Sun, 13 Apr 2014 22:15:04 +0200 Subject: [PATCH 31/40] Eradicate gzip -9 without -n --- nixos/modules/system/boot/stage-1.nix | 2 +- pkgs/development/compilers/qcmm/builder.sh | 2 +- pkgs/os-specific/linux/multipath-tools/default.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nixos/modules/system/boot/stage-1.nix b/nixos/modules/system/boot/stage-1.nix index 426da778f434d..b987c655fb33c 100644 --- a/nixos/modules/system/boot/stage-1.nix +++ b/nixos/modules/system/boot/stage-1.nix @@ -298,7 +298,7 @@ in boot.initrd.compressor = mkOption { internal = true; - default = "gzip -9"; + default = "gzip -9n"; type = types.str; description = "The compressor to use on the initrd image."; example = "xz"; diff --git a/pkgs/development/compilers/qcmm/builder.sh b/pkgs/development/compilers/qcmm/builder.sh index c6aa18fea3c84..acdfbaa08dce0 100644 --- a/pkgs/development/compilers/qcmm/builder.sh +++ b/pkgs/development/compilers/qcmm/builder.sh @@ -16,7 +16,7 @@ installPhase() { mv $file ${file%.opt} done - find $out/man -type f -exec gzip -9 {} \; + find $out/man -type f -exec gzip -9n {} \; find $out -name \*.a -exec echo stripping {} \; \ -exec strip -S {} \; diff --git a/pkgs/os-specific/linux/multipath-tools/default.nix b/pkgs/os-specific/linux/multipath-tools/default.nix index 90722d74ace15..3da37a89923a4 100644 --- a/pkgs/os-specific/linux/multipath-tools/default.nix +++ b/pkgs/os-specific/linux/multipath-tools/default.nix @@ -14,7 +14,7 @@ stdenv.mkDerivation rec { preBuild = '' - makeFlagsArray=(GZIP="${gzip}/bin/gzip -9 -c" prefix=$out mandir=$out/share/man/man8 man5dir=$out/share/man/man5 LIB=lib) + makeFlagsArray=(GZIP="${gzip}/bin/gzip -9n -c" prefix=$out mandir=$out/share/man/man8 man5dir=$out/share/man/man5 LIB=lib) substituteInPlace multipath/Makefile --replace /etc $out/etc substituteInPlace kpartx/Makefile --replace /etc $out/etc From f97b73b77d4be9abd72accceebc31db44b2ebe71 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Mon, 14 Apr 2014 15:12:53 +0200 Subject: [PATCH 32/40] Set the linux kernel timestamp properly. --- pkgs/os-specific/linux/kernel/generic.nix | 1 + pkgs/os-specific/linux/kernel/manual-config.nix | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/os-specific/linux/kernel/generic.nix b/pkgs/os-specific/linux/kernel/generic.nix index 800af8355e301..a15425490fa33 100644 --- a/pkgs/os-specific/linux/kernel/generic.nix +++ b/pkgs/os-specific/linux/kernel/generic.nix @@ -58,6 +58,7 @@ let arch = stdenv.platform.kernelArch; useFakeTime = 1; + KBUILD_BUILD_TIMESTAMP = 0; crossAttrs = let cp = stdenv.cross.platform; in { diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix index 6d9baed7f2ddf..6501661a6256e 100644 --- a/pkgs/os-specific/linux/kernel/manual-config.nix +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -104,10 +104,9 @@ let buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=Thu Jan 1 00:00:01 UTC 1970") ''; - buildFlags = [ - "KBUILD_BUILD_VERSION=1-NixOS" - platform.kernelTarget - ] ++ optional isModular "modules"; + KBUILD_BUILD_TIMESTAMP=0; + KBUILD_BUILD_VERSION="1-NixOS"; + buildFlags = [ platform.kernelTarget ] ++ optional isModular "modules"; installFlags = [ "INSTALLKERNEL=${installkernel}" From e8ee36a84668f1b1ed2c612ca6c58caa4acc406a Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Mon, 14 Apr 2014 16:02:12 +0200 Subject: [PATCH 33/40] Make syslinux deterministic. --- pkgs/os-specific/linux/syslinux/default.nix | 2 +- pkgs/os-specific/linux/syslinux/no-date-in-banner.patch | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 pkgs/os-specific/linux/syslinux/no-date-in-banner.patch diff --git a/pkgs/os-specific/linux/syslinux/default.nix b/pkgs/os-specific/linux/syslinux/default.nix index 734613c44ac8a..0c82ddda455a9 100644 --- a/pkgs/os-specific/linux/syslinux/default.nix +++ b/pkgs/os-specific/linux/syslinux/default.nix @@ -8,7 +8,7 @@ stdenv.mkDerivation rec { sha256 = "0y2ld2s64s6vc5pf8rj36w71rq2cfax3c1iafp0w1qbjpxy1p8xg"; }; - patches = [ ./perl-deps.patch ]; + patches = [ ./perl-deps.patch ./no-date-in-banner.patch ]; buildInputs = [ nasm perl libuuid ]; diff --git a/pkgs/os-specific/linux/syslinux/no-date-in-banner.patch b/pkgs/os-specific/linux/syslinux/no-date-in-banner.patch new file mode 100644 index 0000000000000..e139c8d734d12 --- /dev/null +++ b/pkgs/os-specific/linux/syslinux/no-date-in-banner.patch @@ -0,0 +1,9 @@ +diff -ur syslinux-4.07.orig/gen-id.sh syslinux-4.07/gen-id.sh +--- syslinux-4.07.orig/gen-id.sh 2013-07-25 11:28:59.000000000 +0200 ++++ syslinux-4.07/gen-id.sh 2014-04-14 16:00:37.000006164 +0200 +@@ -30,4 +30,5 @@ + if test -z "$id"; then + id="$tim" + fi ++id="unknown" + echo "$id" From 0ca9e1012b56d8ab05fa9b1b12b8a3caa7de26f5 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Mon, 14 Apr 2014 16:03:08 +0200 Subject: [PATCH 34/40] Disable profile-guided-optimization (PGO) for gcc. This only disables it for compiling gcc itself. PGO results in non-deterministic output because the timing information itself has small variations. --- pkgs/top-level/all-packages.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 4e8cd35358d01..80e7dc9424816 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2837,7 +2837,8 @@ let inherit noSysDirs; # PGO seems to speed up compilation by gcc by ~10%, see #445 discussion - profiledCompiler = with stdenv; (!isDarwin && (isi686 || isx86_64)); + # however, it results in non-deterministic output + profiledCompiler = false; # When building `gcc.crossDrv' (a "Canadian cross", with host == target # and host != build), `cross' must be null but the cross-libc must still From e52a6a2ba2688ced8e3be8bb933b35e7acd1006e Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Tue, 15 Apr 2014 00:54:13 +0200 Subject: [PATCH 35/40] Barf on finding the build directory in build artifacts. --- pkgs/stdenv/generic/setup.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh index 0e7bfd656de7b..c35398d8f0891 100644 --- a/pkgs/stdenv/generic/setup.sh +++ b/pkgs/stdenv/generic/setup.sh @@ -859,6 +859,16 @@ installCheckPhase() { $makeFlags "${makeFlagsArray[@]}" \ $installCheckFlags "${installCheckFlagsArray[@]}" ${installCheckTarget:-installcheck}' + + if [ -z "$noErrorBuildTop" -a "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_BUILD_TOP" ]; then + if grep -qr $NIX_BUILD_TOP $out; then + echo "ERROR: The following files include the build path: $NIX_BUILD_TOP" + echo "ERROR: Either fix the nix expression or set noErrorBuildTop" + grep -lr $NIX_BUILD_TOP $out + exit 1 + fi + fi + runHook postInstallCheck } From 3157dbe3ac4de70873529c294e4d5c13cc906a95 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Tue, 15 Apr 2014 00:54:36 +0200 Subject: [PATCH 36/40] Remove build artifacts from e2fsprogs output. --- pkgs/tools/filesystems/e2fsprogs/default.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkgs/tools/filesystems/e2fsprogs/default.nix b/pkgs/tools/filesystems/e2fsprogs/default.nix index dcbf7235e49c4..f637bd3070a25 100644 --- a/pkgs/tools/filesystems/e2fsprogs/default.nix +++ b/pkgs/tools/filesystems/e2fsprogs/default.nix @@ -25,6 +25,12 @@ stdenv.mkDerivation rec { postInstall = "make install-libs"; + # Remove references to the build directory + preFixup = '' + sed -i -e 's/ET_DIR=".*"/""/' $out/bin/compile_et + sed -i -e 's/SS_DIR=".*"/""/' $out/bin/mk_cmds + ''; + meta = { homepage = http://e2fsprogs.sourceforge.net/; description = "Tools for creating and checking ext2/ext3/ext4 filesystems"; From 449193d67114b665f5f03fd4fcecfd17230f5142 Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 16 Apr 2014 16:41:34 +0200 Subject: [PATCH 37/40] Change some fixed timestamp to != (time_t)0 --- .../interpreters/perl/5.16/no-impure-config-time.patch | 2 +- pkgs/development/libraries/glib/default.nix | 1 + pkgs/development/libraries/libgcrypt/no-build-timestamp.patch | 2 +- .../development/libraries/libgpg-error/no-build-timestamp.patch | 2 +- pkgs/os-specific/linux/kernel/generic.nix | 2 +- pkgs/os-specific/linux/kernel/manual-config.nix | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch b/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch index 2bf1841e9dd2c..1382de70625ec 100644 --- a/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch +++ b/pkgs/development/interpreters/perl/5.16/no-impure-config-time.patch @@ -4,7 +4,7 @@ : who configured the system cf_time=`LC_ALL=C; LANGUAGE=C; export LC_ALL; export LANGUAGE; $date 2>&1` -+cf_time='Thu Jan 1 00:00:00 UTC 1970' ++cf_time='Thu Jan 1 00:00:01 UTC 1970' + case "$cf_by" in "") diff --git a/pkgs/development/libraries/glib/default.nix b/pkgs/development/libraries/glib/default.nix index d3de4c18399b4..a6f28b8034219 100644 --- a/pkgs/development/libraries/glib/default.nix +++ b/pkgs/development/libraries/glib/default.nix @@ -99,6 +99,7 @@ stdenv.mkDerivation rec { sed -e '/g_subprocess_launcher_set_environ (launcher, envp);/a g_subprocess_launcher_setenv (launcher, "PATH", g_getenv("PATH"), TRUE);' -i gio/tests/gsubprocess.c ''; + postInstall = ''rm -rvf $out/share/gtk-doc''; DETERMINISTIC_BUILD = 1; passthru = { diff --git a/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch b/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch index 6ae708f059d77..897773387232c 100644 --- a/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch +++ b/pkgs/development/libraries/libgcrypt/no-build-timestamp.patch @@ -5,7 +5,7 @@ diff -ur libgcrypt-1.5.3.orig/configure libgcrypt-1.5.3/configure BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date` -+BUILD_TIMESTAMP=1970-01-01T00:00+0000 ++BUILD_TIMESTAMP=1970-01-01T00:01+0000 cat >>confdefs.h <<_ACEOF diff --git a/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch b/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch index c8350a278ec4a..eab9d6d63ad63 100644 --- a/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch +++ b/pkgs/development/libraries/libgpg-error/no-build-timestamp.patch @@ -5,7 +5,7 @@ diff -ur libgpg-error-1.12.orig/configure libgpg-error-1.12/configure BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date` -+BUILD_TIMESTAMP=1970-01-01T00:00+0000 ++BUILD_TIMESTAMP=1970-01-01T00:01+0000 cat >>confdefs.h <<_ACEOF diff --git a/pkgs/os-specific/linux/kernel/generic.nix b/pkgs/os-specific/linux/kernel/generic.nix index a15425490fa33..119d990a33de0 100644 --- a/pkgs/os-specific/linux/kernel/generic.nix +++ b/pkgs/os-specific/linux/kernel/generic.nix @@ -58,7 +58,7 @@ let arch = stdenv.platform.kernelArch; useFakeTime = 1; - KBUILD_BUILD_TIMESTAMP = 0; + KBUILD_BUILD_TIMESTAMP = 1; # (time_t)1 crossAttrs = let cp = stdenv.cross.platform; in { diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix index 6501661a6256e..385f4cd271e7f 100644 --- a/pkgs/os-specific/linux/kernel/manual-config.nix +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -104,7 +104,7 @@ let buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=Thu Jan 1 00:00:01 UTC 1970") ''; - KBUILD_BUILD_TIMESTAMP=0; + KBUILD_BUILD_TIMESTAMP=1; # (time_t)1 KBUILD_BUILD_VERSION="1-NixOS"; buildFlags = [ platform.kernelTarget ] ++ optional isModular "modules"; From 3823348143b834e3ef63df023c33dd3f4b8aeb1b Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 16 Apr 2014 16:43:02 +0200 Subject: [PATCH 38/40] Add atomic-ops package. --- .../libraries/atomic-ops/default.nix | 28 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 ++ 2 files changed, 30 insertions(+) create mode 100644 pkgs/development/libraries/atomic-ops/default.nix diff --git a/pkgs/development/libraries/atomic-ops/default.nix b/pkgs/development/libraries/atomic-ops/default.nix new file mode 100644 index 0000000000000..da06221c72f35 --- /dev/null +++ b/pkgs/development/libraries/atomic-ops/default.nix @@ -0,0 +1,28 @@ +{stdenv, fetchgit, autoconf, automake, libtool}: + +stdenv.mkDerivation rec { + baseName = "atomic-ops"; + version = "7.4.0"; + name="${baseName}-${version}"; + + buildInputs = [ autoconf automake libtool ]; + + preConfigure = '' + ./autogen.sh + ''; + + src = fetchgit { + url = "https://github.com/ivmai/libatomic_ops"; + rev = "a5df11ab031f7541442bac387e2ec5b6c88d8600"; + sha256 = "0ij9i0m9lq7ipx5mbp0qpr1y95zpgiv8cp11d46sss2fs1jkj1i3"; + }; + + meta = { + homepage = "https://github.com/ivmai/libatomic_ops"; + description = '' + This package provides semi-portable access to hardware-provided + atomic memory update operations on a number architectures.''; + platforms = stdenv.lib.platforms.linux ++ stdenv.lib.platforms.darwin; + maintainers = [ stdenv.lib.maintainers.ak ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 80e7dc9424816..8cfdd9077c127 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -664,6 +664,8 @@ let enableStandardFeatures = true; }); + atomicops = callPackage ../development/libraries/atomic-ops { }; + autossh = callPackage ../tools/networking/autossh { }; bacula = callPackage ../tools/backup/bacula { }; From 41568013d6468dff59f636f260701d79bb8882ca Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Wed, 23 Apr 2014 15:12:54 +0200 Subject: [PATCH 39/40] Excluding directories makes initrd fail for the kernel. --- pkgs/build-support/kernel/make-initrd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/build-support/kernel/make-initrd.sh b/pkgs/build-support/kernel/make-initrd.sh index e7bad57e4ba40..c06692429a3ec 100644 --- a/pkgs/build-support/kernel/make-initrd.sh +++ b/pkgs/build-support/kernel/make-initrd.sh @@ -36,7 +36,7 @@ storePaths=$(perl $pathsFromGraph closure-*) # Put the closure in a gzipped cpio archive. mkdir -p $out -(cd root && find * ! -type d -print0 | +(cd root && find * -print0 | sort -z | cpio -o -H newc -R 0.0 --null | perl $cpioClean | From 90c307e205bf9e5e20845f81ab08afa813829c8b Mon Sep 17 00:00:00 2001 From: Alexander Kjeldaas Date: Tue, 10 Jun 2014 12:57:02 +0200 Subject: [PATCH 40/40] python 2.7.7 updates to deterministic builds. --- pkgs/development/interpreters/python/2.7/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/development/interpreters/python/2.7/default.nix b/pkgs/development/interpreters/python/2.7/default.nix index d8ac3fb22019b..fa530a01e388a 100644 --- a/pkgs/development/interpreters/python/2.7/default.nix +++ b/pkgs/development/interpreters/python/2.7/default.nix @@ -91,7 +91,7 @@ let # It disables creation of windows installers and the lib2to3 which # can rewrite python2-programs to python3. rm $out/lib/python${majorVersion}/distutils/command/wininst-*.exe - rm $out/lib/python${majorVersion}/lib2to3/Grammar2.7.6.final.0.pickle + rm $out/lib/python${majorVersion}/lib2to3/Grammar2.7.7.final.0.pickle ''; passthru = rec {