diff options
-rw-r--r-- | .gitignore | 19 | ||||
-rw-r--r-- | Makefile | 165 | ||||
-rw-r--r-- | Makefile.am | 234 | ||||
-rw-r--r-- | NEWS.org (renamed from NEWS) | 1 | ||||
-rw-r--r-- | build-aux/distcheck.scm | 76 | ||||
-rwxr-xr-x | build-aux/generate-cwl-output.sh (renamed from build-aux/generate-cwl-output.sh.in) | 8 | ||||
-rw-r--r-- | build-aux/test-driver.scm (renamed from build-aux/test-driver.scm.in) | 66 | ||||
-rwxr-xr-x | configure (renamed from bootstrap.sh) | 13 | ||||
-rw-r--r-- | configure.ac | 58 | ||||
-rw-r--r-- | configure.scm | 159 | ||||
-rw-r--r-- | guix.scm | 6 | ||||
-rwxr-xr-x[-rw-r--r--] | pre-inst-env (renamed from pre-inst-env.in) | 11 | ||||
-rwxr-xr-x | scripts/ccwl (renamed from scripts/ccwl.in) | 3 |
13 files changed, 448 insertions, 371 deletions
@@ -1,16 +1,6 @@ *.go .depends -Makefile -Makefile.in -aclocal.m4 -autom4te.cache -build-aux/generate-cwl-output.sh -build-aux/install-sh -build-aux/missing -build-aux/test-driver.scm -config.log -config.status -configure +Makefile.include doc/*.cwl !doc/echo.cwl doc/*.dot @@ -18,13 +8,6 @@ doc/*.html doc/*.info doc/*.out doc/*.png -doc/.dirstamp doc/cwl-output -doc/stamp-vti -pre-inst-env -scripts/ccwl -test-suite.log -tests/*.log -tests/*.trs website/index.html website/manual
\ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..02f9d26 --- /dev/null +++ b/Makefile @@ -0,0 +1,165 @@ +# ccwl --- Concise Common Workflow Language +# Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net> +# +# This file is part of ccwl. +# +# ccwl 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. +# +# ccwl 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 ccwl. If not, see <https://www.gnu.org/licenses/>. + +include Makefile.include + +DOT = dot +EMACS = emacs +GIT = git +GPG = gpg +GUILD = guild +GUILE = guile +LZIP = lzip +SKRIBILO = skribilo + +FIND_DEPENDENCIES = build-aux/find-dependencies.scm +GENERATE_CWL_OUTPUT = build-aux/generate-cwl-output.sh +TEST_DRIVER = build-aux/test-driver.scm + +top_level_module_dir = $(project) +sources = $(wildcard $(top_level_module_dir)/*.scm) +objects = $(sources:.scm=.go) +scripts = $(wildcard scripts/*) +tests = $(wildcard tests/*.scm) +test_data = $(wildcard tests/*.cwl) +doc_sources = doc/ccwl.skb +doc_info = $(doc_sources:.skb=.info) +doc_html = $(doc_sources:.skb=.html) +doc_data = doc/hello.c.gz doc/hello.tar doc/hello.txt \ + doc/spell-check-text.txt doc/dictionary +distribute_files = $(sources) $(scripts) $(tests) $(test_data) \ + $(doc_sources) doc/skribilo.scm $(doc_data) $(DOC_SCM) $(DOC_OTHER) \ + pre-inst-env guix.scm Makefile configure configure.scm \ + $(FIND_DEPENDENCIES) $(GENERATE_CWL_OUTPUT) $(TEST_DRIVER) \ + COPYING NEWS.org README.org + +scmdir = $(datarootdir)/guile/site/$(guile_effective_version)/$(top_level_module_dir) +godir = $(libdir)/guile/$(guile_effective_version)/site-ccache/$(top_level_module_dir) + +.PHONY: all check clean dist distcheck info install + +# Build + +all: $(objects) + +%.go: %.scm + $(GUILD) compile -L . -o $@ $< + +# Run tests + +check: $(tests) $(TEST_DRIVER) + $(GUILE) --no-auto-compile -L . $(TEST_DRIVER) $(tests) + +# Build documentation + +include .depends + +.depends: $(doc_sources) $(FIND_DEPENDENCIES) + $(GUILE) --no-auto-compile $(FIND_DEPENDENCIES) > $@ + +info: $(doc_info) +html: $(doc_html) + +doc: + mkdir -p $(dir $@) + +$(DOC_IMAGES:.png=.dot) $(DOC_OUT): | doc + +%.cwl: %.scm + ./pre-inst-env ccwl compile $< > $@ + +doc/capture-output-file.out: doc/capture-output-file.cwl doc/hello.tar $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --archive $(word 2, $^) + +doc/capture-output-file-with-parameter-reference.out: doc/capture-output-file-with-parameter-reference.cwl doc/hello.tar $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --archive $(word 2, $^) --extractfile hello.txt + +doc/capture-stdout.out: doc/capture-stdout.cwl $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --message '"Hello World!"' + +doc/checksum.out: doc/checksum.cwl doc/hello.txt $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --file $(word 2, $^) + +doc/decompress-compile-run.out: doc/decompress-compile-run.cwl doc/hello.c.gz $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --compressed-source $(word 2, $^) + +doc/hello-world.out: doc/hello-world.cwl $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --message '"Hello World!"' + +doc/pass-stdin.out: doc/pass-stdin.cwl doc/hello.txt $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --file $(word 2, $^) + +doc/spell-check.out: doc/spell-check.cwl doc/spell-check-text.txt doc/dictionary $(GENERATE_CWL_OUTPUT) + $(GENERATE_CWL_OUTPUT) $< --text-file $(word 2, $^) --dictionary $(word 3, $^) + +doc/hello.tar.out: doc/hello.tar + echo "$$ tar --list --file $(notdir $<)" > $@ + tar --list --file $< >> $@ + +%.dot: %.scm + ./pre-inst-env ccwl compile --to=dot $< > $@ + +%.png: %.dot + $(DOT) -Tpng -o$@ $< + +$(doc_info): $(doc_sources) doc/skribilo.go $(DOC_IMAGES) $(DOC_SCM) $(DOC_OUT) $(DOC_OTHER) + ./pre-inst-env $(SKRIBILO) --target=info $< --output=$@ + +$(doc_html): $(doc_sources) doc/skribilo.go $(DOC_IMAGES) $(DOC_SCM) $(DOC_OUT) $(DOC_OTHER) + rm -rf $@ + mkdir -p $@ + ./pre-inst-env $(SKRIBILO) --target=html $< --output=$@/index.html + cp -v $(DOC_IMAGES) $@ + +# Install + +install: $(sources) $(objects) $(scripts) $(doc_info) + install -D $(sources) --target-directory $(scmdir) + install -D $(objects) --target-directory $(godir) + install -D $(scripts) --target-directory $(bindir) + install -D $(doc_info) --target-directory $(infodir) + +# Build distribution tarball + +dist_archive = $(project)-$(version).tar.lz + +dist: $(dist_archive) $(dist_archive).asc + +$(dist_archive): .git/refs/heads/main + $(GIT) archive --prefix $(basename $(basename $@))/ --format=tar main $(distribute_files) \ + | $(LZIP) --force --output $@ + +%.asc: % + $(GPG) --detach-sign --armor $< + +distcheck: $(dist_archive) + $(GUILE) build-aux/distcheck.scm $(version) $< + +# Build website + +website: website/index.html + +website/index.html: README.org build-aux/build-home-page.el + $(EMACS) -Q --batch --load build-aux/build-home-page.el --funcall build-website + +# Clean + +clean: + rm -f $(objects) $(dist_archive) $(dist_archive).asc Makefile.include website/index.html \ + $(DOC_SCM:.scm=.cwl) $(DOC_IMAGES) $(DOC_IMAGES:.png=.dot) $(DOC_OUT) \ + $(doc_html) $(doc_info) doc/skribilo.go diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 218ccc7..0000000 --- a/Makefile.am +++ /dev/null @@ -1,234 +0,0 @@ -# -*- indent-tabs-mode: t; -*- -# ccwl --- Concise Common Workflow Language -# Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> -# -# This file is part of ccwl. -# -# ccwl 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. -# -# ccwl 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 ccwl. If not, see <https://www.gnu.org/licenses/>. - -# Prefix variables for silencing various commands. See "(automake) -# Automake Silent Rules" for details. -CCWL_GEN = $(CCWL_GEN_$(V)) -CCWL_GEN_ = $(CCWL_GEN_$(AM_DEFAULT_VERBOSITY)) -CCWL_GEN_0 = @echo " CCWL" $@; -CCWL_GEN_1 = - -CWLTOOL_GEN = $(CWLTOOL_GEN_$(V)) -CWLTOOL_GEN_ = $(CWLTOOL_GEN_$(AM_DEFAULT_VERBOSITY)) -CWLTOOL_GEN_0 = @echo " CWLTOOL" $@; -CWLTOOL_GEN_1 = - -DOT_GEN = $(DOT_GEN_$(V)) -DOT_GEN_ = $(DOT_GEN_$(AM_DEFAULT_VERBOSITY)) -DOT_GEN_0 = @echo " DOT" $@; -DOT_GEN_1 = - -EMACS_GEN = $(EMACS_GEN_$(V)) -EMACS_GEN_ = $(EMACS_GEN_$(AM_DEFAULT_VERBOSITY)) -EMACS_GEN_0 = @echo " EMACS" $@; -EMACS_GEN_1 = - -GUILD_GEN = $(GUILD_GEN_$(V)) -GUILD_GEN_ = $(GUILD_GEN_$(AM_DEFAULT_VERBOSITY)) -GUILD_GEN_0 = @echo " GUILD" $@; -GUILD_GEN_1 = - -SKRIBILO_GEN = $(SKRIBILO_GEN_$(V)) -SKRIBILO_GEN_ = $(SKRIBILO_GEN_$(AM_DEFAULT_VERBOSITY)) -SKRIBILO_GEN_0 = @echo " SKRIBILO" $@; -SKRIBILO_GEN_1 = - -GOBJECTS = $(SOURCES:%.scm=%.go) - -nobase_mod_DATA = $(SOURCES) $(NOCOMP_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 -# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html> -# for details. -guile_install_go_files = install-nobase_goDATA -$(guile_install_go_files): install-nobase_modDATA - -CLEANFILES = $(GOBJECTS) -EXTRA_DIST = $(SOURCES) $(NOCOMP_SOURCES) -GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat -%.go: %.scm - $(GUILD_GEN)$(builddir)/pre-inst-env $(GUILD) compile $(GUILE_WARNINGS) -o "$@" "$<" - -moddir = $(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION) -godir = $(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache - -bin_SCRIPTS = scripts/ccwl - -SOURCES = ccwl/ccwl.scm ccwl/cwl.scm ccwl/graphviz.scm ccwl/yaml.scm ccwl/utils.scm -TEST_EXTENSIONS = .scm -SCM_TESTS = tests/ccwl.scm tests/graphviz.scm tests/utils.scm tests/yaml.scm -TESTS = $(SCM_TESTS) - -SCM_LOG_DRIVER = \ - $(builddir)/pre-inst-env \ - $(GUILE) --no-auto-compile -s \ - $(builddir)/build-aux/test-driver.scm - -EXTRA_DIST += \ - $(TESTS) \ - tests/input-output-parameters.cwl \ - doc/skribilo.scm \ - doc/ccwl.skb \ - doc/hello.c.gz \ - doc/hello.tar \ - doc/hello.txt \ - doc/spell-check-text.txt \ - doc/dictionary \ - $(DOC_SCM) \ - $(DOC_OTHER) \ - COPYING \ - README.org - -.DELETE_ON_ERROR: - -# Build documentation - -include .depends - -CLEANFILES += doc/.dirstamp $(DOC_SCM:.scm=.cwl) $(DOC_IMAGES) $(DOC_IMAGES:.png=.dot) $(DOC_OUT) -CLEAN_DIRECTORIES = doc/cwl-output - -doc/.dirstamp: - @$(MKDIR_P) $(dir $@) - @: > $@ - -$(DOC_IMAGES:.png=.dot) $(DOC_OUT): doc/.dirstamp - -%.cwl: %.scm - $(CCWL_GEN)$(builddir)/pre-inst-env ccwl compile $< > $@ - -GENERATE_CWL_OUTPUT = ./build-aux/generate-cwl-output.sh - -doc/capture-output-file.out: doc/capture-output-file.cwl doc/hello.tar $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --archive $(word 2, $^) - -doc/capture-output-file-with-parameter-reference.out: doc/capture-output-file-with-parameter-reference.cwl doc/hello.tar $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --archive $(word 2, $^) --extractfile hello.txt - -doc/capture-stdout.out: doc/capture-stdout.cwl $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --message '"Hello World!"' - -doc/checksum.out: doc/checksum.cwl doc/hello.txt $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --file $(word 2, $^) - -doc/decompress-compile-run.out: doc/decompress-compile-run.cwl doc/hello.c.gz $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --compressed-source $(word 2, $^) - -doc/hello-world.out: doc/hello-world.cwl $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --message '"Hello World!"' - -doc/pass-stdin.out: doc/pass-stdin.cwl doc/hello.txt $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --file $(word 2, $^) - -doc/spell-check.out: doc/spell-check.cwl doc/spell-check-text.txt doc/dictionary $(GENERATE_CWL_OUTPUT) - $(CWLTOOL_GEN)$(GENERATE_CWL_OUTPUT) $< --text-file $(word 2, $^) --dictionary $(word 3, $^) - -doc/hello.tar.out: doc/hello.tar - echo "$$ tar --list --file $(notdir $<)" > $@ - tar --list --file $< >> $@ - -# Print out graph for graphviz's dot. -%.dot: %.scm - $(CCWL_GEN)$(builddir)/pre-inst-env ccwl compile --to=dot $< > $@ - -%.png: %.dot - $(DOT_GEN)$(DOT) -Tpng -o$@ $< - -# The info and html targets depend on the info-local and html-local -# targets respectively. So, we use them to extend the info and html -# targets. -info-local: doc/ccwl.info -html-local: doc/ccwl.html - -SKRIBILO_FLAGS = --source-path=$(srcdir) --image-path=$(builddir) -CLEANFILES += doc/ccwl.info doc/skribilo.go -CLEAN_DIRECTORIES += doc/ccwl.html - -doc/ccwl.info: doc/ccwl.skb doc/skribilo.go $(DOC_IMAGES) $(DOC_SCM) $(DOC_OUT) $(DOC_OTHER) - $(SKRIBILO_GEN)$(builddir)/pre-inst-env $(SKRIBILO) $(SKRIBILO_FLAGS) -t info $< -o $@ - -doc/ccwl.html: doc/ccwl.skb doc/skribilo.go $(DOC_IMAGES) $(DOC_SCM) $(DOC_OUT) $(DOC_OTHER) - rm -rf $@ - $(MKDIR_P) $@ - $(SKRIBILO_GEN)$(builddir)/pre-inst-env $(SKRIBILO) $(SKRIBILO_FLAGS) -t html $< -o $@/index.html - cp -v $(DOC_IMAGES) $@ - -# The install target depends on the install-data target, which in turn -# depends on the install-data-local target. Use the install-data-local -# target to install info documentation by default on `make install'. -install-data-local: install-info-local - -# The install-info and install-html targets depend on the -# install-info-local and install-html-local targets respectively. Use -# them to install the skribilo generated info and html documentation. -install-info-local: doc/ccwl.info - $(MKDIR_P) $(DESTDIR)$(infodir) - $(INSTALL_DATA) $< $(DESTDIR)$(infodir) - -install-html-local: doc/ccwl.html - $(MKDIR_P) $(DESTDIR)$(htmldir) - $(INSTALL_DATA) $< $(DESTDIR)$(htmldir) - -# The uninstall target depends on the uninstall-local target. Use it -# to uninstall the installed info and html documentation. -uninstall-local: - rm -f $(DESTDIR)$(infodir)/ccwl.info $(DESTDIR)$(htmldir)/ccwl.html - -# Build website - -website: website/index.html website/manual/dev/en - -CLEANFILES += website/index.html -CLEAN_DIRECTORIES += website/manual -website/index.html: README.org build-aux/build-home-page.el - $(EMACS_GEN)$(EMACS) -Q --batch --load build-aux/build-home-page.el --funcall build-website - -website/manual/dev/en: doc/ccwl.html - rm -rf $@ - $(MKDIR_P) $(dir $@) - cp -vr $< $@ - -# Make release - -CURRENT_RELEASE = website/releases/$(firstword $(DIST_ARCHIVES)) -.PHONY: release -release: $(CURRENT_RELEASE) $(CURRENT_RELEASE).asc - -$(CURRENT_RELEASE): dist distcheck - cp $(notdir $@) $@ - -%.asc: % - gpg --detach-sign --armor $< - -# Build software bundles. - -.PHONY: docker pack -docker: - guix pack -RR --format=docker --entry-point=bin/ccwl --expression='(load "guix.scm")' - -pack: - guix pack -RR --symlink=/opt/gnu/bin=bin --expression='(load "guix.scm")' - -# The clean target depends on clean-local. Use clean-local to clean up -# several directories. Directories cannot be specified in CLEANFILES. -clean-local: - rm -rf $(CLEAN_DIRECTORIES) @@ -1,4 +1,3 @@ --*- org -*- #+TITLE: ccwl NEWS – History of user-visible changes Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> diff --git a/build-aux/distcheck.scm b/build-aux/distcheck.scm new file mode 100644 index 0000000..4cca909 --- /dev/null +++ b/build-aux/distcheck.scm @@ -0,0 +1,76 @@ +;;; ccwl --- Concise Common Workflow Language +;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net> +;;; +;;; This file is part of ccwl. +;;; +;;; ccwl 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. +;;; +;;; ccwl 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 ccwl. If not, see <https://www.gnu.org/licenses/>. + +(import (rnrs io ports) + (srfi srfi-26) + (ice-9 eval-string) + (ice-9 match) + (ice-9 popen) + (guix gexp) + (guix packages) + (guix scripts) + (guix store)) + +(define (call-with-input-pipe command proc) + "Call PROC with input pipe to COMMAND. COMMAND is a list of program +arguments." + (match command + ((prog args ...) + (let ((port #f)) + (dynamic-wind + (lambda () + (set! port (apply open-pipe* OPEN_READ prog args))) + (cut proc port) + (cut close-pipe port)))))) + +(define (call-with-archive-file archive file proc) + "Call PROC with port reading FILE in lzip compressed tar ARCHIVE." + (call-with-input-pipe (list "tar" "--extract" "--to-stdout" + "--file" archive + (string-append (basename archive ".tar.lz") + "/" file)) + proc)) + +(define (package-in-archive dist-archive) + "Return the package object in guix.scm of DIST-ARCHIVE." + (call-with-archive-file dist-archive "guix.scm" + (lambda (port) + (eval-string (get-string-all port) + #:file (string-append (getcwd) "/guix.scm"))))) + +(define (check-build dist-archive) + "Check if package in DIST-ARCHIVE builds correctly." + (run-with-store (open-connection) + (build-package + (package + (inherit (package-in-archive dist-archive)) + (source (local-file dist-archive)))))) + +(define (check-news version dist-archive) + "Check if VERSION appears in the first 200 characters of the news +file in DIST-ARCHIVE." + (call-with-archive-file dist-archive "NEWS.org" + (lambda (port) + (unless (string-contains (get-string-n port 200) + version) + (error "NEWS.org does not mention current version:" version))))) + +(match (program-arguments) + ((_ version dist-archive) + (check-build dist-archive) + (check-news version dist-archive))) diff --git a/build-aux/generate-cwl-output.sh.in b/build-aux/generate-cwl-output.sh index 4f92cc6..b5bed39 100755 --- a/build-aux/generate-cwl-output.sh.in +++ b/build-aux/generate-cwl-output.sh @@ -35,8 +35,8 @@ output_file=$(basename $cwl_file .cwl).out # On Guix, workflows involving gcc need to preserve the # LIBRARY_PATH environment variable. - @CWLTOOL@ --preserve-environment LIBRARY_PATH --outdir doc/cwl-output $cwl_file "$@" 2>&1 \ - | @SED@ '1,2d' \ - | @SED@ 's|\[1;30mINFO\[0m ||g' \ - | @SED@ "s|$(pwd)/doc/cwl-output|/home/manimekalai|g" + cwltool --preserve-environment LIBRARY_PATH --outdir doc/cwl-output $cwl_file "$@" 2>&1 \ + | sed '1,2d' \ + | sed 's|\[1;30mINFO\[0m ||g' \ + | sed "s|$(pwd)/doc/cwl-output|/home/manimekalai|g" } > doc/$output_file diff --git a/build-aux/test-driver.scm.in b/build-aux/test-driver.scm index 1407fc8..8fc5236 100644 --- a/build-aux/test-driver.scm.in +++ b/build-aux/test-driver.scm @@ -1,5 +1,5 @@ ;;; ccwl --- Concise Common Workflow Language -;;; Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> +;;; Copyright © 2021, 2022 Arun Isaac <arunisaac@systemreboot.net> ;;; ;;; This file is part of ccwl. ;;; @@ -26,21 +26,10 @@ ;;; Code: (use-modules (ice-9 format) - (ice-9 getopt-long) (ice-9 match) (srfi srfi-26) (srfi srfi-64)) -;; Currently, only log-file and trs-file are understood. Everything -;; else is ignored. -(define %options - '((test-name (value #t)) - (log-file (value #t)) - (trs-file (value #t)) - (color-tests (value #t)) - (expect-failure (value #t)) - (enable-hard-errors (value #t)))) - (define (color code str color?) (if color? (format #f "~a[~am~a~a[0m" #\esc code str #\esc) @@ -50,7 +39,7 @@ (define green (cut color 32 <> <>)) (define magenta (cut color 35 <> <>)) -(define (my-gnu-runner log-port trs-port color?) +(define (my-gnu-runner color?) (let ((runner (test-runner-null))) (test-runner-on-group-begin! runner (lambda (runner suite-name count) @@ -64,36 +53,39 @@ (result (string-upcase (symbol->string (test-result-kind runner)))) (result-alist (test-result-alist runner))) - (format trs-port ":test-result: ~a ~a~%" result name) (format #t "~a ~a~%" (case (test-result-kind runner) ((pass) (green result color?)) (else (red result color?))) name) - (format log-port "~a ~a~%" result name) ;; If test did not pass, print details. (unless (eq? (test-result-kind runner) 'pass) - (let* ((expected-value (match (assq-ref result-alist 'source-form) - (('test-assert _ ...) #t) - (_ (assq-ref result-alist 'expected-value)))) - (log-output - (format #f "~a:~a~%expected: ~s~%actual: ~s~%" - (assq-ref result-alist 'source-file) - (assq-ref result-alist 'source-line) - expected-value - (assq-ref result-alist 'actual-value)))) - (display log-output log-port) - (display log-output (current-error-port))))))) + (format (current-error-port) + "~a:~a~%expected: ~s~%actual: ~s~%" + (assq-ref result-alist 'source-file) + (assq-ref result-alist 'source-line) + (match (assq-ref result-alist 'source-form) + (('test-assert _ ...) #t) + (_ (assq-ref result-alist 'expected-value))) + (assq-ref result-alist 'actual-value)))))) runner)) -(let ((opts (getopt-long (command-line) %options))) - (call-with-output-file (string-append "@abs_top_builddir@/" - (option-ref opts 'log-file #f)) - (lambda (log-port) - (call-with-output-file (option-ref opts 'trs-file #f) - (lambda (trs-port) - (chdir "@abs_top_srcdir@") - (test-with-runner (my-gnu-runner log-port trs-port - (string=? (option-ref opts 'color-tests "yes") - "yes")) - (load-from-path (option-ref opts 'test-name #f)))))))) +(match (command-line) + ((_ test-files ...) + (let ((runner (my-gnu-runner #t))) + (test-with-runner runner + (for-each load-from-path test-files) + (display (magenta "SUMMARY" #t)) + (newline) + (format #t "PASS: ~a +FAIL: ~a +XPASS: ~a +XFAIL: ~a +SKIP: ~a +" + (test-runner-pass-count runner) + (test-runner-fail-count runner) + (test-runner-xpass-count runner) + (test-runner-xfail-count runner) + (test-runner-skip-count runner)) + (exit (zero? (test-runner-fail-count runner))))))) @@ -1,7 +1,7 @@ #! /bin/sh # ccwl --- Concise Common Workflow Language -# Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> +# Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net> # # This file is part of ccwl. # @@ -10,13 +10,12 @@ # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# ccwl 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. +# ccwl 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 ccwl. If not, see <https://www.gnu.org/licenses/>. -guile --no-auto-compile build-aux/find-dependencies.scm > .depends -autoreconf --verbose --install --force +guile --no-auto-compile configure.scm ccwl "$@" diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 36d0868..0000000 --- a/configure.ac +++ /dev/null @@ -1,58 +0,0 @@ -dnl ccwl --- Concise Common Workflow Language -dnl Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> -dnl -dnl This file is part of ccwl. -dnl -dnl ccwl is free software: you can redistribute it and/or modify it -dnl under the terms of the GNU General Public License as published by -dnl the Free Software Foundation, either version 3 of the License, or -dnl (at your option) any later version. -dnl -dnl ccwl is distributed in the hope that it will be useful, but -dnl WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -dnl General Public License for more details. -dnl -dnl You should have received a copy of the GNU General Public License -dnl along with ccwl. If not, see <https://www.gnu.org/licenses/>. - -AC_INIT([ccwl], [0.2.0]) -AC_CONFIG_AUX_DIR([build-aux]) -AM_INIT_AUTOMAKE([color-tests -Wall -Wno-portability foreign check-news no-dist-gzip dist-lzip]) -AM_SILENT_RULES([yes]) - -GUILE_PKG([3.0 2.2]) -GUILE_PROGS -GUILE_MODULE_REQUIRED([yaml]) - -# CHECK_FOR_PROGRAM(VARIABLE, PROGRAM-TO-CHECK-FOR, MESSAGE) -# ---------------------------------------------------------- -AC_DEFUN([CHECK_FOR_PROGRAM], [ - AC_PATH_PROG([$1], [$2], [no]) - AS_IF([test x"$$1" = xno], [$3]) -]) - -# REQUIRED_PROGRAM(VARIABLE, PROGRAM-TO-CHECK-FOR, PACKAGE-CONTAINING-PROGRAM) -# ---------------------------------------------------------------------------- -AC_DEFUN([REQUIRED_PROGRAM], [ - CHECK_FOR_PROGRAM([$1], [$2], [AC_MSG_ERROR([cannot find $2 m4_ifnblank([$3], [from the $3 package])])]) -]) - -# OPTIONAL_PROGRAM(VARIABLE, PROGRAM-TO-CHECK-FOR, WARNING) -# ---------------------------------------------------------------------------- -AC_DEFUN([OPTIONAL_PROGRAM], [ - CHECK_FOR_PROGRAM([$1], [$2], [AC_MSG_WARN([$3])]) -]) - -AC_PROG_SED -REQUIRED_PROGRAM([DOT], [dot], [graphviz]) -REQUIRED_PROGRAM([CWLTOOL], [cwltool]) -REQUIRED_PROGRAM([SKRIBILO], [skribilo]) -OPTIONAL_PROGRAM([EMACS], [emacs], [cannot find emacs, and therefore cannot build the website]) - -AC_CONFIG_FILES([Makefile]) -AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env]) -AC_CONFIG_FILES([build-aux/test-driver.scm]) -AC_CONFIG_FILES([build-aux/generate-cwl-output.sh], [chmod +x build-aux/generate-cwl-output.sh]) -AC_CONFIG_FILES([scripts/ccwl], [chmod +x scripts/ccwl]) -AC_OUTPUT diff --git a/configure.scm b/configure.scm new file mode 100644 index 0000000..a271879 --- /dev/null +++ b/configure.scm @@ -0,0 +1,159 @@ +;;; ccwl --- Concise Common Workflow Language +;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net> +;;; +;;; This file is part of ccwl. +;;; +;;; ccwl 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. +;;; +;;; ccwl 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 ccwl. If not, see <https://www.gnu.org/licenses/>. + +(use-modules (rnrs io ports) + (srfi srfi-1) + (srfi srfi-26) + (srfi srfi-28) + (srfi srfi-37) + (ice-9 match) + (ice-9 popen)) + +(define (call-with-input-pipe command proc) + "Call PROC with input pipe to COMMAND. COMMAND is a list of program +arguments." + (match command + ((prog args ...) + (let ((port #f)) + (dynamic-wind + (lambda () + (set! port (apply open-pipe* OPEN_READ prog args))) + (cut proc port) + (cut close-pipe port)))))) + +(define (check-for-guile-3.0) + (display "checking for guile 3.0... ") + (if (string=? (effective-version) "3.0") + (display (format "yes~%")) + (begin + (display (format "no~%error: Guile 3.0 not found~%")) + (exit #f)))) + +(define (check-for-module module) + (display (format "checking for module ~a... " module)) + (if (resolve-module module #:ensure #f) + (display (format "yes~%")) + (begin + (display (format "no~%error: no ~a found~%" module)) + (exit #f)))) + +(define (find-program program) + (find file-exists? + (map (lambda (path) + (string-append path "/" program)) + (string-split (getenv "PATH") + #\:)))) + +(define* (check-for-program program #:optional package) + (display (format "checking for program ~a... " program)) + (let ((found-program (find-program program))) + (cond + (found-program + (display (format "~a~%" found-program))) + (package + (display (format "no~%error: cannot find ~a from the ~a package~%" + program package)) + (exit #f)) + (else + (display (format "no~%error: cannot find ~a~%" program)) + (exit #f))))) + +(define* (check-for-optional-program program msg) + (display (format "checking for program ~a... " program)) + (let ((found-program (find-program program))) + (display (or found-program msg)) + (newline))) + +(define (option-proc opt name arg result) + (cons (cons (string->symbol name) arg) + result)) + +(define (unrecognized-option-proc opt name arg result) + (display (if arg + (format "Ignoring unrecognized option --~a=~a~%" + name arg) + (format "Ignoring unrecognized option --~a~%" + name))) + result) + +(define (unrecognized-argument-proc arg result) + (display (format "Ignoring unrecognized argument ~a~%" + arg)) + result) + +(define processed-args + (match (program-arguments) + ((_ project args ...) + (let* ((args (args-fold args + (list (option '("prefix") #t #f + option-proc)) + unrecognized-option-proc + unrecognized-argument-proc + '())) + (prefix (or (assq-ref args 'prefix) + "/usr/local")) + (exec-prefix (or (assq-ref args 'exec-prefix) + prefix)) + (datarootdir (or (assq-ref args 'datarootdir) + (string-append prefix "/share")))) + `((project . ,project) + (bindir . ,(or (assq-ref args 'bindir) + (string-append exec-prefix "/bin"))) + (libdir . ,(or (assq-ref args 'libdir) + (string-append exec-prefix "/lib"))) + (datarootdir . ,datarootdir) + (infodir . ,(or (assq-ref args 'infodir) + (string-append datarootdir "/info")))))))) + +(define version + (call-with-input-pipe (list "git" "tag" "--sort=taggerdate" + "--list" "v*") + (lambda (port) + (let ((line (get-line port))) + (if (eof-object? line) + ;; If there are no tags, assume first version. + "0.1.0" + (substring line (string-length "v"))))))) + +(check-for-guile-3.0) +(check-for-module '(yaml)) +(check-for-program "dot" "graphviz") +(check-for-program "cwltool") +(check-for-program "skribilo") +(check-for-optional-program "emacs" "cannot find emacs, and therefore cannot build the website") + +(call-with-output-file "Makefile.include" + (lambda (port) + (display (format "# This file was automatically generated by configure. + +project = ~a +version = ~a +bindir = ~a +libdir = ~a +datarootdir = ~a +infodir = ~a +guile_effective_version = ~a +" + (assq-ref processed-args 'project) + version + (assq-ref processed-args 'bindir) + (assq-ref processed-args 'libdir) + (assq-ref processed-args 'datarootdir) + (assq-ref processed-args 'infodir) + (effective-version)) + port))) @@ -40,10 +40,6 @@ (inherit guix:ccwl) (source (local-file %source-dir #:recursive? #t - #:select? (git-predicate %source-dir))) - (native-inputs - `(("autoconf" ,autoconf) - ("automake" ,automake) - ,@(package-native-inputs guix:ccwl))))) + #:select? (git-predicate %source-dir))))) ccwl diff --git a/pre-inst-env.in b/pre-inst-env index d0aa24c..c1ed5d7 100644..100755 --- a/pre-inst-env.in +++ b/pre-inst-env @@ -1,5 +1,4 @@ -#! @GUILE@ --no-auto-compile --*- scheme -*- +#! /usr/bin/env guile !# ;;; ccwl --- Concise Common Workflow Language ;;; Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> @@ -28,9 +27,11 @@ '())) ":"))) -(prepend-path-env! "GUILE_LOAD_PATH" "@abs_top_builddir@" "@abs_top_srcdir@") -(prepend-path-env! "GUILE_LOAD_COMPILED_PATH" "@abs_top_builddir@") -(prepend-path-env! "PATH" "@abs_top_builddir@/scripts") +(define %source-dir (dirname (current-filename))) + +(prepend-path-env! "GUILE_LOAD_PATH" %source-dir) +(prepend-path-env! "GUILE_LOAD_COMPILED_PATH" %source-dir) +(prepend-path-env! "PATH" (string-append %source-dir "/scripts")) (match (command-line) ((_ command args ...) diff --git a/scripts/ccwl.in b/scripts/ccwl index 5fb7877..1521803 100755 --- a/scripts/ccwl.in +++ b/scripts/ccwl @@ -1,5 +1,4 @@ -#! @GUILE@ --*- scheme -*- +#! /usr/bin/env guile !# ;;; ccwl --- Concise Common Workflow Language ;;; Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net> |