aboutsummaryrefslogtreecommitdiff
path: root/reproduce/software
diff options
context:
space:
mode:
Diffstat (limited to 'reproduce/software')
-rw-r--r--reproduce/software/bash/git-post-checkout66
-rw-r--r--reproduce/software/bash/git-pre-commit83
-rw-r--r--reproduce/software/bibtex/astropy.tex97
-rw-r--r--reproduce/software/bibtex/cython.tex21
-rw-r--r--reproduce/software/bibtex/fftw.tex19
-rw-r--r--reproduce/software/bibtex/gnuastro.tex24
-rw-r--r--reproduce/software/bibtex/matplotlib.tex22
-rw-r--r--reproduce/software/bibtex/mpi4py.tex20
-rw-r--r--reproduce/software/bibtex/numpy.tex23
-rw-r--r--reproduce/software/bibtex/scipy.tex34
-rw-r--r--reproduce/software/config/gnuastro/astbuildprog.conf16
-rw-r--r--reproduce/software/config/gnuastro/astconvertt.conf33
-rw-r--r--reproduce/software/config/gnuastro/aststatistics.conf36
-rw-r--r--reproduce/software/config/gnuastro/gnuastro.conf37
-rw-r--r--reproduce/software/config/installation/LOCAL.mk.in16
-rw-r--r--reproduce/software/config/installation/numpy-scipy.cfg46
-rw-r--r--reproduce/software/config/installation/texlive.conf35
-rw-r--r--reproduce/software/config/installation/texlive.mk22
-rw-r--r--reproduce/software/config/installation/versions.mk123
-rwxr-xr-xreproduce/software/make/atlas-multiple.mk72
-rwxr-xr-xreproduce/software/make/atlas-single.mk54
-rw-r--r--reproduce/software/make/basic.mk903
-rw-r--r--reproduce/software/make/build-rules.mk120
-rw-r--r--reproduce/software/make/high-level.mk720
-rw-r--r--reproduce/software/make/python.mk506
25 files changed, 3148 insertions, 0 deletions
diff --git a/reproduce/software/bash/git-post-checkout b/reproduce/software/bash/git-post-checkout
new file mode 100644
index 0000000..9552f01
--- /dev/null
+++ b/reproduce/software/bash/git-post-checkout
@@ -0,0 +1,66 @@
+#!@BINDIR@/bash
+#
+# The example hook script to store the metadata information of version
+# controlled files (with each commit) using the `metastore' program.
+#
+# Copyright (C) 2016 Przemyslaw Pawelczyk <przemoc@gmail.com>
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# This script is taken from the `examples/hooks/pre-commit' file of the
+# `metastore' package (installed within the project, with an MIT license
+# for copyright). We have just changed the name of the `MSFILE' and also
+# set special characters for the installation location of meta-store so our
+# own installation is found by Git.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+# File containig the metadata and metastore executable.
+MSFILE=".file-metadata"
+MSBIN=@BINDIR@/metastore
+
+# If metastore is not installed, then ignore this script (exit with a
+# status of 0).
+if [ ! -f $MSBIN ]; then exit 0; fi
+
+# Delete all temporary files
+find @TOP_PROJECT_DIR@/ -name "*~" -type f -delete
+
+# Function to help in reporting a crash.
+exit_on_fail() {
+ "$@"
+ if [ $? -ne 0 ]; then
+ echo "Failed to execute: $@" >&2
+ exit 1
+ fi
+}
+
+# Check if the metadata file exists.
+if [ ! -e "$MSFILE" ]; then
+ echo "\"$MSFILE\" missing" >&2
+ exit 1
+fi
+
+# Run metastore.
+exit_on_fail \
+ $MSBIN -a -m -e -E -q -O @USER@ -G @GROUP@ -f "$MSFILE"
+
+# Return with a success code (0).
+exit 0
diff --git a/reproduce/software/bash/git-pre-commit b/reproduce/software/bash/git-pre-commit
new file mode 100644
index 0000000..dbe0ecc
--- /dev/null
+++ b/reproduce/software/bash/git-pre-commit
@@ -0,0 +1,83 @@
+#!@BINDIR@/bash
+#
+# The example hook script to store the metadata information of version
+# controlled files (with each commit) using the `metastore' program.
+#
+# Copyright (C) 2016 Przemyslaw Pawelczyk <przemoc@gmail.com>
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# WARNING:
+#
+# If the commit is aborted (e.g. by not entering any synopsis),
+# then updated metastore file (.metadata by default) is not reverted,
+# so its new version remains in the index.
+# To undo any changes in metastore file written since HEAD commit,
+# you may want to reset and checkout HEAD version of the file:
+#
+# git reset HEAD -- .metadata
+# git checkout HEAD -- .metadata
+#
+# This script is taken from the `examples/hooks/pre-commit' file of the
+# `metastore' package (installed within the project, with an MIT license
+# for copyright). Here, the name of the `MSFILE' and also set special
+# characters for the installation location of meta-store so our own
+# installation is found by Git.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# File containig the metadata and metastore executable.
+MSFILE=".file-metadata"
+MSBIN=@BINDIR@/metastore
+
+# If metastore is not installed, then ignore this script (exit with a
+# status of 0).
+if [ ! -f $MSBIN ]; then exit 0; fi
+
+# Function to help in reporting a crash.
+exit_on_fail() {
+ "$@"
+ if [ $? -ne 0 ]; then
+ echo "Failed to execute: $@" >&2
+ exit 1
+ fi
+}
+
+# Run metastore.
+exit_on_fail \
+ $MSBIN -O @USER@ -G @GROUP@ -s -f "$MSFILE"
+
+# If it's first metastore commit, store again to include $MSFILE in $MSFILE.
+if ! git-ls-tree --name-only HEAD 2>/dev/null | grep -Fqx "$MSFILE"; then
+ exit_on_fail \
+ $MSBIN -O @USER@ -G @GROUP@ -s -f "$MSFILE"
+fi
+
+# Check if the metadata file exists.
+if [ ! -e "$MSFILE" ]; then
+ echo "\"$MSFILE\" missing" >&2
+ exit 1
+fi
+
+# Add the metadata file to the Git repository.
+exit_on_fail \
+ git-add "$MSFILE"
+
+# Return with a success code (0).
+exit 0
diff --git a/reproduce/software/bibtex/astropy.tex b/reproduce/software/bibtex/astropy.tex
new file mode 100644
index 0000000..450212d
--- /dev/null
+++ b/reproduce/software/bibtex/astropy.tex
@@ -0,0 +1,97 @@
+%% Copyright (C) 2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{astropy2018,
+ author = {{Astropy Collaboration} and {Price-Whelan}, A.~M. and {Sip{\H o}cz}, B.~M. and
+ {G{\"u}nther}, H.~M. and {Lim}, P.~L. and {Crawford}, S.~M. and
+ {Conseil}, S. and {Shupe}, D.~L. and {Craig}, M.~W. and {Dencheva}, N. and
+ {Ginsburg}, A. and {VanderPlas}, J.~T. and {Bradley}, L.~D. and
+ {P{\'e}rez-Su{\'a}rez}, D. and {de Val-Borro}, M. and {Aldcroft}, T.~L. and
+ {Cruz}, K.~L. and {Robitaille}, T.~P. and {Tollerud}, E.~J. and
+ {Ardelean}, C. and {Babej}, T. and {Bach}, Y.~P. and {Bachetti}, M. and
+ {Bakanov}, A.~V. and {Bamford}, S.~P. and {Barentsen}, G. and
+ {Barmby}, P. and {Baumbach}, A. and {Berry}, K.~L. and {Biscani}, F. and
+ {Boquien}, M. and {Bostroem}, K.~A. and {Bouma}, L.~G. and {Brammer}, G.~B. and
+ {Bray}, E.~M. and {Breytenbach}, H. and {Buddelmeijer}, H. and
+ {Burke}, D.~J. and {Calderone}, G. and {Cano Rodr{\'{\i}}guez}, J.~L. and
+ {Cara}, M. and {Cardoso}, J.~V.~M. and {Cheedella}, S. and {Copin}, Y. and
+ {Corrales}, L. and {Crichton}, D. and {D'Avella}, D. and {Deil}, C. and
+ {Depagne}, {\'E}. and {Dietrich}, J.~P. and {Donath}, A. and
+ {Droettboom}, M. and {Earl}, N. and {Erben}, T. and {Fabbro}, S. and
+ {Ferreira}, L.~A. and {Finethy}, T. and {Fox}, R.~T. and {Garrison}, L.~H. and
+ {Gibbons}, S.~L.~J. and {Goldstein}, D.~A. and {Gommers}, R. and
+ {Greco}, J.~P. and {Greenfield}, P. and {Groener}, A.~M. and
+ {Grollier}, F. and {Hagen}, A. and {Hirst}, P. and {Homeier}, D. and
+ {Horton}, A.~J. and {Hosseinzadeh}, G. and {Hu}, L. and {Hunkeler}, J.~S. and
+ {Ivezi{\'c}}, {\v Z}. and {Jain}, A. and {Jenness}, T. and {Kanarek}, G. and
+ {Kendrew}, S. and {Kern}, N.~S. and {Kerzendorf}, W.~E. and
+ {Khvalko}, A. and {King}, J. and {Kirkby}, D. and {Kulkarni}, A.~M. and
+ {Kumar}, A. and {Lee}, A. and {Lenz}, D. and {Littlefair}, S.~P. and
+ {Ma}, Z. and {Macleod}, D.~M. and {Mastropietro}, M. and {McCully}, C. and
+ {Montagnac}, S. and {Morris}, B.~M. and {Mueller}, M. and {Mumford}, S.~J. and
+ {Muna}, D. and {Murphy}, N.~A. and {Nelson}, S. and {Nguyen}, G.~H. and
+ {Ninan}, J.~P. and {N{\"o}the}, M. and {Ogaz}, S. and {Oh}, S. and
+ {Parejko}, J.~K. and {Parley}, N. and {Pascual}, S. and {Patil}, R. and
+ {Patil}, A.~A. and {Plunkett}, A.~L. and {Prochaska}, J.~X. and
+ {Rastogi}, T. and {Reddy Janga}, V. and {Sabater}, J. and {Sakurikar}, P. and
+ {Seifert}, M. and {Sherbert}, L.~E. and {Sherwood-Taylor}, H. and
+ {Shih}, A.~Y. and {Sick}, J. and {Silbiger}, M.~T. and {Singanamalla}, S. and
+ {Singer}, L.~P. and {Sladen}, P.~H. and {Sooley}, K.~A. and
+ {Sornarajah}, S. and {Streicher}, O. and {Teuben}, P. and {Thomas}, S.~W. and
+ {Tremblay}, G.~R. and {Turner}, J.~E.~H. and {Terr{\'o}n}, V. and
+ {van Kerkwijk}, M.~H. and {de la Vega}, A. and {Watkins}, L.~L. and
+ {Weaver}, B.~A. and {Whitmore}, J.~B. and {Woillez}, J. and
+ {Zabalza}, V. and {Astropy Contributors}},
+ title = "{The Astropy Project: Building an Open-science Project and Status of the v2.0 Core Package}",
+ journal = {AJ},
+archivePrefix = "arXiv",
+ eprint = {1801.02634},
+ primaryClass = "astro-ph.IM",
+ keywords = {methods: data analysis, methods: miscellaneous, methods: statistical, reference systems },
+ year = 2018,
+ month = sep,
+ volume = 156,
+ eid = {123},
+ pages = {123},
+ doi = {10.3847/1538-3881/aabc4f},
+ adsurl = {http://adsabs.harvard.edu/abs/2018AJ....156..123A},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
+
+
+
+
+
+@ARTICLE{astropy2013,
+ author = {{Astropy Collaboration} and {Robitaille}, T.~P. and {Tollerud}, E.~J. and
+ {Greenfield}, P. and {Droettboom}, M. and {Bray}, E. and {Aldcroft}, T. and
+ {Davis}, M. and {Ginsburg}, A. and {Price-Whelan}, A.~M. and
+ {Kerzendorf}, W.~E. and {Conley}, A. and {Crighton}, N. and
+ {Barbary}, K. and {Muna}, D. and {Ferguson}, H. and {Grollier}, F. and
+ {Parikh}, M.~M. and {Nair}, P.~H. and {Unther}, H.~M. and {Deil}, C. and
+ {Woillez}, J. and {Conseil}, S. and {Kramer}, R. and {Turner}, J.~E.~H. and
+ {Singer}, L. and {Fox}, R. and {Weaver}, B.~A. and {Zabalza}, V. and
+ {Edwards}, Z.~I. and {Azalee Bostroem}, K. and {Burke}, D.~J. and
+ {Casey}, A.~R. and {Crawford}, S.~M. and {Dencheva}, N. and
+ {Ely}, J. and {Jenness}, T. and {Labrie}, K. and {Lim}, P.~L. and
+ {Pierfederici}, F. and {Pontzen}, A. and {Ptak}, A. and {Refsdal}, B. and
+ {Servillat}, M. and {Streicher}, O.},
+ title = "{Astropy: A community Python package for astronomy}",
+ journal = {A\&A},
+archivePrefix = "arXiv",
+ eprint = {1307.6212},
+ primaryClass = "astro-ph.IM",
+ keywords = {methods: data analysis, methods: miscellaneous, virtual observatory tools},
+ year = 2013,
+ month = oct,
+ volume = 558,
+ eid = {A33},
+ pages = {A33},
+ doi = {10.1051/0004-6361/201322068},
+ adsurl = {http://adsabs.harvard.edu/abs/2013A\%26A...558A..33A},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
diff --git a/reproduce/software/bibtex/cython.tex b/reproduce/software/bibtex/cython.tex
new file mode 100644
index 0000000..110cb19
--- /dev/null
+++ b/reproduce/software/bibtex/cython.tex
@@ -0,0 +1,21 @@
+%% Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{cython2011,
+ author = {{Behnel}, S. and {Bradshaw}, R. and {Citro}, C. and {Dalcin}, L. and
+ {Seljebotn}, D.~S. and {Smith}, K.},
+ title = "{Cython: The Best of Both Worlds}",
+ journal = {CiSE},
+ year = 2011,
+ month = mar,
+ volume = 13,
+ number = 2,
+ pages = {31},
+ doi = {10.1109/MCSE.2010.118},
+ adsurl = {http://adsabs.harvard.edu/abs/2011CSE....13b..31B},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
diff --git a/reproduce/software/bibtex/fftw.tex b/reproduce/software/bibtex/fftw.tex
new file mode 100644
index 0000000..60c24a8
--- /dev/null
+++ b/reproduce/software/bibtex/fftw.tex
@@ -0,0 +1,19 @@
+%% Copyright (C) 2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{fftw,
+ author = {M. {Frigo} and S. G. {Johnson}},
+ journal = {IEEE Proc.},
+ title = {The Design and Implementation of FFTW3},
+ year = {2005},
+ volume = {93},
+ number = {2},
+ pages = {216},
+ doi = {10.1109/JPROC.2004.840301},
+ ISSN = {0018-9219},
+ month = {Feb},
+}
diff --git a/reproduce/software/bibtex/gnuastro.tex b/reproduce/software/bibtex/gnuastro.tex
new file mode 100644
index 0000000..91788c9
--- /dev/null
+++ b/reproduce/software/bibtex/gnuastro.tex
@@ -0,0 +1,24 @@
+%% Copyright (C) 2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{gnuastro,
+ author = {{Akhlaghi}, M. and {Ichikawa}, T.},
+ title = "{Noise-based Detection and Segmentation of Nebulous Objects}",
+ journal = {ApJS},
+archivePrefix = "arXiv",
+ eprint = {1505.01664},
+ primaryClass = "astro-ph.IM",
+ keywords = {galaxies: irregular, galaxies: photometry, galaxies: structure, methods: data analysis, techniques: image processing, techniques: photometric},
+ year = 2015,
+ month = sep,
+ volume = 220,
+ eid = {1},
+ pages = {1},
+ doi = {10.1088/0067-0049/220/1/1},
+ adsurl = {http://adsabs.harvard.edu/abs/2015ApJS..220....1A},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
diff --git a/reproduce/software/bibtex/matplotlib.tex b/reproduce/software/bibtex/matplotlib.tex
new file mode 100644
index 0000000..8578899
--- /dev/null
+++ b/reproduce/software/bibtex/matplotlib.tex
@@ -0,0 +1,22 @@
+%% Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@Article{matplotlib2007,
+ Author = {Hunter, J. D.},
+ Title = {Matplotlib: A 2D graphics environment},
+ Journal = {CiSE},
+ Volume = {9},
+ Number = {3},
+ Pages = {90},
+ abstract = {Matplotlib is a 2D graphics package used for Python
+ for application development, interactive scripting, and
+ publication-quality image generation across user
+ interfaces and operating systems.},
+ publisher = {IEEE COMPUTER SOC},
+ doi = {10.1109/MCSE.2007.55},
+ year = 2007
+}
diff --git a/reproduce/software/bibtex/mpi4py.tex b/reproduce/software/bibtex/mpi4py.tex
new file mode 100644
index 0000000..4e0045f
--- /dev/null
+++ b/reproduce/software/bibtex/mpi4py.tex
@@ -0,0 +1,20 @@
+%% Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{mpi4py2011,
+ author = {{Dalcin}, L.~D. and {Paz}, R.~R. and {Kler}, P.~A. and {Cosimo}, A.
+ },
+ title = "{Parallel distributed computing using Python}",
+ journal = {Advances in Water Resources},
+ year = 2011,
+ month = sep,
+ volume = 34,
+ pages = {1124},
+ doi = {10.1016/j.advwatres.2011.04.013},
+ adsurl = {http://adsabs.harvard.edu/abs/2011AdWR...34.1124D},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
diff --git a/reproduce/software/bibtex/numpy.tex b/reproduce/software/bibtex/numpy.tex
new file mode 100644
index 0000000..0d9028f
--- /dev/null
+++ b/reproduce/software/bibtex/numpy.tex
@@ -0,0 +1,23 @@
+%% Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{numpy2011,
+ author = {{van der Walt}, S. and {Colbert}, S.~C. and {Varoquaux}, G.},
+ title = "{The NumPy Array: A Structure for Efficient Numerical Computation}",
+ journal = {CiSE},
+archivePrefix = "arXiv",
+ eprint = {1102.1523},
+ primaryClass = "cs.MS",
+ year = 2011,
+ month = mar,
+ volume = 13,
+ number = 2,
+ pages = {22},
+ doi = {10.1109/MCSE.2011.37},
+ adsurl = {http://adsabs.harvard.edu/abs/2011CSE....13b..22V},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}
diff --git a/reproduce/software/bibtex/scipy.tex b/reproduce/software/bibtex/scipy.tex
new file mode 100644
index 0000000..60500d2
--- /dev/null
+++ b/reproduce/software/bibtex/scipy.tex
@@ -0,0 +1,34 @@
+%% Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+%%
+%% Copying and distribution of this file, with or without modification,
+%% are permitted in any medium without royalty provided the copyright
+%% notice and this notice are preserved. This file is offered as-is,
+%% without any warranty.
+
+@ARTICLE{scipy2011,
+ author = {K. J. {Millman} and M. {Aivazis}},
+ journal = {CiSE},
+ title = {Python for Scientists and Engineers},
+ year = {2011},
+ volume = {13},
+ number = {2},
+ pages = {9},
+ keywords = {Special issues and sections;Computer languages;Programming;Scientific computing;Numerical models;Programming languages;Python;Scientific computing;interactive research;Python libraries;Python tools},
+ doi = {10.1109/MCSE.2011.36},
+ ISSN = {1521-9615},
+ month ={March},
+}
+
+@ARTICLE{scipy2007,
+ author = {T. E. {Oliphant}},
+ journal = {CiSE},
+ title = {Python for Scientific Computing},
+ year = {2007},
+ volume = {9},
+ number = {3},
+ pages = {10},
+ keywords = {high level languages;Python;scientific computing;steering language;scientific codes;high-level language;Scientific computing;High level languages;Libraries;Writing;Application software;Embedded software;Software standards;Standards development;Internet;Prototypes;Python;computer languages;scientific programming;scientific computing},
+ doi = {10.1109/MCSE.2007.58},
+ ISSN = {1521-9615},
+ month = {May},
+}
diff --git a/reproduce/software/config/gnuastro/astbuildprog.conf b/reproduce/software/config/gnuastro/astbuildprog.conf
new file mode 100644
index 0000000..c15baf1
--- /dev/null
+++ b/reproduce/software/config/gnuastro/astbuildprog.conf
@@ -0,0 +1,16 @@
+# BuildProgram's configuration file depends on the build and is installed
+# along with the rest of Gnuastro. So we'll set any specific configuration
+# we want here, then import those.
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+# To keep the program's compiled excutable file, comment this line.
+deletecompiled 1
+
+# Import the built configuration file
+config .local/etc/astbuildprog.conf \ No newline at end of file
diff --git a/reproduce/software/config/gnuastro/astconvertt.conf b/reproduce/software/config/gnuastro/astconvertt.conf
new file mode 100644
index 0000000..6466455
--- /dev/null
+++ b/reproduce/software/config/gnuastro/astconvertt.conf
@@ -0,0 +1,33 @@
+# Default parameters (System) for ConvertType.
+# ConvertType is part of GNU Astronomy Utitlies.
+#
+# Use the long option name of each parameter followed by a value. The name
+# and value should be separated by atleast one white-space character (for
+# example ` '[space], or tab). Lines starting with `#' are ignored.
+#
+# For more information, please run these commands:
+#
+# $ astconvertt --help # Full list of options, short doc.
+# $ astconvertt -P # Print all options and used values.
+# $ info astconvertt # All options and input/output.
+# $ info gnuastro "Configuration files" # How to use configuration files.
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+# Input:
+
+# Output:
+ quality 100
+ widthincm 10.0
+ borderwidth 1
+ output jpg
+
+# Flux:
+ invert 0
+
+# Common options
diff --git a/reproduce/software/config/gnuastro/aststatistics.conf b/reproduce/software/config/gnuastro/aststatistics.conf
new file mode 100644
index 0000000..1d13e3f
--- /dev/null
+++ b/reproduce/software/config/gnuastro/aststatistics.conf
@@ -0,0 +1,36 @@
+# Default parameters (System) for Statistics.
+# Statistics is part of GNU Astronomy Utitlies.
+#
+# Use the long option name of each parameter followed by a value. The name
+# and value should be separated by atleast one white-space character (for
+# example ` '[space], or tab). Lines starting with `#' are ignored.
+#
+# For more information, please run these commands:
+#
+# $ aststatistics --help # Full list of options, short doc.
+# $ aststatistics -P # Print all options and used values.
+# $ info aststatistics # All options and input/output.
+# $ info gnuastro "Configuration files" # How to use configuration files.
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+# Input image:
+
+# Sky and its STD settings
+ khdu 1
+ meanmedqdiff 0.005
+ outliersigma 10
+ outliersclip 3,0.2
+ smoothwidth 3
+ sclipparams 3,0.1
+
+# Histogram and CFP settings
+ numasciibins 70
+ asciiheight 10
+ numbins 100
+ mirrordist 1.5
diff --git a/reproduce/software/config/gnuastro/gnuastro.conf b/reproduce/software/config/gnuastro/gnuastro.conf
new file mode 100644
index 0000000..57fcadc
--- /dev/null
+++ b/reproduce/software/config/gnuastro/gnuastro.conf
@@ -0,0 +1,37 @@
+# Default values for the common options to all the programs in GNU
+# Astronomy Utitlies.
+#
+# IMPORTANT NOTE: The `lastconfig' option is very important in a
+# reproducible environment. Because we don't want any of Gnuastro's
+# programs to go into an un-controlled environment (user or system wide
+# configuration files).
+#
+# The rest of this configuration file is taken from the default Gnuastro
+# configuration from its source (`bin/gnuastro.conf').
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+# Local project settings (`config' has to be before `lastconfig').
+ config .gnuastro/gnuastro-local.conf
+ lastconfig 1
+
+# Input:
+ hdu 1
+ ignorecase 1
+ searchin name
+
+# Tessellation
+ tilesize 50,50
+ numchannels 1,1
+ remainderfrac 0.1
+ workoverch 0
+ interpnumngb 9
+ interponlyblank 0
+
+# Output:
+ tableformat fits-binary \ No newline at end of file
diff --git a/reproduce/software/config/installation/LOCAL.mk.in b/reproduce/software/config/installation/LOCAL.mk.in
new file mode 100644
index 0000000..785bb6a
--- /dev/null
+++ b/reproduce/software/config/installation/LOCAL.mk.in
@@ -0,0 +1,16 @@
+# Local project configuration.
+#
+# This is just a template for the `./configure' script to fill in. Please
+# don't make any change to this file.
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+BDIR = @bdir@
+INDIR = @indir@
+DEPENDENCIES-DIR = @ddir@
+DOWNLOADER = @downloader@
+GROUP-NAME = @groupname@
diff --git a/reproduce/software/config/installation/numpy-scipy.cfg b/reproduce/software/config/installation/numpy-scipy.cfg
new file mode 100644
index 0000000..4b7a7b0
--- /dev/null
+++ b/reproduce/software/config/installation/numpy-scipy.cfg
@@ -0,0 +1,46 @@
+# THIS IS A COPY OF NUMPY'S site.cfg.example, CUSTOMIZED FOR THIS TEMPLATE
+# ------------------------------------------------------------------------
+
+# This file provides configuration information about non-Python
+# dependencies for numpy.distutils-using packages. Create a file like this
+# called "site.cfg" next to your package's setup.py file and fill in the
+# appropriate sections. Not all packages will use all sections so you
+# should leave out sections that your package does not use.
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+# IMPORTANT NOTE
+# --------------
+#
+# The `ALL' grouping does't apply to ATLAS!!!!!
+
+ [ALL]
+ library_dirs = @LIBDIR@
+ include_dirs = @INCDIR@
+
+
+# FFT libraries
+# -------------
+# There are two FFT libraries that we can configure here: FFTW (2 and 3) and djbfft.
+# Note that these libraries are not used by numpy or scipy.
+#
+# http://fftw.org/
+# https://cr.yp.to/djbfft.html
+#
+# Given only this section, numpy.distutils will try to figure out which version
+# of FFTW you are using.
+
+# Even with this section, Numpy apparently does not use fftw. But we will
+# keep it here for the future (if a solution is found).
+[fftw]
+libraries = fftw3
+#
+# For djbfft, numpy.distutils will look for either djbfft.a or libdjbfft.a .
+#[djbfft]
+#include_dirs = /usr/local/djbfft/include
+#library_dirs = /usr/local/djbfft/lib
diff --git a/reproduce/software/config/installation/texlive.conf b/reproduce/software/config/installation/texlive.conf
new file mode 100644
index 0000000..53054e1
--- /dev/null
+++ b/reproduce/software/config/installation/texlive.conf
@@ -0,0 +1,35 @@
+# Basic profile for build. Values to set:
+#
+# installdir: Install directory
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+selected_scheme scheme-basic
+TEXDIR @installdir@/texlive/2018
+TEXMFCONFIG @installdir@/texlive2018/texmf-config
+TEXMFLOCAL @installdir@/texlive/texmf-local
+TEXMFSYSCONFIG @installdir@/texlive/2018/texmf-config
+TEXMFSYSVAR @installdir@/texlive/2018/texmf-var
+TEXMFVAR @installdir@/texlive2018/texmf-var
+instopt_adjustpath 0
+instopt_adjustrepo 1
+instopt_letter 0
+instopt_portable 0
+instopt_write18_restricted 1
+tlpdbopt_autobackup 1
+tlpdbopt_backupdir @installdir@/texlive/2018/backups
+tlpdbopt_create_formats 1
+tlpdbopt_desktop_integration 1
+tlpdbopt_file_assocs 1
+tlpdbopt_generate_updmap 0
+tlpdbopt_install_docfiles 1
+tlpdbopt_install_srcfiles 1
+tlpdbopt_post_code 1
+tlpdbopt_sys_bin @installdir@/bin
+tlpdbopt_sys_info @installdir@/share/info
+tlpdbopt_sys_man @installdir@/share/man
+tlpdbopt_w32_multi_user 1
diff --git a/reproduce/software/config/installation/texlive.mk b/reproduce/software/config/installation/texlive.mk
new file mode 100644
index 0000000..0acf5ab
--- /dev/null
+++ b/reproduce/software/config/installation/texlive.mk
@@ -0,0 +1,22 @@
+# Necessary packages to install in TeX Live.
+#
+# If any extra TeX package is necessary to build your paper, just add its
+# name to this variable (you can check in `ctan.org' to find the official
+# name).
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice and
+# this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+
+# Note on `tex' and `fancyhdr': These two packages are installed along with
+# the basic installation scheme that we used to install tlmgr, they will be
+# ignored in the `tlmgr install' command, but will be used later when we
+# want their versions.
+texlive-packages = tex fancyhdr ec newtx fontaxes xkeyval etoolbox xcolor \
+ setspace caption footmisc datetime fmtcount titlesec \
+ preprint ulem biblatex biber logreq pgf pgfplots fp \
+ courier tex-gyre txfonts times
diff --git a/reproduce/software/config/installation/versions.mk b/reproduce/software/config/installation/versions.mk
new file mode 100644
index 0000000..149f9ae
--- /dev/null
+++ b/reproduce/software/config/installation/versions.mk
@@ -0,0 +1,123 @@
+# Versions of the various dependencies
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+#
+# 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/>.
+
+# C/C++ programs and libraries.
+atlas-version = 3.10.3
+bash-version = 5.0
+binutils-version = 2.31.1
+cfitsio-version = 3.45
+cmake-version = 3.14.2
+coreutils-version = 8.31
+curl-version = 7.63.0
+diffutils-version = 3.7
+fftw-version = 3.3.8
+file-version = 5.36
+findutils-version = 4.6.0.199-e3fc
+flock-version = 0.2.3
+freetype-version = 2.9
+gawk-version = 5.0.0
+gcc-version = 8.3.0
+ghostscript-version = 9.26
+git-version = 2.21.0
+gmp-version = 6.1.2
+gnuastro-version = 0.8
+grep-version = 3.3
+gsl-version = 2.5
+gzip-version = 1.10
+hdf5-version = 1.10.5
+isl-version = 0.18
+libbsd-version = 0.9.1
+libffi-version = 3.2.1
+libjpeg-version = v9b
+libpng-version = 1.6.36
+libtiff-version = 4.0.10
+libtool-version = 2.4.6
+lzip-version = 1.20
+m4-version = 1.4.18
+make-version = 4.2.90
+metastore-version = 1.1.2-23-fa9170b
+mpfr-version = 4.0.2
+mpc-version = 1.1.0
+ncurses-version = 6.1
+openblas-version = 0.3.5
+openmpi-version = 4.0.1
+openssl-version = 1.1.1a
+patchelf-version = 0.9
+pkgconfig-version = 0.29.2
+python-version = 3.7.3
+readline-version = 8.0
+sed-version = 4.7
+tar-version = 1.32
+unzip-version = 6.0
+wget-version = 1.20.3
+which-version = 2.21
+xz-version = 5.2.4
+zip-version = 3.0
+zlib-version = 1.2.11
+
+# Special libraries
+# -----------------
+#
+# When updating the version of these libraries, please look into the build
+# rule first: In one way or another, the version string becomes necessary
+# during their build and must be accounted for.
+bzip2-version = 1.0.6
+lapack-version = 3.8.0
+libgit2-version = 0.26.0
+wcslib-version = 6.2
+
+# Python packages
+# ---------------
+#
+# IMPORTANT: Fix url in `reproduce/src/make/dependencies.mk'
+# if changing the version
+asn1crypto-version = 0.24.0
+astroquery-version = 0.3.9
+astropy-version = 3.1.1
+beautifulsoup4-version = 4.7.1
+certifi-version = 2018.11.29
+cffi-version = 1.12.2
+chardet-version = 3.0.4
+cryptography-version = 2.6.1
+cycler-version = 0.10.0
+cython-version = 0.29.6
+entrypoints-version = 0.3
+h5py-version = 2.9.0
+html5lib-version = 1.0.1
+idna-version = 2.8
+jeepney-version = 0.4
+kiwisolver-version = 1.0.1
+keyring-version = 18.0.0
+matplotlib-version = 3.0.2
+mpi4py-version = 3.0.1
+numpy-version = 1.16.2
+pip-version = 19.0.2
+pycparser-version = 2.19
+pyparsing-version = 2.3.1
+pypkgconfig-version = 1.5.1
+python-dateutil-version = 2.8.0
+requests-version = 2.21.0
+scipy-version = 1.2.1
+secretstorage-version = 3.1.1
+setuptools-version = 40.8.0
+setuptools_scm-version = 3.2.0
+six-version = 1.12.0
+soupsieve-version = 1.8
+urllib3-version = 1.24.1
+virtualenv-version = 16.4.0
+webencodings-version = 0.5.1
diff --git a/reproduce/software/make/atlas-multiple.mk b/reproduce/software/make/atlas-multiple.mk
new file mode 100755
index 0000000..fef25c7
--- /dev/null
+++ b/reproduce/software/make/atlas-multiple.mk
@@ -0,0 +1,72 @@
+# Rules to build ATLAS shared libraries in multi-threaded mode on GNU/Linux
+#
+# ------------------------------------------------------------------------
+# !!!!! IMPORTANT NOTES !!!!!
+#
+# This Makefile will be run during the initial `./configure' script. It is
+# not included into the reproduction pipe after that.
+#
+# ------------------------------------------------------------------------
+#
+# Copyright (C) 2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# 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/>.
+
+ORIGLDFLAGS := $(LDFLAGS)
+
+include Make.inc
+
+all: libatlas.so libf77blas.so libptf77blas.so libstcblas.so libptcblas.so \
+ libblas.so libcblas.so liblapack.so.3.6.1 libptlapack.so.3.6.1 liblapack.so.3
+
+libatlas.so: libatlas.a
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname $@ -o $@ \
+ --whole-archive libatlas.a --no-whole-archive -lc $(LIBS)
+
+libf77blas.so : libf77blas.a libatlas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname libf77blas.so.3 \
+ -o $@ --whole-archive libf77blas.a --no-whole-archive \
+ $(F77SYSLIB) -L. -latlas
+
+libptf77blas.so : libptf77blas.a libatlas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname libblas.so.3 \
+ -o $@ --whole-archive libptf77blas.a --no-whole-archive \
+ $(F77SYSLIB) -L. -latlas
+
+libstcblas.so : libcblas.a libatlas.so libblas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname libstcblas.so \
+ -o $@ --whole-archive libcblas.a -L. -latlas -lblas
+
+libptcblas.so : libptcblas.a libatlas.so libblas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname libcblas.so \
+ -o $@ --whole-archive libptcblas.a -L. -latlas -lblas
+
+libblas.so: libptf77blas.so
+ ln -s $< $@
+
+libcblas.so: libptcblas.so
+ ln -s $< $@
+
+liblapack.so.3.6.1 : liblapack.a libstcblas.so libf77blas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname libstlapack.so.3 \
+ -o $@ --whole-archive liblapack.a --no-whole-archive \
+ $(F77SYSLIB) -L. -lstcblas -lf77blas
+
+libptlapack.so.3.6.1 : libptlapack.a libcblas.so libblas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname liblapack.so.3 \
+ -o $@ --whole-archive libptlapack.a --no-whole-archive \
+ $(F77SYSLIB) -L. -lcblas -lblas
+
+liblapack.so.3: libptlapack.so.3.6.1
+ ln -s $< $@
diff --git a/reproduce/software/make/atlas-single.mk b/reproduce/software/make/atlas-single.mk
new file mode 100755
index 0000000..dde2926
--- /dev/null
+++ b/reproduce/software/make/atlas-single.mk
@@ -0,0 +1,54 @@
+# Rules to build ATLAS shared libraries for single threads on GNU/Linux
+#
+# ------------------------------------------------------------------------
+# !!!!! IMPORTANT NOTES !!!!!
+#
+# This Makefile will be run during the initial `./configure' script. It is
+# not included into the reproduction pipe after that.
+#
+# ------------------------------------------------------------------------
+#
+# Copyright (C) 2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# 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/>.
+
+ORIGLDFLAGS := $(LDFLAGS)
+
+include Make.inc
+
+all: libatlas.so libf77blas.so libcblas.so libblas.so liblapack.so.3.6.1
+
+libatlas.so: libatlas.a
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname $@ -o $@ \
+ --whole-archive libatlas.a --no-whole-archive -lc $(LIBS)
+
+libf77blas.so : libf77blas.a libatlas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname libblas.so.3 \
+ -o $@ --whole-archive libf77blas.a --no-whole-archive \
+ $(F77SYSLIB) -L. -latlas
+
+libcblas.so : libcblas.a libatlas.so libblas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname $@ -o $@ \
+ --whole-archive libcblas.a -L. -latlas -lblas
+
+libblas.so: libf77blas.so
+ ln -s $< $@
+
+liblapack.so.3.6.1 : liblapack.a libcblas.so libblas.so
+ ld $(ORIGLDFLAGS) $(LDFLAGS) -shared -soname liblapack.so.3 \
+ -o $@ --whole-archive liblapack.a --no-whole-archive \
+ $(F77SYSLIB) -L. -lcblas -lblas
+
+liblapack.so.3: liblapack.so.3.6.1
+ ln -s $< $@
diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk
new file mode 100644
index 0000000..cfa05d2
--- /dev/null
+++ b/reproduce/software/make/basic.mk
@@ -0,0 +1,903 @@
+# Build the VERY BASIC project software before higher-level ones. Assuming
+# minimal/generic Make and Shell.
+#
+# ------------------------------------------------------------------------
+# !!!!! IMPORTANT NOTES !!!!!
+#
+# This Makefile will be run by the initial `./configure' script. It is not
+# included into the project after that.
+#
+# This Makefile builds very low-level and basic tools like GNU Tar, GNU
+# Bash, GNU Make, GCC and etc. Therefore this is the only Makefile in the
+# project where you CANNOT assume that GNU Bash or GNU Make are used. After
+# this Makefile (where GNU Bash and GNU Make are built), other Makefiles
+# can safely assume the fixed version of all these software.
+#
+# ------------------------------------------------------------------------
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# 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/>.
+
+
+# Top level environment
+include reproduce/software/make/build-rules.mk
+include reproduce/software/config/installation/LOCAL.mk
+include reproduce/software/config/installation/versions.mk
+
+lockdir = $(BDIR)/locks
+tdir = $(BDIR)/software/tarballs
+ddir = $(BDIR)/software/build-tmp
+idir = $(BDIR)/software/installed
+ibdir = $(BDIR)/software/installed/bin
+ildir = $(BDIR)/software/installed/lib
+ibidir = $(BDIR)/software/installed/version-info/bin
+ilidir = $(BDIR)/software/installed/version-info/lib
+
+# We'll need the system's PATH for making links to low-level programs we
+# won't be building ourselves.
+syspath := $(PATH)
+
+# As we build more programs, we want to use this project's built programs
+# and libraries, not the host's.
+export CCACHE_DISABLE := 1
+export PATH := $(ibdir):$(PATH)
+export PKG_CONFIG_PATH := $(ildir)/pkgconfig
+export PKG_CONFIG_LIBDIR := $(ildir)/pkgconfig
+export LD_LIBRARY_PATH := $(ildir):$(LD_LIBRARY_PATH)
+export CPPFLAGS := -I$(idir)/include $(CPPFLAGS)
+export LDFLAGS := $(rpath_command) -L$(ildir) $(LDFLAGS)
+
+# Define the top-level programs (that don't depend on any other).
+top-level-programs = low-level-links wget gcc
+all: $(foreach p, $(top-level-programs), $(ibidir)/$(p))
+
+
+
+
+
+# Tarballs
+# --------
+#
+# Prepare tarballs. Difference with that in `high-level.mk': `.ONESHELL' is
+# not recognized by some versions of Make (even older GNU Makes). So we'll
+# have to make sure the recipe doesn't break into multiple shell calls (so
+# we can preserve the variables).
+#
+# Software hosted at akhlaghi.org/src: As of our latest check (November
+# 2018) their major release tarballs either crash or don't build on some
+# systems (for example Make or Gzip), or they don't exist (for example
+# Bzip2).
+#
+# In the first case, we used their Git repo and bootstrapped them (just
+# like Gnuastro) and built the most recent tarball off of that. In the case
+# of Bzip2: its webpage has expired and doesn't host the data any more. It
+# is available on the link below (archive.org):
+#
+# https://web.archive.org/web/20180624184806/http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
+#
+# However, downloading from this link is slow (because its just a link). So
+# its easier to just keep a with the others.
+$(lockdir): | $(BDIR); mkdir $@
+downloadwrapper = ./reproduce/analysis/bash/download-multi-try
+tarballs = $(foreach t, bash-$(bash-version).tar.gz \
+ binutils-$(binutils-version).tar.lz \
+ bzip2-$(bzip2-version).tar.gz \
+ cert.pem \
+ coreutils-$(coreutils-version).tar.xz \
+ diffutils-$(diffutils-version).tar.xz \
+ file-$(file-version).tar.gz \
+ findutils-$(findutils-version).tar.lz \
+ gawk-$(gawk-version).tar.lz \
+ gcc-$(gcc-version).tar.xz \
+ gmp-$(gmp-version).tar.lz \
+ grep-$(grep-version).tar.xz \
+ gzip-$(gzip-version).tar.gz \
+ isl-$(isl-version).tar.bz2 \
+ libtool-$(libtool-version).tar.xz \
+ lzip-$(lzip-version).tar.gz \
+ m4-$(m4-version).tar.gz \
+ make-$(make-version).tar.lz \
+ mpfr-$(mpfr-version).tar.xz \
+ mpc-$(mpc-version).tar.gz \
+ ncurses-$(ncurses-version).tar.gz \
+ openssl-$(openssl-version).tar.gz \
+ patchelf-$(patchelf-version).tar.gz \
+ pkg-config-$(pkgconfig-version).tar.gz \
+ readline-$(readline-version).tar.gz \
+ sed-$(sed-version).tar.xz \
+ tar-$(tar-version).tar.gz \
+ unzip-$(unzip-version).tar.gz \
+ wget-$(wget-version).tar.lz \
+ which-$(which-version).tar.gz \
+ xz-$(xz-version).tar.gz \
+ zip-$(zip-version).tar.gz \
+ zlib-$(zlib-version).tar.gz \
+ , $(tdir)/$(t) )
+$(tarballs): $(tdir)/%: | $(lockdir)
+ if [ -f $(DEPENDENCIES-DIR)/$* ]; then \
+ cp $(DEPENDENCIES-DIR)/$* $@; \
+ else \
+ n=$$(echo $* | sed -e's/[0-9\-]/ /g' \
+ -e's/\./ /g' \
+ | awk '{print $$1}' ); \
+ \
+ mergenames=1; \
+ if [ $$n = bash ]; then w=http://ftp.gnu.org/gnu/bash; \
+ elif [ $$n = binutils ]; then w=http://ftp.gnu.org/gnu/binutils; \
+ elif [ $$n = bzip ]; then w=http://akhlaghi.org/src; \
+ elif [ $$n = cert ]; then w=http://akhlaghi.org/src; \
+ elif [ $$n = coreutils ]; then w=http://ftp.gnu.org/gnu/coreutils;\
+ elif [ $$n = diffutils ]; then w=http://ftp.gnu.org/gnu/diffutils;\
+ elif [ $$n = file ]; then w=ftp://ftp.astron.com/pub/file; \
+ elif [ $$n = findutils ]; then w=http://akhlaghi.org/src; \
+ elif [ $$n = gawk ]; then w=http://ftp.gnu.org/gnu/gawk; \
+ elif [ $$n = gcc ]; then w=http://ftp.gnu.org/gnu/gcc/gcc-$(gcc-version); \
+ elif [ $$n = gmp ]; then w=https://gmplib.org/download/gmp; \
+ elif [ $$n = grep ]; then w=http://ftp.gnu.org/gnu/grep; \
+ elif [ $$n = gzip ]; then w=http://ftp.gnu.org/gnu/gzip; \
+ elif [ $$n = isl ]; then w=ftp://gcc.gnu.org/pub/gcc/infrastructure; \
+ elif [ $$n = libtool ]; then w=http://ftp.gnu.org/gnu/libtool; \
+ elif [ $$n = lzip ]; then w=http://download.savannah.gnu.org/releases/lzip; \
+ elif [ $$n = m ]; then \
+ mergenames=0; \
+ w=http://akhlaghi.org/src/m4-1.4.18-patched.tar.gz; \
+ elif [ $$n = make ]; then w=http://akhlaghi.org/src; \
+ elif [ $$n = mpfr ]; then w=http://www.mpfr.org/mpfr-current;\
+ elif [ $$n = mpc ]; then w=http://ftp.gnu.org/gnu/mpc; \
+ elif [ $$n = ncurses ]; then w=http://ftp.gnu.org/gnu/ncurses; \
+ elif [ $$n = openssl ]; then w=http://www.openssl.org/source; \
+ elif [ $$n = patchelf ]; then w=http://nixos.org/releases/patchelf/patchelf-$(patchelf-version); \
+ elif [ $$n = pkg ]; then w=http://pkg-config.freedesktop.org/releases; \
+ elif [ $$n = readline ]; then w=http://ftp.gnu.org/gnu/readline; \
+ elif [ $$n = sed ]; then w=http://ftp.gnu.org/gnu/sed; \
+ elif [ $$n = tar ]; then w=http://ftp.gnu.org/gnu/tar; \
+ elif [ $$n = unzip ]; then \
+ mergenames=0; v=$$(echo $(unzip-version) | sed -e's/\.//'); \
+ w=ftp://ftp.info-zip.org/pub/infozip/src/unzip$$v.tgz; \
+ elif [ $$n = wget ]; then w=http://ftp.gnu.org/gnu/wget; \
+ elif [ $$n = which ]; then w=http://ftp.gnu.org/gnu/which; \
+ elif [ $$n = xz ]; then w=http://tukaani.org/xz; \
+ elif [ $$n = zip ]; then \
+ mergenames=0; v=$$(echo $(zip-version) | sed -e's/\.//'); \
+ w=ftp://ftp.info-zip.org/pub/infozip/src/zip$$v.tgz; \
+ elif [ $$n = zlib ]; then w=http://www.zlib.net; \
+ else \
+ echo; echo; echo; \
+ echo "'$$n' not a basic dependency name (for downloading)." \
+ echo; echo; echo; \
+ exit 1; \
+ fi; \
+ \
+ if [ $$mergenames = 1 ]; then tarballurl=$$w/"$*"; \
+ else tarballurl=$$w; \
+ fi; \
+ \
+ echo "Downloading $$tarballurl"; \
+ if [ -f $(ibdir)/wget ]; then \
+ downloader="wget --no-use-server-timestamps -O"; \
+ else \
+ downloader="$(DOWNLOADER)"; \
+ fi; \
+ \
+ touch $(lockdir)/download; \
+ $(downloadwrapper) "$$downloader" $(lockdir)/download \
+ $$tarballurl $@; \
+ fi
+
+
+
+
+
+# Low-level (not built) programs
+# ------------------------------
+#
+# For the time being, we aren't building a local C compiler, but we'll use
+# any C compiler that the system already has and just make a symbolic link
+# to it.
+#
+# ccache: ccache acts like a wrapper over the C compiler and is made to
+# avoid/speed-up compiling of identical files in a system (it is commonly
+# used on large servers). It actually makes `gcc' or `g++' a symbolic link
+# to itself so it can control them internally. So, for our purpose here, it
+# is very annoying and can cause many complications. We thus remove any
+# part of PATH of that has `ccache' in it before making symbolic links to
+# the programs we are not building ourselves.
+makelink = origpath="$$PATH"; \
+ export PATH=$$(echo $(syspath) | tr : '\n' | grep -v ccache \
+ | tr '\n' :); \
+ a=$$(which $(1) 2> /dev/null); \
+ if [ -e $(ibdir)/$(1) ]; then rm $(ibdir)/$(1); fi; \
+ if [ x$$a = x ]; then \
+ if [ "x$(strip $(2))" = xmandatory ]; then \
+ echo "'$(1)' is necessary for higher-level tools."; \
+ echo "Please install it for the configuration to continue."; \
+ exit 1; \
+ fi; \
+ else \
+ ln -s $$a $(ibdir)/$(1); \
+ fi; \
+ export PATH="$$origpath"
+$(ibdir) $(ildir):; mkdir $@
+$(ibidir)/low-level-links: | $(ibdir) $(ildir)
+
+ # The Assembler
+ $(call makelink,as)
+
+ # Compiler (Cmake needs the clang compiler which we aren't building
+ # yet in the project).
+ $(call makelink,clang)
+ $(call makelink,clang++)
+
+ # The linker
+ $(call makelink,ar)
+ $(call makelink,ld)
+ $(call makelink,nm)
+ $(call makelink,ps)
+ $(call makelink,ranlib)
+
+ # Mac OS specific
+ $(call makelink,sysctl)
+ $(call makelink,sw_vers)
+ $(call makelink,dsymutil)
+ $(call makelink,install_name_tool)
+
+ # On Mac OS, libtool is different compared to GNU Libtool. The
+ # libtool we'll build in the high-level dependencies has the
+ # executable name `glibtool'.
+ $(call makelink,libtool)
+
+ # GNU Gettext (translate messages)
+ $(call makelink,msgfmt)
+
+ # Needed by TeXLive specifically.
+ $(call makelink,perl)
+
+ # Necessary libraries:
+ # Libdl (for dynamic loading libraries at runtime)
+ # POSIX Threads library for multi-threaded programs.
+ for l in dl pthread; do \
+ rm -f $(ildir)/lib$$l*; \
+ if [ -f /usr/lib/lib$$l.a ]; then \
+ ln -s /usr/lib/lib$$l.* $(ildir)/; \
+ fi; \
+ done
+
+ # We want this to be empty (so it doesn't interefere with the other
+ # files in `ibidir'.
+ touch $@
+
+
+
+
+
+
+
+
+
+
+# Level 1 (MOST BASIC): Compression programs
+# ------------------------------------------
+#
+# The first set of programs to be built are those that we need to unpack
+# the source code tarballs of each program. First, we'll build the
+# necessary programs, then we'll build GNU Tar.
+$(ibidir)/gzip: $(tdir)/gzip-$(gzip-version).tar.gz
+ $(call gbuild, $<, gzip-$(gzip-version), static, , V=1) \
+ && echo "GNU Gzip $(gzip-version)" > $@
+
+# GNU Lzip: For a static build, the `-static' flag should be given to
+# LDFLAGS on the command-line (not from the environment).
+ifeq ($(static_build),yes)
+lzipconf="LDFLAGS=-static"
+else
+lzipconf=
+endif
+$(ibidir)/lzip: $(tdir)/lzip-$(lzip-version).tar.gz
+ $(call gbuild, $<, lzip-$(lzip-version), , $(lzipconf)) \
+ && echo "Lzip $(lzip-version)" > $@
+
+$(ibidir)/xz: $(tdir)/xz-$(xz-version).tar.gz
+ $(call gbuild, $<, xz-$(xz-version), static) \
+ && echo "XZ Utils $(xz-version)" > $@
+
+$(ibidir)/bzip2: $(tdir)/bzip2-$(bzip2-version).tar.gz
+ # Bzip2 doesn't have a `./configure' script, and its Makefile
+ # doesn't build a shared library. So we can't use the `gbuild'
+ # function here and we need to take some extra steps (inspired
+ # from the "Linux from Scratch" guide for Bzip2):
+ # 1) The `sed' call is for relative installed symbolic links.
+ # 2) The special Makefile-libbz2_so builds shared libraries.
+ #
+ # NOTE: the major version number appears in the final symbolic
+ # link.
+ tdir=bzip2-$(bzip2-version); \
+ if [ $(static_build) = yes ]; then \
+ makecommand="make LDFLAGS=-static"; \
+ makeshared="echo no-shared"; \
+ else \
+ makecommand="make"; \
+ if [ x$(on_mac_os) = xyes ]; then \
+ makeshared="echo no-shared"; \
+ else \
+ makeshared="make -f Makefile-libbz2_so"; \
+ fi; \
+ fi; \
+ cd $(ddir) && rm -rf $$tdir && tar xf $< && cd $$tdir \
+ && sed -e 's@\(ln -s -f \)$$(PREFIX)/bin/@\1@' Makefile \
+ > Makefile.sed \
+ && mv Makefile.sed Makefile \
+ && $$makeshared \
+ && cp -a libbz2* $(ildir)/ \
+ && make clean \
+ && $$makecommand \
+ && make install PREFIX=$(idir) \
+ && cd .. \
+ && rm -rf $$tdir \
+ && cd $(ildir) \
+ && ln -fs libbz2.so.1.0 libbz2.so \
+ && echo "Bzip2 $(bzip2-version)" > $@
+
+$(ibidir)/unzip: $(tdir)/unzip-$(unzip-version).tar.gz
+ v=$$(echo $(unzip-version) | sed -e's/\.//'); \
+ $(call gbuild, $<, unzip$$v, static,, \
+ -f unix/Makefile generic_gcc \
+ CFLAGS="-DBIG_MEM -DMMAP",,pwd, \
+ -f unix/Makefile \
+ BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) \
+ && echo "Unzip $(unzip-version)" > $@
+
+$(ibidir)/zip: $(tdir)/zip-$(zip-version).tar.gz
+ v=$$(echo $(zip-version) | sed -e's/\.//'); \
+ $(call gbuild, $<, zip$$v, static,, \
+ -f unix/Makefile generic_gcc \
+ CFLAGS="-DBIG_MEM -DMMAP",,pwd, \
+ -f unix/Makefile \
+ BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) \
+ && echo "Zip $(zip-version)" > $@
+
+# Some programs (like Wget and CMake) that use zlib need it to be dynamic
+# so they use our custom build. So we won't force a static-only build.
+#
+# Note for a static-only build: Zlib's `./configure' doesn't use Autoconf's
+# configure script, it just accepts a direct `--static' option.
+$(ilidir)/zlib: $(tdir)/zlib-$(zlib-version).tar.gz
+ $(call gbuild, $<, zlib-$(zlib-version)) \
+ && echo "Zlib $(zlib-version)" > $@
+
+# GNU Tar: When built statically, tar gives a segmentation fault on
+# unpacking Bash. So we'll build it dynamically. Note that technically, zip
+# and unzip aren't dependencies of Tar, but for a clean build, we'll set
+# Tar to be the last compression-related software (the first-set of
+# software to be built).
+$(ibidir)/tar: $(tdir)/tar-$(tar-version).tar.gz \
+ $(ibidir)/bzip2 \
+ $(ibidir)/unzip \
+ $(ibidir)/gzip \
+ $(ibidir)/lzip \
+ $(ilidir)/zlib \
+ $(ibidir)/zip \
+ $(ibidir)/xz
+ # Since all later programs depend on Tar, the configuration will be
+ # stuck here, only making Tar. So its more efficient to built it on
+ # multiple threads (when the user's Make doesn't pass down the
+ # number of threads).
+ $(call gbuild, $<, tar-$(tar-version), , , -j$(numthreads) V=1) \
+ && echo "GNU Tar $(tar-version)" > $@
+
+
+
+
+
+
+
+
+
+
+# Level 2 (SECOND MOST BASIC): Bash and Make
+# ------------------------------------------
+#
+# GNU Make and GNU Bash are the second layer that we'll need to build the
+# basic dependencies.
+#
+# Unfortunately Make needs dynamic linking in two instances: when loading
+# objects (dynamically linked libraries), or when using the `getpwnam'
+# function (for tilde expansion). The first can be disabled with
+# `--disable-load', but unfortunately I don't know any way to fix the
+# second. So, we'll have to build it dynamically for now.
+$(ibidir)/make: $(tdir)/make-$(make-version).tar.lz \
+ $(ibidir)/tar
+ # See Tar's comments for the `-j' option.
+ $(call gbuild, $<, make-$(make-version), , , -j$(numthreads)) \
+ && echo "GNU Make $(make-version)" > $@
+
+$(ilidir)/ncurses: $(tdir)/ncurses-$(ncurses-version).tar.gz \
+ $(ibidir)/make
+
+ # Delete the library that will be installed (so we can make sure
+ # the build process completed afterwards and reset the links).
+ rm -f $(ildir)/libncursesw*
+
+ # Delete the (possibly existing) low-level programs that depend on
+ # `readline', and thus `ncurses'. Since these programs are actually
+ # used during the building of `ncurses', we need to delete them so
+ # the build process doesn't use the project's Bash and AWK, but the
+ # host's.
+ rm -f $(ibdir)/bash* $(ibdir)/awk* $(ibdir)/gawk*
+
+ # Standard build process.
+ $(call gbuild, $<, ncurses-$(ncurses-version), static, \
+ --with-shared --enable-rpath --without-normal \
+ --without-debug --with-cxx-binding \
+ --with-cxx-shared --enable-widec --enable-pc-files \
+ --with-pkg-config=$(ildir)/pkgconfig )
+
+ # Unfortunately there are many problems with `ncurses' using
+ # "normal" (or 8-bit) characters. The standard way that will work
+ # is to build it with wide character mode as you see above in the
+ # configuration (or the `w' prefix you see below). Also, most
+ # programs (and in particular Bash and AWK), first look for other
+ # (mostly obsolete) libraries like tinfo, which define the same
+ # symbols. The links below address both situations: we need to fool
+ # higher-level packages to find this library even if they aren't
+ # explicitly mentioning its name correctly (as a value to `-l' at
+ # link time in their configure scripts).
+ #
+ # This part is taken from the Arch Linux build script[1], then
+ # extended to Mac thanks to Homebrew's script [2].
+ #
+ # [1] https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/ncurses
+ # [2] https://github.com/Homebrew/homebrew-core/blob/master/Formula/ncurses.rb
+ #
+ # Since we can't have comments, in the connected script, here is a
+ # summary:
+ #
+ # 1. We find the actual suffix of the library, from the file that
+ # is not a symbolic link (starting with `-' in the output of
+ # `ls -l').
+ #
+ # 2. We make symbolic links to all the "ncurses", "ncurses++",
+ # "form", "panel" and "menu" libraries to point to their
+ # "wide" (character) library.
+ #
+ # 3. We make symbolic links to the "tic" and "tinfo" libraries to
+ # point to the same `libncursesw' library.
+ #
+ # 4. Some programs link with "curses" (not "ncurses", notice the
+ # starting "n"), so we'll also make links for these to point
+ # to the `libncursesw' library.
+ #
+ # 5. A link is made to also be able to include files from the
+ # `ncurses' headers.
+ if [ x$(on_mac_os) = xyes ]; then so="dylib"; else so="so"; fi; \
+ if [ -f $(ildir)/libncursesw.$$so ]; then \
+ \
+ sov=$$(ls -l $(ildir)/libncursesw* \
+ | awk '/^-/{print $$NF}' \
+ | sed -e's|'$(ildir)/libncursesw.'||'); \
+ \
+ cd "$(ildir)"; \
+ for lib in ncurses ncurses++ form panel menu; do \
+ ln -fs lib$$lib"w".$$sov lib$$lib.$$so; \
+ ln -fs $(ildir)/pkgconfig/"$$lib"w.pc pkgconfig/$$lib.pc; \
+ done; \
+ for lib in tic tinfo; do \
+ ln -fs libncursesw.$$sov lib$$lib.$$so; \
+ ln -fs libncursesw.$$sov lib$$lib.$$sov; \
+ ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/$$lib.pc; \
+ done; \
+ ln -fs libncursesw.$$sov libcurses.$$so; \
+ ln -fs libncursesw.$$sov libcursesw.$$sov; \
+ ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/curses.pc; \
+ ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/cursesw.pc; \
+ \
+ ln -fs $(idir)/include/ncursesw $(idir)/include/ncurses; \
+ echo "GNU NCURSES $(ncurses-version)" > $@; \
+ else \
+ exit 1; \
+ fi
+
+$(ilidir)/readline: $(tdir)/readline-$(readline-version).tar.gz \
+ $(ilidir)/ncurses
+ $(call gbuild, $<, readline-$(readline-version), static, \
+ --with-curses --disable-install-examples, \
+ SHLIB_LIBS="-lncursesw" ) \
+ && echo "GNU Readline $(readline-version)" > $@
+
+$(ibidir)/patchelf: $(tdir)/patchelf-$(patchelf-version).tar.gz \
+ $(ibidir)/make
+ $(call gbuild, $<, patchelf-$(patchelf-version), static) \
+ && echo "PatchELF $(patchelf-version)" > $@
+
+
+# IMPORTANT: Even though we have enabled `rpath', Bash doesn't write the
+# absolute adddress of the libraries it depends on! Therefore, if we
+# configure Bash with `--with-installed-readline' (so the installed version
+# of Readline, that we build below as a prerequisite or AWK, is used) and
+# you run `ldd $(ibdir)/bash' on the resulting binary, it will say that it
+# is linking with the system's `readline'. But if you run that same command
+# within a rule in this project, you'll see that it is indeed linking with
+# our own built readline.
+ifeq ($(on_mac_os),yes)
+needpatchelf =
+else
+needpatchelf = $(ibidir)/patchelf
+endif
+$(ibidir)/bash: $(tdir)/bash-$(bash-version).tar.gz \
+ $(ilidir)/readline \
+ $(needpatchelf)
+
+ # Delete the (possibly) existing Bash executable.
+ rm -f $(ibdir)/bash
+
+ # Build Bash. Note that we aren't building Bash with
+ # `--with-installed-readline'. This is because (as described above)
+ # Bash needs the `LD_LIBRARY_PATH' set properly before it is
+ # run. Within a recipe, things are fine (we do set
+ # `LD_LIBRARY_PATH'). However, Make will also call the shell
+ # outside of the recipe (for example in the `foreach' Make
+ # function!). In such cases, our new `LD_LIBRARY_PATH' is not set.
+ # This will cause a crash in the shell and thus the Makefile,
+ # complaining that it can't find `libreadline'. Therefore, even
+ # though we build readline below, we won't link Bash with an
+ # external readline.
+ #
+ # Bash has many `--enable' features which are already enabled by
+ # default. As described in the manual, they are mainly useful when
+ # you disable them all with `--enable-minimal-config' and enable a
+ # subset using the `--enable' options.
+ if [ "x$(static_build)" = xyes ]; then stopt="--enable-static-link";\
+ else stopt=""; \
+ fi; \
+ $(call gbuild, $<, bash-$(bash-version),, \
+ --with-installed-readline=$(ildir) $$stopt )
+
+ # Atleast on GNU/Linux systems, Bash doesn't include RPATH by
+ # default. So, we have to manually include it, currently we are
+ # only doing this on GNU/Linux systems (using the `patchelf'
+ # program).
+ if [ "x$(needpatchelf)" != x ]; then \
+ if [ -f $(ibdir)/bash ]; then \
+ $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/bash; fi \
+ fi
+
+ # To be generic, some systems use the `sh' command to call the
+ # shell. By convention, `sh' is just a symbolic link to the
+ # preferred shell executable. So we'll define `$(ibdir)/sh' as a
+ # symbolic link to the Bash that we just built and installed.
+ #
+ # Just to be sure that the installation step above went well,
+ # before making the link, we'll see if the file actually exists
+ # there.
+ if [ -f $(ibdir)/bash ]; then \
+ ln -fs $(ibdir)/bash $(ibdir)/sh; \
+ echo "GNU Bash $(bash-version)" > $@; \
+ else \
+ echo "GNU Bash not built!"; exit 1; fi
+
+
+
+
+
+# Downloader
+# ----------
+#
+# OpenSSL: Some programs/libraries later need dynamic linking. So we'll
+# build libssl (and libcrypto) dynamically also.
+#
+# Until we find a nice and generic way to create an updated CA file in the
+# project, the certificates will be available in a file for this project
+# along with the other tarballs.
+#
+# In case you do want a static OpenSSL and libcrypto, then uncomment the
+# following conditional and put $(openssl-static) in the configure options.
+#
+#ifeq ($(static_build),yes)
+#openssl-static = no-dso no-dynamic-engine no-shared
+#endif
+$(idir)/etc:; mkdir $@
+$(ilidir)/openssl: $(tdir)/openssl-$(openssl-version).tar.gz \
+ $(tdir)/cert.pem \
+ $(ibidir)/bash | $(idir)/etc
+ # According to OpenSSL's Wiki (link bellow), it can't automatically
+ # detect Mac OS's structure. It will need some help. So we'll use
+ # the `on_mac_os' Make variable that we defined in the configure
+ # script and help it with some extra configuration options and an
+ # environment variable.
+ #
+ # https://wiki.openssl.org/index.php/Compilation_and_Installation
+ if [ x$(on_mac_os) = xyes ]; then \
+ export KERNEL_BITS=64; \
+ copt="shared no-ssl2 no-ssl3 enable-ec_nistp_64_gcc_128"; \
+ fi; \
+ $(call gbuild, $<, openssl-$(openssl-version), , \
+ zlib \
+ $$copt \
+ $(rpath_command) \
+ --openssldir=$(idir)/etc/ssl \
+ --with-zlib-lib=$(ildir) \
+ --with-zlib-include=$(idir)/include, , , \
+ ./config ) && \
+ cp $(tdir)/cert.pem $(idir)/etc/ssl/cert.pem; \
+ if [ $$? = 0 ]; then \
+ if [ x$(on_mac_os) = xyes ]; then \
+ echo "No need to fix rpath in libssl"; \
+ else \
+ patchelf --set-rpath $(ildir) $(ildir)/libssl.so; \
+ fi; \
+ echo "OpenSSL $(openssl-version)" > $@; \
+ fi
+
+# GNU Wget
+#
+# Note that on some systems (for example GNU/Linux) Wget needs to explicity
+# link with `libdl', but on others (for example Mac OS) it doesn't. We
+# check this at configure time and define the `needs_ldl' variable.
+#
+# Also note that since Wget needs to load outside libraries dynamically, it
+# gives a segmentation fault when built statically.
+#
+# There are many network related libraries that we are currently not
+# building as part of this project. So to avoid too much dependency on the
+# host system (especially a crash when these libraries are updated on the
+# host), they are disabled here.
+$(ibidir)/wget: $(tdir)/wget-$(wget-version).tar.lz \
+ $(ibidir)/pkg-config \
+ $(ilidir)/openssl
+ libs="-pthread"; \
+ if [ x$(needs_ldl) = xyes ]; then libs="$$libs -ldl"; fi; \
+ $(call gbuild, $<, wget-$(wget-version), , \
+ LIBS="$$LIBS $$libs" \
+ --with-libssl-prefix=$(idir) \
+ --with-ssl=openssl \
+ --with-openssl=yes \
+ --without-metalink \
+ --without-libuuid \
+ --without-libpsl \
+ --without-libidn \
+ --disable-pcre2 \
+ --disable-pcre \
+ --disable-iri ) \
+ && echo "GNU Wget $(wget-version)" > $@
+
+
+
+
+
+# Basic command-line tools and their dependencies
+# -----------------------------------------------
+#
+# These are basic programs which are commonly necessary in the build
+# process of the higher-level programs and libraries. Note that during the
+# building of those higher-level programs (after this Makefile finishes),
+# there is no access to the system's PATH.
+$(ibidir)/coreutils: $(tdir)/coreutils-$(coreutils-version).tar.xz \
+ $(ilidir)/openssl
+ # Coreutils will use the hashing features of OpenSSL's `libcrypto'.
+ # See Tar's comments for the `-j' option.
+ $(call gbuild, $<, coreutils-$(coreutils-version), static, \
+ LDFLAGS="$(LDFLAGS)" CPPFLAGS="$(CPPFLAGS)" \
+ --enable-rpath --disable-silent-rules --with-openssl, \
+ -j$(numthreads)) \
+ && echo "GNU Coreutils $(coreutils-version)" > $@
+
+$(ibidir)/diffutils: $(tdir)/diffutils-$(diffutils-version).tar.xz \
+ $(ibidir)/bash
+ $(call gbuild, $<, diffutils-$(diffutils-version), static, , V=1) \
+ && echo "GNU Diffutils $(diffutils-version)" > $@
+
+$(ibidir)/findutils: $(tdir)/findutils-$(findutils-version).tar.lz \
+ $(ibidir)/bash
+ $(call gbuild, $<, findutils-$(findutils-version), static, , V=1) \
+ && echo "GNU Findutils $(findutils-version)" > $@
+
+$(ibidir)/gawk: $(tdir)/gawk-$(gawk-version).tar.lz \
+ $(ibidir)/bash \
+ $(ilidir)/mpfr \
+ $(ilidir)/gmp
+ # AWK doesn't include RPATH by default, so we'll have to manually
+ # include it using the `patchelf' program (which was a dependency
+ # of Bash). Just note that AWK produces two executables (for
+ # example `gawk-4.2.1' and `gawk') and a symbolic link `awk' to one
+ # of those executables.
+ $(call gbuild, $<, gawk-$(gawk-version), static, \
+ --with-readline=$(idir)) \
+ && if [ "x$(needpatchelf)" != x ]; then \
+ if [ -f $(ibdir)/gawk ]; then \
+ $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/gawk; \
+ fi; \
+ if [ -f $(ibdir)/gawk-$(gawk-version) ]; then \
+ $(ibdir)/patchelf --set-rpath $(ildir) \
+ $(ibdir)/gawk-$(gawk-version); \
+ fi; \
+ fi \
+ && echo "GNU AWK $(gawk-version)" > $@
+
+$(ilidir)/gmp: $(tdir)/gmp-$(gmp-version).tar.lz \
+ $(ibidir)/bash
+ $(call gbuild, $<, gmp-$(gmp-version), static, , , make check) \
+ && echo "GNU Multiple Precision Arithmetic Library $(gmp-version)" > $@
+
+# On Mac OS, libtool does different things, so to avoid confusion, we'll
+# prefix GNU's libtool executables with `glibtool'.
+$(ibidir)/glibtool: $(tdir)/libtool-$(libtool-version).tar.xz \
+ $(ibidir)/m4
+ $(call gbuild, $<, libtool-$(libtool-version), static, \
+ --program-prefix=g) \
+ && echo "GNU Libtool $(libtool-version)" > $@
+
+$(ibidir)/grep: $(tdir)/grep-$(grep-version).tar.xz \
+ $(ibidir)/bash
+ $(call gbuild, $<, grep-$(grep-version), static) \
+ && echo "GNU Grep $(grep-version)" > $@
+
+$(ibidir)/m4: $(tdir)/m4-$(m4-version).tar.gz \
+ $(ibidir)/bash
+ $(call gbuild, $<, m4-$(m4-version), static) \
+ && echo "GNU M4 $(m4-version)" > $@
+
+$(ilidir)/mpfr: $(tdir)/mpfr-$(mpfr-version).tar.xz \
+ $(ilidir)/gmp
+ $(call gbuild, $<, mpfr-$(mpfr-version), static, , , make check) \
+ && echo "GNU Multiple Precision Floating-Point Reliably $(mpfr-version)" > $@
+
+$(ibidir)/pkg-config: $(tdir)/pkg-config-$(pkgconfig-version).tar.gz \
+ $(ibidir)/bash
+ # Some Mac OS systems may have a version of the GNU C Compiler
+ # (GCC) installed that doesn't support some necessary features of
+ # building Glib (as part of pkg-config). So to be safe, for Mac
+ # systems, we'll make sure it will use LLVM's Clang.
+ if [ x$(on_mac_os) = xyes ]; then export compiler="CC=clang"; \
+ else export compiler=""; \
+ fi; \
+ $(call gbuild, $<, pkg-config-$(pkgconfig-version), static, \
+ $$compiler --with-internal-glib \
+ --with-pc-path=$(ildir)/pkgconfig) \
+ && echo "pkg-config $(pkgconfig-version)" > $@
+
+$(ibidir)/sed: $(tdir)/sed-$(sed-version).tar.xz \
+ $(ibidir)/bash
+ $(call gbuild, $<, sed-$(sed-version), static) \
+ && echo "GNU Sed $(sed-version)" > $@
+
+$(ibidir)/which: $(tdir)/which-$(which-version).tar.gz \
+ $(ibidir)/bash
+ $(call gbuild, $<, which-$(which-version), static) \
+ && echo "GNU Which $(which-version)" > $@
+
+
+
+
+
+
+
+
+
+
+# GCC and its prerequisites
+# -------------------------
+#
+# Binutils' linker `ld' is apparently only good for GNU/Linux systems and
+# other OSs have their own. So for now we aren't actually building
+# Binutils (`ld' isn't a prerequisite of GCC).
+$(ibidir)/binutils: $(tdir)/binutils-$(binutils-version).tar.lz \
+ $(ibidir)/bash
+ $(call gbuild, $<, binutils-$(binutils-version), static) \
+ && echo "GNU Binutils $(binutils-version)" > $@
+
+# `file' is not a prerequisite of GCC. However, since it is low level, it is
+# set as a prerequisite of GCC to have it installed.
+$(ibidir)/file: $(tdir)/file-$(file-version).tar.gz \
+ $(ibidir)/bash
+ $(call gbuild, $<, file-$(file-version), static) \
+ && echo "File $(file-version)" > $@
+
+$(ilidir)/isl: $(tdir)/isl-$(isl-version).tar.bz2 \
+ $(ilidir)/gmp
+ $(call gbuild, $<, isl-$(isl-version), static) \
+ && echo "GNU Integer Set Library $(isl-version)" > $@
+
+$(ilidir)/mpc: $(tdir)/mpc-$(mpc-version).tar.gz \
+ $(ilidir)/mpfr
+ $(call gbuild, $<, mpc-$(mpc-version), static, , , make check) \
+ && echo "GNU Multiple Precision Complex library" > $@
+
+# We are having issues with `libiberty' (part of GCC) on Mac. So for now,
+# GCC won't be built there. Since almost no natural science paper's
+# processing depends so strongly on the compiler used, for now, this isn't
+# a bad assumption, but we are indeed searching for a solution.
+#
+# Based on the GCC manual, the GCC build can benefit from a GNU
+# environment. So, we'll build GCC after building all the basic tools that
+# are often used in a configure and build scripts of GCC components.
+#
+# Objective C and Objective C++ is necessary for installing `matplotlib'.
+#
+# We are currently having problems installing GCC on macOS, so for the time
+# being, if the project is being run on a macOS, we'll just set a link.
+ifeq ($(host_cc),1)
+gcc-prerequisites =
+else
+gcc-prerequisites = $(tdir)/gcc-$(gcc-version).tar.xz \
+ $(ilidir)/isl \
+ $(ilidir)/mpc
+endif
+$(ibidir)/gcc: $(gcc-prerequisites) \
+ $(ibidir)/sed \
+ $(ibidir)/bash \
+ $(ibidir)/file \
+ $(ibidir)/gawk \
+ $(ibidir)/grep \
+ $(ibidir)/which \
+ $(ibidir)/glibtool \
+ $(ibidir)/coreutils \
+ $(ibidir)/diffutils \
+ $(ibidir)/findutils
+
+ # GCC builds is own libraries in '$(idir)/lib64'. But all other
+ # libraries are in '$(idir)/lib'. Since this project is only for a
+ # single architecture, we can trick GCC into building its libraries
+ # in '$(idir)/lib' by defining the '$(idir)/lib64' as a symbolic
+ # link to '$(idir)/lib'.
+ if [ $(host_cc) = 1 ]; then \
+ $(call makelink,gcc); \
+ $(call makelink,g++,mandatory); \
+ $(call makelink,gfortran,mandatory); \
+ ccinfo=$$(gcc --version | awk 'NR==1'); \
+ echo "C compiler (""$$ccinfo"")" > $@; \
+ else \
+ rm -f $(ibdir)/gcc* $(ibdir)/g++ $(ibdir)/gfortran $(ibdir)/gcov*;\
+ rm -rf $(ildir)/gcc $(ildir)/libcc* $(ildir)/libgcc*; \
+ rm -rf $(ildir)/libgfortran* $(ildir)/libstdc* rm $(idir)/x86_64*;\
+ \
+ ln -fs $(ildir) $(idir)/lib64; \
+ \
+ cd $(ddir); \
+ rm -rf gcc-build gcc-$(gcc-version); \
+ tar xf $< \
+ && mkdir $(ddir)/gcc-build \
+ && cd $(ddir)/gcc-build \
+ && ../gcc-$(gcc-version)/configure SHELL=$(ibdir)/bash \
+ --prefix=$(idir) \
+ --with-mpc=$(idir) \
+ --with-mpfr=$(idir) \
+ --with-gmp=$(idir) \
+ --with-isl=$(idir) \
+ --with-build-time-tools=$(idir) \
+ --enable-shared \
+ --disable-multilib \
+ --disable-multiarch \
+ --enable-threads=posix \
+ --with-local-prefix=$(idir) \
+ --enable-languages=c,c++,fortran,objc,obj-c++ \
+ --disable-libada \
+ --disable-nls \
+ --enable-default-pie \
+ --enable-default-ssp \
+ --enable-cet=auto \
+ --enable-decimal-float \
+ && make SHELL=$(ibdir)/bash -j$$(nproc) \
+ && make SHELL=$(ibdir)/bash install \
+ && cd .. \
+ && rm -rf gcc-build gcc-$(gcc-version) \
+ \
+ && if [ "x$(on_mac_os)" != xyes ]; then \
+ for f in $$(find $(idir)/libexec/gcc); do \
+ if ldd $$f &> /dev/null; then \
+ patchelf --set-rpath $(ildir) $$f; \
+ fi; \
+ done; \
+ fi \
+ && echo "GNU Compiler Collection (GCC) $(gcc-version)" > $@; \
+ fi
diff --git a/reproduce/software/make/build-rules.mk b/reproduce/software/make/build-rules.mk
new file mode 100644
index 0000000..a8c8731
--- /dev/null
+++ b/reproduce/software/make/build-rules.mk
@@ -0,0 +1,120 @@
+# Generic configurable recipes to build packages with GNU Build system or
+# CMake. This is Makefile is not intended to be run directly, it will be
+# imported into `dependencies-basic.mk' and `dependencies.mk'. They should
+# be activated with Make's `Call' function.
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# 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/>.
+
+
+
+
+
+# IMPORTANT note
+# --------------
+#
+# Without using `&&', if a step fails, the process will continue. However,
+# in the `if' statements, we need `;' (particularly between `]' and
+# `then'). So we need to put any necessary checks at the start, then when
+# we start the process, every command will be separated by an `&&'.
+
+
+
+
+
+# GNU Build system
+# ----------------
+#
+# Arguments:
+# 1: Tarball full address.
+# 2: Directory name after unpacking.
+# 3: Set to `static' for a static build.
+# 4: Extra configuration options.
+# 5: Extra options/arguments to pass to Make.
+# 6: Step to run between `make' and `make install': usually `make check'.
+# 7: The configuration script (`configure' by default).
+# 8: Arguments for `make install'.
+#
+# NOTE: Unfortunately the configure script of `zlib' doesn't recognize
+# `SHELL'. So we'll have to remove it from the call to the configure
+# script.
+#
+# NOTE: A program might not contain any configure script. In this case,
+# we'll just pass a non-relevant function like `pwd'. So SED should be used
+# to modify `confscript' or to set `configop'.
+gbuild = if [ x$(static_build) = xyes ] && [ "x$(3)" = xstatic ]; then \
+ export LDFLAGS="$$LDFLAGS -static"; \
+ fi; \
+ check="$(6)"; \
+ if [ x"$$check" = x ]; then check="echo Skipping-check"; fi; \
+ cd $(ddir); rm -rf $(2); \
+ if ! tar xf $(1); then echo; echo "Tar error"; exit 1; fi; \
+ cd $(2); \
+ \
+ if [ x"$(strip $(7))" = x ]; then confscript=./configure; \
+ else confscript="$(strip $(7))"; \
+ fi; \
+ \
+ if [ -f $(ibdir)/bash ]; then \
+ if [ -f $$confscript ]; then \
+ sed -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \
+ -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \
+ $$confscript > $$confscript-tmp; \
+ mv $$confscript-tmp $$confscript; \
+ chmod +x $$confscript; \
+ fi; \
+ shellop="SHELL=$(ibdir)/bash"; \
+ elif [ -f /bin/bash ]; then shellop="SHELL=/bin/bash"; \
+ else shellop="SHELL=/bin/sh"; \
+ fi; \
+ \
+ if [ -f $$confscript ]; then \
+ if [ x"$(strip $(2))" = x"zlib-$(zlib-version)" ]; then \
+ configop="--prefix=$(idir)"; \
+ else configop="$$shellop --prefix=$(idir)"; \
+ fi; \
+ fi; \
+ \
+ echo; echo "Using '$$confscript' to configure:"; echo; \
+ echo "$$confscript $(4) $$configop"; echo; \
+ $$confscript $(4) $$configop && \
+ make "$$shellop" $(5) && \
+ $$check && \
+ make "$$shellop" install $(8) && \
+ cd .. && rm -rf $(2)
+
+
+
+
+# CMake
+# -----
+#
+# According to the link below, in CMake `/bin/sh' is hardcoded, so there is
+# no way to change it.
+#
+# https://stackoverflow.com/questions/21167014/how-to-set-shell-variable-in-makefiles-generated-by-cmake
+cbuild = if [ x$(static_build) = xyes ] && [ $(3)x = staticx ]; then \
+ export LDFLAGS="$$LDFLAGS -static"; \
+ opts="-DBUILD_SHARED_LIBS=OFF"; \
+ fi; \
+ cd $(ddir) && rm -rf $(2) && tar xf $(1) && cd $(2) && \
+ rm -rf project-build && mkdir project-build && \
+ cd project-build && \
+ cmake .. -DCMAKE_LIBRARY_PATH=$(ildir) \
+ -DCMAKE_INSTALL_PREFIX=$(idir) \
+ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON $$opts $(4) && \
+ make && make install && \
+ cd ../.. && \
+ rm -rf $(2)
diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk
new file mode 100644
index 0000000..f7b1f4f
--- /dev/null
+++ b/reproduce/software/make/high-level.mk
@@ -0,0 +1,720 @@
+# Build the project's dependencies (programs and libraries).
+#
+# ------------------------------------------------------------------------
+# !!!!! IMPORTANT NOTES !!!!!
+#
+# This Makefile will be run by the initial `./configure' script. It is not
+# included into the reproduction pipe after that.
+#
+# ------------------------------------------------------------------------
+#
+# Copyright (C) 2018-2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# 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/>.
+
+
+
+# Top level environment
+include reproduce/software/make/build-rules.mk
+include reproduce/software/config/installation/LOCAL.mk
+include reproduce/software/config/installation/texlive.mk
+include reproduce/software/config/installation/versions.mk
+
+lockdir = $(BDIR)/locks
+tdir = $(BDIR)/software/tarballs
+ddir = $(BDIR)/software/build-tmp
+idir = $(BDIR)/software/installed
+ibdir = $(BDIR)/software/installed/bin
+ildir = $(BDIR)/software/installed/lib
+dtexdir = $(shell pwd)/reproduce/software/bibtex
+ibidir = $(BDIR)/software/installed/version-info/bin
+ilidir = $(BDIR)/software/installed/version-info/lib
+itidir = $(BDIR)/software/installed/version-info/tex
+ictdir = $(BDIR)/software/installed/version-info/cite
+ipydir = $(BDIR)/software/installed/version-info/python
+
+# Define the top-level programs to build (installed in `.local/bin').
+#
+# About ATLAS: currently the template does not depend on ATLAS but many
+# high level software depend on it. The current rule for ATLAS is tested
+# successfully on Mac (only static) and GNU/Linux (shared and static). But,
+# since it takes a few hours to build, it is not currently a target.
+top-level-libraries = # atlas
+top-level-python = astroquery matplotlib
+top-level-programs = gnuastro metastore
+all: $(foreach p, $(top-level-libraries), $(ilidir)/$(p)) \
+ $(foreach p, $(top-level-programs), $(ibidir)/$(p)) \
+ $(foreach p, $(top-level-python), $(ipydir)/$(p)) \
+ $(itidir)/texlive
+
+# Other basic environment settings: We are only including the host
+# operating system's PATH environment variable (after our own!) for the
+# compiler and linker. For the library binaries and headers, we are only
+# using our internally built libraries.
+#
+# To investigate:
+#
+# 1) Set SHELL to `$(ibdir)/env - NAME=VALUE $(ibdir)/bash' and set all
+# the parameters defined bellow as `NAME=VALUE' statements before
+# calling Bash. This will enable us to completely ignore the user's
+# native environment.
+#
+# 2) Add `--noprofile --norc' to `.SHELLFLAGS' so doesn't load the
+# user's environment.
+.ONESHELL:
+.SHELLFLAGS := --noprofile --norc -ec
+export CCACHE_DISABLE := 1
+export PATH := $(ibdir)
+export SHELL := $(ibdir)/bash
+export CPPFLAGS := -I$(idir)/include
+export PKG_CONFIG_PATH := $(ildir)/pkgconfig
+export PKG_CONFIG_LIBDIR := $(ildir)/pkgconfig
+export LD_RUN_PATH := $(ildir):$(il64dir)
+export LD_LIBRARY_PATH := $(ildir):$(il64dir)
+export LDFLAGS := $(rpath_command) -L$(ildir)
+
+
+# We want the download to happen on a single thread. So we need to define a
+# lock, and call a special script we have written for this job. These are
+# placed here because we want them both in the `high-level.mk' and
+# `python.mk'.
+$(lockdir): | $(BDIR); mkdir $@
+downloader="wget --no-use-server-timestamps -O";
+downloadwrapper = ./reproduce/analysis/bash/download-multi-try
+
+
+
+
+
+# Python packages
+include reproduce/software/make/python.mk
+
+
+
+
+
+# Tarballs
+# --------
+#
+# All the necessary tarballs are defined and prepared with this rule.
+#
+# Note that we want the tarballs to follow the convention of NAME-VERSION
+# before the `tar.XX' prefix. For those programs that don't follow this
+# convention, but include the name/version in their tarball names with
+# another format, we'll do the modification before the download so the
+# downloaded file has our desired format.
+tarballs = $(foreach t, cfitsio-$(cfitsio-version).tar.gz \
+ atlas-$(atlas-version).tar.bz2 \
+ cmake-$(cmake-version).tar.gz \
+ curl-$(curl-version).tar.gz \
+ freetype-$(freetype-version).tar.gz \
+ fftw-$(fftw-version).tar.gz \
+ ghostscript-$(ghostscript-version).tar.gz \
+ git-$(git-version).tar.xz \
+ gnuastro-$(gnuastro-version).tar.lz \
+ gsl-$(gsl-version).tar.gz \
+ hdf5-$(hdf5-version).tar.gz \
+ install-tl-unx.tar.gz \
+ jpegsrc.$(libjpeg-version).tar.gz \
+ lapack-$(lapack-version).tar.gz \
+ libbsd-$(libbsd-version).tar.xz \
+ libpng-$(libpng-version).tar.xz \
+ libgit2-$(libgit2-version).tar.gz \
+ metastore-$(metastore-version).tar.gz \
+ openmpi-$(openmpi-version).tar.gz \
+ openblas-$(openblas-version).tar.gz \
+ tiff-$(libtiff-version).tar.gz \
+ wcslib-$(wcslib-version).tar.bz2 \
+ , $(tdir)/$(t) )
+$(tarballs): $(tdir)/%: | $(lockdir)
+ if [ -f $(DEPENDENCIES-DIR)/$* ]; then
+ cp $(DEPENDENCIES-DIR)/$* $@
+ else
+ # Remove all numbers, `-' and `.' from the tarball name so we can
+ # search more easily only with the program name.
+ n=$$(echo $* | sed -e's/[0-9\-]/ /g' -e's/\./ /g' \
+ | awk '{print $$1}' )
+
+ # Set the top download link of the requested tarball.
+ mergenames=1
+ if [ $$n = cfitsio ]; then
+ mergenames=0
+ v=$$(echo $(cfitsio-version) | sed -e's/\.//' \
+ | awk '{l=length($$1); \
+ printf (l==4 ? "%d\n" \
+ : (l==3 ? "%d0\n" \
+ : (l==2 ? "%d00\n" \
+ : "%d000\n") ), $$1)}')
+ w=https://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio$$v.tar.gz
+ elif [ $$n = atlas ]; then
+ mergenames=0
+ w=https://sourceforge.net/projects/math-atlas/files/Stable/$(atlas-version)/atlas$(atlas-version).tar.bz2/download
+ elif [ $$n = cmake ]; then
+ mergenames=0
+ majv=$$(echo $(cmake-version) \
+ | sed -e's/\./ /' \
+ | awk '{printf("%d.%d", $$1, $$2)}')
+ w=https://cmake.org/files/v$$majv/cmake-$(cmake-version).tar.gz
+ elif [ $$n = curl ]; then w=https://curl.haxx.se/download
+ elif [ $$n = fftw ]; then w=ftp://ftp.fftw.org/pub/fftw
+ elif [ $$n = freetype ]; then w=https://download.savannah.gnu.org/releases/freetype
+ elif [ $$n = hdf ]; then
+ mergenames=0
+ majorver=$$(echo $(hdf5-version) | sed -e 's/\./ /g' | awk '{printf("%d.%d", $$1, $$2)}')
+ w=https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-$$majorver/hdf5-$(hdf5-version)/src/$*
+ elif [ $$n = ghostscript ]; then w=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs926
+ elif [ $$n = git ]; then w=http://mirrors.edge.kernel.org/pub/software/scm/git
+ elif [ $$n = gnuastro ]; then w=http://ftp.gnu.org/gnu/gnuastro
+ elif [ $$n = gsl ]; then w=http://ftp.gnu.org/gnu/gsl
+ elif [ $$n = install ]; then w=http://mirror.ctan.org/systems/texlive/tlnet
+ elif [ $$n = jpegsrc ]; then w=http://ijg.org/files
+ elif [ $$n = lapack ]; then w=http://www.netlib.org/lapack
+ elif [ $$n = libbsd ]; then w=http://libbsd.freedesktop.org/releases
+ elif [ $$n = libpng ]; then w=https://download.sourceforge.net/libpng
+ elif [ $$n = libgit ]; then
+ mergenames=0
+ w=https://github.com/libgit2/libgit2/archive/v$(libgit2-version).tar.gz
+ elif [ $$n = metastore ]; then w=http://akhlaghi.org/src
+ elif [ $$n = openblas ]; then
+ mergenames=0
+ w=https://github.com/xianyi/OpenBLAS/archive/v$(openblas-version).tar.gz
+ elif [ $$n = openmpi ]; then
+ mergenames=0
+ majorver=$$(echo $(openmpi-version) | sed -e 's/\./ /g' | awk '{printf("%d.%d", $$1, $$2)}')
+ w=https://download.open-mpi.org/release/open-mpi/v$$majorver/$*
+ elif [ $$n = tiff ]; then w=https://download.osgeo.org/libtiff
+ elif [ $$n = wcslib ]; then w=ftp://ftp.atnf.csiro.au/pub/software/wcslib
+ else
+ echo; echo; echo;
+ echo "'$$n' not recognized as a dependency name to download."
+ echo; echo; echo;
+ exit 1
+ fi
+
+ # Download the requested tarball. Note that some packages may not
+ # follow our naming convention (where the package name is merged
+ # with its version number). In such cases, `w' will be the full
+ # address, not just the top directory address. But since we are
+ # storing all the tarballs in one directory, we want it to have
+ # the same naming convention, so we'll download it to a temporary
+ # name, then rename that.
+ if [ $$mergenames = 1 ]; then tarballurl=$$w/"$*"
+ else tarballurl=$$w
+ fi
+
+ # Download using the script specially defined for this job.
+ touch $(lockdir)/download
+ downloader="wget --no-use-server-timestamps -O"
+ $(downloadwrapper) "$$downloader" $(lockdir)/download \
+ $$tarballurl $@
+ fi
+
+
+
+
+
+# Libraries
+# ---------
+#
+# We would prefer to build static libraries, but some compilers like LLVM
+# don't have static capabilities, so they'll only build dynamic/shared
+# libraries. Therefore, we can't use the easy `.a' suffix for static
+# libraries as targets and there are different conventions for shared
+# library names.
+#
+# For the actual build, the same compiler that built the library will build
+# the programs, so exact knowledge of the suffix is ultimately irrelevant
+# for us here. So, we'll make an `$(ildir)/built' directory and make a
+# simple plain text file in it with the basic library name (an no prefix)
+# and create/write into it when the library is successfully built.
+$(ilidir)/cfitsio: $(tdir)/cfitsio-$(cfitsio-version).tar.gz \
+ $(ibidir)/curl
+
+ # CFITSIO hard-codes the absolute address of cURL's `curl-config'
+ # program (which gives the necessary header and linking
+ # information) into the configure script. So we'll have to modify
+ # it manually before doing the standard build.
+ topdir=$(pwd); cd $(ddir); tar xf $<
+ customtar=cfitsio-$(cfitsio-version)-custom.tar.gz
+ sed cfitsio/configure \
+ -e's|/usr/bin/curl-config|$(ibdir)/curl-config|g' \
+ > cfitsio/configure_tmp
+ mv cfitsio/configure_tmp cfitsio/configure
+ chmod +x cfitsio/configure
+ tar cf $$customtar cfitsio
+ cd $$topdir
+
+ # Continue the standard build on the customized tarball.
+ $(call gbuild, $$customtar, cfitsio, static, \
+ --enable-sse2 --enable-reentrant) \
+ && rm $$customtar \
+ && echo "CFITSIO $(cfitsio-version)" > $@
+
+$(ilidir)/gsl: $(tdir)/gsl-$(gsl-version).tar.gz
+ $(call gbuild, $<, gsl-$(gsl-version), static) \
+ && echo "GNU Scientific Library $(gsl-version)" > $@
+
+$(ilidir)/fftw: $(tdir)/fftw-$(fftw-version).tar.gz
+ $(call gbuild, $<, fftw-$(fftw-version), static, \
+ --enable-shared) \
+ && cp $(dtexdir)/fftw.tex $(ictdir)/ \
+ && echo "FFTW $(fftw-version) \citep{fftw}" > $@
+
+# Freetype is necessary to install matplotlib
+$(ilidir)/freetype: $(tdir)/freetype-$(freetype-version).tar.gz \
+ $(ilidir)/libpng
+ $(call gbuild, $<, freetype-$(freetype-version), static) \
+ && echo "FreeType $(freetype-version)" > $@
+
+$(ilidir)/hdf5: $(tdir)/hdf5-$(hdf5-version).tar.gz \
+ $(ilidir)/openmpi
+ export CC=mpicc; \
+ export FC=mpif90; \
+ $(call gbuild, $<, hdf5-$(hdf5-version), static, \
+ --enable-parallel \
+ --enable-fortran, V=1) \
+ && echo "HDF5 library $(hdf5-version)" > $@
+
+$(ilidir)/libbsd: $(tdir)/libbsd-$(libbsd-version).tar.xz
+ $(call gbuild, $<, libbsd-$(libbsd-version), static,,V=1) \
+ && echo "Libbsd $(libbsd-version)" > $@
+
+$(ilidir)/libjpeg: $(tdir)/jpegsrc.$(libjpeg-version).tar.gz
+ $(call gbuild, $<, jpeg-9b, static) \
+ && echo "Libjpeg $(libjpeg-version)" > $@
+
+$(ilidir)/libpng: $(tdir)/libpng-$(libpng-version).tar.xz
+ $(call gbuild, $<, libpng-$(libpng-version), static) \
+ && echo "Libpng $(libpng-version)" > $@
+
+$(ilidir)/libtiff: $(tdir)/tiff-$(libtiff-version).tar.gz \
+ $(ilidir)/libjpeg
+ $(call gbuild, $<, tiff-$(libtiff-version), static, \
+ --disable-webp --disable-zstd) \
+ && echo "Libtiff $(libtiff-version)" > $@
+
+$(ilidir)/openmpi: $(tdir)/openmpi-$(openmpi-version).tar.gz
+ $(call gbuild, $<, openmpi-$(openmpi-version), static, , V=1) \
+ && echo "OpenMPI $(openmpi-version)" > $@
+
+$(ilidir)/atlas: $(tdir)/atlas-$(atlas-version).tar.bz2 \
+ $(tdir)/lapack-$(lapack-version).tar.gz
+
+ # Get the operating system specific features (how to get
+ # CPU frequency and the library suffixes). To make the steps
+ # more readable, the different library version suffixes are
+ # named with a single character: `s' for no version in the
+ # name, `m' for the major version suffix, and `f' for the
+ # full version suffix.
+ # GCC in Mac OS doesn't work. To work around this issue, on Mac
+ # systems we force ATLAS to use `clang' instead of `gcc'.
+ if [ x$(on_mac_os) = xyes ]; then
+ s=dylib
+ m=3.dylib
+ f=3.6.1.dylib
+ core=$$(sysctl hw.cpufrequency | awk '{print $$2/1000000}')
+ clangflag="--force-clang=$(ibdir)/clang"
+ else
+ s=so
+ m=so.3
+ f=so.3.6.1
+ clangflag=
+ core=$$(cat /proc/cpuinfo | grep "cpu MHz" \
+ | head -n 1 \
+ | sed "s/.*: \([0-9.]*\).*/\1/")
+ fi
+
+ # See if the shared libraries should be build for a single CPU
+ # thread or multiple threads.
+ N=$$(nproc)
+ srcdir=$$(pwd)/reproduce/src/make
+ if [ $$N = 1 ]; then
+ sharedmk=$$srcdir/dependencies-atlas-single.mk
+ else
+ sharedmk=$$srcdir/dependencies-atlas-multiple.mk
+ fi
+
+ # The linking step here doesn't recognize the `-Wl' in the
+ # `rpath_command'.
+ export LDFLAGS=-L$(ildir)
+ cd $(ddir) \
+ && tar xf $< \
+ && cd ATLAS \
+ && rm -rf build \
+ && mkdir build \
+ && cd build \
+ && ../configure -b 64 -D c -DPentiumCPS=$$core \
+ --with-netlib-lapack-tarfile=$(word 2, $^) \
+ --cripple-atlas-performance \
+ -Fa alg -fPIC --shared $$clangflag \
+ --prefix=$(idir) \
+ && make \
+ && if [ "x$(on_mac_os)" != xyes ]; then \
+ cd lib && make -f $$sharedmk && cd .. \
+ && for l in lib/*.$$s*; do \
+ patchelf --set-rpath $(ildir) $$l; done \
+ && cp -d lib/*.$$s* $(ildir) \
+ && ln -fs $(ildir)/libblas.$$s $(ildir)/libblas.$$m \
+ && ln -fs $(ildir)/libf77blas.$$s $(ildir)/libf77blas.$$m \
+ && ln -fs $(ildir)/liblapack.$$f $(ildir)/liblapack.$$s \
+ && ln -fs $(ildir)/liblapack.$$f $(ildir)/liblapack.$$m; \
+ fi \
+ && make install
+
+ # We need to check the existance of `libptlapack.a', but we can't
+ # do this in the `&&' steps above (it will conflict). So we'll do
+ # the check after seeing if `libtatlas.so' is installed, then we'll
+ # finalize the build (delete the untarred directory).
+ if [ "x$(on_mac_os)" != xyes ]; then \
+ [ -e lib/libptlapack.a ] && cp lib/libptlapack.a $(ildir); \
+ cd $(ddir); \
+ rm -rf ATLAS; \
+ fi
+
+ # We'll check the full installation with the static library (not
+ # currently building shared library on Mac.
+ if [ -f $(ildir)/libatlas.a ]; then \
+ echo "ATLAS $(atlas-version)" > $@; \
+ fi
+
+$(ilidir)/openblas: $(tdir)/openblas-$(openblas-version).tar.gz
+ if [ x$(on_mac_os) = xyes ]; then \
+ export CC=clang; \
+ fi; \
+ cd $(ddir) \
+ && tar xf $< \
+ && cd OpenBLAS-$(openblas-version) \
+ && make \
+ && make PREFIX=$(idir) install \
+ && cd .. \
+ && rm -rf OpenBLAS-$(openblas-version) \
+ && echo "OpenBLAS $(openblas-version)" > $@
+
+
+
+
+# Libraries with special attention on Mac OS
+# ------------------------------------------
+#
+# Libgit2 and WCSLIB don't set their installation path, or don't do it
+# properly, in their finally installed shared libraries. But since we are
+# linking everything (including OpenSSL and its dependencies) dynamically,
+# we need to also make a shared libraries and can't use static
+# libraries. So for Mac OS systems we have to correct their addresses
+# manually.
+#
+# For example, Libgit2 page recommends doing a static build, especially for
+# Mac systems (with `-DBUILD_SHARED_LIBS=OFF'): "It’s highly recommended
+# that you build libgit2 as a static library for Xcode projects. This
+# simplifies distribution significantly, as the resolution of dynamic
+# libraries at runtime can be extremely problematic.". This is a major
+# problem we have been having so far with Mac systems:
+# https://libgit2.org/docs/guides/build-and-link
+$(ilidir)/libgit2: $(tdir)/libgit2-$(libgit2-version).tar.gz \
+ $(ibidir)/cmake \
+ $(ibidir)/curl
+ # Build and install the library.
+ $(call cbuild, $<, libgit2-$(libgit2-version), static, \
+ -DUSE_SSH=OFF -DBUILD_CLAR=OFF \
+ -DTHREADSAFE=ON )
+
+ # Correct the shared library absolute address if necessary.
+ if [ x$(on_mac_os) = xyes ]; then
+ install_name_tool -id $(ildir)/libgit2.26.dylib \
+ $(ildir)/libgit2.26.dylib
+ fi
+
+ # Write the target file.
+ echo "Libgit2 $(libgit2-version)" > $@
+
+$(ilidir)/wcslib: $(tdir)/wcslib-$(wcslib-version).tar.bz2 \
+ $(ilidir)/cfitsio
+ # Build and install the library.
+ $(call gbuild, $<, wcslib-$(wcslib-version), , \
+ LIBS="-pthread -lcurl -lm" \
+ --with-cfitsiolib=$(ildir) \
+ --with-cfitsioinc=$(idir)/include \
+ --without-pgplot --disable-fortran)
+
+ # Correct the shared library absolute address if necessary.
+ if [ x$(on_mac_os) = xyes ]; then
+ install_name_tool -id $(ildir)/libwcs.6.2.dylib \
+ $(ildir)/libwcs.6.2.dylib;
+ fi
+
+ # Write the target file.
+ echo "WCSLIB $(wcslib-version)" > $@
+
+
+
+
+
+# Programs
+# --------
+#
+# CMake can be built with its custom `./bootstrap' script.
+$(ibidir)/cmake: $(tdir)/cmake-$(cmake-version).tar.gz \
+ $(ibidir)/curl
+ # After searching in `bootstrap', I couldn't find `LIBS', only
+ # `LDFLAGS'. So the extra libraries are being added to `LDFLAGS',
+ # not `LIBS'.
+ #
+ # On Mac systems, the build complains about `clang' specific
+ # features, so we can't use our own GCC build here.
+ if [ x$(on_mac_os) = xyes ]; then \
+ export CC=clang; \
+ export CXX=clang++; \
+ fi; \
+ cd $(ddir) \
+ && rm -rf cmake-$(cmake-version) \
+ && tar xf $< \
+ && cd cmake-$(cmake-version) \
+ && ./bootstrap --prefix=$(idir) --system-curl --system-zlib \
+ --system-bzip2 --system-liblzma --no-qt-gui \
+ && make LIBS="$$LIBS -lssl -lcrypto -lz" VERBOSE=1 \
+ && make install \
+ && cd .. \
+ && rm -rf cmake-$(cmake-version) \
+ && echo "CMake $(cmake-version)" > $@
+
+# cURL (and its library, which is needed by several programs here) can
+# optionally link with many different network-related libraries on the host
+# system that we are not yet building in the template. Many of these are
+# not relevant to most science projects, so we are explicitly using
+# `--without-XXX' or `--disable-XXX' so cURL doesn't link with them. Note
+# that if it does link with them, the configuration will crash when the
+# library is updated/changed by the host, and the whole purpose of this
+# project is avoid dependency on the host as much as possible.
+$(ibidir)/curl: $(tdir)/curl-$(curl-version).tar.gz
+ $(call gbuild, $<, curl-$(curl-version), , \
+ LIBS="-pthread" \
+ --with-zlib=$(ildir) \
+ --with-ssl=$(idir) \
+ --without-mesalink \
+ --with-ca-fallback \
+ --without-librtmp \
+ --without-libidn2 \
+ --without-wolfssl \
+ --without-brotli \
+ --without-gnutls \
+ --without-cyassl \
+ --without-libpsl \
+ --without-axtls \
+ --disable-ldaps \
+ --disable-ldap \
+ --without-nss, V=1) \
+ && echo "cURL $(curl-version)" > $@
+
+$(ibidir)/ghostscript: $(tdir)/ghostscript-$(ghostscript-version).tar.gz
+ $(call gbuild, $<, ghostscript-$(ghostscript-version)) \
+ && echo "GPL Ghostscript $(ghostscript-version)" > $@
+
+$(ibidir)/git: $(tdir)/git-$(git-version).tar.xz \
+ $(ibidir)/curl
+ $(call gbuild, $<, git-$(git-version), static, \
+ --without-tcltk --with-shell=$(ibdir)/bash, \
+ V=1) \
+ && echo "Git $(git-version)" > $@
+
+# Metastore is used (through a Git hook) to restore the source modification
+# dates of files after a Git checkout. Another Git hook saves all file
+# metadata just before a commit (to allow restoration after a
+# checkout). Since this project is managed in Makefiles, file modification
+# dates are critical to not having to redo the whole analysis after
+# checking out between branches.
+#
+# Note that we aren't using the standard version of Metastore, but a fork
+# of it that is maintained in this repository:
+# https://gitlab.com/makhlaghi/metastore-fork
+#
+# Libbsd is not necessary on macOS systems, because macOS is already a
+# BSD-based distribution. But on GNU/Linux systems, it is necessary.
+ifeq ($(on_mac_os),yes)
+needlibbsd =
+else
+needlibbsd = $(ilidir)/libbsd
+endif
+$(ibidir)/metastore: $(tdir)/metastore-$(metastore-version).tar.gz \
+ $(needlibbsd) \
+ $(ibidir)/git
+
+ # The build command below will change the current directory of this
+ # build, so we'll fix its value here.
+ current_dir=$$(pwd)
+
+ # Metastore doesn't have any `./configure' script. So we'll just
+ # call `pwd' as a place-holder for the `./configure' command.
+ #
+ # File attributes are also not available on some systems, since the
+ # main purpose here is modification dates (and not attributes),
+ # we'll also set the `NO_XATTR' flag.
+ $(call gbuild, $<, metastore-$(metastore-version), static,, \
+ NO_XATTR=1 V=1,,pwd,PREFIX=$(idir))
+
+ # Write the relevant hooks into this system's Git hooks, so Git
+ # calls metastore properly on every commit and every checkout.
+ #
+ # Note that the -O and -G options used here are currently only in a
+ # fork of `metastore' currently hosted at:
+ # https://github.com/mohammad-akhlaghi/metastore
+ user=$$(whoami)
+ group=$$(groups | awk '{print $$1}')
+ cd $$current_dir
+ if [ -f $(ibdir)/metastore ]; then
+ for f in pre-commit post-checkout; do
+ sed -e's|@USER[@]|'$$user'|g' \
+ -e's|@GROUP[@]|'$$group'|g' \
+ -e's|@BINDIR[@]|$(ibdir)|g' \
+ -e's|@TOP_PROJECT_DIR[@]|'$$current_dir'|g' \
+ reproduce/software/bash/git-$$f > .git/hooks/$$f
+ chmod +x .git/hooks/$$f
+ echo "Metastore (forked) $(metastore-version)" > $@
+ done
+ else
+ echo; echo; echo;
+ echo "*****************"
+ echo "metastore couldn't be installed!"
+ echo
+ echo "Its used for preserving timestamps on Git commits."
+ echo "Its useful for development, not simple running of the project."
+ echo "So we won't stop the configuration because it wasn't built."
+ echo "*****************"
+ fi
+
+# The order of dependencies is based on how long they take to build (how
+# large they are): Libgit2 depends on CMake which takes a VERY long time to
+# build. Also, Ghostscript and GSL are relatively large packages. So when
+# building in parallel, its better to have these packages start building
+# early.
+$(ibidir)/gnuastro: $(tdir)/gnuastro-$(gnuastro-version).tar.lz \
+ $(ilidir)/gsl \
+ $(ilidir)/wcslib \
+ $(ilidir)/libjpeg \
+ $(ilidir)/libtiff \
+ $(ilidir)/libgit2 \
+ $(ibidir)/ghostscript
+ifeq ($(static_build),yes)
+ staticopts="--enable-static=yes --enable-shared=no";
+endif
+ $(call gbuild, $<, gnuastro-$(gnuastro-version), static, \
+ $$staticopts, -j$(numthreads), \
+ make check -j$(numthreads)) \
+ && cp $(dtexdir)/gnuastro.tex $(ictdir)/ \
+ && echo "GNU Astronomy Utilities $(gnuastro-version) \citep{gnuastro}" > $@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Since we want to avoid complicating the PATH, we are putting a symbolic
+# link of all the TeX Live executables in $(ibdir). But symbolic links are
+# hard to track for Make (as a target). Also, TeX in general is optional
+# for the project (the processing is the main target, not the generation of
+# the final PDF). So we'll make a simple ASCII file called
+# `texlive-ready-tlmgr' and use its contents to mark if we can use it or
+# not.
+$(itidir)/texlive-ready-tlmgr: $(tdir)/install-tl-unx.tar.gz \
+ reproduce/software/config/installation/texlive.conf
+
+ # Unpack, enter the directory, and install based on the given
+ # configuration (prerequisite of this rule).
+ @topdir=$$(pwd)
+ cd $(ddir)
+ rm -rf install-tl-*
+ tar xf $(tdir)/install-tl-unx.tar.gz
+ cd install-tl-*
+ sed -e's|@installdir[@]|$(idir)|g' \
+ $$topdir/reproduce/software/config/installation/texlive.conf \
+ > texlive.conf
+
+ # TeX Live's installation may fail due to any reason. But TeX Live
+ # is optional (only necessary for building the final PDF). So we
+ # don't want the configure script to fail if it can't run.
+ if ./install-tl --profile=texlive.conf; then
+
+ # Put a symbolic link of the TeX Live executables in `ibdir'. The
+ # main problem is that the year and build system (for example
+ # `x86_64-linux') are also in the directory names, making it hard
+ # to be generic. We are using wildcards here, but only in this
+ # Makefile, not in any other.
+ ln -fs $(idir)/texlive/20*/bin/*/* $(ibdir)/
+
+ # Register that the build was successful.
+ echo "TeX Live is ready." > $@
+ else
+ echo "NOT!" > $@
+ fi
+
+ # Clean up
+ cd ..
+ rm -rf install-tl-*
+
+
+
+
+
+# To keep things modular and simple, we'll break up the installation of TeX
+# Live itself (only very basic TeX and LaTeX) and the installation of its
+# necessary packages into two packages.
+$(itidir)/texlive: reproduce/software/config/installation/texlive.mk \
+ $(itidir)/texlive-ready-tlmgr
+
+ # To work with TeX live installation, we'll need the internet.
+ @res=$$(cat $(itidir)/texlive-ready-tlmgr)
+ if [ x"$$res" = x"NOT!" ]; then
+ echo "" > $@
+ else
+ # Install all the extra necessary packages. If LaTeX complains
+ # about not finding a command/file/what-ever/XXXXXX, simply run
+ # the following command to find which package its in, then add it
+ # to the `texlive-packages' variable of the first prerequisite.
+ #
+ # ./.local/bin/tlmgr info XXXXXX
+ #
+ # We are putting a notice, because if there is no internet,
+ # `tlmgr' just hangs waiting.
+ tlmgr install $(texlive-packages)
+
+ # Make a symbolic link of all the TeX Live executables in the bin
+ # directory so we don't have to modify `PATH'.
+ ln -fs $(idir)/texlive/20*/bin/*/* $(ibdir)/
+
+ # Get all the necessary versions.
+ texlive=$$(pdflatex --version | awk 'NR==1' | sed 's/.*(\(.*\))/\1/' \
+ | awk '{print $$NF}');
+
+ # Package names and versions.
+ tlmgr info $(texlive-packages) --only-installed | awk \
+ '$$1=="package:" {version=0; \
+ if($$NF=="tex-gyre") name="texgyre"; \
+ else name=$$NF} \
+ $$1=="cat-version:" {version=$$NF} \
+ $$1=="cat-date:" {if(version==0) version=$$2; \
+ printf("%s %s\n", name, version)}' >> $@
+ fi
diff --git a/reproduce/software/make/python.mk b/reproduce/software/make/python.mk
new file mode 100644
index 0000000..5ec99f0
--- /dev/null
+++ b/reproduce/software/make/python.mk
@@ -0,0 +1,506 @@
+# Build the project's Python dependencies.
+#
+# ------------------------------------------------------------------------
+# !!!!! IMPORTANT NOTES !!!!!
+#
+# This Makefile will be run by the initial `./configure' script. It is not
+# included into the reproduction pipe after that.
+#
+# ------------------------------------------------------------------------
+#
+# Copyright (C) 2019 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2019 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# 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/>.
+
+
+
+
+
+# Python enviroment
+# -----------------
+#
+# The main Python environment variable is `PYTHONPATH'. However, so far we
+# have found several other Python-related environment variables on some
+# systems which might interfere. To be safe, we are removing all their
+# values.
+export PYTHONPATH := $(installdir)/lib/python/site-packages
+export PYTHONPATH2 := $(PYTHONPATH)
+export PYTHONPATH3 := $(PYTHONPATH)
+export _LMFILES_ :=
+export LOADEDMODULES :=
+export MPI_PYTHON_SITEARCH :=
+export MPI_PYTHON2_SITEARCH :=
+export MPI_PYTHON3_SITEARCH :=
+
+
+
+
+
+# Tarballs
+# --------
+#
+# All the necessary tarballs are defined and prepared with this rule.
+#
+# Note that we want the tarballs to follow the convention of NAME-VERSION
+# before the `tar.XX' prefix. For those programs that don't follow this
+# convention, but include the name/version in their tarball names with
+# another format, we'll do the modification before the download so the
+# downloaded file has our desired format.
+pytarballs = $(foreach t, asn1crypto-$(asn1crypto-version).tar.gz \
+ astroquery-$(astroquery-version).tar.gz \
+ astropy-$(astropy-version).tar.gz \
+ beautifulsoup4-$(beautifulsoup4-version).tar.gz \
+ certifi-$(certifi-version).tar.gz \
+ cffi-$(cffi-version).tar.gz \
+ chardet-$(chardet-version).tar.gz \
+ cryptography-$(cryptography-version).tar.gz \
+ cycler-$(cycler-version).tar.gz \
+ cython-$(cython-version).tar.gz \
+ entrypoints-$(entrypoints-version).tar.gz \
+ h5py-$(h5py-version).tar.gz \
+ html5lib-$(html5lib-version).tar.gz \
+ idna-$(idna-version).tar.gz \
+ jeepney-$(jeepney-version).tar.gz \
+ kiwisolver-$(kiwisolver-version).tar.gz \
+ keyring-$(keyring-version).tar.gz \
+ libffi-$(libffi-version).tar.gz \
+ matplotlib-$(matplotlib-version).tar.gz \
+ mpi4py-$(mpi4py-version).tar.gz \
+ numpy-$(numpy-version).zip \
+ pkgconfig-$(pypkgconfig-version).tar.gz \
+ pip-$(pip-version).tar.gz \
+ pycparser-$(pycparser-version).tar.gz \
+ python-$(python-version).tar.gz \
+ python-dateutil-$(python-dateutil-version).tar.gz \
+ pyparsing-$(pyparsing-version).tar.gz \
+ requests-$(requests-version).tar.gz \
+ scipy-$(scipy-version).tar.gz \
+ secretstorage-$(secretstorage-version).tar.gz \
+ setuptools-$(setuptools-version).zip \
+ setuptools_scm-$(setuptools_scm-version).tar.gz \
+ six-$(six-version).tar.gz \
+ soupsieve-$(soupsieve-version).tar.gz \
+ urllib3-$(urllib3-version).tar.gz \
+ webencodings-$(webencodings-version).tar.gz \
+ virtualenv-$(virtualenv-version).tar.gz \
+ , $(tdir)/$(t) )
+pytopurl=https://files.pythonhosted.org/packages
+$(pytarballs): $(tdir)/%:
+ if [ -f $(DEPENDENCIES-DIR)/$* ]; then
+ cp $(DEPENDENCIES-DIR)/$* $@
+ else
+
+ # Convenience variable
+ # --------------------
+ #
+ # `n' is just for convenience and to avoid having to repeat the
+ # package tarball name in the conditional to find its URL.
+ #
+ # For some packages (for example `python-dateutil', or those with
+ # a number or dash in their name), we need special consideration
+ # because the tokenization above will produce `python' as the
+ # first string.
+ if [ $* = python-dateutil-$(python-dateutil-version).tar.gz ]; then
+ n=dateutil
+ elif [ $* = h5py-$(h5py-version).tar.gz ]; then
+ n=h5py
+
+ # elif [ $* = strange-tarball5name-version.tar.gz ]; then
+ # n=strange5-name
+ else
+ # Remove all numbers, `-' and `.' from the tarball name so we can
+ # search more easily only with the program name.
+ n=$$(echo $* | sed -e's/[0-9\-]/ /g' -e's/\./ /g' \
+ | awk '{print $$1}')
+ fi
+
+ # Set the top download link of the requested tarball. The ones
+ # that have non-standard filenames (differing from our archived
+ # tarball names) are treated first, then the standard ones.
+ mergenames=1
+ if [ $$n = cython ]; then
+ mergenames=0
+ hash=36/da/fcb979fc8cb486a67a013d6aefefbb95a3e19e67e49dff8a35e014046c5e
+ h=$(pytopurl)/$$hash/Cython-$(cython-version).tar.gz
+ elif [ $$n = python ]; then
+ mergenames=0
+ h=https://www.python.org/ftp/python/$(python-version)/Python-$(python-version).tgz
+ elif [ $$n = libffi ]; then
+ mergenames=0
+ h=ftp://sourceware.org/pub/libffi/libffi-$(libffi-version).tar.gz
+ elif [ $$n = secretstorage ]; then
+ mergenames=0
+ hash=a6/89/df343dbc2957a317127e7ff2983230dc5336273be34f2e1911519d85aeb5
+ h=$(pytopurl)/$$hash/SecretStorage-$(secretstorage-version).tar.gz
+ elif [ $$n = asn ]; then h=fc/f1/8db7daa71f414ddabfa056c4ef792e1461ff655c2ae2928a2b675bfed6b4
+ elif [ $$n = astroquery ]; then h=61/50/a7a08f9e54d7d9d97e69433cd88231e1ad2901811c9d1ae9ac7ccaef9396
+ elif [ $$n = astropy ]; then h=eb/f7/1251bf6881861f24239efe0c24cbcfc4191ccdbb69ac3e9bb740d0c23352
+ elif [ $$n = beautifulsoup ]; then h=80/f2/f6aca7f1b209bb9a7ef069d68813b091c8c3620642b568dac4eb0e507748
+ elif [ $$n = certifi ]; then h=55/54/3ce77783acba5979ce16674fc98b1920d00b01d337cfaaf5db22543505ed
+ elif [ $$n = cffi ]; then h=64/7c/27367b38e6cc3e1f49f193deb761fe75cda9f95da37b67b422e62281fcac
+ elif [ $$n = chardet ]; then h=fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d
+ elif [ $$n = cryptography ]; then h=07/ca/bc827c5e55918ad223d59d299fff92f3563476c3b00d0a9157d9c0217449
+ elif [ $$n = cycler ]; then h=c2/4b/137dea450d6e1e3d474e1d873cd1d4f7d3beed7e0dc973b06e8e10d32488
+ elif [ $$n = entrypoints ]; then h=b4/ef/063484f1f9ba3081e920ec9972c96664e2edb9fdc3d8669b0e3b8fc0ad7c
+ elif [ $$n = h5py ]; then h=43/27/a6e7dcb8ae20a4dbf3725321058923fec262b6f7835179d78ccc8d98deec
+ elif [ $$n = html ]; then h=85/3e/cf449cf1b5004e87510b9368e7a5f1acd8831c2d6691edd3c62a0823f98f
+ elif [ $$n = idna ]; then h=ad/13/eb56951b6f7950cadb579ca166e448ba77f9d24efc03edd7e55fa57d04b7
+ elif [ $$n = jeepney ]; then h=16/1d/74adf3b164a8d19a60d0fcf706a751ffa2a1eaa8e5bbb1b6705c92a05263
+ elif [ $$n = keyring ]; then h=15/88/c6ce9509438bc02d54cf214923cfba814412f90c31c95028af852b19f9b2
+ elif [ $$n = kiwisolver ]; then h=31/60/494fcce70d60a598c32ee00e71542e52e27c978e5f8219fae0d4ac6e2864
+ elif [ $$n = matplotlib ]; then h=89/0c/653aec68e9cfb775c4fbae8f71011206e5e7fe4d60fcf01ea1a9d3bc957f
+ elif [ $$n = mpi ]; then h=55/a2/c827b196070e161357b49287fa46d69f25641930fd5f854722319d431843
+ elif [ $$n = numpy ]; then h=cf/8d/6345b4f32b37945fedc1e027e83970005fc9c699068d2f566b82826515f2
+ elif [ $$n = pip ]; then h=4c/4d/88bc9413da11702cbbace3ccc51350ae099bb351febae8acc85fec34f9af
+ elif [ $$n = pkgconfig ]; then h=6e/a9/ff67ef67217dfdf2aca847685fe789f82b931a6957a3deac861297585db6
+ elif [ $$n = pycparser ]; then h=68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a
+ elif [ $$n = pyparsing ]; then h=b9/b8/6b32b3e84014148dcd60dd05795e35c2e7f4b72f918616c61fdce83d27fc
+ elif [ $$n = dateutil ]; then h=ad/99/5b2e99737edeb28c71bcbec5b5dda19d0d9ef3ca3e92e3e925e7c0bb364c
+ elif [ $$n = requests ]; then h=52/2c/514e4ac25da2b08ca5a464c50463682126385c4272c18193876e91f4bc38
+ elif [ $$n = scipy ]; then h=a9/b4/5598a706697d1e2929eaf7fe68898ef4bea76e4950b9efbe1ef396b8813a
+ elif [ $$n = secretstorage ]; then h=a6/89/df343dbc2957a317127e7ff2983230dc5336273be34f2e1911519d85aeb5
+ elif [ $$n = setuptools ]; then h=c2/f7/c7b501b783e5a74cf1768bc174ee4fb0a8a6ee5af6afa92274ff964703e0
+ elif [ $$n = setuptools_scm ]; then h=54/85/514ba3ca2a022bddd68819f187ae826986051d130ec5b972076e4f58a9f3
+ elif [ $$n = six ]; then h=dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca
+ elif [ $$n = soupsieve ]; then h=0c/52/e9088bb9b96e2d39fc3b33fcda5b4fde9d71473536ac660a1ca9a0958a2f
+ elif [ $$n = urllib ]; then h=b1/53/37d82ab391393565f2f831b8eedbffd57db5a718216f82f1a8b4d381a1c1
+ elif [ $$n = virtualenv ]; then h=51/aa/c395a6e6eaaedfa5a04723b6446a1df783b16cca6fec66e671cede514688
+ elif [ $$n = webencodings ]; then h=0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47
+# elif [ $$n = strange5-name ]; then h=XXXXX
+ else
+ echo; echo; echo;
+ echo "'$$n' not recognized as a dependency name to download."
+ echo; echo; echo;
+ exit 1
+ fi
+
+ # Download the requested tarball. Note that some packages may not
+ # follow our naming convention (where the package name is merged
+ # with its version number). In such cases, `w' will be the full
+ # address, not just the top directory address. But since we are
+ # storing all the tarballs in one directory, we want it to have
+ # the same naming convention, so we'll download it to a temporary
+ # name, then rename that.
+ if [ $$mergenames = 1 ]; then tarballurl=$(pytopurl)/$$h/"$*"
+ else tarballurl=$$h
+ fi
+
+ # Download using the script specially defined for this job.
+ touch $(lockdir)/download
+ downloader="wget --no-use-server-timestamps -O"
+ $(downloadwrapper) "$$downloader" $(lockdir)/download \
+ $$tarballurl $@
+ fi
+
+
+
+
+
+# Necessary programs and libraries
+# --------------------------------
+#
+# While this Makefile is for Python programs, in some cases, we need
+# certain programs (like Python itself), or libraries for the modules.
+$(ilidir)/libffi: $(tdir)/libffi-$(libffi-version).tar.gz
+ $(call gbuild, $<, libffi-$(libffi-version)) \
+ echo "Libffi $(libffi-version)" > $@
+
+$(ibidir)/python3: $(tdir)/python-$(python-version).tar.gz \
+ $(ilidir)/libffi
+ # On Mac systems, the build complains about `clang' specific
+ # features, so we can't use our own GCC build here.
+ if [ x$(on_mac_os) = xyes ]; then \
+ export CC=clang; \
+ export CXX=clang++; \
+ fi; \
+ $(call gbuild, $<, Python-$(python-version),, \
+ --without-ensurepip \
+ --with-system-ffi \
+ --enable-shared) \
+ && v=$$(echo $(python-version) | awk 'BEGIN{FS="."} \
+ {printf "%d.%d\n", $$1, $$2}') \
+ && ln -s $(ildir)/python$$v $(ildir)/python \
+ && rm -rf $(ipydir) \
+ && mkdir $(ipydir) \
+ && echo "Python $(python-version)" > $@
+
+
+
+
+
+# Non-PiP Python module installation
+# ----------------------------------
+#
+# To build Python packages with direct access to a `setup.py' (if no direct
+# access to `setup.py' is needed, pip can be used).
+# Arguments of this function are the numbers
+# 1) Unpack command
+# 2) Package name
+# 3) Unpacked directory name after unpacking the tarball
+# 4) site.cfg file (optional)
+# 5) Official software name.(for paper).
+pybuild = cd $(ddir); rm -rf $(3); \
+ if ! $(1) $(2); then echo; echo "Tar error"; exit 1; fi; \
+ cd $(3); \
+ if [ "x$(strip $(4))" != x ]; then \
+ sed -e 's|@LIBDIR[@]|'"$(ildir)"'|' \
+ -e 's|@INCDIR[@]|'"$(idir)/include"'|' \
+ $(4) > site.cfg; \
+ fi; \
+ python3 setup.py build \
+ && python3 setup.py install \
+ && cd .. \
+ && rm -rf $(3) \
+ && echo "$(5)" > $@
+
+
+
+
+
+# Python modules
+# ---------------
+#
+# All the necessary Python modules go here.
+$(ipydir)/asn1crypto: $(tdir)/asn1crypto-$(asn1crypto-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, asn1crypto-$(asn1crypto-version), , \
+ Asn1crypto $(asn1crypto-version))
+
+$(ipydir)/astroquery: $(tdir)/astroquery-$(astroquery-version).tar.gz \
+ $(ipydir)/beautifulsoup4 \
+ $(ipydir)/html5lib \
+ $(ipydir)/requests \
+ $(ipydir)/astropy \
+ $(ipydir)/keyring \
+ $(ipydir)/numpy
+ $(call pybuild, tar xf, $<, astroquery-$(astroquery-version), ,\
+ Astroquery $(astroquery-version))
+
+$(ipydir)/astropy: $(tdir)/astropy-$(astropy-version).tar.gz \
+ $(ipydir)/h5py \
+ $(ipydir)/numpy \
+ $(ipydir)/scipy
+ $(call pybuild, tar xf, $<, astropy-$(astropy-version)) \
+ && cp $(dtexdir)/astropy.tex $(ictdir)/ \
+ && echo "Astropy $(astropy-version) \citep{astropy2013,astropy2018}" > $@
+
+$(ipydir)/beautifulsoup4: $(tdir)/beautifulsoup4-$(beautifulsoup4-version).tar.gz \
+ $(ipydir)/soupsieve
+ $(call pybuild, tar xf, $<, beautifulsoup4-$(beautifulsoup4-version), ,\
+ BeautifulSoup $(beautifulsoup4-version))
+
+$(ipydir)/certifi: $(tdir)/certifi-$(certifi-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, certifi-$(certifi-version), ,\
+ Certifi $(certifi-version))
+
+$(ipydir)/cffi: $(tdir)/cffi-$(cffi-version).tar.gz \
+ $(ilidir)/libffi \
+ $(ipydir)/pycparser
+ $(call pybuild, tar xf, $<, cffi-$(cffi-version), ,\
+ cffi $(cffi-version))
+
+$(ipydir)/chardet: $(tdir)/chardet-$(chardet-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, chardet-$(chardet-version), ,\
+ Chardet $(chardet-version))
+
+$(ipydir)/cryptography: $(tdir)/cryptography-$(cryptography-version).tar.gz \
+ $(ipydir)/asn1crypto \
+ $(ipydir)/cffi
+ $(call pybuild, tar xf, $<, cryptography-$(cryptography-version), ,\
+ Cryptography $(cryptography-version))
+
+$(ipydir)/cycler: $(tdir)/cycler-$(cycler-version).tar.gz \
+ $(ipydir)/six
+ $(call pybuild, tar xf, $<, cycler-$(cycler-version), ,\
+ Cycler $(cycler-version))
+
+$(ipydir)/cython: $(tdir)/cython-$(cython-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, Cython-$(cython-version)) \
+ && cp $(dtexdir)/cython.tex $(ictdir)/ \
+ && echo "Cython $(cython-version) \citep{cython2011}" > $@
+
+$(ipydir)/entrypoints: $(tdir)/entrypoints-$(entrypoints-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, entrypoints-$(entrypoints-version), ,\
+ EntryPoints $(entrypoints-version))
+
+$(ipydir)/h5py: $(tdir)/h5py-$(h5py-version).tar.gz \
+ $(ilidir)/hdf5 \
+ $(ipydir)/cython \
+ $(ipydir)/pypkgconfig \
+ $(ipydir)/setuptools
+ #$(ipydir)/mpi4py # AFTER its problem is fixed.
+ #export HDF5_MPI=ON; # AFTER its problem is fixed.
+ export HDF5_DIR=$(ildir); \
+ $(call pybuild, tar xf, $<, h5py-$(h5py-version), ,\
+ h5py $(h5py-version))
+
+$(ipydir)/html5lib: $(tdir)/html5lib-$(html5lib-version).tar.gz \
+ $(ipydir)/six \
+ $(ipydir)/webencodings
+ $(call pybuild, tar xf, $<, html5lib-$(html5lib-version), ,\
+ HTML5lib $(html5lib-version))
+
+$(ipydir)/idna: $(tdir)/idna-$(idna-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, idna-$(idna-version), ,\
+ idna $(idna-version))
+
+$(ipydir)/jeepney: $(tdir)/jeepney-$(jeepney-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, jeepney-$(jeepney-version), ,\
+ Jeepney $(jeepney-version))
+
+$(ipydir)/keyring: $(tdir)/keyring-$(keyring-version).tar.gz \
+ $(ipydir)/entrypoints \
+ $(ipydir)/secretstorage \
+ $(ipydir)/setuptools_scm
+ $(call pybuild, tar xf, $<, keyring-$(keyring-version), ,\
+ Keyring $(keyring-version))
+
+$(ipydir)/kiwisolver: $(tdir)/kiwisolver-$(kiwisolver-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, kiwisolver-$(kiwisolver-version), ,\
+ Kiwisolver $(kiwisolver-version))
+
+$(ipydir)/matplotlib: $(tdir)/matplotlib-$(matplotlib-version).tar.gz \
+ $(ipydir)/cycler \
+ $(ilidir)/freetype \
+ $(ipydir)/kiwisolver \
+ $(ipydir)/numpy \
+ $(ipydir)/pyparsing \
+ $(ipydir)/python-dateutil
+ $(call pybuild, tar xf, $<, matplotlib-$(matplotlib-version)) \
+ && cp $(dtexdir)/matplotlib.tex $(ictdir)/ \
+ && echo "Matplotlib $(matplotlib-version) \citep{matplotlib2007}" > $@
+
+# Currently mpi4py doesn't build because of some conflict with OpenMPI:
+#
+# In file included from src/mpi4py.MPI.c:591,
+# from src/MPI.c:4:
+# src/mpi4py.MPI.c: In function '__pyx_f_6mpi4py_3MPI_del_Datatype':
+# src/mpi4py.MPI.c:15094:36: error: expected expression before '_Static_assert'
+# __pyx_t_1 = (((__pyx_v_ob[0]) == MPI_UB) != 0);
+#
+# But atleast on my system it fails.
+$(ipydir)/mpi4py: $(tdir)/mpi4py-$(mpi4py-version).tar.gz \
+ $(ipydir)/setuptools \
+ $(ilidir)/openmpi
+ $(call pybuild, tar xf, $<, mpi4py-$(mpi4py-version)) \
+ && cp $(dtexdir)/mpi4py.tex $(ictdir)/ \
+ && echo "mpi4py $(mpi4py-version) \citep{mpi4py2011}" > $@
+
+$(ipydir)/numpy: $(tdir)/numpy-$(numpy-version).zip \
+ $(ipydir)/setuptools \
+ $(ilidir)/openblas \
+ $(ilidir)/fftw \
+ $(ibidir)/unzip
+ if [ x$(on_mac_os) = xyes ]; then \
+ export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle"; \
+ else \
+ export LDFLAGS="$(LDFLAGS) -shared"; \
+ fi; \
+ conf="$$(pwd)/reproduce/software/config/installation/numpy-scipy.cfg"; \
+ $(call pybuild, unzip, $<, numpy-$(numpy-version),$$conf, \
+ Numpy $(numpy-version)) \
+ && cp $(dtexdir)/numpy.tex $(ictdir)/ \
+ && echo "Numpy $(numpy-version) \citep{numpy2011}" > $@
+
+$(ibidir)/pip3: $(tdir)/pip-$(pip-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, pip-$(pip-version), ,\
+ PiP $(pip-version))
+
+$(ipydir)/pypkgconfig: $(tdir)/pkgconfig-$(pypkgconfig-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, pkgconfig-$(pypkgconfig-version), ,
+ pkgconfig $(pypkgconfig-version))
+
+$(ipydir)/pycparser: $(tdir)/pycparser-$(pycparser-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, pycparser-$(pycparser-version), ,\
+ pycparser $(pycparser-version))
+
+$(ipydir)/pyparsing: $(tdir)/pyparsing-$(pyparsing-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, pyparsing-$(pyparsing-version), ,\
+ PyParsing $(pyparsing-version))
+
+$(ipydir)/python-dateutil: $(tdir)/python-dateutil-$(python-dateutil-version).tar.gz \
+ $(ipydir)/setuptools_scm \
+ $(ipydir)/six
+ $(call pybuild, tar xf, $<, python-dateutil-$(python-dateutil-version), ,\
+ python-dateutil $(python-dateutil-version))
+
+$(ipydir)/requests: $(tdir)/requests-$(requests-version).tar.gz \
+ $(ipydir)/certifi \
+ $(ipydir)/chardet \
+ $(ipydir)/idna \
+ $(ipydir)/numpy \
+ $(ipydir)/urllib3
+ $(call pybuild, tar xf, $<, requests-$(requests-version), ,\
+ Requests $(requests-version))
+
+$(ipydir)/scipy: $(tdir)/scipy-$(scipy-version).tar.gz \
+ $(ipydir)/numpy
+ if [ x$(on_mac_os) = xyes ]; then \
+ export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle"; \
+ else \
+ export LDFLAGS="$(LDFLAGS) -shared"; \
+ fi; \
+ conf="$$(pwd)/reproduce/software/config/installation/numpy-scipy.cfg"; \
+ $(call pybuild, tar xf, $<, scipy-$(scipy-version),$$conf) \
+ && cp $(dtexdir)/scipy.tex $(ictdir)/ \
+ && echo "Scipy $(scipy-version) \citep{scipy2007,scipy2011}" > $@
+
+$(ipydir)/secretstorage: $(tdir)/secretstorage-$(secretstorage-version).tar.gz \
+ $(ipydir)/cryptography \
+ $(ipydir)/jeepney
+ $(call pybuild, tar xf, $<, SecretStorage-$(secretstorage-version), ,\
+ SecretStorage $(secretstorage-version))
+
+$(ipydir)/setuptools: $(tdir)/setuptools-$(setuptools-version).zip \
+ $(ibidir)/python3 \
+ $(ibidir)/unzip
+ $(call pybuild, unzip, $<, setuptools-$(setuptools-version), ,\
+ Setuptools $(setuptools-version))
+
+$(ipydir)/setuptools_scm: $(tdir)/setuptools_scm-$(setuptools_scm-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, setuptools_scm-$(setuptools_scm-version), ,\
+ Setuptools-scm $(setuptools_scm-version))
+
+$(ipydir)/six: $(tdir)/six-$(six-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, six-$(six-version), ,\
+ Six $(six-version))
+
+$(ipydir)/soupsieve: $(tdir)/soupsieve-$(soupsieve-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, soupsieve-$(soupsieve-version), ,\
+ SoupSieve $(soupsieve-version))
+
+$(ipydir)/urllib3: $(tdir)/urllib3-$(urllib3-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, urllib3-$(urllib3-version), ,\
+ Urllib3 $(urllib3-version))
+
+$(ipydir)/webencodings: $(tdir)/webencodings-$(webencodings-version).tar.gz \
+ $(ipydir)/setuptools
+ $(call pybuild, tar xf, $<, webencodings-$(webencodings-version), ,\
+ Webencodings $(webencodings-version))