checkpointedBuild: add checkpointed build test based on pkgs hello

This commit is contained in:
Martin Messer 2022-04-07 16:28:20 +02:00
parent 1cd6b7fdc3
commit 17e88c2890
5 changed files with 209 additions and 0 deletions

View file

@ -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 {};

View file

@ -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!" ]
'';
}

View file

@ -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 */

View file

@ -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 <<EOF > hello-test1.ok
-Hello, world!
+Hello, incremental world!
EOF
tmpfiles="$tmpfiles hello-test1.out"

View file

@ -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 <<EOF > hello-test1.ok
-Hello, world!
+Hello, incremental world!
EOF
tmpfiles="$tmpfiles hello-test1.out"