# ccwl --- Concise Common Workflow Language
# Copyright © 2022, 2024–2025 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
GUILE_RUN64 = guile-run64
LZIP = lzip
SKRIBILO = skribilo
FIND_DEPENDENCIES = build-aux/find-dependencies.scm
GENERATE_CWL_OUTPUT = build-aux/generate-cwl-output.sh
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
fonts = $(addprefix $(GUIX_ENVIRONMENT)/share/fonts/web/, charter_regular.woff2 FiraCode-Regular.woff2 FiraCode-SemiBold.woff2)
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) \
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
GUILE_AUTO_COMPILE=0 $(GUILD) compile -L . -o $@ $<
# Run tests
check:
./pre-inst-env $(GUILE_RUN64) $(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)
distsign: $(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/manual/dev/en website/fonts
website/index.html: README.org build-aux/build-home-page.el
$(EMACS) -Q --batch --load build-aux/build-home-page.el --funcall build-website
website/manual/dev/en: $(doc_html)
rm -rf $@
mkdir -p $(dir $@)
cp -vr $^ $@
website/fonts: $(fonts)
rm -rf $@
mkdir -p $@
cp -v $^ $@/
# Clean
clean:
rm -f .$(objects) $(dist_archive) $(dist_archive).asc \
.depends Makefile.include website/index.html \
$(DOC_SCM:.scm=.cwl) $(DOC_IMAGES) $(DOC_IMAGES:.png=.dot) $(DOC_OUT) \
$(doc_info) doc/skribilo.go
rm -rf $(doc_html) website/manual website/fonts