diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..e1d3e71 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,87 @@ +bin_SCRIPTS = scripts/msg + +# Handle substitution of fully-expanded Autoconf variables. +do_subst = $(SED) \ + -e 's,[@]GUILE[@],$(GUILE),g' \ + -e 's,[@]guilemoduledir[@],$(guilemoduledir),g' \ + -e 's,[@]guileobjectdir[@],$(guileobjectdir),g' \ + -e 's,[@]localedir[@],$(localedir),g' + +nodist_noinst_SCRIPTS = pre-inst-env + +GOBJECTS = $(SOURCES:%.scm=%.go) + +moddir=$(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION) +godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache +ccachedir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache + +nobase_dist_mod_DATA = $(filter-out $(BUILT_SOURCES),$(SOURCES)) $(NOCOMP_SOURCES) +nobase_nodist_mod_DATA = $(BUILT_SOURCES) +nobase_go_DATA = $(GOBJECTS) + +# Make sure source files are installed first, so that the mtime of +# installed compiled files is greater than that of installed source +# files. See +# +# for details. +guile_install_go_files = install-nobase_goDATA +$(guile_install_go_files): install-nobase_dist_modDATA + +GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat +SUFFIXES = .scm .go +.scm.go: + $(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_TARGET) $(GUILE_WARNINGS) -o "$@" "$<" + +SOURCES = msg.scm \ + msg/machine.scm \ + msg/hconfig.scm \ + msg/shell.scm \ + msg/helpers.scm + +TESTS = + +TEST_EXTENSIONS = .scm +SCM_LOG_DRIVER = \ + $(top_builddir)/pre-inst-env \ + $(GUILE) --no-auto-compile -e main \ + $(top_srcdir)/build-aux/test-driver.scm + +# Tell 'build-aux/test-driver.scm' to display only source file names, +# not indivdual test names. +AM_SCM_LOG_DRIVER_FLAGS = --brief=yes + +AM_SCM_LOG_FLAGS = --no-auto-compile -L "$(top_srcdir)" + +AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" + +info_TEXINFOS = doc/msg.texi \ + doc/version.texi + +EXTRA_DIST = README.org \ + README \ + HACKING \ + COPYING \ + doc/.dirstamp \ + doc/msg.info \ + doc/stamp-vti \ + NEWS \ + AUTHORS \ + ChangeLog \ + guix.scm \ + .gitignore \ + hall.scm \ + build-aux/test-driver.scm \ + $(TESTS) + +ACLOCAL_AMFLAGS = -I m4 + +AM_DISTCHECK_DVI_TARGET = info # Disable DVI as part of distcheck + +clean-go: + -$(RM) $(GOBJECTS) +.PHONY: clean-go + +CLEANFILES = \ + $(BUILT_SOURCES) \ + $(GOBJECTS) \ + $(TESTS:tests/%.scm=%.log) diff --git a/build-aux/test-driver.scm b/build-aux/test-driver.scm new file mode 100644 index 0000000..0c555ea --- /dev/null +++ b/build-aux/test-driver.scm @@ -0,0 +1,179 @@ +;;;; test-driver.scm - Guile test driver for Automake testsuite harness + +(define script-version "2019-01-15.13") ;UTC + +;;; Copyright © 2015, 2016 Mathieu Lirzin +;;; Copyright © 2019 Alex Sassmannshausen +;;; +;;; This program is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see . + +;;;; Commentary: +;;; +;;; This script provides a Guile test driver using the SRFI-64 Scheme API for +;;; test suites. SRFI-64 is distributed with Guile since version 2.0.9. +;;; +;;; This script is a lightly modified version of the orignal written by +;;; Matthieu Lirzin. The changes make it suitable for use as part of the +;;; guile-hall infrastructure. +;;; +;;;; Code: + +(use-modules (ice-9 getopt-long) + (ice-9 pretty-print) + (srfi srfi-26) + (srfi srfi-64)) + +(define (show-help) + (display "Usage: + test-driver --test-name=NAME --log-file=PATH --trs-file=PATH + [--expect-failure={yes|no}] [--color-tests={yes|no}] + [--enable-hard-errors={yes|no}] [--brief={yes|no}}] [--] + TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] +The '--test-name', '--log-file' and '--trs-file' options are mandatory. +")) + +(define %options + '((test-name (value #t)) + (log-file (value #t)) + (trs-file (value #t)) + (color-tests (value #t)) + (expect-failure (value #t)) ;XXX: not implemented yet + (enable-hard-errors (value #t)) ;not implemented in SRFI-64 + (brief (value #t)) + (help (single-char #\h) (value #f)) + (version (single-char #\V) (value #f)))) + +(define (option->boolean options key) + "Return #t if the value associated with KEY in OPTIONS is 'yes'." + (and=> (option-ref options key #f) (cut string=? <> "yes"))) + +(define* (test-display field value #:optional (port (current-output-port)) + #:key pretty?) + "Display 'FIELD: VALUE\n' on PORT." + (if pretty? + (begin + (format port "~A:~%" field) + (pretty-print value port #:per-line-prefix "+ ")) + (format port "~A: ~S~%" field value))) + +(define* (result->string symbol #:key colorize?) + "Return SYMBOL as an upper case string. Use colors when COLORIZE is #t." + (let ((result (string-upcase (symbol->string symbol)))) + (if colorize? + (string-append (case symbol + ((pass) "") ;green + ((xfail) "") ;light green + ((skip) "") ;blue + ((fail xpass) "") ;red + ((error) "")) ;magenta + result + "") ;no color + result))) + +(define* (test-runner-gnu test-name #:key color? brief? out-port trs-port) + "Return an custom SRFI-64 test runner. TEST-NAME is a string specifying the +file name of the current the test. COLOR? specifies whether to use colors, +and BRIEF?, well, you know. OUT-PORT and TRS-PORT must be output ports. The +current output port is supposed to be redirected to a '.log' file." + + (define (test-on-test-begin-gnu runner) + ;; Procedure called at the start of an individual test case, before the + ;; test expression (and expected value) are evaluated. + (let ((result (cute assq-ref (test-result-alist runner) <>))) + (format #t "test-name: ~A~%" (result 'test-name)) + (format #t "location: ~A~%" + (string-append (result 'source-file) ":" + (number->string (result 'source-line)))) + (test-display "source" (result 'source-form) #:pretty? #t))) + + (define (test-on-test-end-gnu runner) + ;; Procedure called at the end of an individual test case, when the result + ;; of the test is available. + (let* ((results (test-result-alist runner)) + (result? (cut assq <> results)) + (result (cut assq-ref results <>))) + (unless brief? + ;; Display the result of each test case on the console. + (format out-port "~A: ~A - ~A~%" + (result->string (test-result-kind runner) #:colorize? color?) + test-name (test-runner-test-name runner))) + (when (result? 'expected-value) + (test-display "expected-value" (result 'expected-value))) + (when (result? 'expected-error) + (test-display "expected-error" (result 'expected-error) #:pretty? #t)) + (when (result? 'actual-value) + (test-display "actual-value" (result 'actual-value))) + (when (result? 'actual-error) + (test-display "actual-error" (result 'actual-error) #:pretty? #t)) + (format #t "result: ~a~%" (result->string (result 'result-kind))) + (newline) + (format trs-port ":test-result: ~A ~A~%" + (result->string (test-result-kind runner)) + (test-runner-test-name runner)))) + + (define (test-on-group-end-gnu runner) + ;; Procedure called by a 'test-end', including at the end of a test-group. + (let ((fail (or (positive? (test-runner-fail-count runner)) + (positive? (test-runner-xpass-count runner)))) + (skip (or (positive? (test-runner-skip-count runner)) + (positive? (test-runner-xfail-count runner))))) + ;; XXX: The global results need some refinements for XPASS. + (format trs-port ":global-test-result: ~A~%" + (if fail "FAIL" (if skip "SKIP" "PASS"))) + (format trs-port ":recheck: ~A~%" + (if fail "yes" "no")) + (format trs-port ":copy-in-global-log: ~A~%" + (if (or fail skip) "yes" "no")) + (when brief? + ;; Display the global test group result on the console. + (format out-port "~A: ~A~%" + (result->string (if fail 'fail (if skip 'skip 'pass)) + #:colorize? color?) + test-name)) + #f)) + + (let ((runner (test-runner-null))) + (test-runner-on-test-begin! runner test-on-test-begin-gnu) + (test-runner-on-test-end! runner test-on-test-end-gnu) + (test-runner-on-group-end! runner test-on-group-end-gnu) + (test-runner-on-bad-end-name! runner test-on-bad-end-name-simple) + runner)) + +;;; +;;; Entry point. +;;; + +(define (main . args) + (let* ((opts (getopt-long (command-line) %options)) + (option (cut option-ref opts <> <>))) + (cond + ((option 'help #f) (show-help)) + ((option 'version #f) (format #t "test-driver.scm ~A" script-version)) + (else + (let ((log (open-file (option 'log-file "") "w0")) + (trs (open-file (option 'trs-file "") "wl")) + (out (duplicate-port (current-output-port) "wl"))) + (redirect-port log (current-output-port)) + (redirect-port log (current-warning-port)) + (redirect-port log (current-error-port)) + (test-with-runner + (test-runner-gnu (option 'test-name #f) + #:color? (option->boolean opts 'color-tests) + #:brief? (option->boolean opts 'brief) + #:out-port out #:trs-port trs) + (load-from-path (option 'test-name #f))) + (close-port log) + (close-port trs) + (close-port out)))) + (exit 0))) diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..581ad19 --- /dev/null +++ b/configure.ac @@ -0,0 +1,39 @@ +dnl -*- Autoconf -*- + +AC_INIT(msg, 0.1) +AC_SUBST(HVERSION, "\"0.1\"") +AC_SUBST(AUTHOR, "\"Chad Nelson\"") +AC_SUBST(COPYRIGHT, "'(2023)") +AC_SUBST(LICENSE, gpl3+) +AC_CONFIG_SRCDIR(msg.scm) +AC_CONFIG_AUX_DIR([build-aux]) +AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects color-tests parallel-tests -Woverride -Wno-portability]) +AM_SILENT_RULES([yes]) + +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env]) +AC_CONFIG_FILES([scripts/msg],[chmod +x scripts/msg]) +dnl Search for 'guile' and 'guild'. This macro defines +dnl 'GUILE_EFFECTIVE_VERSION'. +GUILE_PKG([3.0 2.2 2.0]) +GUILE_PROGS +GUILE_SITE_DIR +if test "x$GUILD" = "x"; then + AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.]) +fi + +if test "$cross_compiling" != no; then + GUILE_TARGET="--target=$host_alias" + AC_SUBST([GUILE_TARGET]) +fi + +dnl Hall auto-generated guile-module dependencies + + +dnl Installation directories for .scm and .go files. +guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION" +guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache" +AC_SUBST([guilemoduledir]) +AC_SUBST([guileobjectdir]) + +AC_OUTPUT diff --git a/hall.scm b/hall.scm index beb3c23..a306c42 100644 --- a/hall.scm +++ b/hall.scm @@ -18,6 +18,7 @@ "msg" ((scheme-file "machine") (scheme-file "hconfig") + (scheme-file "shell") (scheme-file "helpers"))))) (tests ((directory "tests" ()))) (programs ((directory "scripts" ((in-file "msg"))))) diff --git a/msg/helpers.scm b/msg/helpers.scm index 4a6232e..a2c0363 100644 --- a/msg/helpers.scm +++ b/msg/helpers.scm @@ -4,8 +4,7 @@ #:use-module (ice-9 rdelim) #:use-module (system foreign) #:export (directory-exists? - run-shell-command - start-command-in-background)) + run-shell-command)) (define (directory-exists? path) (catch 'system-error @@ -16,6 +15,6 @@ (define (run-shell-command command) (let* ((port (open-input-pipe command)) (str (read-line port))) - ;;(close-pipe port) - port)) + (close-pipe port) + str)) diff --git a/msg/machine.scm b/msg/machine.scm index fb1596f..f6948a5 100644 --- a/msg/machine.scm +++ b/msg/machine.scm @@ -17,63 +17,144 @@ (("reinit") (clear-install) (init)) + (("start") + (start)) + (("stop") + (stop)) (_ (display "Please enter a valid command or -h for help.\n")))) +(define home-path (getenv "HOME")) +(define arch (run-shell-command "uname -m")) + (define* (help) (display "\nHere are the available commands:\n\n") (display "start: Start the MSG envrionment.\n")) (define* (clear-install) - (display "This is a destructive command and will remove your entire guix instance. Proceed? (y/n)\n") - (define response (read-line)) - (if (string=? response "y") - (begin - (system "rm -r ~/.guix")) - (display "Please enter a valid response."))) + (let loop () + (display "This is a destructive command and will remove your entire Guix instance. Proceed? (y/n)\n") + (define response (read-line)) + (cond + ((string=? response "y") + (system "rm -r ~/.guix")) + ((string=? response "n") + (display "Operation canceled.\n") + (exit 0)) + (else + (display "Please enter a valid response.\n") + (loop))))) -(define* (init) - (define home-path (getenv "HOME")) - (define arch (run-shell-command "uname -m")) - - +(define* (start) (if (not (directory-exists? (format #f "~a/.guix" home-path))) (begin - (system "mkdir -p $HOME/.guix/qemu $HOME/.guix/home $HOME/.guix/ssh-cert") - ;; Get msg image + (display "MSG not initialized. Please run `msg machine init` to continue.") + (exit 0))) + (cond + ((string=? arch "arm64") + (system "/opt/homebrew/bin/qemu-system-aarch64 \ + -machine virt,highmem=on \ + -accel hvf \ + -cpu host \ + -smp 4 \ + -display none \ + -hda $HOME/.guix/qemu/guix-user.qcow2 \ + -m 4G \ + -virtfs local,path=/Users,security_model=mapped,mount_tag=macos \ + -bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \ + -device virtio-net,netdev=vmnic \ + -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &")) + ((string=? arch "x86_64") + ;; (system "/usr/local/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-x86_64guix-user-x86.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") + ;; (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") + ;; (system "/usr/local/bin/qemu-system-x86_64 \ + ;; -machine type=q35,accel=hvf \ + ;; -smp 4 \ + ;; -hda $HOME/.guix/qemu/guix-user.qcow2 \ + ;; -m 4G \ + ;; -display none \ + ;; -cpu Nehalem \ + ;; -virtfs local,path=$HOME/.guix,security_model=mapped,mount_tag=macos \ + ;; -device virtio-net,netdev=vmnic \ + ;; -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22") + (display "x86_64 is not currently supported") + (exit 0))) + (display "MSG has been started") + ) - (cond ((string=? arch "arm64") - (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-aarch64guix-user.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") - (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") - (define pid (run-shell-command "/opt/homebrew/bin/qemu-system-aarch64 \ - -machine virt,highmem=on \ - -accel hvf \ - -cpu host \ - -smp 4 \ - -display none \ - -hda $HOME/.guix/qemu/guix-user.qcow2 \ - -m 4G \ - -virtfs local,path=$HOME/.guix/home,security_model=mapped,mount_tag=macos \ - -bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \ - -device virtio-net,netdev=vmnic \ - -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &")) - (display pid)) - ((string=? arch "x86_64") - (system "/usr/local/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-x86_64guix-user-x86.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") - (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") - (system "/usr/local/bin/qemu-system-x86_64 \ - -machine type=q35,accel=hvf \ - -smp 4 \ - -hda $HOME/.guix/qemu/guix-user.qcow2 \ - -m 4G \ - -display none \ - -cpu Nehalem \ - -virtfs local,path=$HOME/.guix,security_model=mapped,mount_tag=macos \ - -device virtio-net,netdev=vmnic \ - -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22") - )) +(define* (stop) + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo shutdown'")) + +(define* (init) + (if (not (directory-exists? (format #f "~a/.guix" home-path))) + (begin + ;; Grab ssh cert for installer + (system "mkdir -p $HOME/.guix/qemu $HOME/.guix/home $HOME/.guix/ssh-cert") + (system "ssh-keygen -R \"[127.0.0.1]:9001\"") + + ;; Download system image and and start vm + (cond + ((string=? arch "arm64") + (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-aarch64guix-installer.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") + (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") + (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-aarch64config.scm -O $HOME/.guix/home/config.scm") + (system "/opt/homebrew/bin/qemu-system-aarch64 \ + -machine virt,highmem=on \ + -accel hvf \ + -cpu host \ + -smp 8 \ + -display none \ + -hda $HOME/.guix/qemu/guix-user.qcow2 \ + -m 8G \ + -virtfs local,path=$HOME/.guix/home,security_model=mapped,mount_tag=macos \ + -bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \ + -device virtio-net,netdev=vmnic \ + -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &")) + ((string=? arch "x86_64") + ;; (system "/usr/local/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-x86_64guix-user-x86.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") + ;; (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") + ;; (system "/usr/local/bin/qemu-system-x86_64 \ + ;; -machine type=q35,accel=hvf \ + ;; -smp 4 \ + ;; -hda $HOME/.guix/qemu/guix-user.qcow2 \ + ;; -m 4G \ + ;; -display none \ + ;; -cpu Nehalem \ + ;; -virtfs local,path=$HOME/.guix,security_model=mapped,mount_tag=macos \ + ;; -device virtio-net,netdev=vmnic \ + ;; -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22") + (display "x86_64 is not currently supported") + (exit 0))) ;; Get msg ssh-key - (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg_rsa -O $HOME/.guix/ssh-cert/msg_rsa"))) + (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg_rsa -O $HOME/.guix/ssh-cert/msg_rsa") + (system "chmod 400 ~/.guix/ssh-cert/msg_rsa ") - (system "ssh -o StrictHostKeychecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'guix'")) + (update-uid) + + (build-msg) + + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'shutdown'") + (system "ssh-keygen -R \"[127.0.0.1]:9001\"") + (sleep 30) + (system "rm ~/.guix/qemu/guix-user.qcow2") + (system "mv ~/.guix/home/guix-user.qcow2 ~/.guix/qemu/") + (start) + (sleep 15) + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo mkdir /Users'") + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo shutdown'") + (display "\nMSG is ready to be started. Run 'msg machine start' to begin.\n")) + (display "MSG already initialized. Please run `msg machine reinit` if you would like to recreate it.")) + + + ) + +(define (build-msg) + ;; Build MSG + (define* filename (run-shell-command "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'guix system image -t qcow2 --save-provenance --image-size=100G /etc/config.scm'")) + (system (format #f "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'cp ~a /mnt/macos/guix-user.qcow2'" filename))) + +(define (update-uid) + ;; Update UID for msg image + (system "sed -i \"s/\\$UID/$(id -u)/g\" ~/.guix/home/config.scm") + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'cp /mnt/macos/config.scm /etc/config.scm'")) diff --git a/msg/shell.scm b/msg/shell.scm new file mode 100644 index 0000000..26171fa --- /dev/null +++ b/msg/shell.scm @@ -0,0 +1,5 @@ +(define-module (msg shell) + #:export (shell)) + +(define* (shell) + (system "ssh -o StrictHostKeyChecking=no -X -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001")) diff --git a/pre-inst-env.in b/pre-inst-env.in new file mode 100644 index 0000000..31c499d --- /dev/null +++ b/pre-inst-env.in @@ -0,0 +1,13 @@ +#!/bin/sh + +abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`" +abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`" + +GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH" +GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH" +export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH + +PATH="$abs_top_builddir/scripts:$PATH" +export PATH + +exec "$@" diff --git a/scripts/msg.in b/scripts/msg.in index ce79bc7..341c393 100644 --- a/scripts/msg.in +++ b/scripts/msg.in @@ -3,6 +3,7 @@ !# (use-modules (msg machine) + (msg shell) (ice-9 match)) (define* (main #:optional (args (command-line))) @@ -11,6 +12,8 @@ (match clean-args (("machine" rest ...) (machine rest)) + (("shell" rest ...) + (shell)) (("-h") (help)) (_