> Greg Wilson wrote:
> > I'm using GNU Make 3.80 with Cygwin on Microsoft Windows XP (Home
> > Edition).  The Makefile is attached; you can also get it, and the lecture
> > slides I build with it, via:
> >     svn co http://pyre.third-bit.com/svn/swc/trunk swc

> John Graham-Cumming wrote:
> The Makefile does not appear to be attached, and since I don't have svn
> available could you resend it?

Hi John,

Weird --- it's in my outbox as an attachment.  I'll try with a different
mailer, in case someone's being a little over-eager scrubbing attachments.
I've also included the config.mk and platform.mk files that the main
Makefile depends on.

Thanks,
Greg
#======================================================================
# $Id: Makefile 1132 2006-05-19 18:33:32Z gvwilson $
#
# +<
# This Makefile rebuilds everything in the Software Carpentry course
# project.  To see what targets are available, type 'make help'.  Note
# that this Makefile depends upon the GNU Make extensions, so it will
# probably only run with gmake.
#
# Most course content is in ``.swc`` files, which use a home-grown
# XML dialect to mark up slides, lecture notes, exercises, and so on.
# Customization is done by copying ``conf/platform_template.mk`` and
# ``conf/config_template.mk`` to create ``platform.mk`` and
# ``config.mk``, and then making changes there.  To change which
# lectures are included, and what order they're in, edit the
# ``LECTURES`` variable in the ``config.mk`` file.
#
# To delete bibliography, glossary, and external link entries that are
# not referenced in the included lectures, set ``DELETE_ENTRIES`` to
# ``-D``.
#
# To add site-specific content (e.g., for Euphoric State University):
#
#  * Create a ``sites/esu`` directory
#  * Add ``.swc`` files
#  * Edit the definition of ``SITES`` in ``config.mk``
#
# The major output of this Makefile is the ``web`` directory, which
# contains the course notes in ready-to-view HTML.  The positions
# of files in this directory exactly mirrors their positions in the
# project as a whole, i.e. relative links should always continue to
# work.
#
# The build also creates a "unified" file in the ``web/lec``
# directory.  This file contains all of the course lecture content in
# a single page for easy printing and searching.
#
# PDF versions of the lecture notes are created in the ``pdf``
# directory, but only on demand.  These files can only be created on
# machines where Prince has been installed.
#
# Another significant output is the ``docs`` directory.  It contains
# wiki-formatted documentation on the SWC build system and tools;
# these are saved under version control so that they can be viewed
# on systems that aren't set up to build the course, and so that any
# changes in them can be highlighted.
# >+
#======================================================================

# Platform specification file.
PLATFORM = ./platform.mk

# Configuration file.
CONFIG = ./config.mk

# +<
# This Makefile only runs if it can find the files ``platform.mk`` and
# ``config.mk``.  If these file do not, an error message is printed
# and the build stops.
# >+
ifeq ($(wildcard ${PLATFORM}),)
  $(error ${PLATFORM} cannot be found: copy and edit 
./conf/platform_template.mk)
else
  include ${PLATFORM}
endif
ifeq ($(wildcard ${CONFIG}),)
  $(error ${CONFIG} cannot be found: copy and edit ./conf/config_template.mk)
else
  include ${CONFIG}
endif

#----------------------------------------------------------------------
# General definitions
#----------------------------------------------------------------------

# +<
# Setting ``VERBOSE`` before invoking Make will pass the ``-v`` flag
# to scripts and utilities.
# >+
ifdef VERBOSE
  VERBOSE_FLAG = -v
endif

# What to delete when tidying up.
TIDY_JUNK := \
        $(wildcard tmp) \
        $(foreach dir,. ./* ./*/* ./*/*/*, \
          $(wildcard ${dir}/*~) \
          $(wildcard ${dir}/*.pyc) \
          $(wildcard ${dir}/Thumbs.db) \
        )

# Extra stuff to delete when *really* cleaning up.
CLEAN_JUNK := \
        ${TIDY_JUNK} \
        $(wildcard web) \
        $(wildcard ./release.tgz)

# Utilities.
UTILS := \
        ./Makefile \
        ./conf/config_template.mk \
        ./conf/platform_template.mk \
        $(wildcard ./util/*.py) \
        $(wildcard ./util/*.xsl)

# Wiki documentation files.
WIKI_DOCS := $(foreach fname,$(subst ./,./docs/,${UTILS}),${fname}.wiki)

# Name of file that records information used to link lectures together.
LINKAGES := ./tmp/linkages.tmp.py

# The lecture source files.
LECTURES_SRC := $(foreach lec,${LECTURES},./lec/${lec}.swc)

# The site-specific files to include.
SITE_SRC := \
        $(foreach sitedir,${SITES}, \
          $(wildcard ${sitedir}/*.swc) \
          $(wildcard ${sitedir}/*/*.swc) \
        )

# The .swc files to translate...
LICENSE_SRC := ./license.swc
PAGES_SRC := \
        ./index.swc \
        ${LICENSE_SRC} \
        ${LECTURES_SRC} \
        ${SITE_SRC}

# ...the temporary files that will be fed to XSLT...
PAGES_TMP := $(subst ./,./tmp/,${PAGES_SRC})

# ...and the output pages.
PAGES_WEB := $(subst .swc,.html,$(subst ./tmp/,./web/,${PAGES_TMP}))

# The unified temporary page...
UNIFIED_TMP := ./tmp/lec/unified.swc

# ...and the corresponding output page.
UNIFIED_WEB := ./web/lec/unified.html

# Graphics files and outputs.
GFX_SUFFIX := gif jpg png
GFX_SRC := \
        $(foreach fmt,$(GFX_SUFFIX),\
          $(wildcard ./img/*.${fmt}) \
          $(foreach lecdir,${LECTURES}, \
            $(wildcard ./lec/img/${lecdir}/*.${fmt}) \
          ) \
          $(foreach sitedir,${SITES}, \
            $(wildcard ./sites/${sitedir}/img/*.${fmt}) \
          ) \
        )
GFX_WEB := $(subst ./,./web/,${GFX_SRC})

# Miscellaneous support files (not transformed, just copied) and outputs.
MISC_SRC := ./LICENSE.txt ./swc.dtd ./swc.css ./print.css
MISC_WEB := $(subst ./,./web/,${MISC_SRC})

# All the text source (things to check for line endings).
TEXT_SRC := ./Makefile ./tests/*/Makefile ${PAGES_SRC} ${MISC_SRC}

# All the source files (text and otherwise)...
ALL_SRC := ${TEXT_SRC} ${GFX_SRC}

# ...and all files needed for the web site.
ALL_WEB := ${PAGES_WEB} ${UNIFIED_WEB} ${MISC_WEB} ${GFX_WEB}

# PDF versions of web pages.
ALL_PDF := \
        $(subst ./web/,./pdf/,$(subst .html,.pdf,${PAGES_WEB})) \
        $(subst ./web/,./pdf/,$(subst .html,.pdf,${UNIFIED_WEB}))

# Included source files.
INC_SRC := \
        $(foreach base,./lec/inc ./lec/tbl ./tests ${sites},\
                $(wildcard ${base}/*/*.cmd) \
                $(wildcard ${base}/*/*.csv) \
                $(wildcard ${base}/*/*.err) \
                $(wildcard ${base}/*/*.mk) \
                $(wildcard ${base}/*/*.out) \
                $(wildcard ${base}/*/*.py) \
                $(wildcard ${base}/*/*.sql) \
                $(wildcard ${base}/*/*.tbl) \
                $(wildcard ${base}/*/*.txt) \
        )

#----------------------------------------------------------------------
# General targets.
#----------------------------------------------------------------------

# +<'''all''': By default, display options.>+
all : help

# +<'''help''': Display options.>+
help :
        @echo "== Show help. =="
        @echo "all         : By default, display options."
        @echo "help        : Display options."
        @echo
        @echo "== Make web site HTML pages. =="
        @echo "web         : Make course web pages."
        @echo
        @echo "== Installation. =="
        @echo "install     : Install files for viewing."
        @echo "release     : Make a source release for people without SVN 
access."
        @echo
        @echo "== Validation. =="
        @echo "finddos     : Look for source files with Windows line endings."
        @echo "fixdos      : Convert Windows line endings to Unix line endings."
        @echo "validate    : Validate the source files."
        @echo
        @echo "== Tests. =="
        @echo "settings    : Display settings for debugging."
        @echo "linkages    : Make the linkages file."
        @echo "tmpfiles    : Make intermediate .swc files for inspection."
        @echo
        @echo "== Wiki. =="
        @echo "docs        : Make wiki-formatted project documentation."
        @echo "syllabus    : Make a wiki-formatted syllabus."
        @echo
        @echo "== Housekeeping. =="
        @echo "tidy        : Clean up byproducts of build."
        @echo "clean       : Delete everything made by the build."
        @echo "count       : Count the number of words in the source files 
(roughly)."
        @echo "words       : produce a concordance of the lecture notes."
        @echo "properties  : show SVN properties of all source files."
        @echo "scdtd       : Reverse-engineer the DTD of the .swc files."
        @echo "entities    : Create a page showing all of the character 
entities."
        @echo "images      : Make a page showing all images, with paths."
        @echo "tickets     : list tickets from database."

#----------------------------------------------------------------------
# Dependencies.
#----------------------------------------------------------------------

# +<
# This Makefile uses ``depend.mk``, which is built by running
# ``make depend`` or ``make fakedepend``.  If no such file exists,
# a warning is printed, but the build continues.
#
# Note that ``depend.mk`` is included here, rather than at the top
# of the Makefile, so that its targets will not supercede the
# ``all`` target.
# >+

DEPEND = ./depend.mk

ifneq ($(wildcard ${DEPEND}),)
  include ${DEPEND}
else
  ifeq (${MAKECMDGOALS},depend)
    # don't print a warning if asked to make dependencies
  else
    ifeq (${MAKECMDGOALS},)
      # don't print a warning if printing help
    else
      $(warning ${DEPEND} cannot be found: run 'make depend')
    endif
  endif
endif

# +<
# '''depend''': build ``depend.mk``, which describes the exact
# dependencies between ``.swc`` files and the things they include.
# >+
depend :
        @${PYTHON} util/depend.py -o ${DEPEND} -v ${PAGES_SRC}

# +<
# '''fakedepend''': build a version of ``depend.mk`` that only
# includes dependencies on files that actually exist.
# >+
fakedepend :
        @${PYTHON} util/depend.py -E -o ${DEPEND} -v ${PAGES_SRC}

#----------------------------------------------------------------------
# Make web site HTML pages.
#----------------------------------------------------------------------

# +<
# '''web''': Make course web pages in the ``web`` directory.  This
# is done by preprocessing copies of the ``.swc`` files in the
# ``tmp`` directory, and then running XSLT on them.
# >+
web : ${ALL_WEB}

# Specific rule for making unified web page from .swc files.
${UNIFIED_WEB} : ${UNIFIED_TMP} ./tmp/swc.dtd
        @mkdir -p $(dir $@)
        ${XSL} util/unified.xsl $< > $@

# Generic rule for making web pages from .swc files.
web/%.html : tmp/%.swc ./tmp/swc.dtd
        @mkdir -p $(dir $@)
        ${XSL} util/individual.xsl $< > $@

# Rule for making unified .swc file from individual pages.
${UNIFIED_TMP} : ${PAGES_TMP}
        @mkdir -p $(dir $@)
        ${PYTHON} util/unify.py -L ${LINKAGES} ${PAGES_TMP} > $@

# Need to have the DTD file in the temporary directory to keep xsltproc happy.
./tmp/swc.dtd : ./swc.dtd
        @mkdir -p $(dir $@)
        @cp $< $@

# +<
# The rule to transform human-editable ``.swc`` files into files ready
# for XSLTing is a little complicated.  For details, see the
# documentation on ``util/preprocess.py``.
# >+
tmp/%.swc : ./%.swc ${LINKAGES}
        @mkdir -p $(dir $@)
        ${PYTHON} util/preprocess.py ${VERBOSE_FLAG} \
        ${DELETE_ENTRIES} \
        -L ${LINKAGES} \
        -r input:install_url:value=${INSTALL_URL} \
        -i $< \
        -o $@

# +<
# Before preprocessing the ``.swc`` files, the build extracts
# information about cross-linkages, glossary references, figure and
# table numbers, etc., and puts it in ``tmp/linkages.tmp.py``.  The
# build only overwrites this file if it needs to, so that the whole
# build doesn't have to run every time a minor change is made to a
# single file.  For more information, see the documentation on
# ``util/linkages.py``.
# >+
${LINKAGES} : ${PAGES_SRC}
        @mkdir -p $(dir $@)
        @${PYTHON} util/linkages.py ${VERBOSE_FLAG} \
        -B ./lec/bib.swc \
        -o $@ \
        -l "${LICENSE_SRC} ${LECTURES_SRC}" \
        -s "${SITE_SRC}"

#----------------------------------------------------------------------
# Make other web site content.
#----------------------------------------------------------------------

web/%.css : ./%.css
        @mkdir -p $(dir $@)
        cp $< $@

web/%.dtd : ./%.dtd
        @mkdir -p $(dir $@)
        cp $< $@

web/%.gif : ./%.gif
        @mkdir -p $(dir $@)
        cp $< $@

web/%.jpg : ./%.jpg
        @mkdir -p $(dir $@)
        cp $< $@

web/%.png : ./%.png
        @mkdir -p $(dir $@)
        cp $< $@

web/%.txt : ./%.txt
        @mkdir -p $(dir $@)
        cp $< $@

#----------------------------------------------------------------------
# Make PDF files (requires Prince to be installed).
#----------------------------------------------------------------------

pdf : ${ALL_PDF}

./pdf/%.pdf : ./web/%.html
        @mkdir -p $(dir $@)
        ${PRINCE} $< $@

#----------------------------------------------------------------------
# Installation.
#----------------------------------------------------------------------

# +<
# '''install''': Install files for viewing.  This requires the caller
# to have set the ``INSTALL_DIR`` and ``INSTALL_USER`` variables
# from the command line, or in ``config.mk``.  The first is the
# absolute path of the installation directory (which is created), and
# the second determines who will own the installed files.
# >+
install :
        mkdir -p ${INSTALL_DIR}
        cd ./web; cp --parents `find . -type f -print` ${INSTALL_DIR}
        cd ./web; tar zcf ${INSTALL_DIR}/sc-html.tgz `find . -type f -print`
        cd ./web; zip ${INSTALL_DIR}/sc-html.zip     `find . -type f -print`
        chown -R ${INSTALL_USER} ${INSTALL_DIR}
        chmod a+rx `find ${INSTALL_DIR} -type d -print`
        chmod a+r  `find ${INSTALL_DIR} -type f -print`
        chmod a-x  `find ${INSTALL_DIR} -type f -print`

# +<
# '''install_pdf''': Install PDF files.
# >+
install_pdf :
        mkdir -p ${INSTALL_DIR}
        tar zcf ${INSTALL_DIR}/sc-pdf.tgz  `find pdf -name '*.pdf' -print | 
fgrep -v swc.pdf`
        zip ${INSTALL_DIR}/sc-pdf.zip      `find pdf -name '*.pdf' -print | 
fgrep -v swc.pdf`
        cp pdf/swc.pdf ${INSTALL_DIR}

# +<
# '''install_src''': Install example source.
# FIXME: needs to be smarter about what files to install (e.g., the
# contents of the ``assets`` directory, and where to look for them.
# >+
install_src :
        tar zcvf ${INSTALL_DIR}/sc-src.tgz `find lec/src -type f -print | fgrep 
-v .svn`
        zip ${INSTALL_DIR}/sc-src.zip      `find lec/src -type f -print | fgrep 
-v .svn`

#----------------------------------------------------------------------
# Validation.
#----------------------------------------------------------------------

# +<'''finddos''': Look for source files with Windows line endings.>+
finddos :
        @${PYTHON} util/dos2unix.py ${TEXT_SRC} ${UTILS} ${WIKI_DOCS} ${INC_SRC}

# +<'''fixdos''': Convert Windows line endings to Unix line endings.>+
fixdos :
        @${PYTHON} util/dos2unix.py -f ${TEXT_SRC} ${UTILS} ${WIKI_DOCS} 
${INC_SRC}

# +<
# '''validate''': Validate the source files by checking the conditions
# described in the documentation for ``util/validate.py``.
# >+
validate : ${LINKAGES}
        @${PYTHON} util/validate.py ${VERBOSE_FLAG} \
        ${DELETE_ENTRIES} \
        -L ${LINKAGES} \
        ${PAGES_SRC} \
        | sed -e 's:\\:/:g'

# +<
# '''validiff''': Look for changes in validation.
# >+
validiff : ${LINKAGES}
        @${PYTHON} util/validate.py ${VERBOSE_FLAG} \
        ${DELETE_ENTRIES} \
        -L ${LINKAGES} \
        ${PAGES_SRC} \
        | sed -e 's:\\:/:g' \
        | diff -w - util/validate.out

# +<
# '''camelcase''': look for camel case words.
# >+
camelcase :
        @${PYTHON} util/camelcase.py ${TEXT_SRC} ${INC_SRC} ${UTILS} | diff -b 
- util/camelcase.txt

# +<
# '''keywords''': look for Subversion keyword property on files.
# >+
keywords :
        @${PYTHON} util/props.py svn:keywords ${TEXT_SRC} ${INC_SRC} ${UTILS}

#----------------------------------------------------------------------
# Tests.
#----------------------------------------------------------------------

# +<
# '''settings''': Display settings for debugging.
# >+
settings :
        @echo '== Tools =='
        @echo 'PYTHON:' ${PYTHON}
        @echo 'PRINCE:' ${PRINCE}
        @echo 'XSL:' ${XSL}
        @echo 'SQLITE:' ${SQLITE}
        @echo
        @echo '== Configuration =='
        @echo 'LECTURES:' ${LECTURES}
        @echo 'SITES:' ${SITES}
        @echo 'SITES_SC_SRC:' ${SITES_SC_SRC}
        @echo 'DELETE_ENTRIES:' ${DELETE_ENTRIES}
        @echo 'DB_PATH:' ${DB_PATH}
        @echo 'LINKAGES:' ${LINKAGES}
        @echo 'FRIB:' ${FRIB}
        @echo
        @echo '== Pages =='
        @echo 'LECTURES_SRC:' ${LECTURES_SRC}
        @echo 'PAGES_SRC:' ${PAGES_SRC}
        @echo 'PAGES_TMP:' ${PAGES_TMP}
        @echo 'PAGES_WEB:' ${PAGES_WEB}
        @echo
        @echo '== Graphics =='
        @echo 'GFX_SUFFIX:' ${GFX_SUFFIX}
        @echo 'GFX_SRC:' ${GFX_SRC}
        @echo 'GFX_WEB:' ${GFX_WEB}
        @echo
        @echo '== Misc =='
        @echo 'MISC_SRC:' ${MISC_SRC}
        @echo 'MISC_WEB:' ${MISC_WEB}
        @echo
        @echo '== All source files =='
        @echo 'ALL_SRC:' ${ALL_SRC}
        @echo
        @echo '== All web files =='
        @echo 'ALL_WEB:' ${ALL_WEB}
        @echo
        @echo '== All PDF files =='
        @echo 'ALL_PDF:' ${ALL_PDF}
        @echo
        @echo '== Included source =='
        @echo 'INC_SRC:' ${INC_SRC}
        @echo
        @echo '== Utilities =='
        @echo 'UTILS:' ${UTILS}
        @echo
        @echo '== Wiki documentation =='
        @echo 'WIKI_DOCS:' ${WIKI_DOCS}
        @echo
        @echo '== Others =='
        @echo 'TIDY_JUNK:' ${TIDY_JUNK}
        @echo 'CLEAN_JUNK:' ${CLEAN_JUNK}

# +<
# '''linkages''': Make the linkages file ``tmp/linkages.tmp.py`` so
# that it can be inspected during debugging.
# >+
linkages : ${LINKAGES}

# +<
# '''tmpfiles''': Make intermediate ``.swc`` files for inspection.
# >+
tmpfiles : ${PAGES_TMP}

#----------------------------------------------------------------------
# Wiki.
#----------------------------------------------------------------------

# +<'''docs''': Make wiki-formatted project documentation.>+
docs : ${WIKI_DOCS}

docs/%.wiki : %
        ${PYTHON} util/docs.py $< > $@

# +<'''syllabus''': Make a wiki-formatted syllabus.>+
syllabus : ${LINKAGES}
        @${PYTHON} util/wiki.py -s ${LINKAGES}

#----------------------------------------------------------------------
# Housekeeping.
#----------------------------------------------------------------------

# +<'''tidy''': Clean up byproducts of build.>+
tidy :
        @rm -rf ${TIDY_JUNK}

# +<'''clean''': Delete everything made by the build.>+
clean :
        @rm -rf ${CLEAN_JUNK}

# +<
# '''count''': Count the number of words in the source files (roughly).
# >+
count :
        @echo 'source lines:' `cat ${INC_SRC} | wc -l`
        @${PYTHON} util/count.py ${PAGES_SRC}

# +<'''words''': produce a concordance of the lecture notes.>+
words :
        @${PYTHON} util/count.py -t ${PAGES_SRC}

# +<'''properties''': show SVN properties of all source files.>+
properties :
        @svn propget svn:keywords ${ALL_SRC} $(wildcard util/*.py)

# +<
# '''scdtd''': Reverse-engineer the DTD of the .swc files.
# >+
scdtd :
        @python util/revdtd.py -c ${PAGES_SRC}
        @echo
        @python util/revdtd.py -p ${PAGES_SRC}
        @echo
        @python util/revdtd.py -a ${PAGES_SRC}

# +<
# '''entities''': Create a page showing all of the character entities.
# >+
entities :
        @mkdir -p ./tmp
        @${PYTHON} util/fixentities.py -t ./swc.dtd > ./tmp/entities.html

# +<
# '''tickets''': list tickets from database in wiki format.  This will
# only work when run on the Trac host machine.
# >+
tickets :
        @${SQLITE} -separator ' ' ${DB_PATH} "select id, component, summary 
from ticket where status in ('new', 'assigned', 'reopened') order by id" \
        | ${PYTHON} util/wiki.py -t
#======================================================================
# Local configuration for Greg's laptop.
#======================================================================

# What lectures to include.
LECTURES = \
        intro \
        shell01 \
        shell02 \
        version \
        build \
        py01 \
        py02 \
        py03 \
        style \
        qa \
        py04 \
        debugging \
        oop01 \
        oop02 \
        unit \
        re \
        binary \
        xml \
        db \
        spreadsheets \
        integrate \
        client \
        server \
        security \
        dev01 \
        dev02 \
        summary \
        ack \
        bib \
        glossary \
        extlinks \
        figurelist \
        tablelist \
        syllabus

# What sites to build.
SITES = # nothing

# Delete unused bibliography, glossary, and external link entries?
DELETE_ENTRIES = -D # or nothing
#======================================================================
# Local configuration for Greg's laptop.
#======================================================================

# Which interpreter to use.
PYTHON = python

# How to generate PDF files.
PRINCE = prince

# What database manager to use.
SQLITE = sqlite3

# How to apply an XSL transformation.
XSL = xsltproc

# Path to project database.
DB_PATH = /trac/swc/db/trac.db

# Where to install files.
INSTALL_DIR = /tmp/swc2

# Who owns installed files.
INSTALL_USER = 

# URL for installed files.
INSTALL_URL = http://localhost/swc2
_______________________________________________
Help-make mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-make

Reply via email to