Inject the commit timestamp from the Guix build recipe

This commit is contained in:
Georges Dupéron 2018-09-30 19:58:47 +02:00
parent 292dd908ba
commit 77b33ac0e1
4 changed files with 82 additions and 57 deletions

1
.gitignore vendored
View File

@ -103,6 +103,7 @@
/build/test_pass/sudo_iso_mount
/build/twm_cfg
/build/virtualbox.img
/COMMIT_TIMESTAMP
/deploy-screenshots/bochs-anim.gif
/deploy-screenshots/bochs.png
/deploy-screenshots/dosbox-anim.gif

View File

@ -34,8 +34,8 @@ define date_command
date -d ${1} ${2}; \
fi
endef
commit_timestamp = "$$(${call date_command,"${COMMIT_TIMESTAMP_ISO_8601}",'+%Y%m%d%H%m.%S'})"
commit_timestamp_iso_8601 = ${COMMIT_TIMESTAMP_ISO_8601}
real_commit_timestamp_iso_8601 = $$(if test "${COMMIT_TIMESTAMP_ISO_8601}" = "FILE"; then cat COMMIT_TIMESTAMP; else echo "${COMMIT_TIMESTAMP_ISO_8601}"; fi)
commit_timestamp = "$$(${call date_command,"${real_commit_timestamp_iso_8601}",'+%Y%m%d%H%m.%S'})"
reproducible_os_filename="${bld}/reproduced_$$(basename "${os_filename}")"
@ -50,7 +50,8 @@ built_files += ${bld}/check_makefile \
${bld}/makefile_non_file_targets \
${bld}/makefile_phony \
${bld}/makefile_targets \
${bld}/makefile_w_arnings
${bld}/makefile_w_arnings \
COMMIT_TIMESTAMP
include Makefile.example-os
include Makefile.test-example-os
@ -62,6 +63,9 @@ more_built_directories = ${built_directories} ${bld}
in-guix: .gitignore \
${bld}/check_makefile
COMMIT_TIMESTAMP:
echo "This file is injected by the Guix build recipe."
${bld}/makefile_w_arnings: | $${@D}
${built_files}: | $${@D}
@ -71,7 +75,7 @@ ${bld}/makefile_w_arnings: ${Makefiles}
OS_FILENAME=${OS_FILENAME} \
BUILD_DIR=${BUILD_DIR} \
SCREENSHOTS_DIR=${SCREENSHOTS_DIR} \
COMMIT_TIMESTAMP_ISO_8601=${COMMIT_TIMESTAMP_ISO_8601} \
COMMIT_TIMESTAMP_ISO_8601=${real_commit_timestamp_iso_8601} \
test 2>$@ 1>/dev/null \
|| cat $@
@ -92,7 +96,7 @@ ${bld}/makefile_database: ${Makefiles} ${bld}/check_makefile_w_arnings
OS_FILENAME=${OS_FILENAME} \
BUILD_DIR=${BUILD_DIR} \
SCREENSHOTS_DIR=${SCREENSHOTS_DIR} \
COMMIT_TIMESTAMP_ISO_8601=${COMMIT_TIMESTAMP_ISO_8601} \
COMMIT_TIMESTAMP_ISO_8601=${real_commit_timestamp_iso_8601} \
| sed -n -e '/^# Make data base,/,$$p' > $@
${bld}/makefile_database_files: ${bld}/makefile_database ${bld}/check_makefile_w_arnings
@ -138,7 +142,7 @@ clean_reproducible: ${bld}/check_makefile
make OS_FILENAME=${reproducible_os_filename} \
BUILD_DIR=${bld}/reproducible \
SCREENSHOTS_DIR=${bld}/reproducible/screenshots \
COMMIT_TIMESTAMP_ISO_8601=${COMMIT_TIMESTAMP_ISO_8601} \
COMMIT_TIMESTAMP_ISO_8601=${real_commit_timestamp_iso_8601} \
clean; \
fi
@ -158,13 +162,13 @@ ${bld}/test_pass/noemu_reproducible_build: ${os_filename} ${bld}/os.hex_with_off
make OS_FILENAME=${reproducible_os_filename} \
BUILD_DIR=${bld}/reproducible \
SCREENSHOTS_DIR=${bld}/reproducible/screenshots \
COMMIT_TIMESTAMP_ISO_8601=${COMMIT_TIMESTAMP_ISO_8601} \
COMMIT_TIMESTAMP_ISO_8601=${real_commit_timestamp_iso_8601} \
clean
unset MAKEFLAGS MAKELEVEL MAKE_TERMERR MFLAGS; \
make OS_FILENAME=${reproducible_os_filename} \
BUILD_DIR=${bld}/reproducible \
SCREENSHOTS_DIR=${bld}/reproducible/screenshots \
COMMIT_TIMESTAMP_ISO_8601=${COMMIT_TIMESTAMP_ISO_8601} \
COMMIT_TIMESTAMP_ISO_8601=${real_commit_timestamp_iso_8601} \
${reproducible_os_filename} \
${bld}/reproducible/os.hex_with_offsets
# Check that the second build produced the same file.
@ -186,6 +190,6 @@ ${bld}/test_pass/noemu_reproducible_build: ${os_filename} ${bld}/os.hex_with_off
make OS_FILENAME=${reproducible_os_filename} \
BUILD_DIR=${bld}/reproducible \
SCREENSHOTS_DIR=${bld}/reproducible/screenshots \
COMMIT_TIMESTAMP_ISO_8601=${COMMIT_TIMESTAMP_ISO_8601} \
COMMIT_TIMESTAMP_ISO_8601=${real_commit_timestamp_iso_8601} \
clean
touch $@

View File

@ -103,7 +103,8 @@ ${bld}/os.iso: ${bld}/iso_files/os.zip ${bld}/iso_files/boot/iso_boot.sys ./util
! test -d ${bld}/iso_files.tmp
cp -a ${cp_T_option} -- ${bld}/iso_files ${bld}/iso_files.tmp
find ${bld}/iso_files.tmp -depth -exec touch -t ${commit_timestamp} '{}' ';'
UTILS="$$PWD/utils" ./utils/faketime.sh ${commit_timestamp_iso_8601} sh -c '(cd ./${bld}/iso_files.tmp/ && "$$UTILS/mkisofs" \
UTILS="$$PWD/utils" ./utils/faketime.sh ${real_commit_timestamp_iso_8601} \
sh -c '(cd ./${bld}/iso_files.tmp/ && "$$UTILS/mkisofs" \
--input-charset utf-8 \
-rock \
-joliet \
@ -182,12 +183,12 @@ os_fat12_partition = "$@@@${bytes_fat12_start}"
${bld}/os.fat12: ${bld}/os.zip ${dep_bytes_fat12_size} ${dep_bytes_fat12_start} ${dep_sectors_os_size} \
./utils/mformat ./utils/mcopy ${bld}/check_makefile
set -x; dd if=/dev/zero bs=${sector_size} count=${sectors_os_size} of=$@
./utils/faketime.sh ${commit_timestamp_iso_8601} ./utils/mformat -v "Example OS" \
./utils/faketime.sh ${real_commit_timestamp_iso_8601} ./utils/mformat -v "Example OS" \
-T ${sectors_fat12_size} \
-h ${os_floppy_chs_h} \
-s ${os_floppy_chs_s} \
-i ${os_fat12_partition}
./utils/faketime.sh ${commit_timestamp_iso_8601} ./utils/mcopy -i ${os_fat12_partition} $< "::os.zip"
./utils/faketime.sh ${real_commit_timestamp_iso_8601} ./utils/mcopy -i ${os_fat12_partition} $< "::os.zip"
${bld}/iso_files/os.zip: ${bld}/os.zip ${bld}/check_makefile
# TODO: make it so that the various file formats are mutual quines:

109
guix.scm
View File

@ -21,6 +21,10 @@
(guix build-system gnu)
(guix gexp)
(guix)
(guix build utils)
(ice-9 popen)
(ice-9 rdelim)
(gnu packages version-control)
(gnu packages assembly)
(gnu packages base)
(gnu packages mtools)
@ -55,50 +59,65 @@
(synopsis "")))
(define-public os-test-framework
(package
(name "os-test-framework")
(version "0.0")
(build-system gnu-build-system)
(arguments
`(#:phases
(modify-phases %standard-phases
;; unpack ;; this phase is enabled
;; patch-source-shebangs ;; this phase is enabled
(add-after 'patch-source-shebangs 'make-clean
(lambda* (#:key inputs #:allow-other-keys)
(invoke "make" "clean" "COMMIT_TIMESTAMP_ISO_8601=1970-01-01T00:00:00+00:00")))
(delete 'configure)
(add-before 'build 'make-.gitignore-writable
(lambda* (#:key inputs #:allow-other-keys)
(invoke "chmod" "+w" ".gitignore")))
;; build ;; this phase is enabled
(delete 'check) ;; disabled for now, will enable it later.
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (lambda (f) (string-append (assoc-ref outputs "out") f)))) ;; TODO: use path-append or something similar
(invoke "mkdir" "-p" (out "/bin"))
(invoke "cp" "os.bat" (out "/bin/os.bat")))))
(delete 'patch-shebangs)
(delete 'strip))
#:parallel-build? #t
#:make-flags '("in-guix" "COMMIT_TIMESTAMP_ISO_8601=1970-01-01T00:00:00+00:00")))
(native-inputs
`(("nasm" ,nasm)
("which" ,which)
("mtools" ,mtools)
("mkisofs" ,xorriso)
("zip" ,zip)
("faketime" ,faketime)
("gdisk" ,gptfdisk)
("column" ,util-linux)))
(description "Test framework to run an OS in multiple emulators, as a guest graphical / text shell on linux, and so on.")
(home-page "https://github.com/jsmaniac/os-test-framework")
(license "CC0-1.0")
(source (local-file
(current-source-directory)
#:recursive? #t
#:select? (lambda (file stat)
(not (equal? (basename file) ".git")))))
(synopsis "")))
(let ((makefile-commit-timestamp
'(string-append
"COMMIT_TIMESTAMP_ISO_8601="
;; (let* ((pipe (open-input-pipe "git log -1 --pretty=format:%ad --date=iso8601-strict"))
;; (timestamp (read-line pipe)))
;; (close-pipe pipe)
;; timestamp)
"FILE")))
(package
(name "os-test-framework")
(version "0.0")
(build-system gnu-build-system)
(arguments
`(#:phases
(modify-phases %standard-phases
;; unpack ;; this phase is enabled
;; patch-source-shebangs ;; this phase is enabled
(add-after 'patch-source-shebangs 'make-clean
(lambda* (#:key inputs #:allow-other-keys)
(invoke "cp" "COMMIT_TIMESTAMP" "COMMIT_TIMESTAMP.bak")
(invoke "make" "clean" ,makefile-commit-timestamp)
(invoke "cp" "COMMIT_TIMESTAMP.bak" "COMMIT_TIMESTAMP")))
(delete 'configure)
(add-before 'build 'make-.gitignore-writable
(lambda* (#:key inputs #:allow-other-keys)
(invoke "chmod" "+w" ".gitignore")))
;; build ;; this phase is enabled
(delete 'check) ;; disabled for now, will enable it later.
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (lambda (f) (string-append (assoc-ref outputs "out") f)))) ;; TODO: use path-append or something similar
(invoke "mkdir" "-p" (out "/bin"))
(invoke "cp" "os.bat" (out "/bin/os.bat")))))
(delete 'patch-shebangs)
(delete 'strip))
#:parallel-build? #t
#:make-flags
(list "in-guix" ,makefile-commit-timestamp)))
(native-inputs
`(("git" ,git)
("nasm" ,nasm)
("which" ,which)
("mtools" ,mtools)
("mkisofs" ,xorriso)
("zip" ,zip)
("faketime" ,faketime)
("gdisk" ,gptfdisk)
("column" ,util-linux)))
(description "Test framework to run an OS in multiple emulators, as a guest graphical / text shell on linux, and so on.")
(home-page "https://github.com/jsmaniac/os-test-framework")
(license "CC0-1.0")
(source (let ()
(invoke "sh" "-c"
"git log -1 --pretty=format:%ad --date=iso8601-strict > COMMIT_TIMESTAMP")
(local-file
(current-source-directory)
#:recursive? #t
#:select? (lambda (file stat)
(not (equal? (basename file) ".git"))))))
(synopsis ""))))
os-test-framework