From c550ff6cdc8264c66c13ab3b21e61fccedf9735e Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Tue, 29 Jun 2021 18:09:27 +0530 Subject: Makefile: Track dependencies automatically. * build-aux/find-dependencies.scm: New file. * Makefile.am (DOC_IMAGES): Delete variable. (.depends): New target. Include it in the Makefile. ($(SKRIBILO_BUILD_DIR)/ccwl.info, $(SKRIBILO_BUILD_DIR)/ccwl.html): Depend on DOC_OTHER_DEPENDENCIES. (clean-local): Delete .depends. * .gitignore: Add .depends. --- .gitignore | 1 + Makefile.am | 16 +++++---- build-aux/find-dependencies.scm | 77 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 build-aux/find-dependencies.scm diff --git a/.gitignore b/.gitignore index 83d6491..752eca1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.go +.depends Makefile Makefile.in aclocal.m4 diff --git a/Makefile.am b/Makefile.am index 3061b74..be17f08 100644 --- a/Makefile.am +++ b/Makefile.am @@ -66,9 +66,13 @@ EXTRA_DIST += \ # Build documentation SKRIBILO_BUILD_DIR = $(srcdir)/doc/skribilo -DOC_IMAGES = $(addprefix $(SKRIBILO_BUILD_DIR)/, \ - checksum.svg \ - decompress-compile-run.svg) + +.depends: build-aux/find-dependencies.scm doc/ccwl.skb + $(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE) --no-auto-compile $< > $@ + +# We prefix with - so that automake does not fail when .depends is +# missing. +-include .depends $(SKRIBILO_BUILD_DIR)/%.cwl: doc/%.scm $(MKDIR_P) $(SKRIBILO_BUILD_DIR) @@ -88,11 +92,11 @@ $(SKRIBILO_BUILD_DIR)/%.cwl: doc/%.scm info-local: $(SKRIBILO_BUILD_DIR)/ccwl.info html-local: $(SKRIBILO_BUILD_DIR)/ccwl.html -$(SKRIBILO_BUILD_DIR)/ccwl.info: doc/ccwl.skb ccwl/skribilo.scm $(DOC_IMAGES) +$(SKRIBILO_BUILD_DIR)/ccwl.info: doc/ccwl.skb ccwl/skribilo.scm $(DOC_IMAGES) $(DOC_OTHER_DEPENDENCIES) $(MKDIR_P) $(SKRIBILO_BUILD_DIR) $(AM_V_GEN)$(top_builddir)/pre-inst-env $(SKRIBILO) -t info $< -o $@ -$(SKRIBILO_BUILD_DIR)/ccwl.html: doc/ccwl.skb ccwl/skribilo.scm $(DOC_IMAGES) +$(SKRIBILO_BUILD_DIR)/ccwl.html: doc/ccwl.skb ccwl/skribilo.scm $(DOC_IMAGES) $(DOC_OTHER_DEPENDENCIES) rm -rf $@ $(MKDIR_P) $@ $(AM_V_GEN)$(top_builddir)/pre-inst-env $(SKRIBILO) -t html $< -o $@/index.html @@ -127,4 +131,4 @@ website/manual/dev/en: $(SKRIBILO_BUILD_DIR)/ccwl.html # The clean target depends on clean-local. We use clean-local to clean # up the website and the skribilo build directory. clean-local: - rm -rf website/index.html website/manual $(SKRIBILO_BUILD_DIR) + rm -rf .depends website/index.html website/manual $(SKRIBILO_BUILD_DIR) diff --git a/build-aux/find-dependencies.scm b/build-aux/find-dependencies.scm new file mode 100644 index 0000000..fb68e9c --- /dev/null +++ b/build-aux/find-dependencies.scm @@ -0,0 +1,77 @@ +;;; ccwl --- Concise Common Workflow Language +;;; Copyright © 2021 Arun Isaac +;;; +;;; 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 . + +;;; Commentary: + +;; This script scans source files and prints dependencies for make to +;; pick up. + +;;; Code: + +(use-modules (srfi srfi-1) + (srfi srfi-171) + (ice-9 match) + (skribilo reader skribe)) + +(define (skribilo-document file) + "Read skribilo FILE and return the document form." + (call-with-input-file file + (lambda (port) + (port-transduce (tfilter (match-lambda + (('document _ ...) #t) + (_ #f))) + (rany identity) + (make-skribe-reader) + port)))) + +(define (find-dependencies document) + "Return a list of dependencies of the skribilo form DOCUMENT. Each +dependency is of the form (tag . file). tag may either be the symbol +'image or the symbol 'other." + (match document + (('image args ...) + (apply (lambda* (#:key file #:allow-other-keys) + `((image . ,file))) + args)) + (('source args ...) + (apply (lambda* (#:key file #:allow-other-keys) + `((other . ,file))) + args)) + (('scheme-source file) + `((other . ,file))) + (('source-ref file _ ...) + `((other . ,file))) + ((elements ...) + (append-map find-dependencies elements)) + (atom '()))) + +;; Print dependencies +(let ((dependencies + (find-dependencies (skribilo-document "doc/ccwl.skb")))) + (format #t "DOC_IMAGES = ~a~%" + (string-join (filter-map (match-lambda + (('image . file) file) + (_ #f)) + dependencies) + " ")) + (format #t "DOC_OTHER_DEPENDENCIES = ~a~%" + (string-join (filter-map (match-lambda + (('other . file) file) + (_ #f)) + dependencies) + " "))) -- cgit v1.2.3