From 17e88c2890068e944c61dbaf7493ae12417b8944 Mon Sep 17 00:00:00 2001 From: Martin Messer Date: Thu, 7 Apr 2022 16:28:20 +0200 Subject: checkpointedBuild: add checkpointed build test based on pkgs hello --- pkgs/test/default.nix | 2 + pkgs/test/incrementalBuild/default.nix | 57 ++++++++++++++++++++ .../incrementalBuild/hello-additionalFile.patch | 62 ++++++++++++++++++++++ pkgs/test/incrementalBuild/hello-removeFile.patch | 62 ++++++++++++++++++++++ pkgs/test/incrementalBuild/hello.patch | 26 +++++++++ 5 files changed, 209 insertions(+) create mode 100644 pkgs/test/incrementalBuild/default.nix create mode 100644 pkgs/test/incrementalBuild/hello-additionalFile.patch create mode 100644 pkgs/test/incrementalBuild/hello-removeFile.patch create mode 100644 pkgs/test/incrementalBuild/hello.patch (limited to 'pkgs/test') diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix index 29dc4b5192ec..8ca6c4faf56e 100644 --- a/pkgs/test/default.nix +++ b/pkgs/test/default.nix @@ -113,6 +113,8 @@ with pkgs; install-shell-files = callPackage ./install-shell-files {}; + incremental-build = callPackage ./incrementalBuild {}; + kernel-config = callPackage ./kernel.nix {}; ld-library-path = callPackage ./ld-library-path {}; diff --git a/pkgs/test/incrementalBuild/default.nix b/pkgs/test/incrementalBuild/default.nix new file mode 100644 index 000000000000..cff1efee9a12 --- /dev/null +++ b/pkgs/test/incrementalBuild/default.nix @@ -0,0 +1,57 @@ +{ hello, buildIncremental, runCommandNoCC, texinfo, stdenv, rsync }: +let + baseHello = buildIncremental.prepareIncrementalBuild hello; + patchedHello = hello.overrideAttrs (old: { + buildInputs = [ texinfo ]; + src = runCommandNoCC "patch-hello-src" { } '' + mkdir -p $out + cd $out + tar xf ${hello.src} --strip-components=1 + patch -p1 < ${./hello.patch} + ''; + }); + incrementalBuiltHello = buildIncremental.mkIncrementalBuild patchedHello baseHello.incrementalBuildArtifacts; + + incrementalBuiltHelloWithCheck = incrementalBuiltHello.overrideAttrs (old: { + doCheck = true; + checkPhase = '' + echo "checking if unchanged source file is not recompiled" + [ "$(stat --format="%Y" lib/exitfail.o)" = "$(stat --format="%Y" ${baseHello.incrementalBuildArtifacts}/lib/exitfail.o)" ] + ''; + }); + + baseHelloRemoveFile = buildIncremental.prepareIncrementalBuild (hello.overrideAttrs (old: { + patches = [ ./hello-additionalFile.patch ]; + })); + + preparedHelloRemoveFileSrc = runCommandNoCC "patch-hello-src" { } '' + mkdir -p $out + cd $out + tar xf ${hello.src} --strip-components=1 + patch -p1 < ${./hello-additionalFile.patch} + ''; + + patchedHelloRemoveFile = hello.overrideAttrs (old: { + buildInputs = [ texinfo ]; + src = runCommandNoCC "patch-hello-src" { } '' + mkdir -p $out + cd $out + ${rsync}/bin/rsync -cutU --chown=$USER:$USER --chmod=+w -r ${preparedHelloRemoveFileSrc}/* . + patch -p1 < ${./hello-removeFile.patch} + ''; + }); + + incrementalBuiltHelloWithRemovedFile = buildIncremental.mkIncrementalBuild patchedHelloRemoveFile baseHelloRemoveFile.incrementalBuildArtifacts; +in +stdenv.mkDerivation { + name = "patched-hello-returns-correct-output"; + buildCommand = '' + touch $out + + echo "testing output of hello binary" + [ "$(${incrementalBuiltHelloWithCheck}/bin/hello)" = "Hello, incremental world!" ] + echo "testing output of hello with removed file" + [ "$(${incrementalBuiltHelloWithRemovedFile}/bin/hello)" = "Hello, incremental world!" ] + ''; +} + diff --git a/pkgs/test/incrementalBuild/hello-additionalFile.patch b/pkgs/test/incrementalBuild/hello-additionalFile.patch new file mode 100644 index 000000000000..31fbe034909e --- /dev/null +++ b/pkgs/test/incrementalBuild/hello-additionalFile.patch @@ -0,0 +1,62 @@ +diff --git a/Makefile.in b/Makefile.in +index 0805eda..77b000c 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -227,7 +227,7 @@ am_lib_libhello_a_OBJECTS = lib/c-ctype.$(OBJEXT) \ + lib/quotearg.$(OBJEXT) lib/strnlen1.$(OBJEXT) \ + lib/unistd.$(OBJEXT) lib/wctype-h.$(OBJEXT) \ + lib/xmalloc.$(OBJEXT) lib/xalloc-die.$(OBJEXT) \ +- lib/xstrndup.$(OBJEXT) ++ lib/xstrndup.$(OBJEXT) src/additionalFile.$(OBJEXT) + lib_libhello_a_OBJECTS = $(am_lib_libhello_a_OBJECTS) + am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" \ + "$(DESTDIR)$(man1dir)" +@@ -1380,7 +1380,7 @@ lib_libhello_a_SOURCES = lib/c-ctype.h lib/c-ctype.c lib/c-strcase.h \ + lib/gettext.h lib/localcharset.h lib/localcharset.c \ + lib/progname.h lib/progname.c lib/quotearg.c lib/strnlen1.h \ + lib/strnlen1.c lib/unistd.c lib/wctype-h.c lib/xmalloc.c \ +- lib/xalloc-die.c lib/xstrndup.h lib/xstrndup.c ++ lib/xalloc-die.c lib/xstrndup.h lib/xstrndup.c src/additionalFile.c + lib_libhello_a_LIBADD = $(gl_LIBOBJS) + lib_libhello_a_DEPENDENCIES = $(gl_LIBOBJS) + EXTRA_lib_libhello_a_SOURCES = lib/stripslash.c lib/error.c \ +diff --git a/src/additionalFile.c b/src/additionalFile.c +new file mode 100644 +index 0000000..34d683d +--- /dev/null ++++ b/src/additionalFile.c +@@ -0,0 +1,6 @@ ++#include "config.h" ++#include "system.h" ++ ++int somefunc() { ++ return 0; ++} +diff --git a/src/hello.c b/src/hello.c +index 453962f..df67de2 100644 +--- a/src/hello.c ++++ b/src/hello.c +@@ -57,7 +57,11 @@ main (int argc, char *argv[]) + #endif + + /* Having initialized gettext, get the default message. */ +- greeting_msg = _("Hello, world!"); ++ if (somefunc() == 0) { ++ greeting_msg = _("Hello, world!"); ++ } else { ++ greeting_msg = _("Hello, incremental world!"); ++ } + + /* Even exiting has subtleties. On exit, if any writes failed, change + the exit status. The /dev/full device on GNU/Linux can be used for +diff --git a/src/system.h b/src/system.h +index d1acac2..935b955 100644 +--- a/src/system.h ++++ b/src/system.h +@@ -42,4 +42,6 @@ + /* Check for errors on write. */ + # include "closeout.h" + ++int somefunc(); ++ + #endif /* HELLO_SYSTEM_H */ diff --git a/pkgs/test/incrementalBuild/hello-removeFile.patch b/pkgs/test/incrementalBuild/hello-removeFile.patch new file mode 100644 index 000000000000..99ecf1e298bb --- /dev/null +++ b/pkgs/test/incrementalBuild/hello-removeFile.patch @@ -0,0 +1,62 @@ +diff --git a/Makefile.in b/Makefile.in +index 77b000c..0805eda 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -227,7 +227,7 @@ am_lib_libhello_a_OBJECTS = lib/c-ctype.$(OBJEXT) \ + lib/quotearg.$(OBJEXT) lib/strnlen1.$(OBJEXT) \ + lib/unistd.$(OBJEXT) lib/wctype-h.$(OBJEXT) \ + lib/xmalloc.$(OBJEXT) lib/xalloc-die.$(OBJEXT) \ +- lib/xstrndup.$(OBJEXT) src/additionalFile.$(OBJEXT) ++ lib/xstrndup.$(OBJEXT) + lib_libhello_a_OBJECTS = $(am_lib_libhello_a_OBJECTS) + am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" \ + "$(DESTDIR)$(man1dir)" +@@ -1380,7 +1380,7 @@ lib_libhello_a_SOURCES = lib/c-ctype.h lib/c-ctype.c lib/c-strcase.h \ + lib/gettext.h lib/localcharset.h lib/localcharset.c \ + lib/progname.h lib/progname.c lib/quotearg.c lib/strnlen1.h \ + lib/strnlen1.c lib/unistd.c lib/wctype-h.c lib/xmalloc.c \ +- lib/xalloc-die.c lib/xstrndup.h lib/xstrndup.c src/additionalFile.c ++ lib/xalloc-die.c lib/xstrndup.h lib/xstrndup.c + lib_libhello_a_LIBADD = $(gl_LIBOBJS) + lib_libhello_a_DEPENDENCIES = $(gl_LIBOBJS) + EXTRA_lib_libhello_a_SOURCES = lib/stripslash.c lib/error.c \ +diff --git a/src/additionalFile.c b/src/additionalFile.c +deleted file mode 100644 +index 34d683d..0000000 +--- a/src/additionalFile.c ++++ /dev/null +@@ -1,6 +0,0 @@ +-#include "config.h" +-#include "system.h" +- +-int somefunc() { +- return 0; +-} +diff --git a/src/hello.c b/src/hello.c +index df67de2..768285a 100644 +--- a/src/hello.c ++++ b/src/hello.c +@@ -36,6 +36,10 @@ static const struct option longopts[] = { + static void print_help (void); + static void print_version (void); + ++int somefunc() { ++ return 1; ++} ++ + int + main (int argc, char *argv[]) + { +diff --git a/tests/hello-1 b/tests/hello-1 +index e15fa95..3b7a815 100755 +--- a/tests/hello-1 ++++ b/tests/hello-1 +@@ -21,7 +21,7 @@ export LANGUAGE LC_ALL LC_MESSAGES LANG + + tmpfiles="hello-test1.ok" + cat < hello-test1.ok +-Hello, world! ++Hello, incremental world! + EOF + + tmpfiles="$tmpfiles hello-test1.out" diff --git a/pkgs/test/incrementalBuild/hello.patch b/pkgs/test/incrementalBuild/hello.patch new file mode 100644 index 000000000000..3d0d50c2f20e --- /dev/null +++ b/pkgs/test/incrementalBuild/hello.patch @@ -0,0 +1,26 @@ +diff --git a/src/hello.c b/src/hello.c +index 182303c..453962f 100644 +--- a/src/hello.c ++++ b/src/hello.c +@@ -57,7 +57,7 @@ main (int argc, char *argv[]) + #endif + + /* Having initialized gettext, get the default message. */ +- greeting_msg = _("Hello, world!"); ++ greeting_msg = _("Hello, incremental world!"); + + /* Even exiting has subtleties. On exit, if any writes failed, change + the exit status. The /dev/full device on GNU/Linux can be used for +diff --git a/tests/hello-1 b/tests/hello-1 +index 3b7a815..e15fa95 100755 +--- a/tests/hello-1 ++++ b/tests/hello-1 +@@ -21,7 +21,7 @@ export LANGUAGE LC_ALL LC_MESSAGES LANG + + tmpfiles="hello-test1.ok" + cat < hello-test1.ok +-Hello, world! ++Hello, incremental world! + EOF + + tmpfiles="$tmpfiles hello-test1.out" -- cgit 1.4.1