# Gash --- Guile As SHell # Copyright © 2017, 2018, 2019 Timothy Sample # Copyright © 2018, 2019 Jan (janneke) Nieuwenhuizen # # This file is part of Gash. # # Gash 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. # # Gash 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 Gash. If not, see . include $(top_srcdir)/build-aux/guile.am EXTRA_DIST += \ .dir-locals.el \ COPYING.CC0 \ bootstrap \ build-aux/git-version-gen \ build-aux/gitlab-ci.yml \ build-aux/gitlog-to-changelog \ guix.scm # Modules and scripts ##################### SOURCES = \ gash/built-ins/break.scm \ gash/built-ins/cd.scm \ gash/built-ins/colon.scm \ gash/built-ins/command.scm \ gash/built-ins/continue.scm \ gash/built-ins/dot.scm \ gash/built-ins/echo.scm \ gash/built-ins/eval.scm \ gash/built-ins/exec.scm \ gash/built-ins/exit.scm \ gash/built-ins/export.scm \ gash/built-ins/false.scm \ gash/built-ins/pwd.scm \ gash/built-ins/read.scm \ gash/built-ins/readonly.scm \ gash/built-ins/return.scm \ gash/built-ins/set.scm \ gash/built-ins/shift.scm \ gash/built-ins/trap.scm \ gash/built-ins/true.scm \ gash/built-ins/type.scm \ gash/built-ins/umask.scm \ gash/built-ins/unset.scm \ gash/built-ins/utils.scm \ gash/built-ins.scm \ gash/compat/hash-table.scm \ gash/compat/textual-ports.scm \ gash/compat.scm \ gash/config.scm \ gash/environment.scm \ gash/eval.scm \ gash/gash.scm \ gash/lexer.scm \ gash/parser.scm \ gash/pattern.scm \ gash/readline.scm \ gash/repl.scm \ gash/shell.scm \ gash/word.scm bin_SCRIPTS = \ scripts/gash do_subst = sed \ -e 's,[@]GUILE[@],$(GUILE),g' \ -e 's,[@]MODDIR[@],$(moddir),g' \ -e 's,[@]GODIR[@],$(ccachedir),g' scripts/gash: scripts/gash.in Makefile mkdir -p scripts $(do_subst) < $(srcdir)/scripts/gash.in > scripts/gash chmod a+x scripts/gash EXTRA_DIST += scripts/gash.in # Documentation ############### info_TEXINFOS = doc/gash.texi gash_TEXINFOS = doc/fdl-1.3.texi EXTRA_DIST += \ $(gash_TEXINFOS) \ doc/syntax.txt # Tests ####### TEST_EXTENSIONS = .scm .sh SCM_LOG_COMPILER = $(top_builddir)/pre-inst-env $(GUILE) AM_SCM_LOG_FLAGS = --no-auto-compile SH_LOG_COMPILER = $(top_builddir)/pre-inst-env $(top_srcdir)/test.sh .PHONY: check-spec check-spec: $(MAKE) $(AM_MAKEFLAGS) -L -C tests/spec check .PHONY: check-bootstrap check-bootstrap: guix build -f tests/bootstrap/bash-without-bash.scm .PHONY: check-gash check-gash: SHELL=gash $(top_builddir)/pre-inst-env $(top_builddir)/check.sh UNIT_TESTS = \ tests/unit/lexer.scm \ tests/unit/parser.scm \ tests/unit/pattern.scm \ tests/unit/shell.scm \ tests/unit/word.scm FULL_TESTS = \ tests/00-exit.sh \ tests/00-exit-0.sh \ tests/00-exit-1.sh \ tests/00-exit-2.sh \ tests/00-exit-error.sh \ tests/00-exit-var.sh \ tests/01-script-newline.sh \ tests/01-script-semi.sh \ tests/01-script-backslash.sh \ tests/01-script-backslash-space.sh \ tests/01-script-backslash-twice.sh \ tests/01-script-arg-0.sh \ tests/01-script-arg-length.sh \ tests/01-script-arg-list.sh \ tests/01-script-shift.sh \ tests/03-echo.sh \ tests/03-echo-doublequotes.sh \ tests/03-echo-nesting.sh \ tests/03-echo-escaped-doublequotes.sh \ tests/03-echo-quoted-doublequotes.sh \ tests/03-echo-brace.sh \ tests/04-echo-var.sh \ tests/04-echo-equal.sh \ tests/04-echo-word-at.sh \ tests/04-echo-word-at-word.sh \ tests/05-assignment.sh \ tests/05-assignment-backtick.sh \ tests/05-assignment-echo.sh \ tests/05-assignment-empty.sh \ tests/05-assignment-singlequote.sh \ tests/05-assignment-double-quote.sh \ tests/05-assignment-variable-word.sh \ tests/05-assignment-word-variable.sh \ tests/05-assignment-doublequoted-doublequotes.sh \ tests/06-compound-word.sh \ tests/06-command-compound-word.sh \ tests/07-variable-or.sh \ tests/07-variable-not-or.sh \ tests/07-variable-or-slash.sh \ tests/07-variable-or-variable.sh \ tests/07-variable-or-doublequote.sh \ tests/07-variable-or-empty.sh \ tests/08-variable-and.sh \ tests/08-variable-not-and.sh \ tests/10-if.sh \ tests/10-if-false.sh \ tests/10-if-word-variable.sh \ tests/10-if-line.sh \ tests/10-if-multiple.sh \ tests/10-if-else.sh \ tests/10-else-multiple.sh \ tests/10-if-elif.sh \ tests/10-if-redirect.sh \ tests/10-if-test.sh \ tests/10-if-test-false.sh \ tests/10-if-bracket.sh \ tests/10-if-bracket-false.sh \ tests/11-for.sh \ tests/11-for-split-sequence.sh \ tests/11-for-done-subshell.sh \ tests/20-semi.sh \ tests/20-or.sh \ tests/20-and.sh \ tests/20-pipe-exit-0.sh \ tests/20-pipe-exit-1.sh \ tests/20-pipe-sed.sh \ tests/20-pipe-sed-cat.sh \ tests/20-exec.sh \ tests/30-substitution.sh \ tests/30-substitution-word.sh \ tests/30-substitution-backtick.sh \ tests/30-substitution-assignment.sh \ tests/30-for-substitution.sh \ tests/30-substitution-assignment.sh \ tests/30-substitution-assignment-at.sh \ tests/30-substitution-redirect.sh \ tests/40-eval.sh \ tests/40-eval-echo-variable.sh \ tests/40-assignment-eval-echo.sh \ tests/41-dot.sh \ tests/42-sh.sh \ tests/42-sh-export.sh \ tests/42-export-new.sh \ tests/42-sh-export-new.sh \ tests/43-trap-subshell.sh \ tests/50-iohere.sh \ tests/50-iohere-builtin.sh \ tests/50-redirect.sh \ tests/50-redirect-in.sh \ tests/50-redirect-append.sh \ tests/50-redirect-pipe.sh \ tests/50-redirect-sed.sh \ tests/50-redirect-space.sh \ tests/50-redirect-in-out.sh \ tests/50-redirect-clobber.sh \ tests/60-function.sh \ tests/60-function-at.sh \ tests/60-subst.sh \ tests/70-hash.sh \ tests/70-hash-hash.sh \ tests/70-percent.sh \ tests/70-percent-percent.sh \ tests/70-percent-space.sh \ tests/70-slash.sh \ tests/70-slash-string.sh \ tests/70-slash-string-slash.sh \ tests/100-cd.sh \ tests/100-cd-foo.sh \ tests/100-test.sh \ tests/100-test-false.sh \ tests/100-test-file.sh \ tests/100-bracket-file.sh TESTS = $(UNIT_TESTS) $(FULL_TESTS) XFAIL_TESTS = \ tests/70-hash.sh \ tests/70-hash-hash.sh \ tests/70-percent.sh \ tests/70-percent-percent.sh \ tests/70-percent-space.sh \ tests/70-slash.sh \ tests/70-slash-string.sh \ tests/70-slash-string-slash.sh # These tests will not be run. Put tests here # that pass or fail based on environmental # factors. BROKEN_TESTS = \ tests/50-redirect-merge.sh TEST_DATA_FILES = \ tests/00-exit-1.exit \ tests/00-exit-2.exit \ tests/00-exit-error.exit \ tests/00-exit-var.exit \ tests/01-script-arg-length.stdout \ tests/01-script-arg-list.stdout \ tests/01-script-backslash-twice.exit \ tests/01-script-backslash.exit \ tests/01-script-newline.exit \ tests/01-script-semi.exit \ tests/01-script-shift.stdout \ tests/03-echo-brace.stdout \ tests/03-echo-doublequotes.stdout \ tests/03-echo-escaped-doublequotes.stdout \ tests/03-echo-nesting.stdout \ tests/03-echo-quoted-doublequotes.stdout \ tests/04-echo-equal.stdout \ tests/04-echo-word-at-word.stdout \ tests/04-echo-word-at.stdout \ tests/05-assignment-backtick.stdout \ tests/05-assignment-doublequoted-doublequotes.stdout \ tests/05-assignment-echo.stdout \ tests/05-assignment-empty.stdout \ tests/05-assignment-variable-word.stdout \ tests/05-assignment-word-variable.stdout \ tests/06-command-compound-word.stdout \ tests/06-compound-word.stdout \ tests/07-variable-not-or.stdout \ tests/07-variable-or-doublequote.stdout \ tests/07-variable-or-empty.stdout \ tests/07-variable-or-variable.stdout \ tests/07-variable-or.stdout \ tests/08-variable-and.stdout \ tests/08-variable-not-and.stdout \ tests/10-else.multiple.stdout \ tests/10-if-multiple.stdout \ tests/11-for-done-subshell.stdout \ tests/11-for-split-sequence.stdout \ tests/11-for.stdout \ tests/20-and.exit \ tests/20-pipe-exit-1.exit \ tests/20-pipe-sed-cat.stdout \ tests/20-pipe-sed.stdout \ tests/20-semi.exit \ tests/30-for-substitution.stdout \ tests/30-substitution-assignment-at.stdout \ tests/30-substitution-assignment.stdout \ tests/30-substitution-backtick.stdout \ tests/30-substitution-redirect.stdout \ tests/30-substitution-word.stdout \ tests/30-substitution.stdout \ tests/40-assignment-eval-echo.stdout \ tests/40-eval-echo-variable.stdout \ tests/40-eval.stdout \ tests/41-dot.stdout \ tests/42-export-new.stdout \ tests/42-sh-export-new.stdout \ tests/42-sh-export.stdout \ tests/42-sh.stdout \ tests/43-trap-subshell.stdout \ tests/50-iohere.stdout \ tests/50-redirect-append.stdout \ tests/50-redirect-clobber.stdout \ tests/50-redirect-in-out.stdout \ tests/50-redirect-merge.stdout \ tests/50-redirect-pipe.stdout \ tests/50-redirect-sed.stdout \ tests/50-redirect-space.stdout \ tests/50-redirect.stdout \ tests/60-function-at.stdout \ tests/60-function.stdout \ tests/70-hash-hash.stdout \ tests/70-hash.stdout \ tests/70-percent-percent.stdout \ tests/70-percent-space.stdout \ tests/70-percent.stdout \ tests/70-slash-string.stdout \ tests/70-slash.stdout \ tests/100-cd-foo.exit \ tests/100-cd.stdout \ tests/data/star/2 \ tests/data/star/3 \ tests/data/star/0 \ tests/data/star/1 \ tests/data/foo \ tests/data/diff.scm \ tests/data/script.sh .PHONY: test-list test-list: ; @echo $(TESTS) EXTRA_DIST += \ $(TESTS) \ $(BROKEN_TESTS) \ $(TEST_DATA_FILES) \ test.sh \ tests/unit/automake.scm \ tests/spec/check-spec \ tests/spec/Makefile.am \ tests/spec/Makefile.in \ tests/spec/oil.scm \ tests/bootstrap/bash-without-bash.scm # Coverage ########## if HAVE_GENHTML lcov.info: all $(top_builddir)/pre-inst-env $(top_builddir)/tools/coverage coverage: lcov.info $(GENHTML) -o $(top_builddir)/coverage lcov.info endif # HAVE_GENHTML # Distribution ############## dist-hook: gen-ChangeLog echo $(VERSION) > $(distdir)/.tarball-version git ls-tree -r --name-only HEAD > $(distdir)/.tarball-manifest .PHONY: gen-ChangeLog gen-ChangeLog: $(top_srcdir)/build-aux/gitlog-to-changelog \ > $(distdir)/ChangeLog-t rm -f $(distdir)/ChangeLog mv $(distdir)/ChangeLog-t $(distdir)/ChangeLog distcheck-hook: set -e; \ manifest=$(distdir)/.tarball-manifest; \ test -f "$$manifest"; \ for x in `cat "$$manifest"`; \ do \ if ! test -f $(distdir)/"$$x" \ && ! test "$$x" = .gitignore; \ then \ echo "Missing: $$x"; \ exit 1; \ fi; \ done # Cleaning ########## CLEANFILES += \ $(bin_SCRIPTS) \ $(FULL_TESTS:tests/%.sh=tests/%.log) \ $(FULL_TESTS:tests/%.sh=tests/%.trs) \ $(FULL_TESTS:tests/%.sh=tests/%.1) \ $(FULL_TESTS:tests/%.sh=tests/%.2) \ $(UNIT_TESTS:tests/%.scm=tests/%.log) \ $(UNIT_TESTS:tests/%.scm=tests/%.trs) clean-local: $(MAKE) $(AM_MAKEFLAGS) -L -C tests/spec clean distclean-local: $(MAKE) $(AM_MAKEFLAGS) -L -C tests/spec distclean