(use-modules (fruix system freebsd) (ice-9 format) (srfi srfi-13) (rnrs io ports)) (define workdir (or (getenv "WORKDIR") (error "WORKDIR environment variable is required"))) (define os-file (or (getenv "OS_FILE") (error "OS_FILE environment variable is required"))) (define store-dir (or (getenv "STORE_DIR") "/frx/store")) (define guile-prefix (or (getenv "GUILE_PREFIX") "/tmp/guile-freebsd-validate-install")) (define guile-extra-prefix (or (getenv "GUILE_EXTRA_PREFIX") "/tmp/guile-gnutls-freebsd-validate-install")) (define shepherd-prefix (or (getenv "SHEPHERD_PREFIX") "/tmp/shepherd-freebsd-validate-install")) (define metadata-file (string-append workdir "/phase7-system-closure-metadata.txt")) (primitive-load os-file) (validate-operating-system phase7-operating-system) (define (assert-exists path) (unless (file-exists? path) (error "required path missing" path))) (let* ((closure-a (materialize-operating-system phase7-operating-system #:store-dir store-dir #:guile-prefix guile-prefix #:guile-extra-prefix guile-extra-prefix #:shepherd-prefix shepherd-prefix)) (closure-b (materialize-operating-system phase7-operating-system #:store-dir store-dir #:guile-prefix guile-prefix #:guile-extra-prefix guile-extra-prefix #:shepherd-prefix shepherd-prefix)) (closure-path (assoc-ref closure-a 'closure-path)) (closure-rebuild-path (assoc-ref closure-b 'closure-path)) (kernel-store (assoc-ref closure-a 'kernel-store)) (bootloader-store (assoc-ref closure-a 'bootloader-store)) (guile-store (assoc-ref closure-a 'guile-store)) (guile-extra-store (assoc-ref closure-a 'guile-extra-store)) (shepherd-store (assoc-ref closure-a 'shepherd-store)) (base-package-stores (assoc-ref closure-a 'base-package-stores)) (rc-script (string-append closure-path "/usr/local/etc/rc.d/fruix-shepherd")) (shepherd-config (string-append closure-path "/shepherd/init.scm")) (activation-script (string-append closure-path "/activate")) (loader-conf (string-append closure-path "/boot/loader.conf")) (profile-bin-sh (string-append closure-path "/profile/bin/sh")) (profile-sbin-init (string-append closure-path "/profile/sbin/init")) (profile-rc (string-append closure-path "/profile/etc/rc")) (ready-marker (assoc-ref (operating-system-closure-spec phase7-operating-system) 'ready-marker)) (rc-script-target (readlink (string-append closure-path "/boot/loader"))) (kernel-link (readlink (string-append closure-path "/boot/kernel/kernel")))) (for-each assert-exists (list closure-path kernel-store bootloader-store guile-store guile-extra-store shepherd-store rc-script shepherd-config activation-script loader-conf profile-bin-sh profile-sbin-init profile-rc (string-append closure-path "/parameters.scm"))) (unless (string=? closure-path closure-rebuild-path) (error "closure path was not reproducible" closure-path closure-rebuild-path)) (call-with-output-file metadata-file (lambda (port) (format port "store_dir=~a~%" store-dir) (format port "closure_path=~a~%" closure-path) (format port "closure_rebuild_path=~a~%" closure-rebuild-path) (format port "kernel_store=~a~%" kernel-store) (format port "bootloader_store=~a~%" bootloader-store) (format port "guile_store=~a~%" guile-store) (format port "guile_extra_store=~a~%" guile-extra-store) (format port "shepherd_store=~a~%" shepherd-store) (format port "base_package_store_count=~a~%" (length base-package-stores)) (format port "base_package_stores=~a~%" (string-join base-package-stores ",")) (format port "rc_script=~a~%" rc-script) (format port "shepherd_config=~a~%" shepherd-config) (format port "activation_script=~a~%" activation-script) (format port "loader_conf=~a~%" loader-conf) (format port "boot_loader_target=~a~%" rc-script-target) (format port "kernel_link_target=~a~%" kernel-link) (format port "profile_bin_sh=~a~%" profile-bin-sh) (format port "profile_sbin_init=~a~%" profile-sbin-init) (format port "profile_rc=~a~%" profile-rc) (format port "ready_marker=~a~%" ready-marker) (format port "init_integration=freebsd-init+rc.d-shepherd~%"))) (when (getenv "METADATA_OUT") (copy-file metadata-file (getenv "METADATA_OUT"))) (format #t "PASS phase7-system-closure~%") (format #t "Metadata file: ~a~%" metadata-file) (when (getenv "METADATA_OUT") (format #t "Copied metadata to: ~a~%" (getenv "METADATA_OUT"))) (display "--- metadata ---\n") (display (call-with-input-file metadata-file get-string-all)))