1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
# Initialize the reproduction pipeline.
#
# Original author:
# Mohammad Akhlaghi <mohammad@akhlaghi.org>
# Contributing author(s):
# Your name <your@email.address>
# Copyright (C) 2018, Your Name.
#
# This Makefile 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.
#
# This Makefile 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.
#
# A copy of the GNU General Public License is available at
# <http://www.gnu.org/licenses/>.
# High-level directory definitions
# --------------------------------
#
# Basic directories that are used throughout the whole pipeline.
#
# Locks are used to make sure that an operation is done in series not in
# parallel (even if Make is run in parallel with the `-j' option). The most
# common case is downloads which are better done in series and not in
# parallel. Also, some programs may not be thread-safe, therefore it will
# be necessary to put a lock on them. This pipeline uses the `flock'
# program to achieve this.
texdir = $(BDIR)/tex
srcdir = reproduce/src
lockdir = $(BDIR)/locks
texbdir = $(texdir)/build
tikzdir = $(texbdir)/tikz
mtexdir = $(texdir)/macros
gconfdir = reproduce/config/gnuastro
pconfdir = reproduce/config/pipeline
# Sanity check
# ------------
#
# We need to make sure that the `./configure' command has already been
# run. The output of `./configure' is the `$(pconfdir)/LOCAL.mk' file and
# this is the non-time-stamp prerequisite of $(BDIR), see below.
#
# There is one problem however: if the user hasn't run `./configure' yet,
# then `BDIR' isn't defined (will just evaluate to blank space). Therefore
# it won't appear in the prerequisites and the pipeline will try to build
# the other directories in the top root directory (`/'). To solve this
# problem, when `BDIR' isn't defined, we'll define it with a place-holder
# name (only so it won't evaluate to blank space). Note that this
# directory will never be built.
ifeq ($(BDIR),)
configure-run = no
BDIR = reproduce/BDIR
else
configure-run = yes
endif
$(pconfdir)/LOCAL.mk:
@echo
@echo "================================================================"
@echo "For the pipeline's local settings, please run this command first"
@echo "(P.S. this local configuration is only necessary one time)"
@echo
@echo " $$ ./configure"
@echo "================================================================"
@echo
@exit 1
# Make the high-level level directories
# -------------------------------------
#
# These are just the top-level directories for all the separate steps. The
# directories (or possible sub-directories) for individual steps will be
# defined and added within their own Makefiles.
#
# IMPORTANT NOTE for $(BDIR)'s dependency: it only depends on the existance
# (not the time-stamp) of `$(pconfdir)/LOCAL.mk'. So the user can make any
# changes within that file and if they don't affect the pipeline. For
# example a change of the top $(BDIR) name, while the contents are the same
# as before.
#
# The `.SUFFIXES' rule with no prerequisite is defined to eliminate all the
# default implicit rules. The default implicit rules are to do with
# programming (for example converting `.c' files to `.o' files). The
# problem they cause is when you want to debug the make command with `-d'
# option: they add too many extra checks that make it hard to find what you
# are looking for in this pipeline.
.SUFFIXES:
$(tikzdir): | $(texbdir); mkdir $@
$(BDIR): | $(pconfdir)/LOCAL.mk; mkdir $@
$(texdir) $(lockdir): | $(BDIR); mkdir $@
$(mtexdir) $(texbdir): | $(texdir); mkdir $@
# Symbolic link to build directory
# --------------------------------
#
# Besides $(BDIR), we are also making a symbolic link to it for easy
# access. Recall that it is recommended that the actual build directory be
# in a completely separate part of the file system (a place that may easily
# be completely deleted).
#
# Note that $(BDIR) might not be an absolute path and this will complicate
# the symbolic link creation. To be generic, we'll first call `readlink' to
# make sure we have an absolute address, then we'll make a symbolic link to
# that.
reproduce/build: | $(BDIR)
absbdir=$$(readlink -f $(BDIR)); \
ln -s $$absbdir $@
# High-level Makefile management
# ------------------------------
#
# About `.PHONY': these are targets that must be built even if a file with
# their name exists. Most don't correspond to a file, but those that do are
# included here ensure that the file is always built in every run: for
# example the pipeline versions may change within two separate runs, so we
# want it to be rebuilt every time.
.PHONY: all clean distclean clean-mmap $(mtexdir)/initialize.tex
distclean: clean; rm -f $(pconfdir)/LOCAL.mk
# --------- Delete for no Gnuastro ---------
clean-mmap:; rm -f reproduce/config/gnuastro/mmap*
# ------------------------------------------
clean: clean-mmap
ifeq ($(configure-run),yes)
rm -rf $(BDIR)
endif
rm -f reproduce/build *.pdf *.log *.out *.aux *.auxlock
# Pipeline initialization results
# -------------------------------
#
# This file will store some basic info about the pipeline that is necessary
# for the final PDF. Since these are not version controlled, it must be
# calculated everytime the pipeline is run. So even though this file
# actually exists, it is also aded as a `.PHONY' target above.
$(mtexdir)/initialize.tex: | $(mtexdir)
# Version of the pipeline.
@v=$$(git describe --dirty --always); \
echo "\newcommand{\pipelineversion}{$$v}" > $@
# --------- Delete for no Gnuastro ---------
# Version of Gnuastro.
@v=$$(astnoisechisel --version | awk 'NR==1{print $$NF}'); \
echo "\newcommand{\gnuastroversion}{$$v}" >> $@
# ------------------------------------------
# Location of the build directory (for LaTeX inputs).
@echo "\newcommand{\bdir}{$(BDIR)}" >> $@
|