aboutsummaryrefslogtreecommitdiff
path: root/reproduce/software
diff options
context:
space:
mode:
Diffstat (limited to 'reproduce/software')
-rw-r--r--reproduce/software/bibtex/astrometrynet.tex2
-rw-r--r--reproduce/software/bibtex/astropy.tex2
-rw-r--r--reproduce/software/bibtex/corner.tex2
-rw-r--r--reproduce/software/bibtex/cython.tex2
-rw-r--r--reproduce/software/bibtex/fftw.tex2
-rw-r--r--reproduce/software/bibtex/galsim.tex2
-rw-r--r--reproduce/software/bibtex/gnuastro.tex2
-rw-r--r--reproduce/software/bibtex/healpix.tex2
-rw-r--r--reproduce/software/bibtex/imfit.tex2
-rw-r--r--reproduce/software/bibtex/kiwisolver.tex18
-rw-r--r--reproduce/software/bibtex/matplotlib.tex2
-rw-r--r--reproduce/software/bibtex/missfits.tex2
-rw-r--r--reproduce/software/bibtex/mpi4py.tex2
-rw-r--r--reproduce/software/bibtex/numpy.tex2
-rw-r--r--reproduce/software/bibtex/r-cran.tex4
-rw-r--r--reproduce/software/bibtex/scamp.tex2
-rw-r--r--reproduce/software/bibtex/scipy.tex2
-rw-r--r--reproduce/software/bibtex/sextractor.tex4
-rw-r--r--reproduce/software/bibtex/sip_tpv.tex2
-rw-r--r--reproduce/software/bibtex/swarp.tex2
-rw-r--r--reproduce/software/bibtex/sympy.tex2
-rw-r--r--reproduce/software/bibtex/tides.tex2
-rw-r--r--reproduce/software/config/LOCAL.conf.in2
-rw-r--r--reproduce/software/config/TARGETS.conf6
-rw-r--r--reproduce/software/config/checksums.conf207
-rw-r--r--reproduce/software/config/numpy-scipy.cfg4
-rw-r--r--reproduce/software/config/servers-backup.conf4
-rwxr-xr-xreproduce/software/config/software_acknowledge_context.sh4
-rw-r--r--reproduce/software/config/texlive-packages.conf55
-rw-r--r--reproduce/software/config/texlive.conf2
-rw-r--r--reproduce/software/config/urls.conf62
-rw-r--r--reproduce/software/config/versions.conf230
-rw-r--r--reproduce/software/containers/README-apptainer.md71
-rw-r--r--reproduce/software/containers/README-docker.md201
-rwxr-xr-xreproduce/software/containers/apptainer.sh441
-rwxr-xr-xreproduce/software/containers/docker.sh486
-rw-r--r--reproduce/software/make/README.md2
-rw-r--r--reproduce/software/make/atlas-multiple.mk2
-rw-r--r--reproduce/software/make/atlas-single.mk2
-rw-r--r--reproduce/software/make/basic.mk242
-rw-r--r--reproduce/software/make/build-rules.mk37
-rw-r--r--reproduce/software/make/high-level.mk271
-rw-r--r--reproduce/software/make/python.mk614
-rw-r--r--reproduce/software/make/r-cran.mk5
-rw-r--r--reproduce/software/make/xorg.mk6
-rwxr-xr-xreproduce/software/shell/bashrc.sh2
-rwxr-xr-xreproduce/software/shell/configure.sh172
-rwxr-xr-xreproduce/software/shell/git-post-checkout2
-rwxr-xr-xreproduce/software/shell/git-pre-commit2
-rwxr-xr-xreproduce/software/shell/pre-make-build.sh26
-rwxr-xr-xreproduce/software/shell/prep-source.sh94
-rwxr-xr-xreproduce/software/shell/run-parts.in4
-rwxr-xr-xreproduce/software/shell/tarball-prepare.sh67
53 files changed, 2714 insertions, 675 deletions
diff --git a/reproduce/software/bibtex/astrometrynet.tex b/reproduce/software/bibtex/astrometrynet.tex
index 10b487e..5697885 100644
--- a/reproduce/software/bibtex/astrometrynet.tex
+++ b/reproduce/software/bibtex/astrometrynet.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/astropy.tex b/reproduce/software/bibtex/astropy.tex
index f0b8349..3df1aa1 100644
--- a/reproduce/software/bibtex/astropy.tex
+++ b/reproduce/software/bibtex/astropy.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/corner.tex b/reproduce/software/bibtex/corner.tex
index 5eda23d..fd7ea76 100644
--- a/reproduce/software/bibtex/corner.tex
+++ b/reproduce/software/bibtex/corner.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/cython.tex b/reproduce/software/bibtex/cython.tex
index 6103028..311072d 100644
--- a/reproduce/software/bibtex/cython.tex
+++ b/reproduce/software/bibtex/cython.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/fftw.tex b/reproduce/software/bibtex/fftw.tex
index e1e9bf8..15c5c62 100644
--- a/reproduce/software/bibtex/fftw.tex
+++ b/reproduce/software/bibtex/fftw.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/galsim.tex b/reproduce/software/bibtex/galsim.tex
index 6ca9b45..bbfdec1 100644
--- a/reproduce/software/bibtex/galsim.tex
+++ b/reproduce/software/bibtex/galsim.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/gnuastro.tex b/reproduce/software/bibtex/gnuastro.tex
index 5fd87e4..7d56e3e 100644
--- a/reproduce/software/bibtex/gnuastro.tex
+++ b/reproduce/software/bibtex/gnuastro.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/healpix.tex b/reproduce/software/bibtex/healpix.tex
index cfb96c0..afdd6a6 100644
--- a/reproduce/software/bibtex/healpix.tex
+++ b/reproduce/software/bibtex/healpix.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/imfit.tex b/reproduce/software/bibtex/imfit.tex
index f35ee69..1d5270b 100644
--- a/reproduce/software/bibtex/imfit.tex
+++ b/reproduce/software/bibtex/imfit.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/kiwisolver.tex b/reproduce/software/bibtex/kiwisolver.tex
new file mode 100644
index 0000000..47d3f56
--- /dev/null
+++ b/reproduce/software/bibtex/kiwisolver.tex
@@ -0,0 +1,18 @@
+%% Copyright (C) 2025-2025 Boud Roukema <boud@cosmo.torun.pl>
+%%
+%% 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{cassowary2001,
+ author = {{Grudin}, Jonathan and {Badros}, Greg J. and {Borning}, Alan and {Stuckey}, Peter J.},
+ title = "{The Cassowary linear arithmetic constraint solving algorithm}",
+ journal = {ACM Transactions on Computer-Human Interaction},
+ year = 2001,
+ month = dec,
+ volume = {8},
+ number = {4},
+ pages = {267-306},
+ doi = {10.1145/504704.504705},
+}
diff --git a/reproduce/software/bibtex/matplotlib.tex b/reproduce/software/bibtex/matplotlib.tex
index 9873c57..ec7bab4 100644
--- a/reproduce/software/bibtex/matplotlib.tex
+++ b/reproduce/software/bibtex/matplotlib.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/missfits.tex b/reproduce/software/bibtex/missfits.tex
index 64704e6..83510dd 100644
--- a/reproduce/software/bibtex/missfits.tex
+++ b/reproduce/software/bibtex/missfits.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2020-2023 Surena Fatemi <surena.fatemi@ipm.ir>
+%% Copyright (C) 2020-2025 Surena Fatemi <surena.fatemi@ipm.ir>
%%
%% Copying and distribution of this file, with or without modification,
%% are permitted in any medium without royalty provided the copyright
diff --git a/reproduce/software/bibtex/mpi4py.tex b/reproduce/software/bibtex/mpi4py.tex
index cc6bcb9..10e0e74 100644
--- a/reproduce/software/bibtex/mpi4py.tex
+++ b/reproduce/software/bibtex/mpi4py.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/numpy.tex b/reproduce/software/bibtex/numpy.tex
index da54330..fb017c4 100644
--- a/reproduce/software/bibtex/numpy.tex
+++ b/reproduce/software/bibtex/numpy.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/r-cran.tex b/reproduce/software/bibtex/r-cran.tex
index 8d691c1..c58eeeb 100644
--- a/reproduce/software/bibtex/r-cran.tex
+++ b/reproduce/software/bibtex/r-cran.tex
@@ -1,5 +1,5 @@
-%% Copyright (C) 2022-2023 Boud Roukema <boud@cosmo.torun.pl>
-%% Copyright (C) 2022-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2022-2025 Boud Roukema <boud@cosmo.torun.pl>
+%% Copyright (C) 2022-2025 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
diff --git a/reproduce/software/bibtex/scamp.tex b/reproduce/software/bibtex/scamp.tex
index 5e5be91..b5c4da9 100644
--- a/reproduce/software/bibtex/scamp.tex
+++ b/reproduce/software/bibtex/scamp.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/scipy.tex b/reproduce/software/bibtex/scipy.tex
index c92bbec..1296393 100644
--- a/reproduce/software/bibtex/scipy.tex
+++ b/reproduce/software/bibtex/scipy.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/sextractor.tex b/reproduce/software/bibtex/sextractor.tex
index cdffe74..818f04a 100644
--- a/reproduce/software/bibtex/sextractor.tex
+++ b/reproduce/software/bibtex/sextractor.tex
@@ -1,5 +1,5 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/sip_tpv.tex b/reproduce/software/bibtex/sip_tpv.tex
index d13d7a5..0d52e33 100644
--- a/reproduce/software/bibtex/sip_tpv.tex
+++ b/reproduce/software/bibtex/sip_tpv.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/swarp.tex b/reproduce/software/bibtex/swarp.tex
index ecac1a7..e0989f9 100644
--- a/reproduce/software/bibtex/swarp.tex
+++ b/reproduce/software/bibtex/swarp.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/sympy.tex b/reproduce/software/bibtex/sympy.tex
index 27ea9ac..01e481b 100644
--- a/reproduce/software/bibtex/sympy.tex
+++ b/reproduce/software/bibtex/sympy.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/bibtex/tides.tex b/reproduce/software/bibtex/tides.tex
index dfa8eb8..caf1500 100644
--- a/reproduce/software/bibtex/tides.tex
+++ b/reproduce/software/bibtex/tides.tex
@@ -1,4 +1,4 @@
-%% Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+%% Copyright (C) 2019-2025 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
diff --git a/reproduce/software/config/LOCAL.conf.in b/reproduce/software/config/LOCAL.conf.in
index 5ee1ff7..341a78e 100644
--- a/reproduce/software/config/LOCAL.conf.in
+++ b/reproduce/software/config/LOCAL.conf.in
@@ -3,7 +3,7 @@
# This is just a template for the './project configure' script to fill
# in. Please don't make any change to this file.
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2018-2025 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
diff --git a/reproduce/software/config/TARGETS.conf b/reproduce/software/config/TARGETS.conf
index 3d35eed..716fd41 100644
--- a/reproduce/software/config/TARGETS.conf
+++ b/reproduce/software/config/TARGETS.conf
@@ -1,7 +1,7 @@
# Necessary high-level software to build in this project.
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 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
@@ -43,4 +43,4 @@ top-level-python =
# R libraries/modules
# [For developers 2022-01-02: 'r-cran-cowplot r-cran-gridExtra' for all]
-top-level-r-cran =
+top-level-r-cran =
diff --git a/reproduce/software/config/checksums.conf b/reproduce/software/config/checksums.conf
index e34d9b8..89738ce 100644
--- a/reproduce/software/config/checksums.conf
+++ b/reproduce/software/config/checksums.conf
@@ -1,8 +1,8 @@
# sha512 checksums of all the necessary software tarballs.
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
-# Copyright (C) 2022-2023 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2022-2025 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice and
@@ -15,53 +15,53 @@
# Basic/low-level programs and libraires (installed in any case)
# --------------------------------------------------------------
-bash-checksum = 2ce67af3ff6b6c9d87b2e98986da937ee100a4cecefd50f01ccdbaeb53e45ff80b1e84d5861619dd3058259223a1f0748e5850aa2dab13b3350fb8a955c3024e
-binutils-checksum = 028c64a9ac34def97ddb4ead355776999c4e3376857e865c536ed74593292437f5bd2049c036a506129f596ba78898b0cefec5c677b6cd76e7d18dfac9c64a33
+bash-checksum = 52fa7d14e5f05d7b1b5f64ca110388db119fd6b8d4cc25011e0e25848491507e610259091c56f3ca7a7688ee2547f8a98de2005626b35c29558e71f28e29b848
+binutils-checksum = efbc5957bd22804a860261886598778347e82f9cbc0728d21d26748b7296e34328fdc16252868169594a001a301babbcd0964d9c508523736bc79cac2aff8efc
bzip2-checksum = 929cb1b2d0db8a505e2bafe3ce2c893c8f132dd617c0110e86e19f116b570a85de3c8a635483b530456fc8f8b6698c8190d21313e47607f442807b10489ac86e
-cert-checksum = 25b689ebac01ebde136bcef1ef4aa18389fcc618375755001f153b37060cfb327fd6d6afac25d4ddfcf78fd6678fa00ce49ba688e725e4a4c657c37cba4ec3ca
-coreutils-checksum = 887ca0ea9e6918c9e959033e625537335902a118af8384a050bbdfadf1c7fa30a92521dd4d9714055d869c1619c20f0f6bcecb89a99f22278a74668b393a5cf0
-curl-checksum = 9158e35f1f8bee8236df933b0011bc1865bcf10182725b9578824abbfa9cc4dc1e468ab97a5c30bb791cba23e224e395189a6a70b314a500dac1222e4bf21908
-dash-checksum = 794290f8270f05a134966088af5a7f5abd5c7a06e7057108aa49ad18af43643a038cd926192b81cfc9169d9d419b03c9e815483936bbaf102fe7a462f84f358d
-diffutils-checksum = 597cd0a14087722b78469e2238fcee25e78108f53ca43fbff1194d87625b4c7498a205f68c7bb44fcd437b8d642bba263ac40170780aede006076b11956fd06e
-file-checksum = 22acda3d760fa19f94c67086ae5ea8243afbc896be10d3905b92610fe58cdc5954ce4f6756a2cc2a2c241572c37a56b4d6813b14a37f51d718314c6dc9b201fb
-findutils-checksum = 8f1887781e3f97aec1144dbda6da9590489ffb7dd28e47a5c574c0382398988f015a6f4364b90a66a9e35b3c0e79d8a71c573402b3f95f7f9482f2d47687a4a9
+certpem-checksum = d1198511bf1f61a624691c182ecdd57ff468030a4af8b0f0ef248a5ce1f42ed883c684fc5aafdd791d5d3aa24504fbfbab11043231594b1c4e21fdb7247e5a33
+coreutils-checksum = 2afaee98b305f000ab1c9e25b5fec6413c3e385c685f2afe94e3676593c09efca39d007cfda2b3b122e68e94204d2ebe7f50b39300899d8720518d6f74bce019
+curl-checksum = f391f696d725ace63271fe614ab3067b8d55d04be3a160c70bbca388de93670e5fb986dd5dd45e1b62c0327b2b1374ab229bdb5c9df746f70823e0721c9f048d
+dash-checksum = f21a2ac71606a5ae8dbda5639d111f385cc44c357c580a83e453b33faa32c92fd83f8ca6c5d2cf720343f8ab1cfec247ca499596f78ee19f62d67cd1d7ae0c69
+diffutils-checksum = 52582c860a4ce544f0c1a3e61bd9a1ce5f13e1c677b67d3713982439760e40b60267b222de3ef0a27065652822d9880a206899528d7ff8d60c7e64b64721b3e1
+file-checksum = b843b3c25656e8dec52e64eed6f581b29faf36540e0604a803d61c0f0eca830a01a947b81970b0d8a24a1336a37ae5c96bb2ade59daa16c544b1e82fc7db24e8
+findutils-checksum = 826c643e7f5c5d6976a47eabcd9807e51350d09ee8fc7dc931f2d9276f938f65aa0bd97e6213aa979742234784c120e1a6850a52207c327e1c1a465feb374053
flock-checksum = f711815035e21b46572bf80e730a55822e5abf4cb29749e476ee6cf4d5027e9a7deeacf5f6b8c37f18f17a0cc7a6d98fb0be3936e97b122707f1cb2306d1e1d9
-gawk-checksum = 60a9fb36e57c0819576f5b2e48b0cf82210dd0cc45f65529c15d53ae66f8d0674929434bd7ed6fa4beaafc81c6b0ccd8c56d21b5326f7b03dcf958cafca03c3a
-gcc-checksum = be8a7e21fb7ee3be80b814708d6ffb63093fa103a51eb736b3717ac506ed4afcc7571bfe0d475f072e82bed439225d20c07e5d1bbf449a9bc4e10b82e4d8dead
-gettext-checksum = f3083af79341bfdc849118333c1598812c12bc225d998181694648187088050160deb4777c252f72a7158e914c2967416489bc6167ef8505664497f2fb94ecbf
-git-checksum = 2ade8fe6e9bbc88ebfe72348b13e7c68acbd066dfd6bcdd0de4949ec22aa25d02246efb25e7a7868eef1739c8e8cc7bb73c4caffe0060046bbf738f601eac2a7
-gmp-checksum = 2bec8840bceaeac542ce1f7870d5b971b631b055b49751ba4f78f98229d7eb9cd97c0a668f6d7cf81a53bf0b3d5d70e682af523f8f0eee0d7390727ff2bbb271
-grep-checksum = e8c28da23fcef11825c54794b3eebffd0eaf84b7ebf5e187fd06b5d4aeff2af1ac097f0166151b3f11f332dc72abf6097188d578f549496f4c7c96ccf479a61e
-gzip-checksum = 43bfed5da4f376f9ee295fb505648e364bd85d38c22f0de79024e5fd2b7e341f7fef8fed0d49a0f0484164fb5c6ce02b1b1951891807bc2b50e1a3e8f7990548
-isl-checksum = e257c19d861da6615c0be303bd8800d5e1a1c71595126da573c7a8d91fea6c41b9cacc2378caf5272949c6719c8835584a6c7fd05246bf4ffe56031543f648e3
-less-checksum = 31f733ecf4170b4f5dcf467b902d0753833f852739b03bf611137aea3672c03e00e9418fd5e289e82624c2dd42b0de06cb65a7a637dae78e7647e5c6ecf9fb57
-libiconv-checksum = 01e1b073ae6a82320d8759c973ca27c217377f2afd7a27f52f944d1d6e9079e407a7a4d2352f6b38541e49a85cb27dd39ce2f5f74f44ff42775901cda72e1159
-libtool-checksum = e0bdf6194e77beff0273a487b6345a0707addf1c7f57c35663550c5ef6f41dfcadaaac9df30ada639f5c066fa17a4ce7155bbfc0c920e1a1eadd55dae8183754
-libunistring-checksum = f1e92717fc043c2d7c454e44700559b0bd75457fdf3da5e803d9d58d8ebdff261bc73f380f6350bb04ce04071687c0317d09b4e8615003187948be1cd4d0bab3
-libxml2-checksum = 0fdc16aa7536adfe1deaadd19cdc20101dd3b081bd0a2e59d8ecc2965b2ef4c30d2e2447ab5b0cdb861c57ddb89ace1bd4ce120d9436b751b37724a90981ba8c
-lzip-checksum = 9b18ab9b7ef9a7d1c2da06b48fd018399e94405a5ada457885b778c59caa3faed0e73e1da398516621dc9e721587785b57ef1f8a12c1b0e116ebce5129f0f24d
+gawk-checksum = 13cb59a4ef43e5b0d10f13263dcf5ccd72d9344f3ecc512589ed7f6d059baf8a5ae375d38f7654695e29f0694fc33deba3c7c008d61f09e67df57bf81e573f0c
+gcc-checksum = 40f239730fc0165a0ef48f252a886e9cbe7a95ed53fe2c7a16531d7f3d6faabecb2d868cc895a25f7561e7bb90892e3372652953efd8ac35359a6ac2e18a4447
+gettext-checksum = c53f3a09cbb62a3ba8870f1310da336c084bfc83534d7e9c236f7660f503d638654a91301558f1e4880ead2d629dcd92f7c3dd7e0d981d445b74215d836d19ea
+git-checksum = 6e7ac2188cf3204fceeebffc46f34a8180e53a887987a8e1b9d6c90f84073e4b86d45f39488f69432b1cd0962cd8fbd434c07128fc2e430cd2ec20f1a1fc8b61
+gmp-checksum = ad65de00ecb46cf454ed6c40d2a57ce2528f5fa64df1284dfa15036f1e8cf27760a09a4ecdfcc39048faffb71339bba30d99dd365c54173dbc2ba629bee2fad9
+grep-checksum = b1ad850671290120ca0ced6d1744622d99a903c6e638dd231e89a70a2ab48c382100e218697b6fbbbda8c99316679a7c681383a5e954790bbffb9719bd0d6d8e
+gzip-checksum = 19ef6f51ee8274c08aa188ebd26634a40f91c057ff1ad3253719a7fa0c7ac857de5cf289990e0b9fc67d89ca3abb50db6dbaa7664d2c58275c844712834d5e10
+isl-checksum = 615827a86e809c9645e090786008f8b37d7efc7fee6501ff81e937a299a5a72e7998a3965457d1380cb04f7e765b600276d87b7b59cae22d82aa65e71294f499
+less-checksum = 3b52347e1b779a52c89cb18da85a0963eed500e1e94cd3952c0693c56fd0eec4e8606eb02053d451ac92ec8c6e196edd1341eac54515ed84483112513f41f210
+libiconv-checksum = 1f33fcf7f617990812a26e15092dbb2f9e81400cee117eefd40ade813f7ca17c0b9a50a7a9881b4ab0b9c0be8475528204c347d940cbc667a918570e0bde051a
+libtool-checksum = 2aa6d535b4d644393d7ca5c8f174b09923dbdb50d947ba40917aad75c8cecf957fec7a54717bd3670c44130331b1f08fae3694e32c79c8e187c31e909b3d401b
+libunistring-checksum = 6ca6a2dea2c09b6e8e63eb7ff73ab62b2e2f7c412766209c9f6da5b13a109e3a7cb41e67aaee1fb2b46549965b7df13c508000e40594570abe71819dc9cc2eaf
+libxml2-checksum = 7c2c65ae5017be5d695ec5a0e9bf443fe130d33beec97f31bcdbe74c22ac7745ce02524ca603e701035576bdca91c4cb1cbe67ccad5525f9a4566451a8f0c935
+lzip-checksum = 513b7ecdee1d6f12298cbbb025286c887c5e6588e1268b489735955f822a8e305e7a8d4d06054a77b2f4c40f8d82e9e6d779cd73d4227ca3cdfe4002b9e42a98
m4-checksum = 7f8845f99e64d6a45859b9d80b03352a5526b3de0311ca4d6dd6850e504d26dfc90cd21d1640b10382f786213f8fdf20183bff424b3c41ea11432315993ab829
-make-checksum = ddf0fdcb9ee1b182ef294c5da70c1275288c99bef60e63a25c0abed2ddd44aba1770be4aab1db8cac81e5f624576f2127c5d825a1824e1c7a49df4f16445526b
-mpc-checksum = 85e044749c2a001a70af2c11fc4bac58709ca7df11bf6da3b03cca852ef336eb37c4fb1dafdffde2d13df35caa7c296a7cba19a4625b82dc3cccc5066ac95774
-mpfr-checksum = 23a30040511809b6a8ed33d5ef83f903e987f0e4b8e87c9bfa627fdf0ca6400330bda4fd727cf1d37f04f7804c77663ed983c6b5ed26f5d5bd772bf13f1f9eb5
-nano-checksum = 0995899c5bae17411461870d5a5fc61da43679938cd2bf909ae96a0e3ecd3f47319f57397983ef53abe076c34147ec77eb87de0167ce17d1933fddd95983e0a9
-ncurses-checksum = 68b7c0388304791ce82ab86ea5c5725357f07bbae0c230af3e4722f75617778b6e28d1f0c1d65871379670e54fcc96ecd54f529a3462d207f3d930e6dad5a2dd
-openssl-checksum = 722588b8d9f8b7a1c607475f441c47a7097b12f1885a471767424c7509103589a9e2647b5da35f5218fac6edee5c7946e4f2eb6962b434b14142330cf7403ef1
+make-checksum = 154a0247297a7b0131ff63fa8636d651b33aacc8f4a0dad1db176995b20c2039f4fd58eeb2ec27cc0ca7a95c1853199a4ee35a14afc5084995ecc1d694203412
+mpc-checksum = 76e0720e6287d8b7a3eaa09dc5baa5a2b61dde88198c9e1bc9c458a268a44035d11fbab1c8019501a7ee2d5745c7eddfb0bb3c7297110a0fd9e027acb42d0fc3
+mpfr-checksum = c6013b0f573271a3bc41bc3eb28c61f099c6fc5409096a27624b5ec049e6305a1c48275c6f244d0cbe1fe65f649704c7d5f6487ad24308f6b3becc17032fc222
+nano-checksum = e559c09057ff75cd650f02744dff801750a159785234189e48f976bb4ab90142aca2577a283f80d8eecdc4f2b6c0a55bfe6da69e6aaecc5812f32f923075ca9c
+ncurses-checksum = c94eccc1b23a9c6ca9b27881674b19802942802cf21084bd80e45e0b9e50a2d99e0e18a1ecd5cf3e686949982ca93132a7fe2f117a7c4307283db5012b11a2d5
+openssl-checksum = c4c44ab8e4a6d39e6aa69b096a831645c33d5675619d31da6e441452f67e487489b33041a34038a0f8ad596506e17ce8695a8f87bae861700481ecf6b9742b76
patchelf-checksum = f74409c00e7e50a88590267fa0c173f71239f1471985792f7bcdab750d202a9a25383c015987608bbcd6ace5b3642645d46dba63199ba54fabbcb51ae7fca8f6
-perl-checksum = 0cb49a0891ed0b8963093556af232b424d97eea5af659b00a6781c1de446da730a318c5d75d1d8cb7d7572cd4adb1423e4b9019bad96aa17da0de28a19f36399
+perl-checksum = d53da403f2232b487f11df4b0b889babf58350715c7430515ba32e2e7d9996308c5d75ee626906a9f3c56872672c9cfe3880e10c7bb084c178c7c76bb2a5346f
pkgconfig-checksum = c37ab9336ac15a73bf5a23101f3fd8a04810f39b0679634e420e5d7bbd60a80cfc919122694cf83965beb071d2780681efc8d954ce99d77eb235a4dc7497e250
-podlators-checksum = c653205fd1e8e570750584cdb3a813a1250ae6f66d4e654b3521b80052867a3a6ba15ad3d7c8a22065f1febc36175257f9b5685570fcf0a87908c2dc9d42cb3d
-readline-checksum = e7afacba7da0ec0f98c5cfd1a25873a1803c1beee9f8b2bb603844415466e9406512b69e1624412be3a48dc49ed048433599b0f9693986a5253debbc5631e0ae
-sed-checksum = 90d8fa16b2570baee061c128d6db688a3354796a6499014f12dc4c5966b34cbb8a04a47914e4ff8dc1815444ad0235565efef2a327b67c485e3324c2a1d07d78
-tar-checksum = 98d938d76a55dca1d1ba9a13f1aa2a3e8ae25ea422843e93daab98d373f4a72eebf052c88c87122ac16ed629863dc3fdb86dddf18d3ab5a2565b06f49b7d02bd
-texinfo-checksum = 6a706bd0f973b9bbe4fdbc3bfd475cc9699eb410d276cbc19a73255924313006e1b80a87803fa30f7245e3fcb610c829da31e38c91e791e19f11ca8b998914c4
+podlators-checksum = 2e1e8547b0c890101a9fb8d80807b164a0a708820617a6826127930f85115285a0e4d62ddf8ce2401df14c021521a1b3ce0cad0d308e08f7b3d0c49d1b0dd36f
+readline-checksum = ca08305c5a6d5eb6656a7cdff73aab65c1234de62db8da90335e9ea140b1d4f8a867204bdc49ead3acc5e5236358130e73032bd73de5dfe1eee5bb2c76be5cb2
+sed-checksum = e801dacce45a08671e65897f85be0a37a29d97f61e846ca17ff870d3ab9f5a639dba73457491087ff637df4a81099b864d2496d59acf17a07916b43bfe0ae480
+tar-checksum = f8d0b543dc4a2a57d61d8a183d7a64d611d11f033c64683f022a7f1f956d352d364a959903a2549ab1256c1a068de51052960cf34a70f355b80e237f654bfac7
+texinfo-checksum = 06e7d95d73380c16f064e119bd8717942fb464c1cbc532fb1833d2d5dfc3cbbcab2a9001a1d03721c347f676e1db22c2a0f78d19d22df379d0393527be411ef3
unzip-checksum = 5c1f3c417d5feed64b8c5dbc26b51dd84130b9ea43d77e810cc9e82cee6e965fa76e2636e5ba11a029eae3454a815a6081cc2828079fa3994c511d555b82f12c
valgrind-checksum = a99e09e6d957ce435e64f4ce7b1a14e7e266282578171ce4e3bb3f405ce304e4df3b43d2fca59a6024c176f60c2ac82b3992afc810386e8de03c72f262b32702
-wget-checksum = cbce817981864d4dc424b330126b0d06231907004f1fcfc8d105ffc043bab59e93421738d36cf95013cc03b5b9f9813b1c242a3ef3926a907889ca78dfb336d4
-which-checksum = f886f5828359584b204f20a3b712d29c14879288e6255ab612784fce167bc9467c246bf48f9c52780069a95fe25761c3edda358428893967f4a1a1e5e874b2d5
-xz-checksum = a92bc2619f668a9e462945423035a090bc91c010d0788db8fb300851a3f93c04af2d433bc545195979d51312f59667c5814e46dd711b67fa8f89c0864873b81c
+wget-checksum = 75ba60150baf673def8ff5f2688af57d89d699f1b5105cb1a6bc0ce88778be191c74757665d773ac84fdab975851ca9015b30f12f31877fd752500efb49e0034
+which-checksum = cbda59450d35c2fa04f9072db43584ff745844cdb129bce1a382eb50bcd19815f0bbf12f2b03f748cb3f585acf0a16eb2e661b71f9066469236d28e9fa40f168
+xz-checksum = d897a55ae5ee7d778c68edff83c53e6624619f233acd529439fade305681d07b7665ba1d370cf84abb38c7f3f8f88c3d127974c4f59667843814211802501080
zip-checksum = 433eda6a27074746a960952fa3b08028d5ba43fe976a1306dbace9209be5f89aa0554b17bba5815cd00984c0f64559c5fa0b754b620f6d646a2b145a8b599acc
-zlib-checksum = 97493906504451830655b300b4144deeeb9f41bdb9b3f3a3d5635c2b16bf90d543841dc70d028f1cee6b52ad1c604fdc18b18f559d1e4ed6523e6b3ce76fd8c5
+zlib-checksum = 8f0b28c7d0d5d1906c2c03586f4ad3188a7c7eb73d25295a7acaa88cdf87b7c82ac609282b9b12d2b4d5a368169e4bb5f88ba3b840b57e1cf32c78f2ee3ecd86
@@ -79,56 +79,57 @@ apr-checksum = d0ddf8b10dd8d3a831b94e541d387414cc4d507ad48ff752d3274fb808afe6628
apr-util-checksum = 6589948e3f9daf4ecd700bdbd2053fcb83005cec9d339278dda067996ba696e4a947116f066cee03214458aa15e0cb6f0df0103e7bc6f8f32327722eb7265f35
astrometrynet-checksum = 33bf92ec1d5aad50525739f5afb3abd2abe27c8b0cce35a6923831b7b7c35930cb6f14425df47c60dc5561cd27b4af55ea6ccdabaa2d444c81a6c86c7ef9629c
atlas-checksum = 13634a63c686800bef8affcf4e8f5f89d08f485fc557eb1b9ba51a405926014e659e439268f655984bb7f59ffe497d594cd7a607103826f1046325d89796e1b0
-autoconf-checksum = daf3d17178d8c2d0f872a50217ba4d8a1481bad7e70ee5a58c5599717a01209cbd58e6149c72f6c4829b96dcf602bcfb828d47e32a9cfe3e5710c45f4f1736e7
-automake-checksum = 728284b89ab4607b5de5db6b8bf5ad8730cbd8ac094f583b93bb92c59dee35e021e823cddd412b0507b18a12cbbbfbec0fb0447c23d0afd167769641fe0755e5
+autoconf-checksum = 99edec992950b85f7709323247772d1ec0f6ebfd2b066d83af65e856e8ab2facfab257f43d316fc5a8905fec0ce3c24768afd2873a1b85c795c8c120ae5f9277
+automake-checksum = f4b6485c7358554860b370d587bb5cd6c6c1050529eceb2bb0a0aecd408347405b3d1aa2c63e4a0aa38dc394178ea1e05599f1b5b6951c0e3d8f2f85639ffc71
bison-checksum = 08c3e9bcf9fc01bc8b3a6c5e5f8ecdf628e07d6ce0874341e9df6d7b2925db7720a29b3be9a98d644f05a9e55e1130e5d182cb764e1481891414df93aeb2794f
-boost-checksum = cc7b78311538d6e8a6849d58da3b4d3062dc6b816f91a06b86609e6f1538d87ef9308c27af4db7a644e7c8e2b3de73c9f011a739e75262a0f36affdc313947f3
+boost-checksum = df252f6aabd9b1d5421afc478fa288e947a7c5e11f26e54f0a8619c9ac5e16688c20f44106a429ae798b20a4c97cbf800ee0ac9b2aa7febe1bd2755c88802ac1
cairo-checksum = 5de8528196b450d01da5cd4562dec0dd8c31028b77640b6c611172f7c5ad1dc9a4d30bd4e38259344c3ee42b979e29be702a3190aae5fbf47c82c79ee0c14a8e
cdsclient-checksum = 24584eedeb84ab4666cbd2ed0b7264c92c63c9cf090595b75b01dd46f848419d6a7e5cff4db3946695f879d0ee2bfbeb527e88c2be85e769b577302d9b2ad2b7
-cfitsio-checksum = 18dcaec9907c0d6d09c28a1238b0ab1425268aa6c83ca163a2ea8df404cc8fcaa5b9a5b17ed585d415d56ee9a2647b0cfcd6e03da91a1a2f75cf0db530287270
-cmake-checksum = 7587ff2bc7f0d75e4a19798081d13f10545fc49fdf06e913fd1606db2056204471f3536c0e2c46924013c4d64ff1f4e0422eff5dd6b911bce65c01e8510d24be
+cfitsio-checksum = fd40e0cec22bf3a35a7c48ad61a6ebad5a54d3230606c7492161c067b7ccd303ed34d149427bf1d3365e7a3082d89b51df46fc8a9c3d3c0b1eef8756374d711e
+cmake-checksum = 3904964eeb256ae4443d000a24ebdbfd76c677aec08d006f8665020f1ebf2008c65b6a1cffd6fb5b8a29cdb52420415ed2e0e2ea258db2e9888dc48068fc3941
eigen-checksum = 39c1944e0daca50bb01e929edc98e2bfc234accb30ca019dcccfc7b02db5cc81035592be219ae93cc3ec16fe0255e7e4d1f29ca2ad3dfee7e63546c47cb2f807
emacs-checksum = 91313dced8cd74f9e4a996eef42806aad00fb2576fc77b3694bb7b670624b6a1551ff49c2a3326dbeeba916e5732ca5975b5dc40b3b063f6e73a22839009abe9
-expat-checksum = 526f2ec03978f853ff76a911b5a168f58a7eac83b8405536afe2a6acf4611ebcb96acbc5df809fd18e4edeb7ca5059a3ce56dcbd12cb33eecf742c6361d83d19
+expat-checksum = c006dff4ee90ee3722df94ef227cfaab3ee4ebf7ee8193a65b904798b4d185e89c863c75a1e8eae9c120bfbf79336c1e31a8b6aa3042f4131b9a1eb0e97c6643
fftw-checksum = 28bd2f620399a415181027d30d7ea193aa487c7a277c9943d0051488908fd87e2731de0dfc3bebd22a6121d1deaa46037be8296a8a9cdb711f9fde4510c3d368
flex-checksum = a18e0dcdd21bd51779fd70e5efc2d77fa7b2a56d4d0e929d8abb437f86d7fcfa2cd09b8268185698200866dac8bec4444c5a7cff3140c515eaa49fc77c5aea66
-freetype-checksum = b3c7289cda3f89fa6e51143f2d1f1c82fa34808d0caa9262e7be5498c8f0fdb14e88d31ec9928e3add71f03208e40adb2fa94c2a4b4c6b7bfb81daf64b1578cb
+freetype-checksum = fb2d89421633a56d4276b192106d930c9f29cf2b70c52d9e13ba0c6a2679b6f69c20ab9f14480522992c263b493f198f24593bdeddb5806a4d801ab7604a5926
gdb-checksum = 4afd6660d2bbc4c48ce726062fb42217bdaa5974774407358b2624036a2ace48ed853746e4d6b83b9a409cd8fefc622b0727c79da8826e28e3d1444fa3a9d148
-ghostscript-checksum = b8ca229c118bd29f0fadb87a65975011d793d8245652eb7e2d2cc1c0e90be1d545b0bfc216703766e35aedd096a1c3ddb6ad9ed8d3c71efa0a9f9904a524e903
+ghostscript-checksum = 2d6422d434cbe6612d4e995022322e17d0167d0d92fe1f6fe122da73558a81fa43025458411e38363a0e30a573cbc6cf997ae7aa562501787d0af88bf1b5b387
ghostscript-fonts-gnu-checksum = d8de17e5d920bd3803ecdc07aca224fa5b9a26db847ddae0ecc79488dc3e867ab3155a8565f20df7855e5228bc7f36a549b082ba0b8b56c9b948d6cfb655fdc0
ghostscript-fonts-std-checksum = 40e01f88dd113c3120686c11da1c4cf4ee77c8db315b21cc936c3ccfb42cad4949e207298ec6d78d03327ff05122fcd75ac82d5e7cdc9698d4bbf1f72b19756a
-gnuastro-checksum = 3af26ab271d0015642e7290c96899f433c24ae93685fff3dddcef697acf590981da03a7c598b01f31ff042ec99fc4e4759a5622af73bb6ee989c3c2060be7936
+gnuastro-checksum = d27399993ab65d1864c915fe107efb298c758e1f24e3f300830f8f120768dd3a54daea1d2af5537e9dd3b50a13a51edd237f434bfbb442ab992828b2dab1386a
gperf-checksum = 854cdb24337f14b0d4199cc97c4a1d2ec7f953ad8125a47a932d93f79bdc067e2de231859ac0e842f14b1a8d80c5606fdc2c295a370df5e85ea15023b478805b
-gsl-checksum = f9b92ef783d922f97fa40e934314648c627002e0b5c8067e6ca9b691cfacd6363efe68216db75ae1a093053c7aa6b56fda2769bd2e10b2c3a373339d7a0fc9c5
+gsl-checksum = 9a46b431eed536182f31e1ecad781ade214ac8bd885ac88bbfd02b6e08482c294775a529e561d358c1f0211d8d20db4ec99b448b9006c3bf7599c076d3fbbcc3
hdf5-checksum = 58d6d9a1c201efa0863d9c31d189b4d40b1a9b1fb1ab9cb3fdeb4463f508c043e467aa4d44484c2af111d4e2fb775223286da69568774e6edef285208290c67b
healpix-checksum = c11949e92aae9919fd41de91cbab72beffe2519c1203ab153ba217c6b6c81f2c10ceb07b683da0d04fb53ef5c80a9b208bdbb5379f379b7da9d0611d2430cc8e
-help2man-checksum = 94346bed1c6b4f41384a216af55464ee142a47c40fa9d2dcc8bd86a4ecd64afb4ee7c1a06efbc9c6c7f4f275936dc21840ead193a8cc45840808d6d361be5e3d
+help2man-checksum = 83dca38c2020c85a66da882cd994b4e291eb6a0584149b7b3a74fec1444399ec5ecfc6296080fbc34071cd9f8ec5c931e249fde1f755c7f40930cecafb3efab0
icu-checksum = ab14b52a3fdf2dcde6b5160ab7218eac381b850d3c278324379741c49d71fa6040fbacca94c6937e6c9fc15843761121deff302ca6854da5ca1cd5b26a34e839
imagemagick-checksum = 2132614540b7422c9772fcebe7e8e358994efcfb53d8e48fa52992313b09b191847e395bad305322c377a4697014353bb8c15adc4edfd712e038504fc7f17c5e
imfit-checksum = 15edd2349232c1c8e611b31d3a46b0700112d274515f54d0a0085bb4bfa6d3d5f8a15cd926516e043a29ce841accf3534ae58dbfb952d858dc9445199c957096
lapack-checksum = ff670e194a1d8c998f05e6143e01a09e6b43176c511217ea3c77742afd9f2566251c50fc23aeb916442401f7118c1d1fe21f0172382a7f4f2c516c1d7d873e24
libbsd-checksum = 5c7d98474000af1271a36ab769e54aba41578e0b0f06e47af2986d6821b6586ac430ec04cc51b7836823834dd9d0aec9f4ab3af088b94f963b89729fa2cc95d8
-libffi-checksum = 6a4d46567512c3ce69a11c8d01fa0397cf653ea6207b5a86192a52367006f0f27fc08b9ae3559ef45da69433c7c39818199b29ac06bc2c7dc0fafefe7ae7b32d
-libgit2-checksum = 7db8792f4280c484e324aa0f862714cd2ff3ea5c93aaf6953b08f9f2d7423e742d78f6fad11b5e5823747c81188e12432f247ee99dfaf331e4ce293713904ab2
-libidn-checksum = 8606bbdacc48b7fd572104896615acf0ca88f7c11a60c9eafc2ddb8477110a1f62c5684dbd5adf45b6417d9fc04a46add26052f63e464a81b3f4192443d13447
-libjpeg-checksum = 420397a802d81aac7c093aa056bd306f4c617a1deaa42b75179b9497da90568d560624e5423675030fcade69fa2cbca5203060e9fe9f0ef67e5025926b2e1dbc
+libffi-checksum = 027416da7066bd36ac0c9ed8228693e5eeeb5e11dc17afcd7ed7faa66a9e57f505e94dffaf18f8978e6b40964938d4289aa3b5fe8778abe8fb97a68138b8b120
+libgit2-checksum = dd8a2acb214a2f6ba05a0a51a05fa7c04e09f482fe166a6d74f072c8335f23a1bbd3358395c3fa6cbb0811369940be26e3463f9c8fe48d70fce062b69ac996b2
+libidn-checksum = 0ffb80ca195ef0b1b4aec7bb45499d64fbf6b45eb0f68c4ea83193148dc3e761a0098d996722c2ac6e54f18d25057fa8c54b55a9d15593924eb733a30cf8137c
+libjpeg-checksum = 312b0abf986dc937d57dad31b49472258cb6175f9dbc8796a67ed0971a4410bba40d87fae136e42677521dc14df376771982f9acdccf5143ac7edc9d2e91a34d
libmd-checksum = a598b61dcbd7c3daf25a4affccfcdb2f6d58a0d2057b4f24e8fb92cddbeb0d62f1f5e3dd55195dd83be405d187184a331ea080b936b6c336ad4271be03b0beb0
libnsl-checksum = a3c8f674357674b7ed4b26c05adde607f39be8d6dc9ff715448e1fcc5fc23d11fbb4ce85a6e493b79bdb0bb450dc3ffb1fb480715779f738d7bc016fae91621d
-libpaper-checksum = e1f37dfbbcc467c2269e228fa71893fd6c4738e1fd6cf24ce6e2ded568cfeeed80da097e51e833aa48e4ab9e1be0a5c75f9f4cf8bf2f050214c85013e9c24043
-libpng-checksum = 8bf8aaccf4b9efe15a18f0c7a0a6a942eba7bcdbaf61313f50af7e04a237ccc12f380b53ed88e5efa2d20b13f1a0f9f365b6bd7824d32350b3b3d9c6fa63eef6
-libtiff-checksum = 4e0da3df4b853f2017d99f23c5ed83d9f0d20743ce4caaf2ab915fa2d392858a7a74f91b1fd8a00055d1e82e26a5eb165aec6411709ea66478dce16062ccb93e
+libpaper-checksum = 8532e5e95b53e0dcb2b2c4c161d3840a34087b5870d449950a853dc312a4016fb1443851385ddfaf4196ad3b2d431e0d861efe82e1a0442392c435c4455acd76
+libpng-checksum = c4eff9a427302c6f228b93a5a6b74d1e667439ce77f20c086d91ec6efa932a0e7f5752b976f4af5cd07574c5e4999c86e2b9cae3e82cc448ee61f3d0dde9253d
+libtiff-checksum = 72ce12ce317ab2a5c188d3aeb575004eacf890dcb2729e9cb46f73c15cde2132624b4e229539af01626e59ea6a4a7380b4b5f90d5fecad787197b8b901615d20
libtirpc-checksum = bcb6b5c062c1301aa1246ec93ae0a5c1d221b8421126d020863517cb814b43ed038fb6c0c2faf4e68ff133b69abefe4f4d42bfc870671da6c27ca941a30b155a
metastore-checksum = ac1230686535a652e95024abaf6c5585bdab36f4e092bee5fa4deff2a913cd60f3a6bd8020c6887ccab97f0da3a284a0d4619fad5464a269e7b2040d6f7e6aaf
missfits-checksum = 32727f5eb30573a1cedacb8900e2536867e4815059eee32e64e3db65be9291b8a91b9f45b2c9f3cf6fc2a8cc448012ea3d502bdd9dee516008e17d5086aee795
netpbm-checksum = aef81d2e46850fae1fb34a38fa9f634be3c47c7c4e80f300c61aadd5532bcbccdec636e6c701e54caca67ac2d6ce3a7b6a9f090deb00cd4db718439986f89d8e
-openblas-checksum = 979cf2ecd4777fd0a65091210187b717e20ebe65917dd568dfb2590c686cf1a665dffcb3732c7e199c7b951a31e625f0428119d59106635af96552f69964908f
+ninjabuild-checksum = 3a6bfeef3ff1143d427a658d2d4119e4c9d85ebba37393760dd7a6dcce1c4a9e217009b6600b5a72338edb34680f0c45dc07b6b09afe1b0a9eb163993f2bc41a
+openblas-checksum = c87485bb2b74cee175a6e631c63cb52fab174a2275d375c00680c4cbcd8d12a116223fda0349fc677cc9fe49794ce7b0342740855840df491b6141c8f2f4784a
openmpi-checksum = 88c73fd708dd5fe3a893d5517425a8a4c3e252fae4715df9a9b0f2311abe94cf5f71be92f153820fbaeb32c7d0ac0175d5165bdadcadc731427309102182c1bd
openssh-checksum = e280fa2d56f550efd37c5d2477670326261aa8b94d991f9eb17aad90e0c6c9c939efa90fe87d33260d0f709485cb05c379f0fd1bd44fc0d5190298b6398c9982
patch-checksum = 75d4e1544484da12185418cd4a1571994398140a91ac606fa08dd067004187dad77d1413f0eb3319b3fe4df076714615c98b29df06af052bb65960fa8b0c86bf
pcre-checksum = abac4c4f9df9e61d7d7761a9c50843882611752e1df0842a54318f358c28f5953025eba2d78997d21ee690756b56cc9f1c04a5ed591dd60654cc78ba16d9ecfb
pixman-checksum = 333732b99994f7ea636d647e0b6123075351b27601b5b6370c9bc821a1ab3921386ddb92b51e015f3fc35104ba09be1e0d7bef47f0b4f73036b01d1d70396dd9
plplot-checksum = 2c5a36d84ebd948402c924d304427b5702bc75bdd22753c9b3b910b382dfdcc26910382aae452f02d86b25c1c813bbe1f40c9305de1d2809d575975f610fdf10
-python-checksum = b3d6b4187b31167b382e195037d7ca01d5e9c112fceb0f12a30c101dbcc91079601c01aa449f9d33d2fc53c795c33305e80c891e986a0e24cbecc14beaf90199
+python-checksum = de940d7eceee69b8a04f12c613753f61db53ddac1c5cde5388dd342e88a09bae8da1f56b71b96f20997f6203d169e92e9e2558c43b38dbc323221d7bb362abfc
r-cran-checksum = 54cc07956a70c09b5a533188eb063d2a9dc67a8aa5648ec7f9c107f626220c9f6e17ab7175e65dd54a8d608a1ca4106c8ad2856709eb995ab66439b5f033e725
rpcsvc-proto-checksum = c3011d7d7ef97a4a751f6921df1a23e1dd8ac50fb0690c759d37010ed7be27968a2130e3b8872cb48d5914216f9d539096a424f1ec38a75f7ed899748151c6f4
scamp-checksum = c7a192f357c6808acd16d1c5d2657c5c8c2f61e4fecb8a4b18d39b07f4c444f85d5029c21571d41ec3ba9c8d075de8bd660b0e029bf5dd63e3819e963430a938
@@ -137,27 +138,27 @@ sextractor-checksum = 4035710f9b8a20a0bb1a3913dab2dadd8444c179bf6dee425e0e8bb66a
swarp-checksum = 810af6ea0a2dfc7b78b0f6aaa486b80c29f517b90c29f5037d05f31f761e96a55c8b5dcc259e1b435b25f45f01dac45ddba61da84000a69676cce119880bb05d
swig-checksum = ecb1d940f584c23df036a8f77288916003f861851dfdf836ddc5bc45b95312f9259150084191c1d9f086c006e64e12a4db22f7ea382fbb71667b811b8f99995d
tides-checksum = c3360ff0d023b43749ba09a33302ca059f017a157b3ce7cdcf4f1a1578e90d3e7fa420077043adbee6b1ebf94bd698c8d6b279012f36d2a05b4de5351e30e108
-util-linux-checksum = 5f2534266a71cf61373d5b79f5a130191a06e5a3cc025982747be0d336b7ff60bded56cb1e0b42705f01dbd3ff8634928760554c53fef10045e68775c945854f
+util-linux-checksum = 9d421976a344f982f2bd910f0c888a7df4370a1e367c7d2582d03a58cb8500f1fe65cf6a7164c492a9ebd76bff04560c344b3a0f63ecdb372bfea2379b383030
vim-checksum = 85d083fcf3638f2c3a049b88da46d569d6a250ae132f3821d440c07c4792befffc09e4235241ca96d7b0307a1bb96cd2222ac8a63fb41c6add8c2bdc6c17aabb
-wcslib-checksum = f2ee5b0b6aa8e6ef2923a85d0213e7d66c54b6cdee5c6843abc97436b699215479815db2766ae76af1f1bd6eef4f46cd8510dd87bae8272a4a7c770c32ab7535
+wcslib-checksum = cc72804611df1b0087faed2ec19edbc17352cc631559edc8ceb03792162837cdaa6bbf144897c69a58c9fab7e569a1958149be7eaea6552d72190406e4755d12
xlsxio-checksum = 22870fda7bd4eefd5fea2a9ad7530c9049135129d9b69805091777e6b54b2fc6c3f0e69c6954f36bce54eebbfeccaf637cce9e271a593221a4296d6632470a6c
yaml-checksum = dadd7d8e0d88b5ebab005e5d521d56d541580198aa497370966b98c904586e642a1cd4f3881094eb57624f218d50db77417bbfd0ffdce50340f011e35e8c4c02
# Xorg related packages
-fontconfig-checksum = 4786b8419bdead24fe16cdb152b898d2676a59c534fd301f02e5343fd4fe54780fea06521e7c0bf45b794dbb08b0f17359eb5c6f1fe4e31d71dfd952c8fa3da2
-libice-checksum = 9e3488abaff115ac919e5df85479044579802b38a10597425e13466c22c149ef56a8adba77e2adbbcccb8d2e72e23976313f4af3dcee66128b768c971c513932
-libpthread-stubs-checksum = a99695c007e17d81879d5c113652c5e1edab2d63aac9b2984c4f334d85e2cebc1d0b4e8134d6196ed8eea4d4da41972fca27bb8a0c76c2946460f785233a2c03
-libsm-checksum = b9eec391f0438e85e32cf771afbb35bf215119ec31d9e31be40c1b653f2c3e894c2d19add0d6ff69e944d1230f681275e8abad86a8912ec37c1c41e0f1ce4d00
+fontconfig-checksum = e71c684ffcc75015b1aa13918d6598a213b926630317e4babf876fc503e0444ed3211277080a08505cc26da033ee8e673bf5e246cb9d75d2fbe18a43160a0dad
+libice-checksum = c38b5f14d8ac92c5c2507f4369a70c5e2738ee547765ea7a160fc6a0ebc217deb042bad65e16b76a1874ebd131eacc5f53e9630bded5ae1805a7c4c61ff5f357
+libpthread-stubs-checksum = 7895a95e4674fb0c4f206abf744818f58272597f0dd84480a1a217cb4358ff413d153f5e13f748867904e104cf26c43ff8d59a33e0f0a7cfaa81ee21d5d847fd
+libsm-checksum = 7b03a81ae81704ed97426e596849ec1209771f6ca4db296aedd7a698750b586cd56d149690922686c52c64c1c582672474fce00816dddca2c90ad9bded51a269
libx11-checksum = c5ee35af06a90bfa0e9c5f42feea9887c5beb88960a7658f8465524a360e400a5640e5dcda741549d7ecf470e7142d3728a32659e12f95a316203655a408db42
-libxau-checksum = bdca8935aa1a52bcd2748004d26c7405725c18021a4d9a67604c98c1ec3957cc85b5d987d2fcd9fa4ae5e59b6bbd6ab75712beee2d448bd733a7e3ffeb18e62f
-libxcb-checksum = 85effa5ac6c158df2affbe1a9085ebd2c52ddceaa8d972035afaea2a1f1d3031357bac2586237438cfc20a51468e620b0ff8775d057446ce2ef0768d947e9f25
-libxdmcp-checksum = cb1d4650f97d66e73acd2465ec7d757b9b797cce2f85e301860a44997a461837eea845ec9bd5b639ec5ca34c804f8bdd870697a5ce3f4e270b687c9ef74f25ec
-libxext-checksum = 58f4e87f200bfde2b9a2cd85c1c39d5462b702e12274ffa5fae5bd3a08b3dfab1290b399c31224c86627d927106e4dbfcdec6152c11b169834442008228796d4
-libxt-checksum = 9ec0f95ae073360ea7a80ffca2dcd998c991363b79696550c4f88edf2c9cbf740caca23929660b77fffca4ca292465a101398e9e891cd00db85f8eceaa78cde0
-util-macros-checksum = b29c388c60b8318a478656f0552210b2194ee302c082f694e5426ac5c3f4b97fc3e377cd6a7b2b97c3da3442cfb4a5e42dbae18e151ae39f5f84554016a01155
-xcb-proto-checksum = b1e2c12c9d66e729815e782af47cfd50ede4c771fe0d0607a423a3bcddfb5f2fdf5c8b58b17cfccf508104cf5ad6cc05be8bad5f96807538322050ecd65fa320
-xorgproto-checksum = 32852ca4d682207dd1399274714f26da6a995c3f4a20c3ef197e8dfd637f6782d4ce02cb8721ca0179e4618a585beacc53e74537869434dc3096d4ad47e10c26
-xtrans-checksum = 1c2fdd7cb906f012f7db5d42466734f89608bf3376b6bf4b115c2efbf71c4247587cc218ccfcfaa6d50f0cf336865d10fc604515b25bc6e95917db8acb7e3000
+libxau-checksum = db9c8ce453a650a493f83e30d4fa3b50aabaf01e98b5e24f666c32238f46a8c2c120cd18ac8fda447c3c7f9bf300f9e3a08a1cd2bd1c4ef4ace72a54cfb8243c
+libxcb-checksum = e360337777e578c76251b793dc4e7e9203271f4dd0e1032abbc092f96fa228717fbb702965dff061264cca52f2540c983f4085fa486ced0145ebcc4b9e5b766a
+libxdmcp-checksum = 3c25a8d37f2ea553ebadfd9d886592f9c181e7da0a73b5e7bc853f15f0cddbae39483e55dc417c47ed55b45b8401e633efcb02d692af715b1ec1549b75a67378
+libxext-checksum = 99b2dc7b1e65e78b3335138176a1031a8259820b60abe0ebc87b0c8cc1d3bc9f65aca8b43942811ff78b4e85640e0d4cd63b092423b1351daf32bc4109debf88
+libxt-checksum = 776457c702a8685cdda0c2c0b1d1c441f8e20513b89f83b031c3037ae132b56dec53027465c15b2c2d7d5dd0e6933840b5325de8a7242ef0daa76ae5f28016a5
+util-macros-checksum = a9facbdcf973bfb202832b57207731152e7d58ca4ba034b4de31b931256af55daa651d0463309bed5ad84ed892b19b319c919aab77c849e08deac083d1445529
+xcb-proto-checksum = ea92650cacf0a864381fa29ec5e0c9562435cdbd8604ada5639a79e6aa359b3ef0d7ad0a10c5b1599fa1ddd49d86fade4048526445a9525c2978fa984a34f7fb
+xorgproto-checksum = 1b52be01bea4c22c0bd92ea073d1a11e08e9233e93e28d578a7cb247385f3a270b4fb4ce463cb853f3e1a9c6acb45da456e5f6caf4cfa7676a9e316e98bd22cc
+xtrans-checksum = 84f1142994f93882c9c68a4a85a218290c1c979162dbd4c5ee6b6becf0f96b69685d292cae1793ce65db8d7f1fe3f8955499f4b2ced771081894921512e2e16a
# Python packages
# ---------------
@@ -171,26 +172,33 @@ xtrans-checksum = 1c2fdd7cb906f012f7db5d42466734f89608bf3376b6bf4b115c2efbf71c42
# hash here.
asn1crypto-checksum = 44d442a6ddfa971e31e24712fe084368356deb5e1c4c3b3e813e0910931860215bc1c4f9eb2c4bd4fdef607c324086c096e9357068646efd28c97f2d4f85c62f
asteval-checksum = 4d64900b2f7dfdd098d6c8c102f9d9fd46f9ec265a54330e7d94479ba41f0ee0698855658e18b8b32b9c255159eb9a085af5f0306eb6508663d3fea7d2e00b4a
-astropy-checksum = 4dcc515dd656b2c8d040456f8ca66fae9bf856e2e8273675b28d924fc66a6cc687ac258a696f7d6fa5959cde2c2761e3e1c14c1e8db4e6adc690eb59ea0feb7c
+astropy-checksum = a91e327784a6ce0bb55119639e52037db0d802305dafedd46f27d9de96db819b43e336a4d43558a57e57459c4d1b7d6d3fe290771006e061d3779034f089aa9b
+astropy-iers-data-checksum = b8bb1aacf67fdab241e95952919a8691db09488493d0e4ea6eb7a65822c6e4bfb7fc55d4ee2f6a0e9e563fb671d16b06474d38f0ad4d3b0f41d6dc341dc7ec7a
astroquery-checksum = 43846791d8469a26cf6bb8819db58b830cfe50a34bc0091c2e843dd7dc78b1317530855d432a3a567a9f6a6f4d2682382a32edc91ea01716246b99b3625ec521
beautifulsoup4-checksum = bf8fd3e54da63a506f294f0e5f1201fd46bf2edcc2db23e99eda995313b8a8d24db3cd2d1903853c539a9320bfb9eb4b29e311772bfddc0d125f0b4aec71e384
beniget-checksum = 32a19d77323a0a21544ce7fbbb71cc5f4c66949dba280d81deb36f38364544d9fdfb3d24fc48a1ff6d251fb22c24357e81dd7fa4a7e6c11d8b931723e150a182
certifi-checksum = 6a6bf1ff98caefcdbf78a8c83e11e155368bacdd806f0ae0c6afa8f513667df6598e594b3584de61acdca3d6049f4a776937f2aa8672b602bd6db7b737f6074e
cffi-checksum = 50e2b8215ddedfa8f1d569680cc0023cf061c2c52b7b86b6b26ced56e5107b362aaf6dc10a77b9dbbbfca2e5611f7cfb42c59501f9ab7da29fb3ad3ccf418cb4
chardet-checksum = 61a03b23447a2bfe52ceed4dd1b9afdb5784da1933a623776883ee9f297e341f633e27f0ce0230bd5fdc5fdb5382105ab42736a74a417ddeb9f83af57455dba5
+contourpy-checksum = dab72dc7b9c64b1c06674ac4c7ba4d1058bfa5922763087dbe9d30237fe38045201e3801423541cc65ef0cd6c92eb5f4ffb4b6ff8da21d79f2f23a36ddc4bcf3
corner-checksum = ebd625ab1e4591b4c21d25ec706c35d37f560b727e1e0d6a79948c4a112ee6f21d3ca30162901a27715074e1345f3bdee1a0345c63e5fec24113e495fb094127
+cppy-checksum = 562b41f22d2819fa7be65ad7d05b18afa9646999277df8a5e6399c69d66320ed0119a5d2653de5711ccaf65360d55fadd85611bf2f7c42348e2f74fbf4eed45e
cryptography-checksum = 051b5007512521638981a8e975c7bbcb688b1a1c384babc81ba105c7bc2a7e776a8bf46af5939627528b2b57d99aaacf215a041018c47f6d3ae6d7a0e8eafccf
-cycler-checksum = bfd1b625c785b48f9795c4ef701ce1c8fdebaa0e82530b904ed7f481f644178834a1cbcdc6a2732bd5fa3a39f7bb543ce51b710a3e4101a6ecee89a6ff270ebc
-cython-checksum = 1db604326d0cbeb7b113bd163056ba1d4e3685aa66081911a836604dcb7f3654fedc91f4686a9e6514eed1f6cc8873b2d30ffbe6663844ce5bd04dbe5c120844
+cycler-checksum = c958a7c732432cac9dd81948aa451a8cc91e5c828591b1f935d80f5fc2d23481ffa1c1be716c44037f487ec2f4dd1be11c5318f5786f4accab6bbb84dcbcb291
+cython-checksum = cabcaad9c009680b262780030b08298f9785c98e7b2af043a7c85c1d57dbafd08d20d03de2b9298bd229da7c816babdfa2838229e275330ac1fa1bdcdb974725
eigency-checksum = 1e7cdfc43071da5edba30a0d32cd655442b516f15c166b049a195d151dec8c20a2177ad69bed3bba4788a668fa25a4c551ef4990717ff98d5b2f407bffb214c8
emcee-checksum = dd60aace8879525fd3fe42b747d82170b24b2ed21f538f9186ba96b9d04c084812e3303f5d2e04119dabd2f9d3286d510b4d4a5324c71dd24b1c7e5f0a9a0ac6
entrypoints-checksum = aa1274362d3a4b00266103319ca51aa266605b4999c89a9d0673eb61bfae9e646cb0ec6b86c95544493f6fe048385a2c7641d64adca8f45815546fb1e663c858
esutil-checksum = 7f1f22b0a05855819e3bd9bc2eee14942c2f536fb99f4af03575eb41d3d3fd1d2e6091ad076bfab4d51a8f30e213b607af35ed00d063fb2895b58f7a57cde5ae
-extension-helpers-checksum = ea62d537d0f76af9f975ad577d3a679e027fe0dd21f8a125ccb34bff1e4cfb69ecc15c8bceb406744033e91827fc8b78477e30e8f3cc45396bb6ed8102159b08
+extension-helpers-checksum = 3a8d971e33542931754baf1626141b6407c11e98d58088f9898aaffcb2dcd9592adc094b236a7fdd74837b6aa4d38e7191763d7a414fb34d6e923985c7db3534
+features-checksum = 91b88e02ebcccfaac9a9cf4b8f00e177880e119287514c781fd591c06231428f4f7aa479bb9ba74f59b2544f12ec08061486f75bf91aac8480d23bdc91e2c511
flake8-checksum = a25076bb7f978ca23af0f2016b30bf5fe4680371b4c0939361a6f8c496f3c846cf98ecadee35fc2dedd588116c8cd982529972dd2411ab139621912b69132a1e
+flit-core-checksum = 59912228fbab70435a438c978c2cfdf7c1fd4e14f45ea223c9b1cb58a56b86ef932b42e1fcc69cadf3fd5c8ca52d407a99428aa874d58029fcaeb2b6acc6bbd5
+fonttools-checksum = 3bec5dbc51d93d439a9cfffdb45e1de4d1b79d6bd91c5510eaf4b21fed077648deb6c4858c95222f93bfe5da1f9c82cc57e8b3df67f214ee29425037f1261e22
future-checksum = c70565a660cf87c5e7e994bae0d4eb0b2b8b607ecb5ce65521c027bf0a39ce5699f0578413bd3c7edd5d01aeb1617de48dcea098a9e9021d8487a73007573030
galsim-checksum = 65393c4bcf52a3e723604a956aac5f58f490e41c7d5ddbd5d61660658738e2496aa30f632d4d83b765aaf1e46ac691fcd02fc827380e07c8f921c160a9f6a6fd
gast-checksum = 8311f48788daf060bee54ad8986eae054c2a426adcf97f1503cde37c4da2827cd0f664188e51f5c2f932a0a4ded78166a8466465595a640106060c8b6c7072a5
+gpep517-checksum = e937f18c9593c76c15f8b2e77143aa11a0a822b1ff686860d5539f4418b02ca7764d71dbef817e8fe8453f9bf3c45fc2f97af1244cc30068701347f584ace91f
h5py-checksum = c49b04f7dcddf03f36d4f063d79ecbe544e0b1daee432d4a76cfa83dac3a1f2cb144f40a74fb85ea17cb5b778f57f709969ea5d1a2afc5bdd5aecbc9d732898d
healpy-checksum = installed-with-healpix
html5lib-checksum = 35939b4450893864da04e735ee5e0addacf1dd34bae6a6909c76572abf6bfded446a78a713dfde91c1485ba45867d7abeb6a45cf0545c16ea968707be7de5dd2
@@ -198,44 +206,49 @@ idna-checksum = 8ca5cfe6350c51250bafdac7c6e4ddd54c4a5d6bf7acbcef896760a759868c8e
jeepney-checksum = 43083994a7c6af84a5a68d3ff8f6dc4d9129ce9fa55517838fb62d9f62bb78bdf52067649d0b95d08d689b7d7475cb9b2a956662e265a776ad42dcf4ccc0ab63
jinja2-checksum = db19498dbc9bd6419b474fbb465ce8c689b96f72d33ed1a31cee3c42e2c545dfd0fd5bfca610075e2e126fbdd27300a73efd76fb7ea449727ed61a6127806dcd
keyring-checksum = 3863f2cd89131d7e927e55691b4eb4b7c2599af189525293d0948aef5215efbbbd74d45db3cd4885ba5b18a79f0fa0b0edc3783a020a6702f6a6fb7ed86b2cf2
-kiwisolver-checksum = d5aec6da0a5038f969227eb6320bf6ccdae2668b5730fe3e94ea1be5a2e64d121516abea16764c4659e05d821d044e76d97054385c0bc62780c3b0cd82468aed
+kiwisolver-checksum = baa1e6b8b31b8000e51cc9bdacd57be20c3030551782fd7989fd473b15d225f1cad6309fc846d2ba07d7a7abb729151260a873d6beafa46d881f4fdddcde0f3f
lmfit-checksum = 8435328fd8baf92b424299c341aafb995dc45245e17b1774e9eaabdd994dd6ec3b2e70f7506d67b587631cebd2dc584fcd1a9902286925a61e2135b7e11ece21
lsstdesccoord-checksum = a66b8b702cd8122f0c8aee05abe0fc0c6299f8bdb99b151f54bd7ad7430d6bc9f843f7294a7f08f3ce9f8606ea0ced0796a63b79cc8a53ae73068b691e2e6871
markupsafe-checksum = 4bc1171f1dc86516d6002d6dc3df2ccf78481480812025114b3a1511779b152a605904f0dc3aa0a6c8c282111a74564891a2b02650f90c44b667e5e0622c62c0
-matplotlib-checksum = f6fe468a0bed15b89cb158f9b09fe7339b925e9ba1d6c39387fb15ae30217e32a9be68ca3983c1284d5b4ab35375e7971edda97ab82960556775ce9730234384
+matplotlib-checksum = 2911fa5bc27d082aac00131f012503572f21228e0da49622b57d1d1a53eed942fa73a3457ae09efd03d09cb80172e2c344eacbb85234287be085a749622f9505
+meson-checksum = 6ba8af3a835f24b12e105b90948177964930274fed7d134405b3852cf333a4cbfc11d955778b87994cd9ece57a0de424483b40cf6e43ffe3fd6d9d249257f04c
+meson-python-checksum = 08ce6b89f4dd898ef4a92f9b358080aa8984047c3c8b1991347496a2e1283f357424d2d19a1cf5e03054e9dc0750773f2936f5eee2838523db2cedb783546477
mpi4py-checksum = 68b1d4ffaab8425ed3eb6c4adf2c008a489d4086eba1dd042c29cba29c95f790d49db9c4bf2870c677f5d27e6e5103781a8113ade6e28fe6cea655487e5e07b5
mpmath-checksum = 58c69a801f65d73cc0eeb0d2c79277ed638568c656e7213d06ab4709c218aac908b2752377139010bed0e91bbfff01d129c60835ff0a928ba1185aded6de7c0a
-numpy-checksum = 505b8e4aa403b04920584737b7f47f8bf238822de49024ba7defdb542e60c3ac37e35279e4dde4f2dc35ee128d1f21df3d202a7eb49adef64b256ad3bcaccccb
-packaging-checksum = 5a6552ea9f074dc737f0dd20d11901a98900770fa868c1e2fae6ffa9efb66156dbb8d3047feea28805f569d07d17f4286f5ef34f0f978d5b8449ca40cc7794a9
+numpy-checksum = 139ee0c38aa9acf4ddd6d5fd14b3c6c6ff3275b89cd3925ce5c528f58d9dd0e367edf77827685026fe10f686ff662bac95b367249891d4f2360fae8a60a8dec8
+packaging-checksum = 0f0be603c444b20917c7a36e1356bf161a958d7326bc47198bb06d23283017e04f4b3be60eaec66a865bb9704c717342a2ef55c9069bd8ea48bd1810d1d424bb
pexpect-checksum = 4cea4229332c1f3de26dfcad596877665b3c02e91d51ca3c45c1f9b44462adb7c82abc7b76eb09a73822c2d1ccc9d812574cf79bf6bc8fb0b7d2f1093962cc3f
-pillow-checksum = 3f43bdb65be1af6ac3a359bfb7ce74bc48b51ada4e197d61626c5aee242643e60f5f2370df99b12e6dd7afde521bb5dcaa5e44ecc4c94ac8bf070cb9aa8a86fb
+pillow-checksum = 5134db8c35fa66c559a16e7aa3f341e00c7d21e90d4906f5d95f3c912d804aa10fc8d8ca889677299d1f5431b421c4963d3420a614c7587bb43e2d7079278913
pip-checksum = c6e13da3a57462371d32982c80575c5181592f5c6a8e70d60ec879e689442f4ad468e7aef97eb58c9da50a5a770385aa35e701eefd713a8e9fafeb12e11d956b
ply-checksum = 29d3c4de42a74497083dc6780fbfccd319bd3be8098a2a59ea733988a159e760bdd0eead3482fda33a4e36d2b9b88916f9f9408db2fd3a6b7a0c51269b024485
-pybind11-checksum = a863b92a03a23395ba67f6e4916c479ba800060e89a6d80e586533a23603df111b5cba9fd03b3ed500956169edfd8cb1b32a0bc05c42f928740beeea5bd63352
+pybind11-checksum = b877d8d66b2c47b076224bf8e8414fe889f4fc3281c440d6d097edfad0b7a8edd9fb15e04cc60932358232ebe6c14b89863f4736aa43edfd739f4605b6fa6f44
pycodestyle-checksum = 84e751a7d00048393b02ca743de5d71d1641e948ee1b4daebbdf2d07e0cd8f087ca4e81f826061114b40ef41920bbcd680c9f479e7cc1a159a70188425717208
pycparser-checksum = 7f830e1c9066ee2d297a55e2bf6db4bf6447b6d9da0145d11a88c3bb98505755fb7986eafa6e06ae0b7680838f5e5d6a6d188245ca5ad45c2a727587bac93ab5
-pyerfa-checksum = f11dc54f4c3a69dfeab601e8c7bf2be989a1df20280a2e39a8eae77d300b4bd0d9b5bf6d4a75b7774b6a6c4b994126defbcba7e63e3b5e60eb923d9446ca54bd
+pyerfa-checksum = 44a1d3d714a72b9aa66c9f72f692ff46b273b25d3af2b05ddced62305727f23891b6c63a2ff85fd99f2e2d1663da6da995fef0091c541523867100c72c6a18ca
pyflakes-checksum = 7ebf5843b38146305c1063e070480fea8ec3b47fa1be546b1fafaeb242a688a5a001f978e7257fd71d5905b9a338b466ef17c7330725191587e9c40ba632c3f8
-pyparsing-checksum = 8cb58406eea1fd93d1c012577055d4cb806eaca90b7e94c11bf35acb0293f14fc9d8cbef658cb92368ad6f8689d2568097d9bc456af70e826db96c55e5858dd2
+pyparsing-checksum = 9d10454faaa0608eeb739a36a001f76d433c8f2ac9c7f40e9d1de5a9431b99e66a00fbd1618901d2e938ff36f752b77fc6782328ec08413f6d018bf6e5a420e7
pypkgconfig-checksum = 1fd9aa973bd20a8fab864722598f1d19b94c23c7f2b522556b3182b19fe016bda7aa2be5e48a1b8fefa70a069611007d6d790e24defcb462e4594a382de85b00
-python-dateutil-checksum = ec7da86203572582f883a4686acf8a732a2de4f396d809057eb51b2c60dbca5623a7fa90c2c0618c281a2282c60841739bd837731a51cc876f4ff369297f2f81
+pyproject-metadata-checksum = ff36bf73b6d10331d0b58af473a6af4fb4c67b7d2f4d567c36dc75030b6765e4640261041497b7660ce538a5a5baf11cd24acad6752ff45179b50162987a4005
+python-dateutil-checksum = a329abd60db1b3f2ab4cd516c1728c3596831ba7f7ba21003da7a39f7fe571ef38338125a210dc2931a0f1aae34b15f942be148095e0ec0d9a4c10389673c388
+python-installer-checksum = df34826ffc192547e5c87ff03e33e6a431d98eb6b9af6d7783963795204318fb69dce8ff49b757379e88ae6163c4802e43f58213f33b19d1d257bcdebe1d5e27
pythran-checksum = 5d2d14480149b044ffc159990d2a9b02a236c54c348a899929f11637d0545fee7bb16806660aab6e096a22e1f2e220e344084e5d9c96b2318e51c16767b26c59
-pyyaml-checksum = 8f27f92bdfa310a99dd6d83947332cc033fa18f0011998bb585ad5c4340a2da20d8c20bfdb53beaae15651198d1240c986818379b0a05b230f74d1f30f53e7fd
+pyyaml-checksum = 3f19057713a73586fdc73d54a6bd96400bce4edb4939381cbbe4be9bb3294dbc124403f16d880a4d21442df14ea4354231489cc2e97103360407f3936d41781b
requests-checksum = 385e1d80993a21c09e7c4682500ca8c24155962ba41ecd8e73612722b2ff6618b736e827fc48ad1683b0d2bc7a420cfe680f5107860aca52656ef777f1d60104
-scipy-checksum = ed7956f5686b13689d9a8246a8c3afa64a33f993b38fe0e9ed9e880d49298fea6014f10bc3e1a280f1474155cd691ee0409d133254c5f8cd133805d41b2f1ed4
+scipy-checksum = fe7c3ac114190782ebf2b155182597a78f36fc24a5de841380957d8f78faf865f3cb6b4feff2f601547240a7d09cf7756b7f9f0eb87d40e3a805e4dbc0714bb4
secretstorage-checksum = 295e0f75c772edf153480730dc20051f06e60e040a18f169620cb4aaa37b8c1a254a496464d3794a38cf49fa884a7b561fe364816f0d12a5b2622c77259f03cf
-setuptools-checksum = 92040b907eb5d15ae6a95f73c2f2229e7d4c1941c82890ce3920fcb5549240223433db6e1388b1131ba574540a55a0487ae9b802c9e43d0c1cfde699167ef3e6
-setuptools-rust-checksum = cdebf61a2d55846104a3f2ff5eb0c1e268285d2e1f074dc0080b99faf74e3bfa55af9dd5ecd12aba97b37888b8bf5d7388d7b42f2b0b9e906c9860309ea5aceb
-setuptools_scm-checksum = 196d4785a1802875d89b9e54ae788e791a9c5cb685109784059955b691242984e42b96d77075116790935f56be82259bc2588d95d65ecbb101261d76daddb83c
+semantic-version-checksum = c0a354ade9761168a7e3a22b5edb10fab21abe527996266b02e1dc4d631b7f80440fc58a04c71708c1dc24317cb880f9629bff926b55517f798b680c8eb207e1
+setuptools-checksum = 9c1f68e63fda8e65654f9b04423f35e20c1a854cc12d012a3cc9d48bf14aff0bfff37e038dc98675cc246997cfc33af6ee80bde36fd96b58c7cdf917c68a5c67
+setuptools-rust-checksum = fb440e1c619c1b50b67686cf8fc214c88beb01b189f06d43848a31dac910c9c6a8bf915a621299371d8a5148469665f6c2704c4853d218f5dc52fff2b014b6f2
+setuptools-scm-checksum = c00990fd7ea58fc246874c8216e746c2914a6adac2780e7596382a771cfb48a65a0114e04eae0ec12f44dbfb79ccb29a35ebc3c46a03caaa7399b57cd79c5e64
sip_tpv-checksum = 5e03279cb3650dd506332dfcb31aa4a20f23f55b8a29fd18da5c6d422d1b7dc49e12362ceae2ff7417c874401b5e87a73ca1ac0f3c8747c8984e4269cad56c3f
-six-checksum = 903334a9dcde08d654e5bf8f2bc06aa4d72449bd2b667505b9c191c38eb5b8259233fc791215584393cc70aea92ea29035460880a6a151f5defce5db084da1af
+six-checksum = abc5da98a94fc20b8f4edbd881497ebdd5d86f30867d7838bfe388fc35ff415b8973884e24509ddda7de1b4eb8af6ac5fe22e6408826b9297b217d3c53a5a6bb
soupsieve-checksum = abdcbb6a13563e7afadd3056141587fdc3d7d644e346f789bca0a16242d860219e462491b0c624b287300af960fb8e3f85c79f5137580939a9fc8c3d6961478c
sympy-checksum = 6ae09be7260b1624b4f92d39c68d5cdf54e6e33010d9215f46d62d989c04cdbee6f9f9c8b11ebeda53257d154954fb926b3ab7335b738e33ad248764875b6ddb
uncertainties-checksum = 5f09e75db2e4b2838858f2640a8427cd01cf691a6bec66e58f75125cb80515e2a7c164ef6d414dab2cb175a2cc696f42259729d0ebe4b4603f98e3f3ef9e262d
urllib3-checksum = 4c12d08076b0f260727d5aac780f5e9a24e0164755ff05b02a1f5a697876741ff13ba278fdd6e46ef678e8e1146bc39de1fc49ee10ee839229a70540a9424a99
virtualenv-checksum = 3306f59bbcb48ceec225c07083e0b6831379b3e632e4a23c376849559449de1a04db66e0e7ceabb40ddcd3ae984a2a18dfdc4f1c38777d4bc04537f85a0137ac
webencodings-checksum = b727b01bac6ec79bca517960d27b4c0668b295f25559471b9641c2c33dab55db6dac9c990952177964c6418382c22831b14d57df5e632d51d7abf97b61f24326
-wheel-checksum = 0a900806b97c368a6fdb763353c14a54e1fb629443af11432cbbaba5f2d7fa7532c6e4af3fbb3312f9fc2f4bfe285253d13b7c703439e5f3a2dd263850efbabf
+wheel-checksum = df45f00e9eaeae2f27f813f31591590c961da2f6bff15bba6fb2a14d529c221f39b29894b8da408fe49cd4b760840a0e05c4baef377ccfacd9983c0bba83d6d8
# R-CRAN packages
# ---------------
diff --git a/reproduce/software/config/numpy-scipy.cfg b/reproduce/software/config/numpy-scipy.cfg
index 5ad5112..c3cea11 100644
--- a/reproduce/software/config/numpy-scipy.cfg
+++ b/reproduce/software/config/numpy-scipy.cfg
@@ -7,8 +7,8 @@
# appropriate sections. Not all packages will use all sections so you
# should leave out sections that your package does not use.
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 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
diff --git a/reproduce/software/config/servers-backup.conf b/reproduce/software/config/servers-backup.conf
index 67eff44..f0e040e 100644
--- a/reproduce/software/config/servers-backup.conf
+++ b/reproduce/software/config/servers-backup.conf
@@ -3,12 +3,12 @@
# is irrelevant). Note that this is not a to be read as a variable but will
# be parsed as a list.
#
-# Copyright (C) 2020-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2020-2025 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.
+http://gitlab.cefca.es/maneage/tarballs-software/-/raw/master/
http://gitlab.com/maneage/tarballs-software/-/raw/master
http://git.maneage.org/tarballs-software.git/plain
-http://akhlaghi.org/maneage-software
diff --git a/reproduce/software/config/software_acknowledge_context.sh b/reproduce/software/config/software_acknowledge_context.sh
index 043d9aa..deae01b 100755
--- a/reproduce/software/config/software_acknowledge_context.sh
+++ b/reproduce/software/config/software_acknowledge_context.sh
@@ -10,8 +10,8 @@
# your project to make a smoothly readable English text. Afterwards, please
# feel free to modify them as you wish.
#
-# Copyright (C) 2021-2023 Boud Roukema <boud@cosmo.torun.pl>
-# Copyright (C) 2021-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2021-2025 Boud Roukema <boud@cosmo.torun.pl>
+# Copyright (C) 2021-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
#
# This script is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
diff --git a/reproduce/software/config/texlive-packages.conf b/reproduce/software/config/texlive-packages.conf
index 250a4e6..e68a771 100644
--- a/reproduce/software/config/texlive-packages.conf
+++ b/reproduce/software/config/texlive-packages.conf
@@ -4,23 +4,54 @@
# name to this variable (you can check in 'ctan.org' to find the official
# name).
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2022-2025 Boud Roukema <boud@astro.uni.torun.pl>
#
# 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.
+# Hints:
+#
+# - For debugging: after a partial or successful build, look through
+# '.build/software/installed/texlive/maneage/tlpkg/texlive.tlpdb.main.*'
+# to see what packages and files were looked at during the install.
-# 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.
+# Notes:
+#
+# - 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.
#
-# fancyvrb: Needed by R.
-texlive-packages = tex fancyhdr ec newtx fontaxes xkeyval etoolbox xstring \
- xcolor setspace caption footmisc datetime fmtcount \
- titlesec preprint ulem biblatex biber logreq pgf pgfplots \
- fp courier tex-gyre txfonts times csquotes kastrup \
- trimspaces pdftexcmds pdfescape letltxmacro bitset \
- mweights fancyvrb
+# - fancyvrb: needed by R.
+texlive-packages = biber \
+ biblatex \
+ caption \
+ courier \
+ csquotes \
+ datetime \
+ fancyvrb \
+ fmtcount \
+ fontaxes \
+ footmisc \
+ fp \
+ kastrup \
+ logreq \
+ mweights \
+ newtx \
+ pgf \
+ pgfplots \
+ preprint \
+ setspace \
+ tex-gyre \
+ times \
+ titlesec \
+ trimspaces \
+ txfonts \
+ ulem \
+ xcolor \
+ xkeyval \
+ xpatch \
+ xstring
diff --git a/reproduce/software/config/texlive.conf b/reproduce/software/config/texlive.conf
index 71878e5..0babd69 100644
--- a/reproduce/software/config/texlive.conf
+++ b/reproduce/software/config/texlive.conf
@@ -2,7 +2,7 @@
#
# installdir: Install directory
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2018-2025 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
diff --git a/reproduce/software/config/urls.conf b/reproduce/software/config/urls.conf
index 3a86d2d..8bf7b23 100644
--- a/reproduce/software/config/urls.conf
+++ b/reproduce/software/config/urls.conf
@@ -3,8 +3,8 @@
# If un-commented the URLs of this file will be used. Otherwise default
# servers (primarily on 'zenodo.org') will be checked for the tarball.
#
-# Copyright (C) 2020-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2020-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2020-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2020-2025 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
@@ -20,7 +20,7 @@
#bash-url = http://akhlaghi.org/src
#binutils-url = http://ftp.gnu.org/gnu/binutils
#bzip2-url = https://sourceware.org/pub/bzip2
-#cert-url = http://akhlaghi.org/maneage-software
+#certpem-url = http://akhlaghi.org/maneage-software
#coreutils-url = http://ftp.gnu.org/gnu/coreutils
#curl-url = https://curl.haxx.se/download
#dash-url = http://gondor.apana.org.au/~herbert/dash/files
@@ -62,7 +62,7 @@
#which-url = http://ftp.gnu.org/gnu/which
#xz-url = http://tukaani.org/xz
#zip-url = $(shell echo ftp://ftp.info-zip.org/pub/infozip/src/zip$$(echo $(zip-version) | sed -e's/\.//').tgz)
-#zlib-url = http://www.zlib.net
+#zlib-url = https://zlib.net/current/zlib.tar.gz # The version is in the tar
@@ -73,8 +73,8 @@
#
# These are programs and libraries that are optional, The ones in
# 'reproduce/software/config/TARGETS.conf' will be built as
-# part of a project. To specify a software there, just remove the
-# '-url' suffix from the list below.
+# part of a project. To specify a software package there, use
+# the name in the list below, without the '-url' suffix.
#apachelog4cxx-url = http://akhlaghi.org/maneage-software
#apr-url = https://archive.apache.org/dist/apr/
@@ -84,7 +84,7 @@
#autoconf-url = http://akhlaghi.org/maneage-software
#automake-url = http://ftp.gnu.org/gnu/automake
#bison-url = http://ftp.gnu.org/gnu/bison
-#boost-url = https://www.boost.org/users/download/
+#boost-url = https://archives.boost.io/release/$(boost-version)/source
#cairo-url = https://www.cairographics.org/releases
#cdsclient-url = http://cdsarc.u-strasbg.fr/ftp/pub/sw
#cfitsio-url = https://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c
@@ -111,13 +111,13 @@
#imfit-url = http://www.mpe.mpg.de/~erwin/resources/imfit
#lapack-url = http://www.netlib.org/lapack
#libbsd-url = http://libbsd.freedesktop.org/releases
-#libffi-url = https://sourceware.org/libffi/
+#libffi-url = https://github.com/libffi/libffi
#libgit2-url = http://akhlaghi.org/src
#libidn-url = https://ftp.gnu.org/gnu/libidn
#libjpeg-url = http://ijg.org/files
#libmd-url = https://archive.hadrons.org/software/libmd/
#libnsl-url = http://akhlaghi.org/maneage-software
-#libpaper-url=http://ftp.debian.org/debian/pool/main/libp/libpaper/
+#libpaper-url = http://ftp.debian.org/debian/pool/main/libp/libpaper/
#libpng-url = https://download.sourceforge.net/libpng
#libtiff-url = https://download.osgeo.org/libtiff
#libtirpc-url = https://downloads.sourceforge.net/libtirpc
@@ -125,12 +125,16 @@
#minizip-url =
#missfits-url = https://www.astromatic.net/download/missfits
#netpbm-url = https://sourceforge.net/projects/netpbm/files/super_stable/
+#ninjabuild-url = https://github.com/ninja-build/ninja/archive/refs/tags
#openblas-url = https://github.com/xianyi/OpenBLAS/archive
+#openblas-url = https://github.com/OpenMathLib/OpenBLAS/releases/download
#openmpi-url = $(shell majorver=$$(echo $(openmpi-version) | sed -e 's/\./ /g' | awk '{printf("%d.%d", $$1, $$2)}'); echo https://download.open-mpi.org/release/open-mpi/v$$majorver)
#openssh-url = https://artfiles.org/openbsd/OpenSSH/portable
#patch-url = http://ftp.gnu.org/gnu/patch
#pixman-url = https://www.cairographics.org/releases
#python-url = https://www.python.org/downloads/
+#https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz
+#python-url = https://www.python.org/ftp/python
#r-cran-url = $(shell majver=$$(echo $(r-cran-version) | sed -e's/\./ /g' | awk '{print $$1}'); echo https://cran.r-project.org/src/base/R-$$majver)
#rpcsvc-proto-url = https://github.com/thkukuk/rpcsvc-proto/releases/download
#scamp-url = http://akhlaghi.org/maneage-software
@@ -139,13 +143,14 @@
#swarp-url = https://www.astromatic.net/download/swarp
#swig-url = https://sourceforge.net/projects/swig/files/swig/swig-$(swig-version)
#tides-url = http://akhlaghi.org/maneage-software
-#util-linux-url = https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.35/
+#util-linux-url = https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.40
#valgrind-url = https://sourceware.org/pub/valgrind
#vim-url = ftp://ftp.vim.org/pub/vim/unix
#wcslib-url = ftp://ftp.atnf.csiro.au/pub/software/wcslib
#xlsxio-url = https://github.com/brechtsanders/xlsxio/archive
#yaml-url = pyyaml.org/download/libyaml
+
# Xorg packages
# -------------
#fontconfig-url = https://www.freedesktop.org/software/fontconfig/release
@@ -158,6 +163,7 @@
#libxdmcp-url = https://www.x.org/pub/individual/lib
#libxext-url = https://www.x.org/pub/individual/lib
#libxext-url = https://www.x.org/archive/individual/lib/
+#libxt-url = https://www.x.org/archive/individual/lib
#util-macros-url = https://www.x.org/pub/individual/util
#xcb-proto-url = https://xorg.freedesktop.org/archive/individual/proto
#xorgproto-url = https://xorg.freedesktop.org/archive/individual/proto
@@ -182,9 +188,41 @@
# (with full filename of 'numpy-1.18.5.zip') the link will be like this.
#
# numpy-url = https://files.pythonhosted.org/packages/01/1b/d3ddcabd5817be02df0e6ee20d64f77ff6d0d97f83b77f65e98c8a651981
-#
+
# Hence, if the version changes, the checksum, and its two top host
# directories also change. This is why we aren't putting any URL here by
-# default, if you need to add one, simply follow the numpy example above.
+# default, if you need to add one, follow the numpy example above.
# But be sure to send us a link to the tarball so we upload it to Maneage's
# backup servers.
+#astropy-url = https://files.pythonhosted.org/packages/45/12/a1c582b3f9df5e2680eae0ed82c8057ae06d6130a1f7a5c0770fa899737e
+#astropy-iers-data-url = https://files.pythonhosted.org/packages/a1/4d/b9511aba29d4330437497166a7049ab9bac53e344c54e44a35390724ca37
+#contourpy-url = https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866
+#cppy-url = https://files.pythonhosted.org/packages/45/ed/b35645a1b285bce356f30cc0fe77a042375c385660ccd61e0cdc4c1f7c44
+#cycler-url = https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8
+#cython-url = https://files.pythonhosted.org/packages/5a/25/886e197c97a4b8e254173002cdc141441e878ff29aaa7d9ba560cd6e4866
+#extension-helpers-url = https://files.pythonhosted.org/packages/7f/12/da64a4492f1330f09e7f42c3acd9e6395f74e840dc4a5c3fe1fa4db272b5
+#features-url = https://files.pythonhosted.org/packages/98/cc/dcaf1fb02d4eca207be4df3bf6a68d9af8d2af7cb37435dc76e71b389dc3
+#flit-core-url = https://files.pythonhosted.org/packages/bc/18/b9b81cab2b8f63e6e7f72e1ba2766a0454fcd563e7a77b8299cb917ba805
+#fonttools-url = https://files.pythonhosted.org/packages/1c/8c/9ffa2a555af0e5e5d0e2ed7fdd8c9bef474ed676995bb4c57c9cd0014248
+#gpep517-url = https://files.pythonhosted.org/packages/1c/53/e6ad6aa7036d62ac009986e1e5180465353344afd958ddc8ac15e3b632bc
+#kiwisolver-url = https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf
+#matplotlib-url = https://files.pythonhosted.org/packages/68/dd/fa2e1a45fce2d09f4aea3cee169760e672c8262325aa5796c49d543dc7e6
+#meson-url = https://files.pythonhosted.org/packages/02/98/bbcaf6caaaa0510a68834f119ac793a8abade6ff827fc2791eeb6f8b4a66
+#meson-python-url = https://files.pythonhosted.org/packages/67/66/91d242ea8dd1729addd36069318ba2cd03874872764f316c3bb51b633ed2
+#numpy-url = https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de
+#packaging-url = https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da
+#pillow-url = https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b
+#pybind11-url = https://files.pythonhosted.org/packages/d2/c1/72b9622fcb32ff98b054f724e213c7f70d6898baa714f4516288456ceaba
+#pyerfa-url = https://files.pythonhosted.org/packages/71/39/63cc8291b0cf324ae710df41527faf7d331bce573899199d926b3e492260
+#pyparsing-url = https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2
+#pyproject-metadata-url = https://files.pythonhosted.org/packages/c0/79/406a9f56c435caaaca4a1c66397e4f63ecd48a72a6c4fc1d9ecdaac66acb
+#python-dateutil-url = https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db
+#python-installer-url = https://files.pythonhosted.org/packages/05/18/ceeb4e3ab3aa54495775775b38ae42b10a92f42ce42dfa44da684289b8c8
+#pyyaml-url = https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17
+#scipy-url = https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637
+#semantic-version-url = https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595
+#setuptools-url = https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6
+#setuptools-rust-url = https://files.pythonhosted.org/packages/d3/6b/99a1588d826ceb108694ba00f78bc6afda10ed5d72d550ae8f256af1f7b4
+#setuptools-scm-url = https://files.pythonhosted.org/packages/4b/bd/c5d16dd95900567e09744af92119da7abc5f447320d53ec1d9415ec30263
+#six-url = https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2
+#wheel-url = https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c
diff --git a/reproduce/software/config/versions.conf b/reproduce/software/config/versions.conf
index 001667a..166e8ff 100644
--- a/reproduce/software/config/versions.conf
+++ b/reproduce/software/config/versions.conf
@@ -1,8 +1,8 @@
# Versions of the various dependencies
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
-# Copyright (C) 2022-2023 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2022-2025 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice and
@@ -17,51 +17,47 @@
# --------------------------------------------------------------
#
# CLASS:BASIC (important identifier for 'awk'; don't modify this line)
-bash-version = 5.2-rc2
-binutils-version = 2.39
+binutils-version = 2.43.1
bison-version = 3.8.2
-coreutils-version = 9.1
-curl-version = 7.84.0
-dash-version = 0.5.11-057cd65
-diffutils-version = 3.8
-file-version = 5.42
-findutils-version = 4.9.0
+coreutils-version = 9.6
+curl-version = 8.11.1
+dash-version = 0.5.12
+diffutils-version = 3.10
+file-version = 5.46
+findutils-version = 4.10.0
flock-version = 0.4.0
-gawk-version = 5.1.1
-gcc-version = 12.1.0
-gettext-version = 0.21
-git-version = 2.37.1
-gmp-version = 6.2.1
-grep-version = 3.7
-gzip-version = 1.12
-help2man-version = 1.49.2
-isl-version = 0.24
-less-version = 590
-libiconv-version = 1.17
-libtool-version = 2.4.7
-libunistring-version = 1.0
-libxml2-version = 2.9.12
-lzip-version = 1.23
-m4-version = 1.4.19
-make-version = 4.3
-mpc-version = 1.2.1
-mpfr-version = 4.1.0
-nano-version = 6.4
-ncurses-version = 6.3
-openssl-version = 3.0.5
-perl-version = 5.36.0
-pkgconfig-version = 0.29.2
-podlators-version = 4.14
-readline-version = 8.2-rc2
-sed-version = 4.8
-tar-version = 1.34
-texinfo-version = 6.8
+gawk-version = 5.3.1
+gcc-version = 14.2.0
+gettext-version = 0.23.1
+git-version = 2.48.1
+gmp-version = 6.3.0
+grep-version = 3.11
+gzip-version = 1.13
+help2man-version = 1.49.3
+isl-version = 0.27
+less-version = 668
+libiconv-version = 1.18
+libtool-version = 2.5.4
+libunistring-version = 1.3
+libxml2-version = 2.13.5
+lzip-version = 1.25
+make-version = 4.4.1
+mpc-version = 1.3.1
+mpfr-version = 4.2.1
+nano-version = 8.3
+openssl-version = 3.4.0
+perl-version = 5.40.1
+podlators-version = 6.0.2
+readline-version = 8.2.13
+sed-version = 4.9
+tar-version = 1.35
+texinfo-version = 7.2
unzip-version = 6.0
-wget-version = 1.21.2
-which-version = 2.21
-xz-version = 5.2.5
+wget-version = 1.25.0
+which-version = 2.23
+xz-version = 5.6.3
zip-version = 3.0
-zlib-version = 1.2.11
+zlib-version = 1.3.1
# Version-dependent build
# -----------------------
@@ -78,7 +74,7 @@ bzip2-version = 1.0.8
# '/etc/ssl/cert.pem' (which may be a symbolic link to its actual
# location). The current version was taken from an up-to-date ArchLinux at
# the date that is also equal to the version.
-certpem-version = 2021-10-15
+certpem-version = 2025-02-10
# PatchELF
# --------
@@ -90,6 +86,21 @@ certpem-version = 2021-10-15
# supported.
patchelf-version = 0.13
+# Not working with C23
+# --------------------
+#
+# As of GCC 15.1, the default C standard has been changed from C17 to C23
+# and the following software cannot be built with C23. So we have added
+# '-std=c17' to the CFLAGS environment variable in their build rules. After
+# updating their version (and if you have GCC 15.1 or later) first remove
+# '-std=c17' and then try the build. If it works, move the software back up
+# to the main list before the commit.
+ncurses-version = 6.5
+bash-version = 5.2.37
+m4-version = 1.4.19
+pkgconfig-version = 0.29.2
+
+
@@ -107,49 +118,49 @@ apr-util-version = 1.6.1
apr-version = 1.7.0
astrometrynet-version = 0.91
atlas-version = 3.10.3
-autoconf-version = 2.71
-automake-version = 1.16.5
-boost-version = 1.77.0
+autoconf-version = 2.72
+automake-version = 1.17
+boost-version = 1.87.0
cairo-version = 1.16.0
cdsclient-version = 3.84
-cfitsio-version = 4.1.0
-cmake-version = 3.24.0
+cfitsio-version = 4.5.0
+cmake-version = 3.31.5
eigen-version = 3.4.0
emacs-version = 28.1
-expat-version = 2.4.1
+expat-version = 2.6.4
fftw-version = 3.3.10
flex-version = 2.6.4-410-74a89fd
-freetype-version = 2.11.0
+freetype-version = 2.13.3
gdb-version = 11.1
ghostscript-fonts-gnu-version = 6.0
ghostscript-fonts-std-version = 8.11
-ghostscript-version = 9.56.1
-gnuastro-version = 0.18
+ghostscript-version = 10.04.0
+gnuastro-version = 0.23
gperf-version = 3.1
-gsl-version = 2.7
+gsl-version = 2.8
icu-version = 70.1
imagemagick-version = 7.1.0-13
imfit-version = 1.6.1
libbsd-version = 0.11.3
-libffi-version = 3.4.2
-libidn-version = 1.38
-libjpeg-version = 9e
+libffi-version = 3.4.7
+libidn-version = 1.42
+libjpeg-version = 9f
libmd-version = 1.0.4
libnsl-version = 1.2.0-4a062cf
-libpaper-version = 1.1.28
-libpng-version = 1.6.37
-libtiff-version = 4.4.0
+libpaper-version = 1.1.29
+libpng-version = 1.6.46
+libtiff-version = 4.7.0
libtirpc-version = 1.2.6
metastore-version = 1.1.2-23-fa9170b
missfits-version = 2.8.0
-openblas-version = 0.3.21
+ninjabuild-version = 1.12.1
+openblas-version = 0.3.29
openmpi-version = 4.1.1
openssh-version = 8.0p1
patch-version = 2.7.6
pcre-version = 8.44
pixman-version = 0.40.0
plplot-version = 5.15.0
-python-version = 3.10.6
r-cran-version = 4.1.2
rpcsvc-proto-version = 1.4
scamp-version = 2.10.0
@@ -158,33 +169,37 @@ sextractor-version = 2.25.0
swarp-version = 2.41.5
swig-version = 4.0.2
tides-version = 2.0
-util-linux-version = 2.38.1
+util-linux-version = 2.40.4
valgrind-version = 3.18.1
vim-version = 9.0
+wcslib-version = 8.4
xlsxio-version = 0.2.21
yaml-version = 0.2.5
# Xorg packages
-fontconfig-version = 2.14.0
-libice-version = 1.0.10
-libpthread-stubs-version = 0.4
-libsm-version = 1.2.3
+fontconfig-version = 2.16.0
+libice-version = 1.1.2
+libpthread-stubs-version = 0.5
+libsm-version = 1.2.5
libx11-version = 1.8
-libxau-version = 1.0.9
-libxcb-version = 1.15
-libxdmcp-version = 1.1.3
-libxext-version = 1.3.4
-libxt-version = 1.2.1
-util-macros-version = 1.19.3
-xcb-proto-version = 1.15
-xorgproto-version = 2022.1
-xtrans-version = 1.4.0
+libxau-version = 1.0.12
+libxcb-version = 1.17.0
+libxdmcp-version = 1.1.5
+libxext-version = 1.3.6
+libxt-version = 1.3.1
+util-macros-version = 1.20.2
+xcb-proto-version = 1.17.0
+xorgproto-version = 2024.1
+xtrans-version = 1.5.2
# Version-dependent build
# -----------------------
lapack-version = 3.8.0
-libgit2-version = 1.3.0
-wcslib-version = 7.11
+libgit2-version = 1.9.0
+
+# Python should only be updated by the maintainer for Python packages; see
+# https://savannah.nongnu.org/task/?16622.
+python-version = 3.13.2
# Netpbm's questions in the configure steps maybe change with different or
# new versions.
@@ -194,7 +209,6 @@ netpbm-version = 10.73.39
# version.
minizip-version = $(zlib-version)
-
# Be careful with updateing hdf5 because h5py 2.10.0 doesn't work with
# version 1.12.0.
hdf5-version = 1.13.1
@@ -215,67 +229,78 @@ hdf5-version = 1.13.1
# CLASS:PYTHON-START (important identifier for 'awk'; don't modify this line)
asn1crypto-version = 0.24.0
asteval-version = 0.9.16
-astropy-version = 5.1
+astropy-version = 7.0.1
+astropy-iers-data-version = 0.2025.2.24.0.34.4
beautifulsoup4-version = 4.10.0
beniget-version = 0.4.1
certifi-version = 2018.11.29
cffi-version = 1.15.0
chardet-version = 3.0.4
+contourpy-version = 1.3.1
corner-version = 2.0.1
-cycler-version = 0.11.0
-cython-version = 0.29.24
+cppy-version = 1.3.1
+cycler-version = 0.12.1
+cython-version = 3.0.12
eigency-version = 1.77
emcee-version = 3.0.1
entrypoints-version = 0.3
esutil-version = 0.6.9
-extension-helpers-version = 0.1
+extension-helpers-version = 1.2.0
+features-version = 0.5.12
flake8-version = 3.7.8
+flit-core-version = 3.11.0
+fonttools-version = 4.56.0
future-version = 0.18.1
galsim-version = 2.3.5
gast-version = 0.5.3
+gpep517-version = 16
h5py-version = 2.10.0
html5lib-version = 1.0.1
idna-version = 2.8
jeepney-version = 0.4
jinja2-version = 3.0.3
-kiwisolver-version = 1.0.1
+kiwisolver-version = 1.4.8
lmfit-version = 0.9.14
lsstdesccoord-version = 1.2.0
markupsafe-version = 2.0.1
+meson-version = 1.7.0
+meson-python-version = 0.17.1
mpi4py-version = 3.1.3
mpmath-version = 1.1.0
-numpy-version = 1.21.3
-packaging-version = 21.3
+numpy-version = 2.2.3
+packaging-version = 24.2
pexpect-version = 4.7.0
-pillow-version = 8.4.0
+pillow-version = 11.1.0
pip-version = 19.0.2
ply-version = 3.11
-pybind11-version = 2.5.0
+pybind11-version = 2.13.6
pycodestyle-version = 2.5.0
pycparser-version = 2.19
-pyerfa-version = 2.0.0.1
+pyerfa-version = 2.0.1.5
pyflakes-version = 2.1.1
-pyparsing-version = 3.0.4
+pyproject-metadata-version = 0.9.0
+pyparsing-version = 3.2.1
pypkgconfig-version = 1.5.1
-python-dateutil-version = 2.8.0
+python-dateutil-version = 2.9.0.post0
+python-installer-version = 0.7.0
pythran-version = 0.11.0
-pyyaml-version = 5.1
+pyyaml-version = 6.0.2
requests-version = 2.21.0
-setuptools-version = 58.3.0
-setuptools_scm-version = 3.3.3
+setuptools-version = 75.8.0
+setuptools-scm-version = 8.2.0
sip_tpv-version = 1.1
-six-version = 1.16.0
+six-version = 1.17.0
soupsieve-version = 1.8
sympy-version = 1.4
uncertainties-version = 3.1.6
urllib3-version = 1.24.1
webencodings-version = 0.5.1
-wheel-version = 0.37.0
+wheel-version = 0.45.1
-# More recent versions of Matplotlib and Scipy have issues with finding
-# dependencies in our Python build system.
-scipy-version = 1.7.3
-matplotlib-version = 3.3.0
+# Matplotlib and Scipy are big packages that may have difficulty resolving
+# their dependency hell:
+matplotlib-version = 3.10.0
+scipy-version = 1.15.2
# CLASS:PYTHON-END (important identifier for 'awk'; don't modify this line)
@@ -303,7 +328,8 @@ matplotlib-version = 3.3.0
# Setuptools-rust crash (https://savannah.nongnu.org/bugs/index.php?61731),
# so it and its dependencies are being ignored: 'cryptography', and thus
# 'secretstorage' and thus 'keyring' and thus 'astroquery'.
-#setuptools-rust-version = 1.1.2
+setuptools-rust-version = 1.10.2
+semantic-version-version = 2.10.0
#cryptography-version = 36.0.1
#secretstorage-version = 3.1.1
#keyring-version = 18.0.0
diff --git a/reproduce/software/containers/README-apptainer.md b/reproduce/software/containers/README-apptainer.md
new file mode 100644
index 0000000..a7826ec
--- /dev/null
+++ b/reproduce/software/containers/README-apptainer.md
@@ -0,0 +1,71 @@
+# Maneage'd projects in Apptainer
+
+Copyright (C) 2025-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>\
+Copyright (C) 2025-2025 Giacomo Lorenzetti <glorenzetti@cefca.es>\
+See the end of the file for license conditions.
+
+For an introduction on containers, see the "Building in containers" section
+of the `README.md` file within the top-level directory of this
+project. Here, we focus on Apptainer with a simple checklist on how to use
+the `apptainer-run.sh` script that we have already prepared in this
+directory for easy usage in a Maneage'd project.
+
+
+
+
+
+## Building your Maneage'd project in Apptainer
+
+Through the steps below, you will create an Apptainer image that will only
+contain the software environment and keep the project source and built
+analysis files (data and PDF) on your host operating system. This enables
+you to keep the size of the image to a minimum (only containing the built
+software environment) to easily move it from one computer to another.
+
+ 1. Using your favorite text editor, create a `run.sh` in your top Maneage
+ directory (as described in the comments at the start of the
+ `apptainer.sh` script in this directory). Just add `--build-only` on
+ the first run so it doesn't go onto doing the analysis and just sets up
+ the software environment. Set the respective directory(s) based on your
+ filesystem (the software directory is optional). The `run.sh` file name
+ is already in `.gitignore` (because it contains local directories), so
+ Git will ignore it and it won't be committed by mistake.
+
+ 2. Make the script executable with `chmod +x ./run.sh`, and run it with
+ `./run.sh`.
+
+ 3. Once the build finishes, the build directory (on your host) will
+ contain two Singularity Image Format (SIF) files listed below. You can
+ move them to any other (more permanent) positions in your filesystem or
+ to other computers as needed.
+ * `maneage-base.sif`: image containing the base operating system that
+ was used to build your project. You can safely delete this unless you
+ need to keep it for future builds without internet (you can give it
+ to the `--base-name` option of this script). If you want a different
+ name for this, put the same option in your
+ * `maneaged.sif`: image with the full software environment of your
+ project. This file is necessary for future runs of your project
+ within the container.
+
+ 3. To execute your project remote the `--build-only` and use `./run.sh` to
+ execute it. If you want to enter your Maneage'd project shell, add the
+ `--project-shell` option to the call inside `./run.sh`.
+
+
+
+
+
+## Copyright information
+
+This file 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 file is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along
+with this file. If not, see <https://www.gnu.org/licenses/>.
diff --git a/reproduce/software/containers/README-docker.md b/reproduce/software/containers/README-docker.md
new file mode 100644
index 0000000..d651e22
--- /dev/null
+++ b/reproduce/software/containers/README-docker.md
@@ -0,0 +1,201 @@
+# Maneage'd projects in Docker
+
+Copyright (C) 2021-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>\
+See the end of the file for license conditions.
+
+For an introduction on containers, see the "Building in containers" section
+of the `README.md` file within the top-level directory of this
+project. Here, we focus on Docker with a simple checklist on how to use the
+`docker.sh` script that we have already prepared in this directory for easy
+usage in a Maneage'd project.
+
+
+
+
+
+## Building your Maneage'd project in Docker
+
+Through the steps below, you will create a Docker image that will only
+contain the software environment and keep the project source and built
+analysis files (data and PDF) on your host operating system. This enables
+you to keep the size of the image to a minimum (only containing the built
+software environment) to easily move it from one computer to another.
+
+ 0. Add your user to the `docker` group: `usermod -aG docker
+ USERNAME`. This is only necessary once on an operating system.
+
+ 1. Start the Docker daemon (root permissions required). If the operating
+ system uses systemd you can use the command below. If you want the
+ Docker daemon to be available after a reboot also (so you don't have to
+ restart it after turning off your computer), run this command again but
+ replacing `start` with `enable` (this is not recommended if you don't
+ regularly use Docker: it will slow the boot time of your OS).
+
+ ```shell
+ systemctl start docker
+ ```
+
+ 2. Using your favorite text editor, create a `run.sh` in your top Maneage
+ directory (as described in the comments at the start of the `docker.sh`
+ script in this directory). Just activate `--build-only` on the first
+ run so it doesn't go onto doing the analysis and just sets up the
+ software environment. Set the respective directory(s) based on your
+ filesystem (the software directory is optional). The `run.sh` file name
+ is already in `.gitignore` (because it contains local directories), so
+ Git will ignore it and it won't be committed by mistake.
+
+ 3. After the setup is complete, remove the `--build-only` and run the
+ command below to confirm that `maneage-base` (the OS of the container)
+ and `maneaged` (your project's full Maneage'd environment) images are
+ available. If you want different names for these images, add the
+ `--project-name` and `--base-name` options to the `docker.sh` call.
+
+ ```shell
+ docker image list
+ ```
+
+ 4. You are now ready to do your analysis by removing the `--build-only`
+ option.
+
+
+
+
+
+## Script usage tips
+
+The `docker.sh` script introduced above has many options allowing certain
+customizations that you can see when running it with the `--help`
+option. The tips below are some of the more useful scenarios that we have
+encountered so far.
+
+### Docker image in a single file
+
+In case you want to store the image as a single file as backup or to move
+to another computer. For such cases, run the `docker.sh` script with the
+`--image-file` option (for example `--image-file=myproj.tar.gz`). After
+moving the file to the other system, run `docker.sh` with the same option.
+
+When the given file to `docker.sh` already exists, it will only be used for
+loading the environment. When it doesn't exist, the script will save the
+image into it.
+
+
+
+
+
+## Docker usage tips
+
+Below are some useful Docker usage scenarios that have proved to be
+relevant for us in Maneage'd projects.
+
+### Saving and loading an image as a file
+
+Docker keeps its images in hard to access (by humans) location on the
+operating system. Very much like Git, but with much less elegance: the
+place is shared by all users and projects of the system. So they are not
+easy to archive for usage on another system at a low-level. But it does
+have an interface (`docker save`) to copy all the relevant files within an
+image into a tar ball that you can archive externally. There is also a
+separate interface to load the tarball back into docker (`docker load`).
+
+Both of these have been implemented as the `--image-file` option of the
+`docker.sh` script. If you want to save your Maneage'd image into an image,
+simply give the tarball name to this option. Alternatively, if you already
+have a tarball and want to load it into Docker, give it to this option once
+(until you "clean up", as explained below). In fact, docker images take a
+lot of space and it is better to "clean up" regularly. And the only way you
+can clean up safely is through saving your needed images as a file.
+
+### Cleaning up
+
+Docker has stored many large files in your operating system that can drain
+valuable storage space. The storage of the cached files are usually orders
+of magnitudes larger than what you see in `docker image list`! So after
+doing your work, it is best to clean up all those files. If you feel you
+may need the image later, you can save it in a single file as mentioned
+above and delete all the un-necessary cached files. Afterwards, when you
+load the image, only that image will be present with nothing extra.
+
+The easiest and most powerful way to clean up everything in Docker is the
+two commands below. The first will close all open containers. The second
+will remove all stopped containers, all networks not used by at least one
+container, all images without at least one container associated to them,
+and all build cache.
+
+```shell
+docker ps -a -q | xargs docker rm
+docker system prune -a
+```
+
+If you only want to delete the existing used images, run the command
+below. But be careful that the cache is the largest storage consumer! So
+the command above is the solution if your OS's root partition is close to
+getting filled.
+
+```shell
+docker images -a -q | xargs docker rmi -f
+```
+
+
+### Preserving the state of an open container
+
+All interactive changes in a container will be deleted as soon as you exit
+it. This is a very good feature of Docker in general! If you want to make
+persistent changes, you should do it in the project's plain-text source and
+commit them into your project's online Git repository. But in certain
+situations, it is necessary to preserve the state of an interactive
+container. To do this, you need to `commit` the container (and thus save it
+as a Docker "image"). To do this, while the container is still running,
+open another terminal and run these commands:
+
+```shell
+# These two commands should be done in another terminal
+docker container list
+
+# Get the 'XXXXXXX' of your desired container from the first column above.
+# Give the new image a name by replacing 'NEW-IMAGE-NAME'.
+docker commit XXXXXXX NEW-IMAGE-NAME
+```
+
+
+### Interactive tests on built container
+
+If you later want to start a container with the built image and enter it in
+interactive mode (for example for temporary tests), run the following
+command. Just replace `NAME` with the same name you specified when building
+the project. You can always exit the container with the `exit` command
+(note that all your changes will be discarded once you exit, see below if
+you want to preserve your changes after you exit).
+
+```shell
+docker run -it NAME
+```
+
+
+### Copying files from the Docker image to host operating system
+
+Except for the mounted directories, the Docker environment's file system is
+indepenent of your host operating system. One easy way to copy files to and
+from an open container is to use the `docker cp` command (very similar to
+the shell's `cp` command).
+
+```shell
+docker cp CONTAINER:/file/path/within/container /host/path/target
+```
+
+
+
+## Copyright information
+
+This file 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 file is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along
+with this file. If not, see <https://www.gnu.org/licenses/>.
diff --git a/reproduce/software/containers/apptainer.sh b/reproduce/software/containers/apptainer.sh
new file mode 100755
index 0000000..52315f6
--- /dev/null
+++ b/reproduce/software/containers/apptainer.sh
@@ -0,0 +1,441 @@
+#!/bin/sh
+#
+# Create a Apptainer container from an existing image of the built software
+# environment, but with the source, data and build (analysis) directories
+# directly within the host file system. This script is assumed to be run in
+# the top project source directory (that has 'README.md' and
+# 'paper.tex'). If not, use the '--source-dir' option to specify where the
+# Maneage'd project source is located.
+#
+# Usage:
+#
+# - When you are at the top Maneage'd project directory, you can run this
+# script like the example below. Just set all the '/PATH/TO/...'
+# directories. See the items below for optional values.
+#
+# ./reproduce/software/containers/apptainer.sh \
+# --build-dir=/PATH/TO/BUILD/DIRECTORY \
+# --software-dir=/PATH/TO/SOFTWARE/TARBALLS
+#
+# - Non-mandatory options:
+#
+# - If you already have the input data that is necessary for your
+# project's, use the '--input-dir' option to specify its location
+# on your host file system. Otherwise the necessary analysis
+# files will be downloaded directly into the build
+# directory. Note that this is only necessary when '--build-only'
+# is not given.
+#
+# - The '--software-dir' is only useful if you want to build a
+# container. Even in that case, it is not mandatory: if not
+# given, the software tarballs will be downloaded (thus requiring
+# internet).
+#
+# - To avoid having to set them every time you want to start the
+# apptainer environment, you can put this command (with the proper
+# directories) into a 'run.sh' script in the top Maneage'd project
+# source directory and simply execute that. The special name 'run.sh'
+# is in Maneage's '.gitignore', so it will not be included in your
+# git history by mistake.
+#
+# Known problems:
+#
+# Copyright (C) 2025-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2025-2025 Giacomo Lorenzetti <glorenzetti@cefca.es>
+#
+# This script 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 script is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this script. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+
+# Script settings
+# ---------------
+# Stop the script if there are any errors.
+set -e
+
+
+
+
+
+# Default option values
+jobs=
+quiet=0
+source_dir=
+build_only=
+base_name=""
+shm_size=20gb
+scriptname="$0"
+project_name=""
+project_shell=0
+container_shell=0
+base_os=debian:stable-slim
+
+print_help() {
+ # Print the output.
+ cat <<EOF
+Usage: $scriptname [OPTIONS]
+
+Top-level script to build and run a Maneage'd project within Apptainer.
+
+ Host OS directories (to be mounted in the container):
+ -b, --build-dir=STR Dir. to build in (only analysis in host).
+ -i, --input-dir=STR Dir. of input datasets (optional).
+ -s, --software-dir=STR Directory of necessary software tarballs.
+ --source-dir=STR Directory of source code (default: 'pwd -P').
+
+ Apptainer images
+ --base-os=STR Base OS name (default: '$base_os').
+ --base-name=STR Base OS apptainer image (a '.sif' file).
+ --project-name=STR Project's apptainer image (a '.sif' file).
+
+ Interactive shell
+ --project-shell Open the project's shell within the container.
+ --container-shell Open the container shell.
+
+ Operating mode:
+ --quiet Do not print informative statements.
+ -?, --help Give this help list.
+ -j, --jobs=INT Number of threads to use in each phase.
+ --build-only Just build the container, don't run it.
+
+Mandatory or optional arguments to long options are also mandatory or
+optional for any corresponding short options.
+
+Maneage URL: https://maneage.org
+
+Report bugs to mohammad@akhlaghi.org
+EOF
+}
+
+on_off_option_error() {
+ if [ "x$2" = x ]; then
+ echo "$scriptname: '$1' doesn't take any values"
+ else
+ echo "$scriptname: '$1' (or '$2') doesn't take any values"
+ fi
+ exit 1
+}
+
+check_v() {
+ if [ x"$2" = x ]; then
+ printf "$scriptname: option '$1' requires an argument. "
+ printf "Try '$scriptname --help' for more information\n"
+ exit 1;
+ fi
+}
+
+while [ $# -gt 0 ]
+do
+ case $1 in
+
+ # OS directories
+ -b|--build-dir) build_dir="$2"; check_v "$1" "$build_dir"; shift;shift;;
+ -b=*|--build-dir=*) build_dir="${1#*=}"; check_v "$1" "$build_dir"; shift;;
+ -b*) build_dir=$(echo "$1" | sed -e's/-b//'); check_v "$1" "$build_dir"; shift;;
+ -i|--input-dir) input_dir="$2"; check_v "$1" "$input_dir"; shift;shift;;
+ -i=*|--input-dir=*) input_dir="${1#*=}"; check_v "$1" "$input_dir"; shift;;
+ -i*) input_dir=$(echo "$1" | sed -e's/-i//'); check_v "$1" "$input_dir"; shift;;
+ -s|--software-dir) software_dir="$2"; check_v "$1" "$software_dir"; shift;shift;;
+ -s=*|--software-dir=*) software_dir="${1#*=}"; check_v "$1" "$software_dir"; shift;;
+ -s*) software_dir=$(echo "$1" | sed -e's/-s//'); check_v "$1" "$software_dir"; shift;;
+ --source-dir) source_dir="$2"; check_v "$1" "$source_dir"; shift;shift;;
+ --source-dir=*) source_dir="${1#*=}"; check_v "$1" "$source_dir"; shift;;
+
+ # Container options.
+ --base-name) base_name="$2"; check_v "$1" "$base_name"; shift;shift;;
+ --base-name=*) base_name="${1#*=}"; check_v "$1" "$base_name"; shift;;
+ --project-name) project_name="$2"; check_v "$1" "$project_name"; shift;shift;;
+ --project-name=*) project_name="${1#*=}"; check_v "$1" "$project_name"; shift;;
+
+ # Interactive shell.
+ --project-shell) project_shell=1; shift;;
+ --project_shell=*) on_off_option_error --project-shell;;
+ --container-shell) container_shell=1; shift;;
+ --container_shell=*) on_off_option_error --container-shell;;
+
+ # Operating mode
+ --quiet) quiet=1; shift;;
+ --quiet=*) on_off_option_error --quiet;;
+ -j|--jobs) jobs="$2"; check_v "$1" "$jobs"; shift;shift;;
+ -j=*|--jobs=*) jobs="${1#*=}"; check_v "$1" "$jobs"; shift;;
+ -j*) jobs=$(echo "$1" | sed -e's/-j//'); check_v "$1" "$jobs"; shift;;
+ --build-only) build_only=1; shift;;
+ --build-only=*) on_off_option_error --build-only;;
+ --shm-size) shm_size="$2"; check_v "$1" "$shm_size"; shift;shift;;
+ --shm-size=*) shm_size="${1#*=}"; check_v "$1" "$shm_size"; shift;;
+ -'?'|--help) print_help; exit 0;;
+ -'?'*|--help=*) on_off_option_error --help -?;;
+
+ # Unrecognized option:
+ -*) echo "$scriptname: unknown option '$1'"; exit 1;;
+ esac
+done
+
+
+
+
+
+# Sanity checks
+# -------------
+#
+# Make sure that the build directory is given and that it exists.
+if [ x$build_dir = x ]; then
+ printf "$scriptname: '--build-dir' not provided, this is the location "
+ printf "that all built analysis files will be kept on the host OS\n"
+ exit 1;
+else
+ if ! [ -d $build_dir ]; then
+ printf "$scriptname: '$build_dir' (value to '--build-dir') doesn't "
+ printf "exist\n"
+ exit 1;
+ fi
+fi
+
+# Set the default project and base-OS image names (inside the build
+# directory).
+if [ x"$base_name" = x ]; then base_name=$build_dir/maneage-base.sif; fi
+if [ x"$project_name" = x ]; then project_name=$build_dir/maneaged.sif; fi
+
+
+
+
+
+# Directory preparations
+# ----------------------
+#
+# If the host operating system has '/dev/shm', then give Apptainer access
+# to it also for improved speed in some scenarios (like configuration).
+if [ -d /dev/shm ]; then
+ shm_mnt="--mount type=bind,src=/dev/shm,dst=/dev/shm";
+else shm_mnt="";
+fi
+
+# If the following directories do not exist within the build directory,
+# create them to make sure the '--mount' commands always work and
+# that any file. Ideally, the 'input' directory should not be under the 'build'
+# directory, but if the user hasn't given it then they don't care about
+# potentially deleting it later (Maneage will download the inputs), so put
+# it in the build directory.
+analysis_dir="$build_dir"/analysis
+if ! [ -d $analysis_dir ]; then mkdir $analysis_dir; fi
+analysis_dir_mnt="--mount type=bind,src=$analysis_dir,dst=/home/maneager/build/analysis"
+
+# If no '--source-dir' was given, set it to the output of 'pwd -P' (to get
+# the direct path without potential symbolic links) in the running directory.
+if [ x"$source_dir" = x ]; then source_dir=$(pwd -P); fi
+source_dir_mnt="--mount type=bind,src=$source_dir,dst=/home/maneager/source"
+
+# Only when an an input directory is given, we need the respective 'mount'
+# option for the 'apptainer run' command.
+input_dir_mnt=""
+if ! [ x"$input_dir" = x ]; then
+ input_dir_mnt="--mount type=bind,src=$input_dir,dst=/home/maneager/input"
+fi
+
+# If no '--jobs' has been specified, use the maximum available jobs to the
+# operating system.
+if [ x$jobs = x ]; then jobs=$(nproc); fi
+
+# [APPTAINER-ONLY] Optional mounting option for the software directory.
+software_dir_mnt=""
+if ! [ x"$software_dir" = x ]; then
+ software_dir_mnt="--mount type=bind,src=$software_dir,dst=/home/maneager/tarballs-software"
+fi
+
+# [APPTAINER-ONLY] Since the container is read-only and is run with the
+# '--contain' option (which makes an empty '/tmp'), we need to make a
+# dedicated directory for the container to be able to write to. This is
+# necessary because some software (Biber in particular on the default
+# branch) need to write there! See https://github.com/plk/biber/issues/494.
+# We'll keep the directory on the host OS within the build directory, but
+# as a hidden file (since it is not necessary in other types of build and
+# ultimately only contains temporary files of programs that need it).
+toptmp=$build_dir/.apptainer-tmp-$(whoami)
+if ! [ -d $toptmp ]; then mkdir $toptmp; fi
+rm -rf $toptmp/* # So previous runs don't affect this run.
+
+
+
+
+
+# Maneage'd Apptainer SIF container
+# ---------------------------------
+#
+# Build the base operating system using Maneage's './project configure'
+# step.
+if [ -f $project_name ]; then
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: project's image ('$project_name') "
+ printf "already exists and will be used. If you want to build a "
+ printf "new project image, give a new name to '--project-name'. "
+ printf "To remove this message run with '--quiet'\n"
+ fi
+else
+
+ # Build the basic definition, with just Debian and gcc/g++
+ if [ -f $base_name ]; then
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: base OS docker image ('$base_name') "
+ printf "already exists and will be used. If you want to build a "
+ printf "new base OS image, give a new name to '--base-name'. "
+ printf "To remove this message run with '--quiet'\n"
+ fi
+ else
+
+ base_def=$build_dir/base.def
+ cat <<EOF > $base_def
+Bootstrap: docker
+From: $base_os
+
+%post
+ apt-get update && apt-get install -y gcc g++
+EOF
+ # Build the base operating system container and delete the
+ # temporary definition file.
+ apptainer build $base_name $base_def
+ rm $base_def
+ fi
+
+ # Build the Maneage definition file.
+ # - About the '$jobs' variable: this definition file is temporarily
+ # built and deleted immediately after the SIF file is created. So
+ # instead of using Apptainer's more complex '{{ jobs }}' format to
+ # pass an argument, we simply write the value of the configure
+ # script's '--jobs' option as a shell variable here when we are
+ # building that file.
+ # - About the removal of Maneage'd tarballs: we are doing this so if
+ # Maneage has downloaded tarballs during the build they do not
+ # unecessarily bloat the container. Even when the user has given a
+ # software tarball directory, they will all be symbolic links that
+ # aren't valid when the user runs the container (since we only
+ # mount the software tarballs at build time).
+ maneage_def=$build_dir/maneage.def
+ cat <<EOF > $maneage_def
+Bootstrap: localimage
+From: $base_name
+
+%setup
+ mkdir -p \${APPTAINER_ROOTFS}/home/maneager/input
+ mkdir -p \${APPTAINER_ROOTFS}/home/maneager/source
+ mkdir -p \${APPTAINER_ROOTFS}/home/maneager/build/analysis
+ mkdir -p \${APPTAINER_ROOTFS}/home/maneager/tarballs-software
+
+%post
+ cd /home/maneager/source
+ ./project configure --jobs=$jobs \\
+ --input-dir=/home/maneager/input \\
+ --build-dir=/home/maneager/build \\
+ --software-dir=/home/maneager/tarballs-software
+ rm /home/maneager/build/software/tarballs/*
+
+%runscript
+ cd /home/maneager/source
+ if [ x"\$maneage_apptainer_stat" = xshell ]; then \\
+ ./project shell; \\
+ elif [ x"\$maneage_apptainer_stat" = xrun ]; then \\
+ if [ x"\$maneage_jobs" = x ]; then \\
+ ./project make; \\
+ else \\
+ ./project make --jobs=\$maneage_jobs; \\
+ fi; \\
+ else \\
+ printf "$scriptname: '\$maneage_apptainer_stat' (value "; \\
+ printf "to 'maneage_apptainer_stat' environment variable) "; \\
+ printf "is not recognized: should be either 'shell' or 'run'"; \\
+ exit 1; \\
+ fi
+EOF
+
+ # Build the maneage container. The last two are arguments (where order
+ # matters). The first few are options where order does not matter (so
+ # we have sorted them by line length).
+ apptainer build \
+ $shm_mnt \
+ $input_dir_mnt \
+ $source_dir_mnt \
+ $analysis_dir_mnt \
+ $software_dir_mnt \
+ --ignore-fakeroot-command \
+ \
+ $project_name \
+ $maneage_def
+
+ # Clean up.
+ rm $maneage_def
+fi
+
+# If the user just wanted to build the base operating system, abort the
+# script here.
+if ! [ x"$build_only" = x ]; then
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: Maneaged project has been configured "
+ printf "successfully in the '$project_name' image"
+ fi
+ exit 0
+fi
+
+
+
+
+
+# Run the Maneage'd container
+# ---------------------------
+#
+# Set the high-level Apptainer operational mode.
+if [ $container_shell = 1 ]; then
+ aopt="shell"
+elif [ $project_shell = 1 ]; then
+ aopt="run --env maneage_apptainer_stat=shell"
+else
+ aopt="run --env maneage_apptainer_stat=run --env maneage_jobs=$jobs"
+fi
+
+# Build the hostname from the name of the SIF file of the project name.
+hstname=$(echo "$project_name" \
+ | awk 'BEGIN{FS="/"}{print $NF}' \
+ | sed -e's|.sif$||')
+
+# Execute Apptainer:
+#
+# - We are not using '--unsquash' (to run within a sandbox) because it
+# loads the full multi-gigabyte container into RAM (which we usually
+# need for data processing). The container is read-only and we are
+# using the following two options instead to ensure that we have no
+# influence from outside the container. (description of each is from
+# the Apptainer manual)
+# --contain: use minimal /dev and empty other directories (e.g. /tmp
+# and $HOME) instead of sharing filesystems from your host.
+# --cleanenv: clean environment before running container".
+#
+# - We are not mounting '/dev/shm' since Apptainer prints a warning that
+# it is already mounted (apparently does not need it at run time).
+#
+# --no-home and --home: the first ensures that the 'HOME' variable is
+# different from the user's home on the host operating system, the
+# second sets it to a directory we specify (to keep things like
+# '.bash_history').
+apptainer $aopt \
+ --no-home \
+ --contain \
+ --cleanenv \
+ --home $toptmp \
+ $input_dir_mnt \
+ $source_dir_mnt \
+ $analysis_dir_mnt \
+ --workdir $toptmp \
+ --hostname $hstname \
+ --cwd /home/maneager/source \
+ \
+ $project_name
diff --git a/reproduce/software/containers/docker.sh b/reproduce/software/containers/docker.sh
new file mode 100755
index 0000000..d5b5682
--- /dev/null
+++ b/reproduce/software/containers/docker.sh
@@ -0,0 +1,486 @@
+#!/bin/sh
+#
+# Create a Docker container from an existing image of the built software
+# environment, but with the source, data and build (analysis) directories
+# directly within the host file system. This script is assumed to be run in
+# the top project source directory (that has 'README.md' and
+# 'paper.tex'). If not, use the '--source-dir' option to specify where the
+# Maneage'd project source is located.
+#
+# Usage:
+#
+# - When you are at the top Maneage'd project directory, you can run this
+# script like the example below. Just set all the '/PATH/TO/...'
+# directories (see below for '--tmp-dir'). See the items below for
+# optional values.
+#
+# ./reproduce/software/containers/docker.sh --shm-size=15gb \
+# --software-dir=/PATH/TO/SOFTWARE/TARBALLS \
+# --build-dir=/PATH/TO/BUILD/DIRECTORY
+#
+# - Non-mandatory options:
+#
+# - If you already have the input data that is necessary for your
+# project's, use the '--input-dir' option to specify its location
+# on your host file system. Otherwise the necessary analysis
+# files will be downloaded directly into the build
+# directory. Note that this is only necessary when '--build-only'
+# is not given.
+#
+# - The '--software-dir' is only useful if you want to build a
+# container. Even in that case, it is not mandatory: if not
+# given, the software tarballs will be downloaded (thus requiring
+# internet).
+#
+# - To avoid having to set the directory(s) every time you want to
+# start the docker environment, you can put this command (with the
+# proper directories) into a 'run.sh' script in the top Maneage'd
+# project source directory and simply execute that. The special name
+# 'run.sh' is in Maneage's '.gitignore', so it will not be included
+# in your git history by mistake.
+#
+# Known problems:
+#
+# - As of 2025-04-06 the log file containing the output of the 'docker
+# build' command that configures the Maneage'd project does not keep
+# all the output (which gets clipped by Docker). with a "[output
+# clipped, log limit 2MiB reached]" message. We need to find a way to
+# fix this (so nothing gets clipped: useful for debugging).
+#
+# Copyright (C) 2021-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# This script 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 script is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this script. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+
+# Script settings
+# ---------------
+# Stop the script if there are any errors.
+set -e
+
+
+
+
+
+# Default option values
+jobs=
+quiet=0
+source_dir=
+build_only=
+image_file=""
+shm_size=20gb
+scriptname="$0"
+project_shell=0
+container_shell=0
+project_name=maneaged
+base_name=maneage-base
+base_os=debian:stable-slim
+
+print_help() {
+ # Print the output.
+ cat <<EOF
+Usage: $scriptname [OPTIONS]
+
+Top-level script to build and run a Maneage'd project within Docker.
+
+ Host OS directories (to be mounted in the container):
+ -b, --build-dir=STR Dir. to build in (only analysis in host).
+ -i, --input-dir=STR Dir. of input datasets (optional).
+ -s, --software-dir=STR Directory of necessary software tarballs.
+ --source-dir=STR Directory of source code (default: 'pwd -P').
+
+ Docker images
+ --base-os=STR Base OS name (default: '$base_os').
+ --base-name=STR Base OS docker image (default: $base_name).
+ --project-name=STR Project's docker image (default: $project_name).
+ --image-file=STR [Docker only] Load (if given file exists), or
+ save (if given file does not exist), the image.
+ For saving, the given name has to have an
+ '.tar.gz' suffix.
+
+ Interactive shell
+ --project-shell Open the project's shell within the container.
+ --container-shell Open the container shell.
+
+ Operating mode:
+ --quiet Do not print informative statements.
+ -?, --help Give this help list.
+ --shm-size=STR Passed to 'docker build' (default: $shm_size).
+ -j, --jobs=INT Number of threads to use in each phase.
+ --build-only Just build the container, don't run it.
+
+Mandatory or optional arguments to long options are also mandatory or
+optional for any corresponding short options.
+
+Maneage URL: https://maneage.org
+
+Report bugs to mohammad@akhlaghi.org
+EOF
+}
+
+on_off_option_error() {
+ if [ "x$2" = x ]; then
+ echo "$scriptname: '$1' doesn't take any values"
+ else
+ echo "$scriptname: '$1' (or '$2') doesn't take any values"
+ fi
+ exit 1
+}
+
+check_v() {
+ if [ x"$2" = x ]; then
+ printf "$scriptname: option '$1' requires an argument. "
+ printf "Try '$scriptname --help' for more information\n"
+ exit 1;
+ fi
+}
+
+while [ $# -gt 0 ]
+do
+ case $1 in
+
+ # OS directories
+ -b|--build-dir) build_dir="$2"; check_v "$1" "$build_dir"; shift;shift;;
+ -b=*|--build-dir=*) build_dir="${1#*=}"; check_v "$1" "$build_dir"; shift;;
+ -b*) build_dir=$(echo "$1" | sed -e's/-b//'); check_v "$1" "$build_dir"; shift;;
+ -i|--input-dir) input_dir="$2"; check_v "$1" "$input_dir"; shift;shift;;
+ -i=*|--input-dir=*) input_dir="${1#*=}"; check_v "$1" "$input_dir"; shift;;
+ -i*) input_dir=$(echo "$1" | sed -e's/-i//'); check_v "$1" "$input_dir"; shift;;
+ -s|--software-dir) software_dir="$2"; check_v "$1" "$software_dir"; shift;shift;;
+ -s=*|--software-dir=*) software_dir="${1#*=}"; check_v "$1" "$software_dir"; shift;;
+ -s*) software_dir=$(echo "$1" | sed -e's/-s//'); check_v "$1" "$software_dir"; shift;;
+ --source-dir) source_dir="$2"; check_v "$1" "$source_dir"; shift;shift;;
+ --source-dir=*) source_dir="${1#*=}"; check_v "$1" "$source_dir"; shift;;
+
+ # Container options.
+ --base-name) base_name="$2"; check_v "$1" "$base_name"; shift;shift;;
+ --base-name=*) base_name="${1#*=}"; check_v "$1" "$base_name"; shift;;
+
+ # Interactive shell.
+ --project-shell) project_shell=1; shift;;
+ --project_shell=*) on_off_option_error --project-shell;;
+ --container-shell) container_shell=1; shift;;
+ --container_shell=*) on_off_option_error --container-shell;;
+
+ # Operating mode
+ --quiet) quiet=1; shift;;
+ --quiet=*) on_off_option_error --quiet;;
+ -j|--jobs) jobs="$2"; check_v "$1" "$jobs"; shift;shift;;
+ -j=*|--jobs=*) jobs="${1#*=}"; check_v "$1" "$jobs"; shift;;
+ -j*) jobs=$(echo "$1" | sed -e's/-j//'); check_v "$1" "$jobs"; shift;;
+ --build-only) build_only=1; shift;;
+ --build-only=*) on_off_option_error --build-only;;
+ --shm-size) shm_size="$2"; check_v "$1" "$shm_size"; shift;shift;;
+ --shm-size=*) shm_size="${1#*=}"; check_v "$1" "$shm_size"; shift;;
+ -'?'|--help) print_help; exit 0;;
+ -'?'*|--help=*) on_off_option_error --help -?;;
+
+ # Output file
+ --image-file) image_file="$2"; check_v "$1" "$image_file"; shift;shift;;
+ --image-file=*) image_file="${1#*=}"; check_v "$1" "$image_file"; shift;;
+
+ # Unrecognized option:
+ -*) echo "$scriptname: unknown option '$1'"; exit 1;;
+ esac
+done
+
+
+
+
+
+# Sanity checks
+# -------------
+#
+# Make sure that the build directory is given and that it exists.
+if [ x$build_dir = x ]; then
+ printf "$scriptname: '--build-dir' not provided, this is the location "
+ printf "that all built analysis files will be kept on the host OS\n"
+ exit 1;
+else
+ if ! [ -d $build_dir ]; then
+ printf "$scriptname: '$build_dir' (value to '--build-dir') doesn't "
+ printf "exist\n"; exit 1;
+ fi
+fi
+
+# The temporary directory to place the Dockerfile.
+tmp_dir="$build_dir"/temporary-docker-container-dir
+
+
+
+
+# Directory preparations
+# ----------------------
+#
+# If the host operating system has '/dev/shm', then give Docker access
+# to it also for improved speed in some scenarios (like configuration).
+if [ -d /dev/shm ]; then shm_mnt="-v /dev/shm:/dev/shm";
+else shm_mnt=""; fi
+
+# If the following directories do not exist within the build directory,
+# create them to make sure the '--mount' commands always work and
+# that any file. Ideally, the 'input' directory should not be under the 'build'
+# directory, but if the user hasn't given it then they don't care about
+# potentially deleting it later (Maneage will download the inputs), so put
+# it in the build directory.
+analysis_dir="$build_dir"/analysis
+if ! [ -d $analysis_dir ]; then mkdir $analysis_dir; fi
+
+# If no '--source-dir' was given, set it to the output of 'pwd -P' (to get
+# the path without potential symbolic links) in the running directory.
+if [ x"$source_dir" = x ]; then source_dir=$(pwd -P); fi
+
+# Only when an an input directory is given, we need the respective 'mount'
+# option for the 'docker run' command.
+input_dir_mnt=""
+if ! [ x"$input_dir" = x ]; then
+ input_dir_mnt="-v $input_dir:/home/maneager/input"
+fi
+
+# If no '--jobs' has been specified, use the maximum available jobs to the
+# operating system.
+if [ x$jobs = x ]; then jobs=$(nproc); fi
+
+# [DOCKER-ONLY] Make sure the user is a member of the 'docker' group:
+glist=$(groups $(whoami) | awk '/docker/')
+if [ x"$glist" = x ]; then
+ printf "$scriptname: you are not a member of the 'docker' group "
+ printf "You can run the following command as root to fix this: "
+ printf "'usermod -aG docker $(whoami)'\n"
+ exit 1
+fi
+
+# [DOCKER-ONLY] Function to check the temporary directory for building the
+# base operating system docker image. It is necessary that this directory
+# be empty because Docker will inherit the sub-directories of the directory
+# that the Dockerfile is located in.
+tmp_dir_check () {
+ if [ -d $tmp_dir ]; then
+ printf "$scriptname: '$tmp_dir' already exists, please "
+ printf "delete it and re-run this script. This is a temporary "
+ printf "directory only necessary when building a Docker image "
+ printf "and gets deleted automatically after a successful "
+ printf "build. The fact that it remains hints at a problem "
+ printf "in a previous attempt to build a Docker image\n"
+ exit 1
+ else
+ mkdir $tmp_dir
+ fi
+}
+
+
+
+
+
+# Base operating system
+# ---------------------
+#
+# If the base image does not exist, then create it. If it does, inform the
+# user that it will be used.
+if docker image list | grep $base_name &> /dev/null; then
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: base OS docker image ('$base_name') "
+ printf "already exists and will be used. If you want to build a "
+ printf "new base OS image, give a new name to '--base-name'. "
+ printf "To remove this message run with '--quiet'\n"
+ fi
+else
+
+ # In case an image file is given, load the environment from that (no
+ # need to build the environment from scratch).
+ if ! [ x"$image_file" = x ] && [ -f "$image_file" ]; then
+ docker load --input $image_file
+ else
+
+ # Build the temporary directory.
+ tmp_dir_check
+
+ # Build the Dockerfile.
+ uid=$(id -u)
+ cat <<EOF > $tmp_dir/Dockerfile
+FROM $base_os
+RUN useradd -ms /bin/sh --uid $uid maneager; \\
+ printf '123\n123' | passwd maneager; \\
+ printf '456\n456' | passwd root
+RUN apt update; apt install -y gcc g++ wget; echo 'export PS1="[\[\033[01;31m\]\u@\h \W\[\033[32m\]\[\033[00m\]]# "' >> ~/.bashrc
+USER maneager
+WORKDIR /home/maneager
+RUN mkdir build; mkdir build/analysis; echo 'export PS1="[\[\033[01;35m\]\u@\h \W\[\033[32m\]\[\033[00m\]]$ "' >> ~/.bashrc
+EOF
+
+ # Build the base-OS container and delete the temporary directory.
+ curdir="$(pwd)"
+ cd $tmp_dir
+ docker build ./ \
+ -t $base_name \
+ --shm-size=$shm_size
+ cd "$curdir"
+ rm -rf $tmp_dir
+ fi
+fi
+
+
+
+
+
+# Maneage software configuration
+# ------------------------------
+#
+# Having the base operating system in place, we can now construct the
+# project's docker file.
+if docker image list | grep $project_name &> /dev/null; then
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: project's image ('$project_name') "
+ printf "already exists and will be used. If you want to build a "
+ printf "new project image, give a new name to '--project-name'. "
+ printf "To remove this message run with '--quiet'\n"
+ fi
+else
+
+ # Build the temporary directory.
+ tmp_dir_check
+ df=$tmp_dir/Dockerfile
+
+ # The only way to mount a directory inside the Docker build environment
+ # is the 'RUN --mount' command. But Docker doesn't recognize things
+ # like symbolic links. So we need to copy the project's source under
+ # this temporary directory.
+ sdir=source
+ mkdir $tmp_dir/$sdir
+ dsr=/home/maneager/source-raw
+ cp -r $source_dir/* $source_dir/.git $tmp_dir/$sdir
+
+ # Start constructing the Dockerfile.
+ #
+ # Note on the printf's '\x5C\n' part: this will print out as a
+ # backslash at the end of the line to allow easy human readability of
+ # the Dockerfile (necessary for debugging!).
+ echo "FROM $base_name" > $df
+ printf "RUN --mount=type=bind,source=$sdir,target=$dsr \x5C\n" >> $df
+
+ # If a software directory was given, copy it and add its line.
+ tsdir=tarballs-software
+ dts=/home/maneager/tarballs-software
+ if ! [ x"$software_dir" = x ]; then
+
+ # Make the directory to host the software and copy the contents
+ # that the user gave there.
+ mkdir $tmp_dir/$tsdir
+ cp -r "$software_dir"/* $tmp_dir/$tsdir/
+ printf " --mount=type=bind,source=$tsdir,target=$dts \x5C\n" >> $df
+ fi
+
+ # Construct the rest of the 'RUN' command.
+ printf " cp -r $dsr /home/maneager/source; \x5C\n" >> $df
+ printf " cd /home/maneager/source; \x5C\n" >> $df
+ printf " ./project configure --jobs=$jobs \x5C\n" >> $df
+ printf " --build-dir=/home/maneager/build \x5C\n" >> $df
+ printf " --input-dir=/home/maneager/input \x5C\n" >> $df
+ printf " --software-dir=$dts; \x5C\n" >> $df
+
+ # We are deleting the '.build/software/tarballs' directory because this
+ # directory is not relevant for the analysis of the project. But in
+ # case any tarball was downloaded, it will consume space within the
+ # container.
+ printf " rm -rf .build/software/tarballs; \x5C\n" >> $df
+
+ # We are deleting the source directory becaues later (at 'docker run'
+ # time), the 'source' will be mounted directly from the host operating
+ # system.
+ printf " cd /home/maneager; \x5C\n" >> $df
+ printf " rm -rf source\n" >> $df
+
+ # Build the Maneage container and delete the temporary directory. The
+ # '--progress plain' option is for Docker to print all the outputs
+ # (otherwise, it will only print a very small part!).
+ cd $tmp_dir
+ docker build ./ -t $project_name \
+ --progress=plain \
+ --shm-size=$shm_size \
+ --no-cache \
+ 2>&1 | tee build.log
+ cd ..
+ rm -rf $tmp_dir
+fi
+
+# If the user wants to save the container (into a file that does not
+# exist), do it here. If the file exists, it will only be used for creating
+# the container in the previous stages.
+if ! [ x"$image_file" = x ] && ! [ -f "$image_file" ]; then
+
+ # Save the image into a tarball
+ tarname=$(echo $image_file | sed -e's|.gz$||')
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: saving docker image to '$tarname'"
+ fi
+ docker save -o $tarname $project_name
+
+ # Compress the saved image
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: compressing to '$image_file' (can "
+ printf "take +10 minutes, but volume decreases by more than half!)"
+ fi
+ gzip --best $tarname
+fi
+
+# If the user just wanted to build the base operating system, abort the
+# script here.
+if ! [ x"$build_only" = x ]; then
+ if [ $quiet = 0 ]; then
+ printf "$scriptname: info: Maneaged project has been configured "
+ printf "successfully in the '$project_name' image"
+ fi
+ exit 0
+fi
+
+
+
+
+
+# Run the analysis within the Maneage'd container
+# -----------------------------------------------
+#
+# The startup command of the container is managed though the 'shellopt'
+# variable that starts here.
+shellopt=""
+if [ $container_shell = 1 ] || [ $project_shell = 1 ]; then
+
+ # If the user wants to start the project shell within the container,
+ # add the necessary command.
+ if [ $project_shell = 1 ]; then
+ shellopt="/bin/bash -c 'cd source; ./project shell;'"
+ fi
+
+ # Finish the 'shellop' string with a single quote (necessary in any
+ # case) and run Docker.
+ interactiveopt="-it"
+
+# No interactive shell requested, just run the project.
+else
+ interactiveopt=""
+ shellopt="/bin/bash -c 'cd source; ./project make --jobs=$jobs;'"
+fi
+
+# Execute Docker. The 'eval' is because the 'shellopt' variable contains a
+# single-quote that the shell should "evaluate".
+eval docker run \
+ -v "$analysis_dir":/home/maneager/build/analysis \
+ -v "$source_dir":/home/maneager/source \
+ $input_dir_mnt \
+ $shm_mnt \
+ $interactiveopt \
+ $project_name \
+ $shellopt
diff --git a/reproduce/software/make/README.md b/reproduce/software/make/README.md
index d2b6952..00afef4 100644
--- a/reproduce/software/make/README.md
+++ b/reproduce/software/make/README.md
@@ -1,7 +1,7 @@
Software building instructions
------------------------------
-Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>\
+Copyright (C) 2019-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>\
See the end of the file for license conditions.
This directory contains Makefiles that are called by the high-level
diff --git a/reproduce/software/make/atlas-multiple.mk b/reproduce/software/make/atlas-multiple.mk
index 5c8f14c..6e7d415 100644
--- a/reproduce/software/make/atlas-multiple.mk
+++ b/reproduce/software/make/atlas-multiple.mk
@@ -8,7 +8,7 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 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
diff --git a/reproduce/software/make/atlas-single.mk b/reproduce/software/make/atlas-single.mk
index 4e2b04a..2b68677 100644
--- a/reproduce/software/make/atlas-single.mk
+++ b/reproduce/software/make/atlas-single.mk
@@ -8,7 +8,7 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 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
diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk
index f40dd6f..c9aba96 100644
--- a/reproduce/software/make/basic.mk
+++ b/reproduce/software/make/basic.mk
@@ -21,9 +21,9 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
-# Copyright (C) 2022-2023 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2022-2025 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
#
# 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
@@ -49,14 +49,15 @@ include reproduce/software/config/checksums.conf
include reproduce/software/config/urls.conf
# Basic directories
-lockdir = $(BDIR)/software/locks
-tdir = $(BDIR)/software/tarballs
-ddir = $(BDIR)/software/build-tmp
-idir = $(BDIR)/software/installed
-ibdir = $(BDIR)/software/installed/bin
-ildir = $(BDIR)/software/installed/lib
-iidir = $(BDIR)/software/installed/include
-ibidir = $(BDIR)/software/installed/version-info/proglib
+lockdir = $(BDIR)/software/locks
+tdir = $(BDIR)/software/tarballs
+ddir = $(BDIR)/software/build-tmp
+idir = $(BDIR)/software/installed
+ibdir = $(BDIR)/software/installed/bin
+ildir = $(BDIR)/software/installed/lib
+iidir = $(BDIR)/software/installed/include
+shsrcdir = "$(shell pwd)"/reproduce/software/shell
+ibidir = $(BDIR)/software/installed/version-info/proglib
# Ultimate Makefile target. GNU Nano (a simple and very light-weight text
# editor) is installed by default, it is recommended to have it in the
@@ -107,6 +108,15 @@ export CPPFLAGS := -I$(idir)/include $(CPPFLAGS) $(noccwarnings)
# 'LD_LIBRARY_PATH', then we'll add our own newly installed libraries. We
# will also make sure that there is no "current directory" in it (by
# removing a starting or trailing ':' and any occurance of '::'.
+#
+# But first: in case LD_LIBRARY_PATH is empty, give it the default value of
+# $(sys_library_sh_path) (which was the location of the libraries needed by
+# the host's shell). This is because after we add the Maneage's library
+# path, on some systems, no other libraries will be checked except those
+# that are in 'LD_LIBRARY_PATH'.
+ifeq ($(strip $(LD_LIBRARY_PATH)),)
+export LD_LIBRARY_PATH=$(sys_library_sh_path)
+endif
export LD_LIBRARY_PATH := $(shell echo $(LD_LIBRARY_PATH):$(ildir) \
| sed -e's/::/:/g' -e's/^://' -e's/:$$//')
@@ -127,17 +137,24 @@ export DYLD_LIBRARY_PATH :=
# Afer putting everything together, we use the first server as the
# reference for all software if their '-url' variable isn't defined (in
# 'reproduce/software/config/urls.conf').
-downloadwrapper = ./reproduce/analysis/bash/download-multi-try
+downloadwrapper = ./reproduce/analysis/bash/download-multi-try.sh
maneage_backup_urls := $(shell awk '!/^#/{printf "%s ", $$1}' \
reproduce/software/config/servers-backup.conf)
backupservers_all = $(user_backup_urls) $(maneage_backup_urls)
topbackupserver = $(word 1, $(backupservers_all))
backupservers = $(filter-out $(topbackupserver),$(backupservers_all))
-
-
-
-
+# When building in Apptainer containers, as of 2025-04-18, we need to
+# configure Maneage as root (within the container). In such cases, we need
+# to activate the 'FORCE_UNSAFE_CONFIGURE' environment variable to build
+# some of the software. The 'if' statement is here to make sure we are in
+# Apptainer: in other situations, the "unsafe" configure script shouldn't
+# be activated. Note that this doesn't happen in Docker (where the Maneage
+# source is in the same directory) because we build a non-root ('maneager'
+# user there who executes the configure command.
+unsafe-config = if [ $$(pwd) = "/home/maneager/source" ] \
+ && [ $$(whoami) = root ]; then \
+ export FORCE_UNSAFE_CONFIGURE=1; fi
@@ -251,11 +268,8 @@ $(ibidir)/low-level-links: $(ibidir)/grep-$(grep-version) \
#
# The first set of programs to be built are those that we need to unpack
# the source code tarballs of each program. We have already installed Lzip
-# before calling 'basic.mk', so it is present and working. Hence we first
-# build the Lzipped tarball of Gzip, then use our own Gzip to unpack the
-# tarballs of the other compression programs. Once all the compression
-# programs/libraries are complete, we build our own GNU Tar and continue
-# with other software.
+# before calling 'basic.mk', so it is present and working. So the only
+# prerequisites of these (until reaching Tar) is the necessary directories.
$(lockdir): | $(BDIR); mkdir $@
$(ibidir)/gzip-$(gzip-version): | $(ibdir) $(ildir) $(lockdir)
tarball=gzip-$(gzip-version).tar.lz
@@ -263,49 +277,13 @@ $(ibidir)/gzip-$(gzip-version): | $(ibdir) $(ildir) $(lockdir)
$(call gbuild, gzip-$(gzip-version), static, , V=1)
echo "GNU Gzip $(gzip-version)" > $@
-# 2022-07-14 B Roukema
-#
-# xz-5.2.5 fails on (at least) CentOS 7 (Redhat) systems while trying
-# to compile 'cmake' in Maneage - this is Maneage bug 62700 [1].
-#
-# The fix appears to be just a few lines, although it's not clear
-# how robust or long-term it is. Since we don't yet have 'patch' in
-# 'basic.mk', this file has to be copied into place rather than patched.
-
-# xz-5.2.5_src_liblzma_liblzma.map is a patched
-# version of xz-5.2.5/src/liblzma/liblzma.map based on discussion at
-# [1] + [2] + the patch file [3].
-#
-# [1] https://savannah.nongnu.org/bugs/index.php?62700
-# [2] https://github.com/easybuilders/easybuild-easyconfigs/issues/14991
-# [3] https://raw.githubusercontent.com/easybuilders/easybuild-easyconfigs/bcebb3320ffb63f9804ca8d4d64d1822ec7c9792/easybuild/easyconfigs/x/XZ/XZ-5.2.5_compat-libs.patch
-$(ibidir)/xz-$(xz-version): $(ibidir)/gzip-$(gzip-version)
-
-# Prepare the tarball.
+$(ibidir)/xz-$(xz-version): | $(ibdir) $(ildir) $(lockdir)
tarball=xz-$(xz-version).tar.lz
$(call import-source, $(xz-url), $(xz-checksum))
-
-# Until the bug mentioned above is fixed, we'll can't use the generic
-# rule.
-# $(call gbuild, xz-$(xz-version), static)
-
-# Configure and build with patched file.
- srcdir=$$(pwd)
- unpackdir=xz-$(xz-version)
- patchedfile=xz-5.2.5_src_liblzma_liblzma.map
- cd $(ddir)
- rm -rf $$unpackdir
- tar -x -f $(tdir)/$$tarball
- cd $$unpackdir
- cp -pv $$srcdir/reproduce/software/patches/$$patchedfile \
- src/liblzma/liblzma.map # copy the fixed file into place
- ./configure --prefix=$(idir)
- make install
- cd ..
- rm -rf $$unpackdir
+ $(call gbuild, xz-$(xz-version), static)
echo "XZ Utils $(xz-version)" > $@
-$(ibidir)/bzip2-$(bzip2-version): $(ibidir)/gzip-$(gzip-version)
+$(ibidir)/bzip2-$(bzip2-version): | $(ibdir) $(ildir) $(lockdir)
# Download the tarball.
tarball=bzip2-$(bzip2-version).tar.lz
@@ -334,8 +312,9 @@ $(ibidir)/bzip2-$(bzip2-version): $(ibidir)/gzip-$(gzip-version)
fi
cd $(ddir)
rm -rf $$tdir
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$tdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
sed -e 's@\(ln -s -f \)$$(PREFIX)/bin/@\1@' Makefile \
> Makefile.sed
mv Makefile.sed Makefile
@@ -355,7 +334,7 @@ $(ibidir)/bzip2-$(bzip2-version): $(ibidir)/gzip-$(gzip-version)
#
# Note for a static-only build: Zlib's './configure' doesn't use Autoconf's
# configure script, it just accepts a direct '--static' option.
-$(ibidir)/zlib-$(zlib-version): $(ibidir)/gzip-$(gzip-version)
+$(ibidir)/zlib-$(zlib-version): | $(ibdir) $(ildir) $(lockdir)
tarball=zlib-$(zlib-version).tar.lz
$(call import-source, $(zlib-url), $(zlib-checksum))
$(call gbuild, zlib-$(zlib-version))
@@ -376,6 +355,7 @@ $(ibidir)/tar-$(tar-version): \
# a bottleneck here: only making Tar. So its more efficient to built
# it on multiple threads (even when the user's Make doesn't pass down
# the number of threads).
+ $(call unsafe-config)
tarball=tar-$(tar-version).tar.lz
$(call import-source, $(tar-url), $(tar-checksum))
$(call gbuild, tar-$(tar-version), , , -j$(numthreads) V=1)
@@ -443,6 +423,7 @@ $(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version)
rm -f $(ibdir)/bash* $(ibdir)/awk* $(ibdir)/gawk*
# Standard build process.
+ export CFLAGS="-std=c17 $$CFLAGS"
$(call gbuild, ncurses-$(ncurses-version), static, \
--with-shared --enable-rpath --without-normal \
--without-debug --with-cxx-binding \
@@ -486,6 +467,9 @@ $(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version)
#
# 5. A link is made to also be able to include files from the
# 'ncurses' headers.
+#
+# 6. Top-level symbolic links are made for the 'include' (.h) files.
+#
if [ x$(on_mac_os) = xyes ]; then so="dylib"; else so="so"; fi
if [ -f $(ildir)/libncursesw.$$so ]; then
@@ -510,6 +494,11 @@ $(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version)
ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/cursesw.pc
ln -fs $(idir)/include/ncursesw $(idir)/include/ncurses
+
+# Add symbolic links for the ncursesw/*.h 'include' files
+# so that they can be found in the top-level include/ directory.
+ cd "$(iidir)"
+ ln -fsv $(idir)/include/ncursesw/*.h .
echo "GNU NCURSES $(ncurses-version)" > $@
else
exit 1
@@ -573,7 +562,7 @@ $(ibidir)/bash-$(bash-version): \
if [ "x$(static_build)" = xyes ]; then stopt="--enable-static-link"
else stopt=""
fi;
- export CFLAGS="$$CFLAGS \
+ export CFLAGS="$$CFLAGS -std=c17 \
-DDEFAULT_PATH_VALUE='\"$(ibdir)\"' \
-DSTANDARD_UTILS_PATH='\"$(ibdir)\"' \
-DSYS_BASHRC='\"$(BASH_ENV)\"' "
@@ -632,8 +621,9 @@ $(ibidir)/perl-$(perl-version): $(ibidir)/patchelf-$(patchelf-version)
| awk '{printf("%d.%d", $$1, $$2)}')
cd $(ddir)
rm -rf perl-$(perl-version)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd perl-$(perl-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
./Configure -des \
-Dusethreads \
-Duseshrplib \
@@ -692,20 +682,16 @@ $(ibidir)/coreutils-$(coreutils-version): \
$(ibidir)/openssl-$(openssl-version)
# Import, unpack and enter the source directory.
+ $(call unsafe-config)
tarball=coreutils-$(coreutils-version).tar.lz
$(call import-source, $(coreutils-url), $(coreutils-checksum))
+
+# Unpack and enter the source.
cd $(ddir)
rm -rf coreutils-$(coreutils-version)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd coreutils-$(coreutils-version)
-
-# Set the configure script to use our shell, note that we can't
-# assume GNU SED here yet (it installs after Coreutils).
- sed -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \
- -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \
- configure > configure-tmp
- mv configure-tmp configure
- chmod +x configure
+ $(shsrcdir)/prep-source.sh $(ibdir)
# Configure, build and install Coreutils.
./configure --prefix=$(idir) SHELL=$(ibdir)/bash \
@@ -717,7 +703,7 @@ $(ibidir)/coreutils-$(coreutils-version): \
# Fix RPATH if necessary.
if [ -f $(ibdir)/patchelf ]; then
make SHELL=$(ibdir)/bash install DESTDIR=junkinst
- unalias ls || true # avoid decorated 'ls' commands with extra characters
+ unalias ls || true # Not decorated 'ls' (with extra characters).
instprogs=$$(ls junkinst/$(ibdir))
for f in $$instprogs; do
$(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/$$f
@@ -742,8 +728,9 @@ $(ibidir)/podlators-$(podlators-version): $(ibidir)/perl-$(perl-version)
$(call import-source, $(podlators-url), $(podlators-checksum))
cd $(ddir)
rm -rf podlators-$(podlators-version)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd podlators-$(podlators-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
perl Makefile.PL
make
make install
@@ -766,7 +753,7 @@ $(ibidir)/openssl-$(openssl-version): $(ibidir)/podlators-$(podlators-version) \
# First download the certificates and copy them into the
# installation directory.
tarball=cert.pem-$(certpem-version)
- $(call import-source, $(cert-url), $(cert-checksum))
+ $(call import-source, $(certpem-url), $(certpem-checksum))
cp $(tdir)/cert.pem-$(certpem-version) $(idir)/etc/ssl/cert.pem
# Now download the OpenSSL tarball.
@@ -1028,9 +1015,10 @@ $(ibidir)/gmp-$(gmp-version): \
$(ibidir)/coreutils-$(coreutils-version)
tarball=gmp-$(gmp-version).tar.lz
$(call import-source, $(gmp-url), $(gmp-checksum))
+ export CFLAGS="-std=c17 $$CFLAGS"
$(call gbuild, gmp-$(gmp-version), static, \
--enable-cxx --enable-fat, \
- -j$(numthreads) ,make check)
+ -j$(numthreads))
echo "GNU Multiple Precision Arithmetic Library $(gmp-version)" > $@
# Less is useful with Git (to view the diffs within a minimal container)
@@ -1039,7 +1027,19 @@ $(ibidir)/gmp-$(gmp-version): \
$(ibidir)/less-$(less-version): $(ibidir)/ncurses-$(ncurses-version)
tarball=less-$(less-version).tar.lz
$(call import-source, $(less-url), $(less-checksum))
- $(call gbuild, less-$(less-version), static,,-j$(numthreads))
+
+# Without the '--with-regex=posix' option, the build will depend on
+# PCRE (perl compatible regular expressions) which are not available
+# on some systems/compilers and can cause a crash. Maneage was
+# successfully built with the POSIX regular expression (regex), and
+# 'less' is generally, an interactive software, not a batch-mode
+# software (it is just added in 'basic.mk' because Git uses it to
+# display things. Again, this is an interactive meta-operation in
+# maneage (operations you only do when you are developing Maneage
+# within Maneage interactively, and will not affect into the actual
+# reproducible analysis!)
+ $(call gbuild, less-$(less-version), static, \
+ --with-regex=posix,-j$(numthreads))
if [ -f $(ibdir)/patchelf ]; then
$(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/less;
fi
@@ -1058,16 +1058,28 @@ $(ibidir)/libtool-$(libtool-version): $(ibidir)/m4-$(m4-version)
$(ibidir)/grep-$(grep-version): $(ibidir)/coreutils-$(coreutils-version)
tarball=grep-$(grep-version).tar.lz
$(call import-source, $(grep-url), $(grep-checksum))
- $(call gbuild, grep-$(grep-version), static,,V=1)
+ $(call gbuild, grep-$(grep-version), static,, \
+ -j$(numthreads) V=1)
echo "GNU Grep $(grep-version)" > $@
# M4 doesn't depend on PatchELF, but just to be consistent with the
# levels/phases introduced here (where the compressors are level 1,
# PatchELF is level 2, and ...), we'll set it as a dependency.
+#
+# The '--with-syscmd-shell' is used as the default shell and if not given,
+# 'm4' will use '/bin/sh' (which is not under Maneage control and can cause
+# problems in 'high-level.mk' because it closes off the system's
+# LD_LIBRARY_PATH and if the system's '/bin/sh' needs a special system
+# library, the high-level programs will not be built). We are setting this
+# default shell to Dash because M4 is built before our own Bash. Recall
+# that Dash is built before we enter this Makefile.
$(ibidir)/m4-$(m4-version): $(ibidir)/patchelf-$(patchelf-version)
tarball=m4-$(m4-version).tar.lz
$(call import-source, $(m4-url), $(m4-checksum))
- $(call gbuild, m4-$(m4-version), static,,V=1)
+ export CFLAGS="-std=c17 $$CFLAGS"
+ $(call gbuild, m4-$(m4-version), static, \
+ --with-syscmd-shell=$(ibdir)/dash, \
+ -j$(numthreads) V=1)
echo "GNU M4 $(m4-version)" > $@
$(ibidir)/mpfr-$(mpfr-version): $(ibidir)/gmp-$(gmp-version)
@@ -1097,6 +1109,7 @@ $(ibidir)/pkg-config-$(pkgconfig-version): $(ibidir)/patchelf-$(patchelf-version
if [ x$(on_mac_os) = xyes ]; then export compiler="CC=clang"
else export compiler=""
fi
+ export CFLAGS="-std=c17 $$CFLAGS"
$(call gbuild, pkg-config-$(pkgconfig-version), static, \
$$compiler --with-internal-glib \
--with-pc-path=$(ildir)/pkgconfig, V=1)
@@ -1157,7 +1170,7 @@ $(ibidir)/mpc-$(mpc-version): $(ibidir)/mpfr-$(mpfr-version)
echo "" > $@
else
$(call gbuild, mpc-$(mpc-version), static, , \
- -j$(numthreads), make check)
+ -j$(numthreads))
echo "GNU Multiple Precision Complex library" > $@
fi
@@ -1216,7 +1229,8 @@ $(ibidir)/binutils-$(binutils-version): \
# Build binutils with the standard 'gbuild' function.
$(call gbuild, binutils-$(binutils-version), static, \
- --with-lib-path=$(sys_library_path), \
+ --with-lib-path=$(sys_library_path) \
+ --enable-gprofng=no, \
-j$(numthreads) V=1)
# The 'ld' linker of Binutils needs several '*crt*.o' files from
@@ -1344,21 +1358,35 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version)
# to avoid building so many small/temporary files and possibly
# harming the hard-drive or SSD. But if the RAM doesn't have enough
# space, we should use the hard-drive or SSD. During its build,
-# GCC's build directory will become about 7GiB (in units of 1024^3
-# bytes, for GCC 12.1.0, which corresponds to 7.5GB, in units of
-# 1000^3 bytes). So at this step, we make sure that we have more
-# than 12GiB before GCC starts to build. See the figure in the link
-# below for GCC's RAM consumption as a function of time:
+# GCC's build directory will become several gigabytes and the build
+# also needs RAM. You can track the RAM usage of the system with a
+# 1-second resolution (if no other RAM consuming program is running
+# while building GCC) with the command below (example outputs can
+# be seen in https://savannah.nongnu.org/task/index.php?16623).
#
-# https://savannah.nongnu.org/task/?16244#comment12
+# c=1; while true; do POSIXLY_CORRECT=1 df -P /dev/shm/maneage-* | awk 'NR==2{print '$c', $3}'; c=$((c+1)); sleep 1; done > mem-usage.txt
+# asttable mem-usage.txt -c1,'arith $2 512 x 1024 / 1024 / 1024 /' -o mem.fits
#
# For POSIX portability and longevity (default sizes might change),
# we use the '-P' option, and we use the environment variable
-# POSIXLY_CORRECT=1, so the 'block size' is 512 bytes. We'll also
-# allow for about ~0.5 GB at the start.
+# POSIXLY_CORRECT=1, so the 'block size' is 512 bytes. In this way,
+# to get the actual GiB amount, multiply the value returned above
+# by 512 (B/block), then divide by 1024^3 (B/GiB).
+#
+# To get the final value to use here, get the maximum used value
+# after GCC is fully built and you have stopped the 'while true'
+# command above. You can do this with the command below (assumes
+# you have Gnuastro).
#
-# So we need 8 GiB * 1024^3 (B/GiB) / 512 blocks/B = 16777216
-# blocks, in blocks of 512 bytes.
+# aststatistics mem-usage.txt -c2 --maximum | asttable -c'arith $1 7000000 +' -Afixed -B0
+#
+# The extra space is because we will assume an extra 3 GiB = 3GiB *
+# 1024^3 (B/GiB) / 512 (B/block) = 6291456 blocks are necessary for
+# the building (let's round it to 7000000!).
+#
+# Therefore, we need to make sure that the running system more than
+# the necessary amount of space in the RAM. To do this, we use 'df'
+# below.
#
# The 4th column of 'df' is the "available" space at the time of
# running, not the full space. So the 'RAM disk' that the OS
@@ -1368,7 +1396,7 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version)
# alone - no other Maneage software is built at the same time as
# GCC - so this amount of RAM should be enough.
in_ram=$$(POSIXLY_CORRECT=1 df -P $(ddir) \
- | awk 'NR==2{print ($$4>16777216) ? "yes" : "no"}'); \
+ | awk 'NR==2{print ($$4>26613216) ? "yes" : "no"}'); \
if [ $$in_ram = "yes" ]; then odir=$(ddir)
else
odir=$(BDIR)/software/build-tmp-gcc-due-to-lack-of-space
@@ -1382,11 +1410,12 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version)
# Unpack GCC and prepare the 'build' directory inside it for all
# the built files.
rm -rf gcc-$(gcc-version)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
if [ $$odir != $(ddir) ]; then
ln -s $$odir/gcc-$(gcc-version) $(ddir)/gcc-$(gcc-version)
fi
cd gcc-$(gcc-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
# Unfortunately binutils installs headers like 'ansidecl.h' that
# have been seen to conflict with GCC's internal versions of those
@@ -1494,14 +1523,26 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version)
-# Software that need re-compilation (to use our own libraries)
+# Level 6: need re-compilation
+# ----------------------------
+#
+# The initial build of these was done with the host's settings, which will
+# cause problems later when we completely close-off the host environment.
+$(ibidir)/make-$(make-version): $(ibidir)/gcc-$(gcc-version)
+ tarball=make-$(make-version).tar.lz
+ $(call import-source, $(make-url), $(make-checksum))
+ $(call gbuild, make-$(make-version), static, \
+ --disable-dependency-tracking --without-guile)
+ echo "GNU Make $(make-version)" > $@
+
$(ibidir)/lzip-$(lzip-version): $(ibidir)/gcc-$(gcc-version)
tarball=lzip-$(lzip-version).tar
unpackdir=lzip-$(lzip-version)
cd $(ddir)
rm -rf $$unpackdir
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
./configure --build --check --installdir="$(ibdir)"
if [ -f $(ibdir)/patchelf ]; then
$(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/lzip;
@@ -1514,11 +1555,7 @@ $(ibidir)/lzip-$(lzip-version): $(ibidir)/gcc-$(gcc-version)
-
-
-
-
-# Level 6: Basic text editor
+# Level 7: Basic text editor
# --------------------------
#
# If the project is built in a minimal environment, there is no text
@@ -1535,7 +1572,8 @@ $(ibidir)/lzip-$(lzip-version): $(ibidir)/gcc-$(gcc-version)
# nano (and use their own optional high-level text editor). To do this, you
# can just have to manually remove 'nano' from 'targets-proglib' above and
# add their optional text editor in 'TARGETS.conf'.
-$(ibidir)/nano-$(nano-version): $(ibidir)/lzip-$(lzip-version)
+$(ibidir)/nano-$(nano-version): $(ibidir)/lzip-$(lzip-version) \
+ $(ibidir)/make-$(make-version)
tarball=nano-$(nano-version).tar.lz
$(call import-source, $(nano-url), $(nano-checksum))
$(call gbuild, nano-$(nano-version), static)
diff --git a/reproduce/software/make/build-rules.mk b/reproduce/software/make/build-rules.mk
index c160d33..463fbbf 100644
--- a/reproduce/software/make/build-rules.mk
+++ b/reproduce/software/make/build-rules.mk
@@ -3,7 +3,7 @@
# imported into 'basic.mk' and 'high-level.mk'. They should be activated
# with Make's 'Call' function.
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2018-2025 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
@@ -160,7 +160,7 @@ uncompress = csuffix=$$(echo $$utarball \
intarrm=0; \
intar=$$utarball; \
fi; \
- if tar -xf $$intar; then \
+ if tar -xf $$intar --no-same-owner --no-same-permissions; then \
if [ x$$intarrm = x1 ]; then rm $$intar; fi; \
else \
echo; echo "Tar error"; exit 1; \
@@ -207,17 +207,10 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \
else confscript="$(strip $(6))"; \
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; \
+ $(shsrcdir)/prep-source.sh $(ibdir); \
+ if [ -f $(ibdir)/bash ]; then \
shellop="SHELL=$(ibdir)/bash"; \
- elif [ -f /bin/bash ]; then shellop="SHELL=/bin/bash"; \
- else shellop="SHELL=/bin/sh"; \
+ else shellop="SHELL=$(ibdir)/dash"; \
fi; \
\
if [ x$$gbuild_prefix = x ]; then prefixdir="$(idir)"; \
@@ -255,10 +248,7 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \
# CMake
# -----
#
-# According to the link below, in CMake '/bin/sh' is hardcoded, so there is
-# no way to change it unfortunately!
-#
-# https://stackoverflow.com/questions/21167014/how-to-set-shell-variable-in-makefiles-generated-by-cmake
+# Used by packages that are built with CMake.
cbuild = if [ x$(static_build) = xyes ] && [ $(2)x = staticx ]; then \
export LDFLAGS="$$LDFLAGS -static"; \
opts="-DBUILD_SHARED_LIBS=OFF"; \
@@ -268,13 +258,18 @@ cbuild = if [ x$(static_build) = xyes ] && [ $(2)x = staticx ]; then \
utarball=$(tdir)/$$tarball; \
$(call uncompress); \
cd $(1); \
- rm -rf project-build; \
- mkdir project-build; \
- cd project-build; \
+ $(shsrcdir)/prep-source.sh $(ibdir); \
+ if [ -f $(ibdir)/bash ]; then \
+ shellop="SHELL=$(ibdir)/bash"; \
+ else shellop="SHELL=$(ibdir)/dash"; \
+ fi; \
+ rm -rf maneage-build; \
+ mkdir maneage-build; \
+ cd maneage-build; \
cmake .. -DCMAKE_LIBRARY_PATH=$(ildir) \
-DCMAKE_INSTALL_PREFIX=$(idir) \
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON $$opts $(3); \
- make; \
- make install; \
+ make $$shellop; \
+ make $$shellop install; \
cd ../..; \
rm -rf $(1)
diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk
index 8f3b852..4ed5d62 100644
--- a/reproduce/software/make/high-level.mk
+++ b/reproduce/software/make/high-level.mk
@@ -12,8 +12,8 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 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
@@ -64,6 +64,12 @@ ipydir = $(BDIR)/software/installed/version-info/python
ircrandir = $(BDIR)/software/installed/version-info/r-cran
ilibrcrandir = $(BDIR)/software/installed/lib/R/library
+# Special files.
+makewshell = $(ibdir)/make-with-shell
+
+
+
+
# Targets to build.
ifeq ($(strip $(all_highlevel)),1)
@@ -112,11 +118,16 @@ else
endif
+# Disable the TeXLive target if `--offline`
+ifneq ($(strip $(offline)),1)
+ target-texlive := $(itidir)/texlive
+endif
+
# Ultimate Makefile target.
all: $(foreach p, $(targets-proglib), $(ibidir)/$(p)) \
$(foreach p, $(targets-python), $(ipydir)/$(p)) \
$(foreach p, $(targets-r-cran), $(ircrandir)/$(p)) \
- $(itidir)/texlive
+ $(target-texlive)
# Define the shell environment
# ----------------------------
@@ -232,7 +243,7 @@ $(idircustom):; mkdir $@
# Afer putting everything together, we use the first server as the
# reference for all software if their '-url' variable isn't defined (in
# 'reproduce/software/config/urls.conf').
-downloadwrapper = ./reproduce/analysis/bash/download-multi-try
+downloadwrapper = ./reproduce/analysis/bash/download-multi-try.sh
maneage_backup_urls := $(shell awk '!/^#/{printf "%s ", $$1}' \
reproduce/software/config/servers-backup.conf)
backupservers_all = $(user_backup_urls) $(maneage_backup_urls)
@@ -337,8 +348,10 @@ $(ibidir)/atlas-$(atlas-version):
# 'rpath_command'.
export LDFLAGS=-L$(ildir)
cd $(ddir)
- tar -xf $(tdir)/atlas-$(atlas-version).tar.lz
+ tar -xf $(tdir)/atlas-$(atlas-version).tar.lz \
+ --no-same-owner --no-same-permissions
cd ATLAS
+ $(shsrcdir)/prep-source.sh $(ibdir)
rm -rf build
mkdir build
cd build
@@ -393,8 +406,9 @@ $(ibidir)/boost-$(boost-version): \
rm -rf $(ddir)/$$unpackdir
topdir=$(pwd)
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
./bootstrap.sh --prefix=$(idir) --with-libraries=all \
--with-python=python3
echo "using mpi ;" > project-config.jam
@@ -414,12 +428,11 @@ $(ibidir)/cfitsio-$(cfitsio-version):
# systems. So we need to change it to our library installation
# path. It doesn't affect GNU/Linux, so we'll just do it in any case
# to keep things clean.
- topdir=$(pwd); cd $(ddir); tar -xf $(tdir)/$$tarball
+ topdir=$(pwd); cd $(ddir)
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
customtar=cfitsio-$(cfitsio-version)-custom.tar.gz
cd cfitsio-$(cfitsio-version)
- sed configure -e's|@rpath|$(ildir)|g' > configure_tmp
- mv configure_tmp configure
- chmod +x configure
+ sed -i -e's|@rpath|$(ildir)|g' configure
cd ..
tar cf $$customtar cfitsio-$(cfitsio-version)
cd $$topdir
@@ -427,11 +440,14 @@ $(ibidir)/cfitsio-$(cfitsio-version):
# Continue the standard build on the customized tarball. Note that
# with the installation of CFITSIO, 'fpack' and 'funpack' are not
# installed by default. Because of that, they are added explicity.
+#
+# Note that older versions of CFITSIO (before 4.4.0) require a
+# specific 'shared' target for the building of the shared libraries.
export gbuild_tar=$(ddir)/$$customtar
$(call gbuild, cfitsio-$(cfitsio-version), , \
--enable-sse2 --enable-reentrant \
--with-bzip2=$(idir), , \
- make shared fpack funpack)
+ make fpack funpack)
rm $$customtar
echo "CFITSIO $(cfitsio-version)" > $@
@@ -453,7 +469,8 @@ $(ibidir)/eigen-$(eigen-version):
tarball=eigen-$(eigen-version).tar.lz
$(call import-source, $(eigen-url), $(eigen-checksum))
rm -rf $(ddir)/eigen-eigen-*
- topdir=$(pwd); cd $(ddir); tar -xf $(tdir)/$$tarball
+ topdir=$(pwd); cd $(ddir)
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd eigen-$(eigen-version)
if ! [ -d $(iidir)/eigen3 ]; then mkdir $(iidir)/eigen3; fi
cp -r Eigen/* $(iidir)/eigen3/ # Some expect 'eigen3'.
@@ -518,6 +535,12 @@ $(ibidir)/fftw-$(fftw-version):
echo "FFTW $(fftw-version) \citep{fftw}" > $@
$(ibidir)/freetype-$(freetype-version): $(ibidir)/libpng-$(libpng-version)
+# As of version 2.13.2, FreeType doesn't account for the 'SHELL'
+# environment variable. The issue has been reported to the
+# developers. But until future versions, the work-around was
+# discoverd to be setting the 'GNUMAKE' environment variable so it
+# includes 'SHELL'.
+ export GNUMAKE="$(makewshell)"
tarball=freetype-$(freetype-version).tar.lz
$(call import-source, $(freetype-url), $(freetype-checksum))
$(call gbuild, freetype-$(freetype-version), static)
@@ -577,8 +600,10 @@ $(ibidir)/healpix-$(healpix-version): $(healpix-python-dep) \
fi
rm -rf $(ddir)/Healpix_$(healpix-version)
topdir=$(pwd); cd $(ddir);
- tar -xf $(tdir)/$$tarball
- cd Healpix_$(healpix-version)/src/C/autotools/
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd Healpix_$(healpix-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
+ cd src/C/autotools
autoreconf --install
./configure --prefix=$(idir)
make V=1 -j$(numthreads) SHELL=$(ibdir)/bash
@@ -667,9 +692,10 @@ $(ibidir)/libpaper-$(libpaper-version): \
# Unpack, build the configure system, build and install.
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
unpackdir=libpaper-$(libpaper-version)
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
autoreconf -fi
./configure --prefix=$(idir) --sysconfdir=$(idir)/etc \
--disable-static
@@ -792,17 +818,37 @@ $(ibidir)/metastore-$(metastore-version): \
echo "" > $@
fi
+# The Ninja build system (https://ninja-build.org) is also known as simply
+# "Ninja". But other package managers (for example Debian) use
+# "ninja-build" (the old "ninja" name has become obsolete there). Also,
+# their own URL is called "ninja-build". So we use the same convention in
+# Maneage.
+$(ibidir)/ninjabuild-$(ninjabuild-version): $(ibidir)/cmake-$(cmake-version)
+ tarball=ninjabuild-$(ninjabuild-version).tar.lz
+ $(call import-source, $(ninjabuild-url), $(ninjabuild-checksum))
+ cd $(ddir)
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd ninjabuild-$(ninjabuild-version)
+ cmake -Bbuild-cmake
+ cmake --build build-cmake -j$(numthreads)
+ ./build-cmake/ninja_test
+ cp -pv build-cmake/ninja $(ibdir)/
+ cd ..
+ rm -rf ninjabuild-$(ninjabuild-version)
+ echo "Ninja build system $(ninjabuild-version)" > $@
+
$(ibidir)/openblas-$(openblas-version):
- tarball=OpenBLAS-$(openblas-version).tar.lz
+ tarball=openblas-$(openblas-version).tar.lz
$(call import-source, $(openblas-url), $(openblas-checksum))
if [ x$(on_mac_os) = xyes ]; then export CC=clang; fi
cd $(ddir)
- tar -xf $(tdir)/$$tarball
- cd OpenBLAS-$(openblas-version)
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd openblas-$(openblas-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
make -j$(numthreads)
make PREFIX=$(idir) install
cd ..
- rm -rf OpenBLAS-$(openblas-version)
+ rm -rf openblas-$(openblas-version)
echo "OpenBLAS $(openblas-version)" > $@
$(ibidir)/openmpi-$(openmpi-version):
@@ -905,8 +951,8 @@ $(ibidir)/libgit2-$(libgit2-version): $(ibidir)/cmake-$(cmake-version)
-DUSE_SSH=OFF -DBUILD_CLAR=OFF \
-DTHREADSAFE=ON -DUSE_ICONV=OFF )
if [ x$(on_mac_os) = xyes ]; then
- install_name_tool -id $(ildir)/libgit2.1.3.dylib \
- $(ildir)/libgit2.1.3.dylib
+ install_name_tool -id $(ildir)/libgit2.1.9.dylib \
+ $(ildir)/libgit2.1.9.dylib
fi
echo "Libgit2 $(libgit2-version)" > $@
@@ -916,20 +962,27 @@ $(ibidir)/wcslib-$(wcslib-version): $(ibidir)/cfitsio-$(cfitsio-version)
tarball=wcslib-$(wcslib-version).tar.lz
$(call import-source, $(wcslib-url), $(wcslib-checksum))
-# If Fortran isn't present, don't build WCSLIB with it.
- if type gfortran &> /dev/null; then fortranopt="";
- else fortranopt="--disable-fortran"
- fi
-
-# Build WCSLIB.
+# Build WCSLIB while disabling some features:
+# - Fortran is disabled because as of May 2023, on macOS systems
+# where we do not install GCC (and thus a standard 'gfortran'), the
+# LLVM Fortran compiler is not complete and will cause a crash. If
+# you use the Fortran features of WCSLIB, feel free to remove
+# '--disable-fortran', but be careful with portability on other
+# systems. Hopefully some time in the future, GCC will also be
+# install-able on macOS within Maneage or LLVM's 'gfortran' will
+# also be complete and will not cause a crash.
+# - PGPLOT is disabled because it has many manual steps in its
+# installation. Therefore, we currently do not build PGPlots in
+# Maneage. Once (if) it is added, we can remove '--without-pgplot'.
$(call gbuild, wcslib-$(wcslib-version), , \
LIBS="-pthread -lcurl -lm" \
+ --without-pgplot \
+ --disable-fortran \
--with-cfitsiolib=$(ildir) \
- --with-cfitsioinc=$(idir)/include \
- --without-pgplot $$fortranopt)
+ --with-cfitsioinc=$(idir)/include)
if [ x$(on_mac_os) = xyes ]; then
- install_name_tool -id $(ildir)/libwcs.7.11.dylib \
- $(ildir)/libwcs.7.11.dylib
+ install_name_tool -id $(ildir)/libwcs.$(wcslib-version).dylib \
+ $(ildir)/libwcs.$(wcslib-version).dylib
fi
echo "WCSLIB $(wcslib-version)" > $@
@@ -998,8 +1051,9 @@ $(ibidir)/astrometrynet-$(astrometrynet-version): \
# 'astrometrynet'
cd $(ddir)
rm -rf astrometry.net-$(astrometrynet-version)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd astrometry.net-$(astrometrynet-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
sed -e 's|cat /proc/cpuinfo|echo "Ignoring CPU info"|' \
-e 's|-free|echo "Ignoring RAM info"|' Makefile > Makefile.tmp
mv Makefile.tmp Makefile
@@ -1036,8 +1090,9 @@ $(ibidir)/cdsclient-$(cdsclient-version):
tarball=cdsclient-$(cdsclient-version).tar.lz
$(call import-source, $(cdsclient-url), $(cdsclient-checksum))
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd cdsclient-$(cdsclient-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
touch *
./configure --prefix=$(idir)
make
@@ -1054,25 +1109,39 @@ $(ibidir)/cmake-$(cmake-version):
tarball=cmake-$(cmake-version).tar.lz
$(call import-source, $(cmake-url), $(cmake-checksum))
-# 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
+
+# CMake wants a single executable for 'MAKE', so we can't use 'make
+# SHELL=$(SHELL) and we have defined this script.
+ export MAKE="$(makewshell)"
+
+# Go into the unpacked directory and prepare CMake.
cd $(ddir)
rm -rf cmake-$(cmake-version)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd cmake-$(cmake-version)
- ./bootstrap --prefix=$(idir) --system-curl --system-zlib \
- --system-bzip2 --system-liblzma --no-qt-gui \
+ $(shsrcdir)/prep-source.sh $(ibdir)
+
+# Bootstrap, build and install CMake:
+# - With the '--no-system-libs' option, CMake builds and statically
+# links all the libraries it needs. Even though some of those (like
+# liblzma, libcurl, zlib or bzip2) are within Maneage, we
+# discovered that CMake can get confused and use out-of-Maneage
+# libraries (https://savannah.nongnu.org/bugs/?63043).
+ ./bootstrap --no-qt-gui \
+ --prefix=$(idir) \
+ --no-system-libs \
--parallel=$(numthreads)
- make -j$(numthreads) LIBS="$$LIBS -lssl -lcrypto -lz" VERBOSE=1
- make install
+ $(makewshell) VERBOSE=1 LIBS="$$LIBS -lssl -lcrypto -lz" \
+ -j$(numthreads)
+ $(makewshell) install
+
+# Clean up.
cd ..
rm -rf cmake-$(cmake-version)
echo "CMake $(cmake-version)" > $@
@@ -1120,13 +1189,16 @@ $(ibidir)/ghostscript-$(ghostscript-version): \
# '-DPNG_ARM_NEON_OPT=0' prevents an arm64 'neon' library from being
# required at compile time.
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd ghostscript-$(ghostscript-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
./configure --prefix=$(idir) \
--disable-cups \
--enable-dynamic \
--disable-compile-inits \
- CFLAGS="-DPNG_ARM_NEON_OPT=0"
+ --disable-hidden-visibility \
+ CFLAGS="-DPNG_ARM_NEON_OPT=0" \
+ LDFLAGS=-Wl,--copy-dt-needed-entries
# Build and install the program and the shared libraries.
make V=1 -j$(numthreads)
@@ -1140,9 +1212,9 @@ $(ibidir)/ghostscript-$(ghostscript-version): \
# Install the fonts.
tar -xvf $(tdir)/ghostscript-fonts-std-$(ghostscript-fonts-std-version).tar.lz \
- -C $(idir)/share/ghostscript
+ -C $(idir)/share/ghostscript --no-same-owner --no-same-permissions
tar -xvf $(tdir)/ghostscript-fonts-gnu-$(ghostscript-fonts-gnu-version).tar.lz \
- -C $(idir)/share/ghostscript
+ -C $(idir)/share/ghostscript --no-same-owner --no-same-permissions
fc-cache -v $(idir)/share/ghostscript/fonts/
echo; echo "Ghostscript fonts added to Fontconfig."; echo;
@@ -1163,7 +1235,7 @@ $(ibidir)/gnuastro-$(gnuastro-version): \
$(call gbuild, gnuastro-$(gnuastro-version), static, , \
-j$(numthreads))
cp $(dtexdir)/gnuastro.tex $(ictdir)/
- echo "GNU Astronomy Utilities $(gnuastro-version) \citep{gnuastro,akhlaghi19}" > $@
+ echo "GNU Astronomy Utilities $(gnuastro-version) \citep{gnuastro}" > $@
$(ibidir)/icu-$(icu-version): $(ibidir)/python-$(python-version)
@@ -1179,9 +1251,11 @@ $(ibidir)/icu-$(icu-version): $(ibidir)/python-$(python-version)
tarball=icu-$(icu-version).tar.lz
$(call import-source, $(icu-url), $(icu-checksum))
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
unpackdir=icu-$(icu-version)
- cd $$unpackdir/icu4c/source
+ cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
+ cd icu4c/source
./configure --enable-static --prefix=$(idir)
make -j$(numthreads) V=1
make install
@@ -1246,8 +1320,9 @@ $(ibidir)/imfit-$(imfit-version): \
cd $(ddir)
unpackdir=imfit-$(imfit-version)
rm -rf $$unpackdir
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
sed -i 's|/usr/local|$(idir)|g' SConstruct
sed -i 's|/usr/include|$(idir)/include|g' SConstruct
sed -i 's|.append(|.insert(0,|g' SConstruct
@@ -1293,8 +1368,10 @@ $(ibidir)/minizip-$(minizip-version): $(ibidir)/automake-$(automake-version)
unpackdir=minizip-$(minizip-version)
rm -rf $$unpackdir
mkdir $$unpackdir
- tar -xf $(tdir)/$$tarball -C$$unpackdir --strip-components=1
+ tar -xf $(tdir)/$$tarball -C$$unpackdir --strip-components=1 \
+ --no-same-owner --no-same-permissions
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
./configure --prefix=$(idir)
make
cd contrib/minizip
@@ -1354,8 +1431,9 @@ $(ibidir)/netpbm-$(netpbm-version): \
cd $(ddir)
unpackdir=netpbm-$(netpbm-version)
rm -rf $$unpackdir
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
# As of NetPBM 10.73.39 and Flex 2.6.4-410-74a89fd (commit 74a89fd in
# Flex's Git that is 410 commits after version 2.6.4), there is the
@@ -1473,8 +1551,9 @@ $(ibidir)/scons-$(scons-version): $(ibidir)/python-$(python-version)
cd $(ddir)
unpackdir=scons-$(scons-version)
rm -rf $$unpackdir
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
# Unfortuantely SCons hard-codes its search PATH in its source (to
# use POSIX operating system defaults)! So the only way to modify it
@@ -1518,7 +1597,7 @@ $(ibidir)/sextractor-$(sextractor-version): \
unpackdir=sextractor-$(sextractor-version)
cd $(ddir)
rm -rf $$unpackdir
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd $$unpackdir
# See comment above 'missfits' for '-fcommon'.
@@ -1606,7 +1685,10 @@ $(ibidir)/swig-$(swig-version):
# '$(ibdir)'. If any program does need 'util-linux' libraries, they can
# simply add the proper directories to the environment variables, see
# 'fontconfig' for example.
-$(ibidir)/util-linux-$(util-linux-version): | $(idircustom)
+$(ibidir)/util-linux-$(util-linux-version): \
+ $(ibidir)/autoconf-$(autoconf-version) \
+ $(ibidir)/automake-$(automake-version) \
+ | $(idircustom)
# Import the source.
tarball=util-linux-$(util-linux-version).tar.lz
@@ -1616,28 +1698,31 @@ $(ibidir)/util-linux-$(util-linux-version): | $(idircustom)
# explained above). As shown below, later, we'll put a symbolic link
# of all the necessary binaries in the main '$(idir)/bin'.
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd util-linux-$(util-linux-version)
+ $(shsrcdir)/prep-source.sh $(ibdir)
-# If a patch exists for the current version, apply it.
+# If a patch is necessary, apply it.
if [ -f $(patchdir)/util-linux-$(util-linux-version)-macos.patch ]; then
cp $(patchdir)/util-linux-$(util-linux-version)-macos.patch \
util-linux-$(util-linux-version)-macos.patch
git apply util-linux-$(util-linux-version)-macos.patch
fi
-# The 'mkswap' feature needs low-level file system and kernel headers
-# that are not always available (in particular on older Linux
-# kernels). Also, creating SWAP space will need root permissions, so
-# its not something a Maneager may need! Unfortunately there is no
-# configuration option to disable this so we'll have to disable it
-# manually by commenting the relevant files in the
-# 'configure.ac'. Having a more recent 'configure.ac' will trigger
-# the './configure' script to be re-created after the first run, but
-# it is pretty fast and not a problem.
+# The 'mkswap' feature needs low-level file system and kernel headers
+# that are not always available (in particular on older Linux
+# kernels). Also, creating SWAP space will need root permissions, so
+# its not something a Maneager may need! Unfortunately there is no
+# configuration option to disable this so we'll have to disable it
+# manually by commenting the relevant files in the
+# 'configure.ac'.
sed -e's|UL_BUILD_INIT(\[mkswap\], \[yes\])|UL_BUILD_INIT(\[mkswap\], \[no\])|' \
-i configure.ac
+# Having updated 'configure.ac', we need to re-generate the
+# './configure' script with 'autoreconf' (which is part of Autoconf
+# and needs Automake; hence why they are dependencies.
+ autoreconf -f
# Configure Util-linux
export CONFIG_SHELL=$(ibdir)/bash
@@ -1645,6 +1730,7 @@ $(ibidir)/util-linux-$(util-linux-version): | $(idircustom)
--disable-dependency-tracking \
--enable-libmount-support-mtab \
--disable-silent-rules \
+ --disable-liblastlog2 \
--disable-mountpoint \
--disable-libmount \
--disable-unshare \
@@ -1717,9 +1803,10 @@ $(ibidir)/vim-$(vim-version):
tarball=vim-$(vim-version).tar.lz
$(call import-source, $(vim-url), $(vim-checksum))
cd $(ddir)
- tar -xf $(tdir)/$$tarball
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
unpackdir=vim-$(vim-version)
cd $(ddir)/$$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
./configure --prefix=$(idir) \
--disable-canberra \
--enable-multibyte \
@@ -1786,12 +1873,19 @@ $(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf
@topdir=$$(pwd)
cd $(ddir)
rm -rf install-tl-*
- tar -xf $(tdir)/install-tl-unx.tar.gz
+ tar -xf $(tdir)/install-tl-unx.tar.gz \
+ --no-same-owner --no-same-permissions
cd install-tl-*
+ $(shsrcdir)/prep-source.sh $(ibdir)
sed -e's|@installdir[@]|$(idir)|g' \
"$$topdir"/reproduce/software/config/texlive.conf \
> texlive.conf
+# We do not build TeXLive from source and for its installation it
+# downloads components from the web internally; and those components
+# can use '/bin/sh' (which will need '$(sys_library_sh_path)').
+ export LD_LIBRARY_PATH="$(sys_library_sh_path):$$LD_LIBRARY_PATH"
+
# 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. Possible error
@@ -1860,13 +1954,17 @@ $(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf
tarballurl=$$url/install-tl-unx.tar.gz
touch $(lockdir)/download
downloader="wget --no-use-server-timestamps -O"
- if $(downloadwrapper) "$$downloader" $(lockdir)/download \
- $$tarballurl "$(tdir)/install-tl-unx.tar.gz" \
- "$(backupservers)"; then
+ if $(downloadwrapper) "$$downloader" \
+ $(lockdir)/download \
+ $$tarballurl \
+ "$(tdir)/install-tl-unx.tar.gz" \
+ "$(backupservers)"; then
cd $(ddir)
rm -rf install-tl-*
- tar -xf $(tdir)/install-tl-unx.tar.gz
+ tar -xf $(tdir)/install-tl-unx.tar.gz \
+ --no-same-owner --no-same-permissions
cd install-tl-*
+ $(shsrcdir)/prep-source.sh $(ibdir)
sed -e's|@installdir[@]|$(idir)|g' \
$$topdir/reproduce/software/config/texlive.conf \
> texlive.conf
@@ -1897,10 +1995,19 @@ $(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf
# Live itself (only very basic TeX and LaTeX) and the installation of its
# necessary packages into two packages.
#
-# Note that Biber needs to link with libraries like libnsl. However, we
-# don't currently build biber from source. So we can't choose the library
-# version. But we have the source and build instructions for the 'nsl'
-# library. When we later build biber from source, we can easily use them.
+# Note that we do not build the TeXLive executables (like Biber) from
+# source. So in case they need special libraries, we can't choose the
+# library version here (for example see [1] and [2]). In such cases there
+# is no solution but to manually add the location necessary library to
+# LD_LIBRARY_PATH when calling the respective LaTeX command in
+# 'reproduce/analysis/make/paper.mk'. Fortunately as of Biber 2.20, it does
+# not depend on anything except the C library (all dependencies are now
+# statically linked), so problems [1] and [2] will not happen. But this can
+# generally happen for any other tool/OS, so it is important to build
+# TeXLive from source as soon as possible [3].
+# [1] https://github.com/plk/biber/issues/445
+# [2] https://savannah.nongnu.org/bugs/index.php?63175
+# [3] https://savannah.nongnu.org/task/?15267
$(itidir)/texlive: reproduce/software/config/texlive-packages.conf \
$(itidir)/texlive-ready-tlmgr
@@ -1910,6 +2017,11 @@ $(itidir)/texlive: reproduce/software/config/texlive-packages.conf \
echo "" > $@
else
+# We do not build TeXLive from source and for its installation it
+# downloads components from the web internally; and those
+# components can use '/bin/sh' (which needs 'sys_library_sh_path').
+ export LD_LIBRARY_PATH="$(sys_library_sh_path):$$LD_LIBRARY_PATH"
+
# To update itself, tlmgr needs a backup directory.
backupdir=$(idir)/texlive/backups
mkdir -p $$backupdir
@@ -1933,6 +2045,13 @@ $(itidir)/texlive: reproduce/software/config/texlive-packages.conf \
# directory so we don't have to modify 'PATH'.
ln -fs $(idir)/texlive/maneage/bin/*/* $(ibdir)/
+# Correct any reference to '/bin/sh' within the installed LaTeX
+# files (this is because we do no yet install LaTeX from source):
+ cdir=$$(pwd)
+ cd $(idir)/texlive
+ $(shsrcdir)/prep-source.sh $(ibdir)
+ cd $$cdir
+
# Get all the necessary versions.
texlive=$$(pdflatex --version \
| awk 'NR==1' \
diff --git a/reproduce/software/make/python.mk b/reproduce/software/make/python.mk
index 936fab1..c994e3f 100644
--- a/reproduce/software/make/python.mk
+++ b/reproduce/software/make/python.mk
@@ -12,8 +12,8 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2019-2023 Raul Infante-Sainz <infantesainz@gmail.com>
-# Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2019-2025 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
@@ -51,6 +51,8 @@ export MPI_PYTHON3_SITEARCH :=
# Python-specific installation directories.
python-major-version = $(shell echo $(python-version) | awk 'BEGIN{FS="."} \
{printf "%d.%d\n", $$1, $$2}')
+# This is for 'installer' (the python installer) itself:
+ilibpymajorversion = $(idir)/lib/python$(python-major-version)
@@ -93,13 +95,48 @@ $(ibidir)/python-$(python-version): $(ibidir)/libffi-$(libffi-version)
export CC=clang
export CXX=clang++
fi
- $(call gbuild, python-$(python-version),, \
- --without-ensurepip \
- --with-system-ffi \
- --enable-shared, -j$(numthreads))
+
+# Unpack the tarball (see below for the necessary modification).
+ cd $(ddir)
+ unpackdir=python-$(python-version)
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
+
+# Python's 'setup.py' uses 'os.system' to run shell scripts. On the
+# other hand 'os.system' only runs '/bin/sh' (which has its own
+# libraries to link to and those are blocked at this level). So we
+# need to add an extra line on top of the 'os.system' funciton and
+# put '/usr/lib' in 'LD_LIBRARY_PATH' within Python's environment for
+# system calls (with 'os.putenv'). As of Python 3.13.2 the tarball no
+# longer has an 'setup.py'. But when it did, the change below was
+# necessary.
+ if [ -f setup.py ]; then
+ awk '{if(/os.system\(/) \
+ { print " os.putenv(\"LD_LIBRARY_PATH\", \"$$LD_LIBRARY_PATH:$(sys_library_sh_path)\");"; \
+ print $$0;} \
+ else print $$0}' \
+ setup.py > setup-tmp.py
+ mv setup-tmp.py setup.py
+ fi
+
+# Do the basic installation and delete the temporary directory.
+ ./configure SHELL=$(ibdir)/bash \
+ --enable-optimizations \
+ --without-ensurepip \
+ --prefix="$(idir)" \
+ --with-system-ffi \
+ --enable-shared
+ $(makewshell) -j$(numthreads)
+ $(makewshell) install -j$(numthreads)
+ cd ..
+ rm -rf $$unpackdir
+
+# Set the necessary environment variables and finish the build.
ln -sf $(ildir)/python$(python-major-version) $(ildir)/python
ln -sf $(ibdir)/python$(python-major-version) $(ibdir)/python
- ln -sf $(iidir)/python$(python-major-version)m $(iidir)/python$(python-major-version)
+ ln -sf $(iidir)/python$(python-major-version)m \
+ $(iidir)/python$(python-major-version)
rm -rf $(ipydir)
mkdir $(ipydir)
echo "Python $(python-version)" > $@
@@ -108,39 +145,138 @@ $(ibidir)/python-$(python-version): $(ibidir)/libffi-$(libffi-version)
-# Non-PiP Python module installation
+# 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). Note that the
-# software's packaged source code is the first prerequisite that is in the
-# 'tdir' directory.
+# Build strategy for python modules as of February 2025, for python 3.13.2.
+
+# This strategy is mostly based on recommendations by E Schwartz
+# (ztrawhcse) on #python (Libera Chat), in October 2022 and February
+# 2025. Some discussions are on documented in Savannah tasks [1][2]. The
+# build strategy for 'python-installer' is inspired by the gentoo script
+# 'python_domodule' [3].
+
+# Bootstrap-step: 'gpep517' [4], motivated by PEP 517 [5], together with
+# 'python-installer' (module called 'installer') are built without
+# dependences on other python packages apart from python itself. The build
+# rules for these two packages do python byte compilation and copy the .py
+# and .pyc files into the python install directory. These two packages are
+# considered to be 'frontends'.
+
+# Once these two frontends are available, other packages that do building
+# tasks, including both backends and alternative frontends or a mix of
+# these (in particular: setuptools, meson [6]/ninja-build [7] , flit-core,
+# and meson-python), can be built with the 'python-installer' and
+# 'gpep517'. The aims of the various build tools are diverse, include
+# ecosystem resilience, reproducibility, build speed and convenience in
+# building bigger packages such as numpy, scipy and astropy.
+
+# The python.mk script now includes only three methods: the boot
+# build methods of 'python-installer' and 'gpep517'; and the gpep517
+# frontend. No method is provided for using 'python-installer' directly;
+# it is invoked indirectly by source files of many packages, which
+# also give metadata describing information for build methods.
+
+# Why not pip? We do not build any python packages with 'pip' because we
+# want to have a fully documented pipeline of (i) the original upstream
+# locations of tarballs, (ii) the tarballs' checksums, and (iii) the exact
+# sequence of build commands.
+
+# For an alternative viewpoint on a python build strategy, see [8].
+
+# Prerequisite for the pybuild script here: the package's source code
+# (tarball) must already be located in the directory 'tdir'.
#
-# Arguments of this function are the numbers
+# Arguments:
# 1) Unpack command
# 2) Unpacked directory name after unpacking the tarball
# 3) site.cfg file (optional).
-# 4) Official software name (for paper).
+# 4) Official software name (for paper.tex).
+# 5) Obligatory parameter: build method (see below):
+# BOOT_INSTALLER - only for 'python-installer'
+# BOOT_GPEP517 - only for 'gpep517'
+# GPEP517 - for any other python package
#
# Hooks:
# pyhook_before: optional steps before running 'python setup.py build'
# pyhook_after: optional steps after running 'python setup.py install'
-pybuild = cd $(ddir); rm -rf $(2); \
- if ! $(1) $(tdir)/$$tarball; then \
+
+# [1] https://savannah.nongnu.org/task/?16268
+# [2] https://savannah.nongnu.org/task/?16625
+# [3] https://gitweb.gentoo.org/repo/gentoo.git/tree/eclass/python-utils-r1.eclass#n646
+# [4] https://pypi.org/project/gpep517
+# [5] https://peps.python.org/pep-0517
+# [6] https://mesonbuild.com
+# [7] https://ninja-build.org
+# [8] https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html
+
+
+pybuild = cd $(ddir); \
+ packagedir=$(strip $(2)); \
+ if (printf "$$packagedir" | grep "[a-z][a-z]"); then rm -rf $$packagedir; fi; \
+ printf "\nStarting to install python package with maneage pybuild rule: $(4)\n ..."; \
+ if ! $(1) $(tdir)/$$tarball --no-same-owner --no-same-permissions; then \
echo; echo "Tar error"; exit 1; \
fi; \
- cd $(2); \
+ cd $$packagedir; \
if [ "x$(strip $(3))" != x ]; then \
sed -e 's|@LIBDIR[@]|'"$(ildir)"'|' \
-e 's|@INCDIR[@]|'"$(idir)/include"'|' \
$(3) > site.cfg; \
fi; \
if type pyhook_before &>/dev/null; then pyhook_before; fi; \
- python setup.py build; \
- python setup.py install; \
+ printf "pybuild option5 = __ %s __\n" "$(strip $(5))"; \
+ if [ "x$(strip $(5))" = xBOOT_INSTALLER ]; then \
+ chmod 0644 src/installer/*.py; \
+ mkdir -p $(ilibpymajorversion)/installer; \
+ mkdir -p $(ilibpymajorversion)/installer/__pycache__ ; \
+ mkdir -p $(ilibpymajorversion)/installer/_scripts; \
+ mkdir -p $(ilibpymajorversion)/installer/_scripts/__pycache__ ; \
+ cp -pv src/installer/*.py $(ilibpymajorversion)/installer/; \
+ cp -pv src/installer/_scripts/__init__.py $(ilibpymajorversion)/installer/_scripts/; \
+ cd src/installer/; \
+ python -m compileall -o 1 -o 2 -l -f \
+ -d $(ilibpymajorversion)/installer/ .; \
+ chmod 0644 __pycache__/*.pyc; \
+ cp -pv __pycache__/*.pyc \
+ $(ilibpymajorversion)/installer/__pycache__; \
+ cd -; \
+ cd src/installer/_scripts/; \
+ python -m compileall -o 1 -o 2 -l -f \
+ -d $(ilibpymajorversion)/installer/_scripts/ __init__.py; \
+ chmod 0644 __pycache__/*.pyc; \
+ cp -pv __pycache__/*.pyc \
+ $(ilibpymajorversion)/installer/_scripts/__pycache__; \
+ cd -; \
+ elif [ "x$(strip $(5))" = xBOOT_GPEP517 ]; then \
+ chmod 0644 gpep517/*.py; \
+ mkdir -p $(ilibpymajorversion)/gpep517; \
+ mkdir -p $(ilibpymajorversion)/gpep517/__pycache__ ; \
+ cp -pv gpep517/*.py $(ilibpymajorversion)/gpep517/; \
+ cd gpep517/; \
+ python -m compileall -o 1 -o 2 -l -f \
+ -d $(ilibpymajorversion)/gpep517/ .; \
+ chmod 0644 __pycache__/*.pyc; \
+ cp -pv __pycache__/*.pyc \
+ $(ilibpymajorversion)/gpep517/__pycache__; \
+ cd -; \
+ elif [ "x$(strip $(5))" = xGPEP517 ]; then \
+ printf "\n\n\n=== python build method: gpep517 ====== "; pwd; \
+ printf "...............\n\n\n"; \
+ python -m gpep517 install-from-source \
+ --prefix "" \
+ --destdir $(idir) \
+ --optimize all; \
+ else \
+ printf "Error: Unknown pybuild method for $$packagedir: __ $(strip $(5)) __\n"; \
+ printf "The pybuild 5th parameter should very likely be set "; \
+ printf "to GPEP517 after checking the build rule and "; \
+ printf "upgrading if needed.\n"; \
+ exit 1; \
+ fi; \
if type pyhook_after &>/dev/null; then pyhook_after; fi; \
cd ..; \
- rm -rf $(2); \
+ if (printf "$$packagedir" | grep "[a-z][a-z]"); then rm -fr $$packagedir; fi; \
echo "$(4)" > $@
@@ -149,9 +285,11 @@ pybuild = cd $(ddir); rm -rf $(2); \
# Python modules
# ---------------
-#
+
+
# All the necessary Python modules go here.
-$(ipydir)/asn1crypto-$(asn1crypto-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/asn1crypto-$(asn1crypto-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
tarball=asn1crypto-$(asn1crypto-version).tar.gz
$(call import-source, $(asn1crypto-url), $(asn1crypto-checksum))
$(call pybuild, tar -xf, asn1crypto-$(asn1crypto-version), , \
@@ -172,25 +310,58 @@ $(ipydir)/astroquery-$(astroquery-version): \
$(call pybuild, tar -xf, astroquery-$(astroquery-version), , \
Astroquery $(astroquery-version))
+# Astropy: points to consider about dependencies:
+#
# The optional dependency 'h5py' that is necessary for writting tables in
# HDF5 format has been removed from Astropy because on macOS it cannot be
# installed.
+#
+# 2022-or-older dependencies:
+# $(ibidir)/expat-$(expat-version) \
+# $(ipydir)/jinja2-$(jinja2-version) \
+# $(ipydir)/html5lib-$(html5lib-version) \
+# $(ipydir)/beautifulsoup4-$(beautifulsoup4-version) \
+#
+# While the astropy pyproject.toml file says that the astropy build depends
+# on numpy, not scipy, and does not depend on matplotlib; the
+# runtime is recommended to depend on both scipy and matplotlib.
+# In practice, users of astropy will generally expect scipy and matplotlib
+# to be available at runtime, so we set these as prerequisites.
$(ipydir)/astropy-$(astropy-version): \
- $(ibidir)/expat-$(expat-version) \
$(ipydir)/scipy-$(scipy-version) \
- $(ipydir)/numpy-$(numpy-version) \
- $(ipydir)/pyyaml-$(pyyaml-version) \
- $(ipydir)/jinja2-$(jinja2-version) \
$(ipydir)/pyerfa-$(pyerfa-version) \
- $(ipydir)/html5lib-$(html5lib-version) \
- $(ipydir)/beautifulsoup4-$(beautifulsoup4-version) \
+ $(ipydir)/pyyaml-$(pyyaml-version) \
+ $(ipydir)/matplotlib-$(matplotlib-version) \
+ $(ipydir)/astropy-iers-data-$(astropy-iers-data-version) \
$(ipydir)/extension-helpers-$(extension-helpers-version)
+
+# Tarball and its preparation.
tarball=astropy-$(astropy-version).tar.lz
$(call import-source, $(astropy-url), $(astropy-checksum))
- $(call pybuild, tar -xf, astropy-$(astropy-version))
- cp $(dtexdir)/astropy.tex $(ictdir)/
+
+# Conservatively purge old version (but not astropy_iers,
+# astropy-iers):
+ rm -fvr $(idir)/lib/python*/site-packages/astropy/
+ rm -fvr $(idir)/lib/python*/site-packages/astropy-[0-9]*-info/
+ rm -fv $(idir)/bin/fits{diff,check,header,info,2bitmap}
+ rm -fv $(idir)/bin/{samp_hub,showtable,volint,wcslint}
+
+# Do the basic build.
+ $(call pybuild, tar -xf, astropy-$(astropy-version),,, \
+ GPEP517)
+ cp -pv $(dtexdir)/astropy.tex $(ictdir)/
echo "Astropy $(astropy-version) \citep{astropy2013,astropy2018}" > $@
+$(ipydir)/astropy-iers-data-$(astropy-iers-data-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=astropy-iers-data-$(astropy-iers-data-version).tar.lz
+ $(call import-source, $(astropy-iers-data-url), \
+ $(astropy-iers-data-checksum))
+ $(call pybuild, tar -xf, \
+ astropy-iers-data-$(astropy-iers-data-version),,, \
+ GPEP517)
+ echo "Astropy-Iers-Data $(astropy-iers-data-version)" > $@
+
$(ipydir)/beautifulsoup4-$(beautifulsoup4-version): \
$(ipydir)/soupsieve-$(soupsieve-version)
tarball=beautifulsoup4-$(beautifulsoup4-version).tar.lz
@@ -198,13 +369,17 @@ $(ipydir)/beautifulsoup4-$(beautifulsoup4-version): \
$(call pybuild, tar -xf, beautifulsoup4-$(beautifulsoup4-version), , \
BeautifulSoup $(beautifulsoup4-version))
-$(ipydir)/beniget-$(beniget-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/beniget-$(beniget-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=beniget-$(beniget-version).tar.lz
$(call import-source, $(beniget-url), $(beniget-checksum))
$(call pybuild, tar -xf, beniget-$(beniget-version), , \
Beniget $(beniget-version))
-$(ipydir)/certifi-$(certifi-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/certifi-$(certifi-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=certifi-$(certifi-version).tar.gz
$(call import-source, $(certifi-url), $(certifi-checksum))
$(call pybuild, tar -xf, certifi-$(certifi-version), , \
@@ -217,12 +392,23 @@ $(ipydir)/cffi-$(cffi-version): \
$(call import-source, $(cffi-url), $(cffi-checksum))
$(call pybuild, tar -xf, cffi-$(cffi-version), ,cffi $(cffi-version))
-$(ipydir)/chardet-$(chardet-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/chardet-$(chardet-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=chardet-$(chardet-version).tar.gz
$(call import-source, $(chardet-url), $(chardet-checksum))
$(call pybuild, tar -xf, chardet-$(chardet-version), , \
Chardet $(chardet-version))
+$(ipydir)/contourpy-$(contourpy-version): \
+ $(ipydir)/pybind11-$(pybind11-version) \
+ $(ipydir)/meson-python-$(meson-python-version)
+ tarball=contourpy-$(contourpy-version).tar.lz
+ $(call import-source, $(contourpy-url), $(contourpy-checksum))
+ $(call pybuild, tar -xf, contourpy-$(contourpy-version), , \
+ Contourpy $(contourpy-version), GPEP517)
+ echo "Contourpy $(contourpy-version)" > $@
+
$(ipydir)/corner-$(corner-version): $(ipydir)/matplotlib-$(matplotlib-version)
tarball=corner-$(corner-version).tar.gz
$(call import-source, $(corner-url), $(corner-checksum))
@@ -231,6 +417,13 @@ $(ipydir)/corner-$(corner-version): $(ipydir)/matplotlib-$(matplotlib-version)
cp $(dtexdir)/corner.tex $(ictdir)/
echo "Corner $(corner-version) \citep{corner}" > $@
+$(ipydir)/cppy-$(cppy-version): \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
+ tarball=cppy-$(cppy-version).tar.lz
+ $(call import-source, $(cppy-url), $(cppy-checksum))
+ $(call pybuild, tar -xf, cppy-$(cppy-version), , \
+ Cppy $(cppy-version), GPEP517)
+
$(ipydir)/cryptography-$(cryptography-version): \
$(ipydir)/cffi-$(cffi-version) \
$(ipydir)/asn1crypto-$(asn1crypto-version) \
@@ -244,13 +437,17 @@ $(ipydir)/cycler-$(cycler-version): $(ipydir)/six-$(six-version)
tarball=cycler-$(cycler-version).tar.lz
$(call import-source, $(cycler-url), $(cycler-checksum))
$(call pybuild, tar -xf, cycler-$(cycler-version), , \
- Cycler $(cycler-version))
+ Cycler $(cycler-version), GPEP517)
+ echo "Cycler $(cycler-version)" > $@
-$(ipydir)/cython-$(cython-version): $(ipydir)/setuptools-$(setuptools-version)
- tarball=Cython-$(cython-version).tar.lz
+$(ipydir)/cython-$(cython-version): \
+ $(ipydir)/python-installer-$(python-installer-version) \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=cython-$(cython-version).tar.lz
$(call import-source, $(cython-url), $(cython-checksum))
- $(call pybuild, tar -xf, Cython-$(cython-version))
- cp $(dtexdir)/cython.tex $(ictdir)/
+ $(call pybuild, tar -xf, cython-$(cython-version),,, GPEP517)
+ cp -pv $(dtexdir)/cython.tex $(ictdir)/
echo "Cython $(cython-version) \citep{cython2011}" > $@
$(ipydir)/esutil-$(esutil-version): $(ipydir)/numpy-$(numpy-version)
@@ -271,26 +468,28 @@ $(ipydir)/eigency-$(eigency-version): \
$(ipydir)/emcee-$(emcee-version): \
$(ipydir)/numpy-$(numpy-version) \
- $(ipydir)/setuptools_scm-$(setuptools_scm-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=emcee-$(emcee-version).tar.gz
$(call import-source, $(emcee-url), $(emcee-checksum))
$(call pybuild, tar -xf, emcee-$(emcee-version), , \
emcee $(emcee-version))
$(ipydir)/entrypoints-$(entrypoints-version): \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=entrypoints-$(entrypoints-version).tar.gz
$(call import-source, $(entrypoints-url), $(entrypoints-checksum))
$(call pybuild, tar -xf, entrypoints-$(entrypoints-version), , \
EntryPoints $(entrypoints-version))
$(ipydir)/extension-helpers-$(extension-helpers-version): \
- $(ipydir)/setuptools-$(setuptools-version) \
- $(ipydir)/setuptools_scm-$(setuptools_scm-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=extension-helpers-$(extension-helpers-version).tar.lz
- $(call import-source, $(extension-helpers-url), $(extension-helpers-checksum))
- $(call pybuild, tar -xf, extension-helpers-$(extension-helpers-version), , \
- Extension-Helpers $(extension-helpers-version))
+ $(call import-source, $(extension-helpers-url), \
+ $(extension-helpers-checksum))
+ $(call pybuild, tar -xf, \
+ extension-helpers-$(extension-helpers-version),, \
+ Extension-Helpers $(extension-helpers-version), GPEP517)
$(ipydir)/flake8-$(flake8-version): \
$(ipydir)/pyflakes-$(pyflakes-version) \
@@ -300,7 +499,29 @@ $(ipydir)/flake8-$(flake8-version): \
$(call pybuild, tar -xf, flake8-$(flake8-version), , \
Flake8 $(flake8-version))
-$(ipydir)/future-$(future-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/flit-core-$(flit-core-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
+ tarball=flit-core-$(flit-core-version).tar.lz
+ $(call import-source, $(flit-core-url), $(flit-core-checksum))
+ $(call pybuild, tar -xf, flit-core-$(flit-core-version), , \
+ Flit-core $(flit-core-version), GPEP517)
+
+# Although cython is not an obligatory prerequisite of fonttools, we force
+# it as a prerequisite for reproducibility; otherwise build parallelism may
+# lead to some builds with and some builds without cython, depending on how
+# many cpus the host machine has.
+$(ipydir)/fonttools-$(fonttools-version): \
+ $(ipydir)/cython-$(cython-version) \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=fonttools-$(fonttools-version).tar.lz
+ $(call import-source, $(fonttools-url), $(fonttools-checksum))
+ $(call pybuild, tar -xf, fonttools-$(fonttools-version), , \
+ fonttools $(fonttools-version), GPEP517)
+
+$(ipydir)/future-$(future-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=future-$(future-version).tar.gz
$(call import-source, $(future-url), $(future-checksum))
$(call pybuild, tar -xf, future-$(future-version), , \
@@ -318,12 +539,25 @@ $(ipydir)/galsim-$(galsim-version): \
cp $(dtexdir)/galsim.tex $(ictdir)/
echo "Galsim $(galsim-version) \citep{galsim}" > $@
-$(ipydir)/gast-$(gast-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/gast-$(gast-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=gast-$(gast-version).tar.lz
$(call import-source, $(gast-url), $(gast-checksum))
$(call pybuild, tar -xf, gast-$(gast-version), , \
Gast $(gast-version))
+$(ipydir)/gpep517-$(gpep517-version): \
+ $(ibidir)/python-$(python-version)
+ tarball=gpep517-$(gpep517-version).tar.lz
+ $(call import-source, $(gpep517-url), $(gpep517-checksum))
+ $(call pybuild, tar -xf, \
+ gpep517-$(gpep517-version), \
+ , \
+ gpep517 $(gpep517-version), \
+ BOOT_GPEP517)
+ echo "gpep517 $(gpep517-version)" > $@
+
$(ipydir)/h5py-$(h5py-version): \
$(ipydir)/six-$(six-version) \
$(ibidir)/hdf5-$(hdf5-version) \
@@ -356,13 +590,17 @@ $(ipydir)/html5lib-$(html5lib-version): \
$(call pybuild, tar -xf, html5lib-$(html5lib-version), , \
HTML5lib $(html5lib-version))
-$(ipydir)/idna-$(idna-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/idna-$(idna-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=idna-$(idna-version).tar.gz
$(call import-source, $(idna-url), $(idna-checksum))
$(call pybuild, tar -xf, idna-$(idna-version), , \
idna $(idna-version))
-$(ipydir)/jeepney-$(jeepney-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/jeepney-$(jeepney-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=jeepney-$(jeepney-version).tar.gz
$(call import-source, $(jeepney-url), $(jeepney-checksum))
$(call pybuild, tar -xf, jeepney-$(jeepney-version), , \
@@ -377,17 +615,21 @@ $(ipydir)/jinja2-$(jinja2-version): $(ipydir)/markupsafe-$(markupsafe-version)
$(ipydir)/keyring-$(keyring-version): \
$(ipydir)/entrypoints-$(entrypoints-version) \
$(ipydir)/secretstorage-$(secretstorage-version) \
- $(ipydir)/setuptools_scm-$(setuptools_scm-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=keyring-$(keyring-version).tar.gz
$(call import-source, $(keyring-url), $(keyring-checksum))
$(call pybuild, tar -xf, keyring-$(keyring-version), , \
Keyring $(keyring-version))
-$(ipydir)/kiwisolver-$(kiwisolver-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/kiwisolver-$(kiwisolver-version): \
+ $(ipydir)/cppy-$(cppy-version) \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=kiwisolver-$(kiwisolver-version).tar.lz
$(call import-source, $(kiwisolver-url), $(kiwisolver-checksum))
$(call pybuild, tar -xf, kiwisolver-$(kiwisolver-version), , \
- Kiwisolver $(kiwisolver-version))
+ Kiwisolver $(kiwisolver-version), GPEP517)
+ cp -pv $(dtexdir)/kiwisolver.tex $(ictdir)/
+ echo "Kiwisolver $(kiwisolver-version) \citep{cassowary2001}" > $@
$(ipydir)/lmfit-$(lmfit-version): \
$(ipydir)/six-$(six-version) \
@@ -412,7 +654,8 @@ $(ipydir)/lsstdesccoord-$(lsstdesccoord-version): \
LSSTDESC.Coord $(lsstdesccoord-version))
$(ipydir)/markupsafe-$(markupsafe-version): \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=markupsafe-$(markupsafe-version).tar.lz
$(call import-source, $(markupsafe-url), $(markupsafe-checksum))
$(call pybuild, tar -xf, markupsafe-$(markupsafe-version), , \
@@ -423,11 +666,9 @@ $(ipydir)/matplotlib-$(matplotlib-version): \
$(ipydir)/numpy-$(numpy-version) \
$(ipydir)/cycler-$(cycler-version) \
$(ipydir)/pillow-$(pillow-version) \
- $(ibidir)/freetype-$(freetype-version) \
- $(ipydir)/pyparsing-$(pyparsing-version) \
+ $(ipydir)/fonttools-$(fonttools-version) \
+ $(ipydir)/contourpy-$(contourpy-version) \
$(ipydir)/kiwisolver-$(kiwisolver-version) \
- $(ibidir)/ghostscript-$(ghostscript-version) \
- $(ibidir)/imagemagick-$(imagemagick-version) \
$(ipydir)/python-dateutil-$(python-dateutil-version)
# Prepare the source.
@@ -440,40 +681,63 @@ $(ipydir)/matplotlib-$(matplotlib-version): \
export CC=clang
export CXX=clang++
fi
- $(call pybuild, tar -xf, matplotlib-$(matplotlib-version))
+ $(call pybuild, tar -xf, matplotlib-$(matplotlib-version),,, GPEP517)
cp $(dtexdir)/matplotlib.tex $(ictdir)/
echo "Matplotlib $(matplotlib-version) \citep{matplotlib2007}" > $@
+$(ipydir)/meson-$(meson-version): \
+ $(ibidir)/ninjabuild-$(ninjabuild-version) \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=meson-$(meson-version).tar.lz
+ $(call import-source, $(meson-url), $(meson-checksum))
+ $(call pybuild, tar -xf, meson-$(meson-version), , \
+ Meson $(meson-version), GPEP517)
+ echo "Meson $(meson-version)" > $@
+
+# The 'meson-python' package may be helpful or requred for some packages.
+$(ipydir)/meson-python-$(meson-python-version): \
+ $(ipydir)/meson-$(meson-version) \
+ $(ipydir)/packaging-$(packaging-version) \
+ $(ipydir)/pyproject-metadata-$(pyproject-metadata-version)
+ tarball=meson-python-$(meson-python-version).tar.lz
+ $(call import-source, $(meson-python-url), $(meson-python-checksum))
+ $(call pybuild, tar -xf, meson-python-$(meson-python-version), , \
+ Meson-python $(meson-python-version), GPEP517)
+ echo "Meson-Python $(meson-python-version)" > $@
+
$(ipydir)/mpi4py-$(mpi4py-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
$(ibidir)/openmpi-$(openmpi-version) \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=mpi4py-$(mpi4py-version).tar.lz
$(call import-source, $(mpi4py-url), $(mpi4py-checksum))
$(call pybuild, tar -xf, mpi4py-$(mpi4py-version))
cp $(dtexdir)/mpi4py.tex $(ictdir)/
echo "mpi4py $(mpi4py-version) \citep{mpi4py2011}" > $@
-$(ipydir)/mpmath-$(mpmath-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/mpmath-$(mpmath-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=mpmath-$(mpmath-version).tar.gz
$(call import-source, $(mpmath-url), $(mpmath-checksum))
$(call pybuild, tar -xf, mpmath-$(mpmath-version), , \
mpmath $(mpmath-version))
+# Until 2025-02-22: we had 'export CFLAGS="--std=c99 $$CFLAGS"' before
+# calling pybuild; but that doesn't seem to be necessary.
$(ipydir)/numpy-$(numpy-version): \
$(ipydir)/cython-$(cython-version) \
$(ibidir)/openblas-$(openblas-version) \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/pybind11-$(pybind11-version) \
+ $(ipydir)/meson-python-$(meson-python-version)
tarball=numpy-$(numpy-version).tar.lz
$(call import-source, $(numpy-url), $(numpy-checksum))
if [ x$(on_mac_os) = xyes ]; then
export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle"
- else
- export LDFLAGS="$(LDFLAGS) -shared"
fi
- export CFLAGS="--std=c99 $$CFLAGS"
conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg"
$(call pybuild, tar -xf, numpy-$(numpy-version),$$conf, \
- Numpy $(numpy-version))
+ Numpy $(numpy-version), GPEP517)
cp $(dtexdir)/numpy.tex $(ictdir)/
echo "Numpy $(numpy-version) \citep{numpy2020}" > $@
@@ -482,9 +746,11 @@ $(ipydir)/packaging-$(packaging-version): \
tarball=packaging-$(packaging-version).tar.lz
$(call import-source, $(packaging-url), $(packaging-checksum))
$(call pybuild, tar -xf, packaging-$(packaging-version), , \
- Packaging $(packaging-version))
+ Packaging $(packaging-version), GPEP517)
-$(ipydir)/pexpect-$(pexpect-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/pexpect-$(pexpect-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=pexpect-$(pexpect-version).tar.gz
$(call import-source, $(pexpect-url), $(pexpect-checksum))
$(call pybuild, tar -xf, pexpect-$(pexpect-version), , \
@@ -492,25 +758,32 @@ $(ipydir)/pexpect-$(pexpect-version): $(ipydir)/setuptools-$(setuptools-version)
$(ipydir)/pillow-$(pillow-version): $(ibidir)/libjpeg-$(libjpeg-version) \
$(ipydir)/setuptools-$(setuptools-version)
- tarball=Pillow-$(pillow-version).tar.lz
+ tarball=pillow-$(pillow-version).tar.lz
$(call import-source, $(pillow-url), $(pillow-checksum))
- $(call pybuild, tar -xf, Pillow-$(pillow-version), , \
- Pillow $(pillow-version))
-
-$(ipydir)/pip-$(pip-version): $(ipydir)/setuptools-$(setuptools-version)
- tarball=pip-$(pip-version).tar.gz
- $(call import-source, $(pip-url), $(pip-checksum))
- $(call pybuild, tar -xf, pip-$(pip-version), , \
- PiP $(pip-version))
-
-$(ipydir)/ply-$(ply-version): $(ipydir)/setuptools-$(setuptools-version)
+ $(call pybuild, tar -xf, pillow-$(pillow-version), , \
+ Pillow $(pillow-version), GPEP517)
+
+# This should normally not be used, because it's a front-end that obstructs
+# reproducibility - source URL; checksum of the tarball; build rule.
+# $(ipydir)/pip-$(pip-version): \
+# $(ipydir)/python-installer-$(python-installer-version) \
+# $(ipydir)/wheel-$(wheel-version)
+# tarball=pip-$(pip-version).tar.gz
+# $(call import-source, $(pip-url), $(pip-checksum))
+# $(call pybuild, tar -xf, pip-$(pip-version), , \
+# PiP $(pip-version))
+
+$(ipydir)/ply-$(ply-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=ply-$(ply-version).tar.lz
$(call import-source, $(ply-url), $(ply-checksum))
$(call pybuild, tar -xf, ply-$(ply-version), , \
ply $(ply-version))
$(ipydir)/pycodestyle-$(pycodestyle-version): \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=pycodestyle-$(pycodestyle-version).tar.gz
$(call import-source, $(pycodestyle-url), $(pycodestyle-checksum))
$(call pybuild, tar -xf, pycodestyle-$(pycodestyle-version), , \
@@ -519,16 +792,21 @@ $(ipydir)/pycodestyle-$(pycodestyle-version): \
$(ipydir)/pybind11-$(pybind11-version): \
$(ibidir)/eigen-$(eigen-version) \
$(ibidir)/boost-$(boost-version) \
- $(ipydir)/setuptools-$(setuptools-version)
- tarball=pybind11-$(pybind11-version).tar.gz
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
+ tarball=pybind11-$(pybind11-version).tar.lz
$(call import-source, $(pybind11-url), $(pybind11-checksum))
pyhook_after() {
- cp -r include/pybind11 $(iidir)/python$(python-major-version)m/
+ cp -pvr pybind11/include/pybind11 \
+ $(iidir)/python$(python-major-version)m/
}
$(call pybuild, tar -xf, pybind11-$(pybind11-version), , \
- pybind11 $(pybind11-version))
+ pybind11 $(pybind11-version), GPEP517)
+ echo "Pybind11 $(pybind11-version)" > $@
-$(ipydir)/pycparser-$(pycparser-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/pycparser-$(pycparser-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=pycparser-$(pycparser-version).tar.gz
$(call import-source, $(pycparser-url), $(pycparser-checksum))
$(call pybuild, tar -xf, pycparser-$(pycparser-version), , \
@@ -536,46 +814,83 @@ $(ipydir)/pycparser-$(pycparser-version): $(ipydir)/setuptools-$(setuptools-vers
$(ipydir)/pyerfa-$(pyerfa-version): \
$(ipydir)/numpy-$(numpy-version) \
- $(ipydir)/packaging-$(packaging-version) \
- $(ipydir)/setuptools_scm-$(setuptools_scm-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=pyerfa-$(pyerfa-version).tar.lz
$(call import-source, $(pyerfa-url), $(pyerfa-checksum))
$(call pybuild, tar -xf, pyerfa-$(pyerfa-version), , \
- PyERFA $(pyerfa-version))
+ PyERFA $(pyerfa-version), GPEP517)
-$(ipydir)/pyflakes-$(pyflakes-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/pyflakes-$(pyflakes-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=pyflakes-$(pyflakes-version).tar.gz
$(call import-source, $(pyflakes-url), $(pyflakes-checksum))
$(call pybuild, tar -xf, pyflakes-$(pyflakes-version), , \
pyflakes $(pyflakes-version))
$(ipydir)/pyparsing-$(pyparsing-version): \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/flit-core-$(flit-core-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=pyparsing-$(pyparsing-version).tar.lz
$(call import-source, $(pyparsing-url), $(pyparsing-checksum))
$(call pybuild, tar -xf, pyparsing-$(pyparsing-version), , \
- PyParsing $(pyparsing-version))
+ PyParsing $(pyparsing-version), GPEP517)
-$(ipydir)/pypkgconfig-$(pypkgconfig-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/pypkgconfig-$(pypkgconfig-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=pkgconfig-$(pypkgconfig-version).tar.gz
$(call import-source, $(pypkgconfig-url), $(pypkgconfig-checksum))
$(call pybuild, tar -xf, pkgconfig-$(pypkgconfig-version), ,
pkgconfig $(pypkgconfig-version))
+$(ipydir)/pyproject-metadata-$(pyproject-metadata-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/flit-core-$(flit-core-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
+ tarball=pyproject-metadata-$(pyproject-metadata-version).tar.lz
+ $(call import-source, $(pyproject-metadata-url), $(pyproject-metadata-checksum))
+ $(call pybuild, tar -xf, \
+ pyproject-metadata-$(pyproject-metadata-version),,, GPEP517)
+
$(ipydir)/python-dateutil-$(python-dateutil-version): \
- $(ipydir)/six-$(six-version) \
- $(ipydir)/setuptools_scm-$(setuptools_scm-version)
- tarball=python-dateutil-$(python-dateutil-version).tar.gz
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
+ tarball=python-dateutil-$(python-dateutil-version).tar.lz
$(call import-source, $(python-dateutil-url), $(python-dateutil-checksum))
$(call pybuild, tar -xf, python-dateutil-$(python-dateutil-version), , \
- python-dateutil $(python-dateutil-version))
+ python-dateutil $(python-dateutil-version), GPEP517)
+
+$(ipydir)/python-installer-$(python-installer-version): \
+ $(ibidir)/python-$(python-version)
+
+# Prepare the tarball.
+ tarball=python-installer-$(python-installer-version).tar.lz
+ $(call import-source, $(python-installer-url), $(python-installer-checksum))
+
+# Modify the line in the source that will cause a crash when a
+# to-be-installed file already exists in the installation path. This
+# is very important for Python packages in Maneage (when a dependency
+# is updated, the package needs to be re-built, but that would cause
+# due to this line).
+ pyhook_before(){
+ mv -v src/installer/destinations.py src/installer/destinations.py.orig; \
+ sed -e 's/\(raise FileExistsError.message.\)/## \1/' \
+ src/installer/destinations.py.orig > src/installer/destinations.py
+ }
+
+# Build the Python installer.
+ $(call pybuild, tar -xf, \
+ python-installer-$(python-installer-version),,, \
+ BOOT_INSTALLER)
+ echo "Python-installer $(python-installer-version)" > $@
$(ipydir)/pythran-$(pythran-version): \
$(ipydir)/ply-$(ply-version) \
$(ipydir)/gast-$(gast-version) \
$(ibidir)/boost-$(boost-version) \
$(ipydir)/beniget-$(beniget-version) \
- $(ipydir)/setuptools_scm-$(setuptools_scm-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=pythran-$(pythran-version).tar.lz
$(call import-source, $(pythran-url), $(pythran-checksum))
$(call pybuild, tar -xf, pythran-$(pythran-version), , \
@@ -584,25 +899,27 @@ $(ipydir)/pythran-$(pythran-version): \
$(ipydir)/pyyaml-$(pyyaml-version): \
$(ibidir)/yaml-$(yaml-version) \
$(ipydir)/cython-$(cython-version)
- tarball=pyyaml-$(pyyaml-version).tar.gz
+ tarball=pyyaml-$(pyyaml-version).tar.lz
$(call import-source, $(pyyaml-url), $(pyyaml-checksum))
- $(call pybuild, tar -xf, PyYAML-$(pyyaml-version), , \
- PyYAML $(pyyaml-version))
+ $(call pybuild, tar -xf, pyyaml-$(pyyaml-version), , \
+ PyYAML $(pyyaml-version), GPEP517)
$(ipydir)/requests-$(requests-version): $(ipydir)/idna-$(idna-version) \
- $(ipydir)/numpy-$(numpy-version) \
- $(ipydir)/certifi-$(certifi-version) \
- $(ipydir)/chardet-$(chardet-version) \
- $(ipydir)/urllib3-$(urllib3-version)
+ $(ipydir)/numpy-$(numpy-version) \
+ $(ipydir)/certifi-$(certifi-version) \
+ $(ipydir)/chardet-$(chardet-version) \
+ $(ipydir)/urllib3-$(urllib3-version)
tarball=requests-$(requests-version).tar.gz
$(call import-source, $(requests-url), $(requests-checksum))
$(call pybuild, tar -xf, requests-$(requests-version), , \
Requests $(requests-version))
# 'pythran' is disabled in the build of Scipy because of complications it
-# caused on some systems. It is explicitly disabled using the environmental
-# variable. If for some reason it is needed, set the environment variable
-# to 1, and add it as a prerequisite of 'scipy'.
+# caused on some systems. We explicitly disable it using a preprocessor
+# directive. 'Pythran' can in principle speed up compilation of scientific
+# software [1][2].
+# [1] https://pythran.readthedocs.io/en/latest
+# [2] https://docs.scipy.org/doc/scipy-1.15.2/dev/roadmap-detailed.html
$(ipydir)/scipy-$(scipy-version): \
$(ipydir)/numpy-$(numpy-version) \
$(ipydir)/pybind11-$(pybind11-version)
@@ -611,11 +928,28 @@ $(ipydir)/scipy-$(scipy-version): \
if [ x$(on_mac_os) = xyes ]; then
export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle"
else
- export LDFLAGS="$(LDFLAGS) -shared"
+# Same question as for 'numpy': why '-shared'? This obstructs
+# the meson build.
+# export LDFLAGS="$(LDFLAGS) -shared"
+ :
fi
- export SCIPY_USE_PYTHRAN=0
conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg"
- $(call pybuild, tar -xf, scipy-$(scipy-version),$$conf)
+
+# Disable pythran: see
+# https://docs.scipy.org/doc/scipy-1.15.2/dev/roadmap-detailed.html#use-of-pythran
+# export SCIPY_USE_PYTHRAN=0 # deprecated(?)
+# Option 1: Hack the source:
+ pyhook_before() {
+ mv -iv meson.options meson.options.orig; \
+ sed -e 's/\(use-pythran.*value: *\)true/\1false/' \
+ meson.options.orig > meson.options
+ }
+
+# Option 2: pass the string
+# --config-json='{"setup-args": "-Duse-pythran=false"}'
+# to gpep517 with correct escaping of single and double quotes.
+# Not tried as of 2025-02-25.
+ $(call pybuild, tar -xf, scipy-$(scipy-version),$$conf,, GPEP517)
cp $(dtexdir)/scipy.tex $(ictdir)/
echo "Scipy $(scipy-version) \citep{scipy2020}" > $@
@@ -627,26 +961,38 @@ $(ipydir)/secretstorage-$(secretstorage-version): \
$(call pybuild, tar -xf, SecretStorage-$(secretstorage-version), , \
SecretStorage $(secretstorage-version))
+$(ipydir)/semantic-version-$(semantic-version-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=semantic-version-$(semantic-version-version).tar.lz
+ $(call import-source, $(semantic-version-url), \
+ $(semantic-version-checksum))
+ $(call pybuild, tar -xf, \
+ semantic-version-$(semantic-version-version), , \
+ Semantic-version $(semantic-version-version), GPEP517)
+
$(ipydir)/setuptools-$(setuptools-version): \
- $(ibidir)/python-$(python-version)
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=setuptools-$(setuptools-version).tar.lz
$(call import-source, $(setuptools-url), $(setuptools-checksum))
$(call pybuild, tar -xf, setuptools-$(setuptools-version), , \
- Setuptools $(setuptools-version))
+ Setuptools $(setuptools-version), GPEP517)
-$(ipydir)/setuptools_scm-$(setuptools_scm-version): \
+$(ipydir)/setuptools-scm-$(setuptools-scm-version): \
$(ipydir)/setuptools-$(setuptools-version)
- tarball=setuptools_scm-$(setuptools_scm-version).tar.gz
- $(call import-source, $(setuptools_scm-url), $(setuptools_scm-checksum))
- $(call pybuild, tar -xf, setuptools_scm-$(setuptools_scm-version), , \
- Setuptools-scm $(setuptools_scm-version))
+ tarball=setuptools-scm-$(setuptools-scm-version).tar.lz
+ $(call import-source, $(setuptools-scm-url), $(setuptools-scm-checksum))
+ $(call pybuild, tar -xf, setuptools-scm-$(setuptools-scm-version), , \
+ Setuptools-scm $(setuptools-scm-version), GPEP517)
$(ipydir)/setuptools-rust-$(setuptools-rust-version): \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version) \
+ $(ipydir)/semantic-version-$(semantic-version-version)
tarball=setuptools-rust-$(setuptools-rust-version).tar.lz
- $(call import-source, $(setuptools-rust-url), $(setuptools-rust-checksum))
+ $(call import-source, $(setuptools-rust-url), \
+ $(setuptools-rust-checksum))
$(call pybuild, tar -xf, setuptools-rust-$(setuptools-rust-version), , \
- Setuptools-scm $(setuptools-rust-version))
+ Setuptools-rust $(setuptools-rust-version), GPEP517)
$(ipydir)/sip_tpv-$(sip_tpv-version): \
$(ipydir)/sympy-$(sympy-version) \
@@ -657,14 +1003,17 @@ $(ipydir)/sip_tpv-$(sip_tpv-version): \
cp $(dtexdir)/sip_tpv.tex $(ictdir)/
echo "sip_tpv $(sip_tpv-version) \citep{sip-tpv}" > $@
-
-$(ipydir)/six-$(six-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/six-$(six-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
tarball=six-$(six-version).tar.lz
$(call import-source, $(six-url), $(six-checksum))
$(call pybuild, tar -xf, six-$(six-version), , \
- Six $(six-version))
+ Six $(six-version), GPEP517)
+ echo "Six $(six-version)" > $@
-$(ipydir)/soupsieve-$(soupsieve-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/soupsieve-$(soupsieve-version): \
+ $(ipydir)/setuptools-$(setuptools-version) \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=soupsieve-$(soupsieve-version).tar.gz
$(call import-source, $(soupsieve-url), $(soupsieve-checksum))
$(call pybuild, tar -xf, soupsieve-$(soupsieve-version), , \
@@ -683,21 +1032,30 @@ $(ipydir)/uncertainties-$(uncertainties-version): $(ipydir)/numpy-$(numpy-versio
$(call pybuild, tar -xf, uncertainties-$(uncertainties-version), , \
uncertainties $(uncertainties-version))
-$(ipydir)/urllib3-$(urllib3-version): $(ipydir)/setuptools-$(setuptools-version)
+$(ipydir)/urllib3-$(urllib3-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
tarball=urllib3-$(urllib3-version).tar.gz
$(call import-source, $(urllib3-url), $(urllib3-checksum))
$(call pybuild, tar -xf, urllib3-$(urllib3-version), , \
Urllib3 $(urllib3-version))
$(ipydir)/webencodings-$(webencodings-version): \
- $(ipydir)/setuptools-$(setuptools-version)
+ $(ipydir)/setuptools-$(setuptools-version) \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=webencodings-$(webencodings-version).tar.gz
$(call import-source, $(webencodings-url), $(webencodings-checksum))
$(call pybuild, tar -xf, webencodings-$(webencodings-version), , \
Webencodings $(webencodings-version))
-$(ipydir)/wheel-$(wheel-version): $(ipydir)/setuptools-$(setuptools-version)
- tarball=wheel-$(wheel-version).tar.lz
+# As of 2025-02, this is only needed if you want 'wheel' on the command
+# line; 'setuptools' provides its own version of wheels.
+$(ipydir)/wheel-$(wheel-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/flit-core-$(flit-core-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
+# tarball=wheel-$(wheel-version).tar.lz
+ tarball=wheel-$(wheel-version).tar.gz
$(call import-source, $(wheel-url), $(wheel-checksum))
$(call pybuild, tar -xf, wheel-$(wheel-version), , \
- Wheel $(wheel-version))
+ Wheel $(wheel-version), GPEP517)
diff --git a/reproduce/software/make/r-cran.mk b/reproduce/software/make/r-cran.mk
index 484fe74..7c86c23 100644
--- a/reproduce/software/make/r-cran.mk
+++ b/reproduce/software/make/r-cran.mk
@@ -12,8 +12,8 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2022-2023 Boud Roukema <boud@cosmo.torun.pl>
-# Copyright (C) 2022-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2022-2025 Boud Roukema <boud@cosmo.torun.pl>
+# Copyright (C) 2022-2025 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
@@ -204,6 +204,7 @@ $(ibidir)/r-cran-$(r-cran-version): \
tar -xf $(tdir)/$$tarball
unpackdir=R-$(r-cran-version)
cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
# We need to manually remove the lines with '~autodetect~', they
# cause the configure script to crash in version 4.0.2. They are used
diff --git a/reproduce/software/make/xorg.mk b/reproduce/software/make/xorg.mk
index 1cc87a5..864c32a 100644
--- a/reproduce/software/make/xorg.mk
+++ b/reproduce/software/make/xorg.mk
@@ -14,8 +14,8 @@
#
# ------------------------------------------------------------------------
#
-# Copyright (C) 2021-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2021-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2021-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2021-2025 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
@@ -79,7 +79,7 @@ $(ibidir)/libxau-$(libxau-version): $(ibidir)/xorgproto-$(xorgproto-version)
# Library implementing the X Display Manager Control Protocol.
$(ibidir)/libxdmcp-$(libxdmcp-version): $(ibidir)/libxau-$(libxau-version)
- tarball=libXdmcp-$(libxdmcp-version).tar.bz2
+ tarball=libXdmcp-$(libxdmcp-version).tar.lz
$(call import-source, $(libxdmcp-url), $(libxdmcp-checksum))
$(call gbuild, libXdmcp-$(libxdmcp-version),,$(XORG_CONFIG), V=1)
echo "libXdmcp (Xorg) $(libxdmcp-version)" > $@
diff --git a/reproduce/software/shell/bashrc.sh b/reproduce/software/shell/bashrc.sh
index 814de2c..6bbd774 100755
--- a/reproduce/software/shell/bashrc.sh
+++ b/reproduce/software/shell/bashrc.sh
@@ -34,7 +34,7 @@
# shell').
#
#
-# Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
#
# This script is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/reproduce/software/shell/configure.sh b/reproduce/software/shell/configure.sh
index 4f71bee..e291f7b 100755
--- a/reproduce/software/shell/configure.sh
+++ b/reproduce/software/shell/configure.sh
@@ -2,9 +2,9 @@
#
# Necessary preparations/configurations for the reproducible project.
#
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2021-2023 Raul Infante-Sainz <infantesainz@gmail.com>
-# Copyright (C) 2022-2023 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2021-2025 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2022-2025 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
#
# This script is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -563,7 +563,7 @@ fi
# similarly different location.
sys_cpath=""
sys_library_path=""
-if [ x"$$on_mac_os" != xyes ]; then
+if [ x"$on_mac_os" != xyes ]; then
# Get the GCC target name of the compiler, when its given, special
# C libraries and headers are in a sub-directory of the host.
@@ -884,14 +884,17 @@ The project's "source" (this directory) and "build" directories are treated
separately. This greatly helps in managing the many intermediate files that
are created during the build. The intermediate build files don't need to be
archived or backed up: you can always re-build them with the contents of
-the source directory. The build directory also needs a relatively large
-amount of free space (atleast serveral Giga-bytes), while the source
-directory (all plain text) will usually be a mega-byte or less.
+the source directory. The build directory also needs a fairly large amount
+of free space (at least several gigabytes), while the source directory (all
+plain text, ignoring the .git directory if you have it) will usually be a
+megabyte or less.
-'.build' (a symbolic link to the build directory) will also be created
+The link '.build' (a symbolic link to the build directory) will be created
during this configuration. It can help encourage you to set the actual
-build directory in a very different address from this one (one that can be
-deleted and has large volume), while having easy access to it from here.
+build directory to a very different path to that of the source (the build
+directory should be considered as a large volume directory of throwaway
+space that can be casually deleted), while making it easy to access from
+here without having to remember the particular path.
--- CAUTION ---
Do not choose any directory under the top source directory (this
@@ -905,12 +908,15 @@ EOF
do
# Ask the user (if not already set on the command-line).
if [ x"$build_dir" = x ]; then
- if read -p"Please enter the top build directory: " build_dir; then
+ if read -p"Please enter the top build directory: " build_dir;
+ then
just_a_place_holder_to_avoid_not_equal_test=1;
else
- echo "ERROR: shell is in non-interactive-mode and no build directory specified."
- echo "The build directory (described above) is mandatory, configuration can't continue."
- echo "Please use '--build-dir' to specify a build directory non-interactively."
+ printf "ERROR: shell is in non-interactive-mode and no "
+ printf "build directory specified. The build directory "
+ printf "(described above) is mandatory, configuration "
+ printf "can't continue. Please use '--build-dir' to "
+ printf "specify a build directory non-interactively"
exit 1
fi
fi
@@ -937,7 +943,7 @@ EOF
# directory.
if ! [ x"$bdir" = x ]; then
if echo "$bdir/" \
- | grep '^'"$currentdir" 2> /dev/null > /dev/null; then
+ | grep '^'"$currentdir/" 2> /dev/null > /dev/null; then
# If it was newly created, it will be empty, so delete it.
if ! [ "$(ls -A $bdir)" ]; then rm --dir "$bdir"; fi
@@ -1252,6 +1258,14 @@ instlibdir="$instdir"/lib
if ! [ -d "$instlibdir" ]; then mkdir "$instlibdir"; fi
ln -fs "$instlibdir" "$instdir"/lib64
+# Wrapper over Make as a single command so it does not default to '/bin/sh'
+# during installation (needed by some programs like CMake).
+instbindir=$instdir/bin
+if ! [ -d $instbindir ]; then mkdir $instbindir; fi
+makewshell="$instbindir/make-with-shell"
+echo "$instbindir/make SHELL=$instbindir/bash \$@" > $makewshell
+chmod +x $makewshell
+
@@ -1259,33 +1273,10 @@ ln -fs "$instlibdir" "$instdir"/lib64
# Project's top-level built analysis directories
# ----------------------------------------------
-# Top-level built analysis directories.
-badir="$bdir"/analysis
-if ! [ -d "$badir" ]; then mkdir "$badir"; fi
-
# Top-level LaTeX.
-texdir="$badir"/tex
+texdir="$sdir"/tex
if ! [ -d "$texdir" ]; then mkdir "$texdir"; fi
-# LaTeX macros.
-mtexdir="$texdir"/macros
-if ! [ -d "$mtexdir" ]; then mkdir "$mtexdir"; fi
-
-# TeX build directory. If built in a group scenario, the TeX build
-# directory must be separate for each member (so they can work on their
-# relevant parts of the paper without conflicting with each other).
-if [ "x$maneage_group_name" = x ]; then
- texbdir="$texdir"/build
-else
- user=$(whoami)
- texbdir="$texdir"/build-$user
-fi
-if ! [ -d "$texbdir" ]; then mkdir "$texbdir"; fi
-
-# TiKZ (for building figures within LaTeX).
-tikzdir="$texbdir"/tikz
-if ! [ -d "$tikzdir" ]; then mkdir "$tikzdir"; fi
-
# If 'tex/build' and 'tex/tikz' are symbolic links then 'rm -f' will delete
# them and we can continue. However, when the project is being built from
# the tarball, these two are not symbolic links but actual directories with
@@ -1314,8 +1305,6 @@ rm -f .build .local
ln -s "$bdir" .build
ln -s "$instdir" .local
-ln -s "$texdir" tex/build
-ln -s "$tikzdir" tex/tikz
# --------- Delete for no Gnuastro ---------
rm -f .gnuastro
@@ -1431,6 +1420,15 @@ fi
+# Make sure the temporary build directory is empty (un-finished
+# source/build files from previous builds can remain there during debugging
+# or software updates).
+rm -rf $tmpblddir/*
+
+
+
+
+
# Inform the user that the build process is starting
# -------------------------------------------------
#
@@ -1558,6 +1556,52 @@ fi
+# Libraries necessary for the system's shell
+# ------------------------------------------
+#
+# In some cases (mostly the programs that Maneage doesn't yet build by
+# itself), the programs may call the system's shell, not Maneage's
+# shell. After we close-off the system environment from Maneage, this will
+# cause a crash! To avoid such cases, we need to find the locations of the
+# libraries that the shell needs and temporarily add them to the library
+# search path.
+#
+# About the 'grep -v "(0x[^)]*)"' term (from bug 66847, see [1]): On some
+# systems [2], the output of 'ldd /bin/sh' includes a line for the vDSO [3]
+# that is different to the formats that are assumed, prior to this commit,
+# by the algorithm in 'configure.sh' when evaluating the variable
+# 'sys_library_sh_path'. This leads to a fatal syntax error in (at least)
+# 'ncurses', because the option using 'sys_library_sh_path' contains an
+# unquoted RAM address in parentheses. Even if the address were quoted, it
+# would still be incorrect. This 'grep command excludes candidate host path
+# strings that look like RAM addresses to address the problem.
+#
+# [1] https://savannah.nongnu.org/bugs/index.php?66847
+# [2] https://stackoverflow.com/questions/34428037/how-to-interpret-the-output-of-the-ldd-program
+# [3] man vdso
+if [ x"$on_mac_os" = xyes ]; then
+ sys_library_sh_path=$(otool -L /bin/sh \
+ | awk '/\/lib/{print $1}' \
+ | sed 's#/[^/]*$##' \
+ | sort \
+ | uniq \
+ | awk '{if (NR==1) printf "%s", $1; \
+ else printf ":%s", $1}')
+else
+ sys_library_sh_path=$(ldd /bin/sh \
+ | awk '{if($3!="") print $3}' \
+ | sed 's#/[^/]*$##' \
+ | grep -v "(0x[^)]*)" \
+ | sort \
+ | uniq \
+ | awk '{if (NR==1) printf "%s", $1; \
+ else printf ":%s", $1}')
+fi
+
+
+
+
+
# Find Zenodo URL for software downloading
# ----------------------------------------
#
@@ -1575,11 +1619,11 @@ fi
# which will download the DOI-resolved webpage, and extract the Zenodo-URL
# of the most recent version from there (using the 'coreutils' tarball as
# an example, the directory part of the URL for all the other software are
-# the same). This is not done if the option '--debug' is used.
+# the same). This is not done if the options '--debug' or `--offline` are used.
zenodourl=""
user_backup_urls=""
zenodocheck=.build/software/zenodo-check.html
-if [ x$debug = x ]; then
+if [ x$debug = x ] && [ x$offline = x ]; then
if $downloader $zenodocheck https://doi.org/10.5281/zenodo.3883409; then
zenodourl=$(sed -n -e'/coreutils/p' $zenodocheck \
| sed -n -e'/http/p' \
@@ -1646,6 +1690,7 @@ fi
# tools, but we have to be very portable (and use minimal features in all).
echo; echo "Building necessary software (if necessary)..."
.local/bin/make $keepgoing -f reproduce/software/make/basic.mk \
+ sys_library_sh_path=$sys_library_sh_path \
user_backup_urls="$user_backup_urls" \
sys_library_path=$sys_library_path \
rpath_command=$rpath_command \
@@ -1673,17 +1718,30 @@ else
numthreads=$jobs
fi
.local/bin/env -i HOME=$bdir \
- .local/bin/make $keepgoing -f reproduce/software/make/high-level.mk \
- user_backup_urls="$user_backup_urls" \
- sys_library_path=$sys_library_path \
- rpath_command=$rpath_command \
- all_highlevel=$all_highlevel \
- static_build=$static_build \
- numthreads=$numthreads \
- on_mac_os=$on_mac_os \
- sys_cpath=$sys_cpath \
- host_cc=$host_cc \
- -j$numthreads
+ .local/bin/make $keepgoing \
+ -f reproduce/software/make/high-level.mk \
+ sys_library_sh_path=$sys_library_sh_path \
+ user_backup_urls="$user_backup_urls" \
+ sys_library_path=$sys_library_path \
+ rpath_command=$rpath_command \
+ all_highlevel=$all_highlevel \
+ static_build=$static_build \
+ numthreads=$numthreads \
+ on_mac_os=$on_mac_os \
+ sys_cpath=$sys_cpath \
+ host_cc=$host_cc \
+ offline=$offline \
+ -j$numthreads
+
+
+
+
+
+# Delete the temporary Make wrapper
+# ---------------------------------
+#
+# See above for its description.
+rm $makewshell
@@ -1792,7 +1850,7 @@ pymodules=$(prepare_name_version $verdir/python/*)
texpkg=$(prepare_name_version $verdir/tex/texlive)
# Acknowledge these software packages in a LaTeX paragraph.
-pkgver=$mtexdir/dependencies.tex
+pkgver=$texdir/dependencies.tex
# Add the text to the ${pkgver} file.
.local/bin/echo "$thank_software_introduce " > $pkgver
@@ -1809,7 +1867,7 @@ bibfiles="$ictdir/*"
for f in $bibfiles; do if [ -f $f ]; then hasentry=1; break; fi; done;
# Make sure we start with an empty output file.
-pkgbib=$mtexdir/dependencies-bib.tex
+pkgbib=$texdir/dependencies-bib.tex
echo "" > $pkgbib
# Fill it in with all the BibTeX entries in this directory. We'll just
@@ -1829,7 +1887,7 @@ fi
# ---------------------------
#
# Report hardware
-hwparam="$mtexdir/hardware-parameters.tex"
+hwparam="$texdir/hardware-parameters.tex"
# Add the text to the ${hwparam} file. Since harware class might include
# underscore, it must be replaced with '\_', otherwise pdftex would
diff --git a/reproduce/software/shell/git-post-checkout b/reproduce/software/shell/git-post-checkout
index a1340d7..7b521a3 100755
--- a/reproduce/software/shell/git-post-checkout
+++ b/reproduce/software/shell/git-post-checkout
@@ -4,7 +4,7 @@
# controlled files (with each commit) using the 'metastore' program.
#
# Copyright (C) 2016 Przemyslaw Pawelczyk <przemoc@gmail.com>
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2018-2025 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
diff --git a/reproduce/software/shell/git-pre-commit b/reproduce/software/shell/git-pre-commit
index 02ba488..7b98ad0 100755
--- a/reproduce/software/shell/git-pre-commit
+++ b/reproduce/software/shell/git-pre-commit
@@ -4,7 +4,7 @@
# controlled files (with each commit) using the 'metastore' program.
#
# Copyright (C) 2016 Przemyslaw Pawelczyk <przemoc@gmail.com>
-# Copyright (C) 2018-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2018-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
#
# WARNING:
#
diff --git a/reproduce/software/shell/pre-make-build.sh b/reproduce/software/shell/pre-make-build.sh
index 808429b..28b7385 100755
--- a/reproduce/software/shell/pre-make-build.sh
+++ b/reproduce/software/shell/pre-make-build.sh
@@ -2,7 +2,7 @@
#
# Very basic tools necessary to start Maneage's default building.
#
-# Copyright (C) 2020-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2020-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
#
# This script is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -48,7 +48,7 @@ instdir="$sdir"/installed
tmpblddir="$sdir"/build-tmp
confdir=reproduce/software/config
ibidir="$instdir"/version-info/proglib
-downloadwrapper=reproduce/analysis/bash/download-multi-try
+downloadwrapper=reproduce/analysis/bash/download-multi-try.sh
# Derived directories
bindir="$instdir"/bin
@@ -123,7 +123,8 @@ download_tarball() {
# Make sure this is the correct tarball.
if type sha512sum > /dev/null 2> /dev/null; then
checksum=$(sha512sum "$ucname" | awk '{print $1}')
- expectedchecksum=$(awk '/^'$progname'-checksum/{print $3}' "$checksumsfile")
+ expectedchecksum=$(awk '/^'$progname'-checksum/{print $3}' \
+ "$checksumsfile")
if [ x$checksum = x$expectedchecksum ]; then mv "$ucname" "$maneagetar"
else
echo "ERROR: Non-matching checksum: $tarball"
@@ -135,8 +136,10 @@ download_tarball() {
fi
fi
- # If the tarball is newer than the (possibly existing) program (the version
- # has changed), then delete the program.
+ # If the tarball is newer than the (possibly existing) program (the
+ # version has changed), then delete the program. When the LaTeX name is
+ # not given here, the software is re-built later (close to the end of
+ # 'basic.mk') and the name is properly placed there.
if [ -f "$ibidir/$progname" ]; then
if [ "$maneagetar" -nt "$ibidir/$progname" ]; then
rm "$ibidir/$progname"
@@ -174,7 +177,7 @@ build_program() {
fi
# Unpack the tarball and go into it.
- tar xf "$intar"
+ tar xf "$intar" --no-same-owner --no-same-permissions
if [ x$intarrm = x1 ]; then rm "$intar"; fi
cd "$unpackdir"
@@ -210,10 +213,15 @@ build_program() {
fi
fi
- # Clean up the source directory
+ # Clean up the source directory and write the LaTeX name of the
+ # software (if necessary: otherwise, just make an empty file).
cd "$topdir"
rm -rf "$tmpblddir/$unpackdir"
- echo "$progname_tex $version" > "$ibidir/$progname"
+ if [ x"$progname_tex" = x ]; then
+ echo "" > "$ibidir/$progname"
+ else
+ echo "$progname_tex $version" > "$ibidir/$progname"
+ fi
fi
}
@@ -256,7 +264,7 @@ build_program
# Make that has a different executable name (using the '--program-prefix='
# configure option) from the "default" make (which is this one!).
progname="make"
-progname_tex="GNU Make"
+progname_tex="" # Make re-built after GCC (empty string to avoid repetition)
url=$(awk '/^'$progname'-url/{print $3}' $urlfile)
version=$(awk '/^'$progname'-version/{print $3}' $versionsfile)
tarball=$progname-$version.tar.lz
diff --git a/reproduce/software/shell/prep-source.sh b/reproduce/software/shell/prep-source.sh
new file mode 100755
index 0000000..dcdc472
--- /dev/null
+++ b/reproduce/software/shell/prep-source.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env sh
+#
+# Necessary corrections in the un-packed source of programs to make them
+# portable (for example to not use '/bin/sh').
+#
+# Usage: Run in top source directory (will work on all files within the
+# directory that it is run in ):
+# ./prep-source.sh /FULL/ADDRESS/TO/DESIRED/BIN
+#
+# Copyright (C) 2024-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+#
+# This script 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 script is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this script. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+
+# Abort the script in case of an error
+set -e
+
+
+
+
+# Read the first argument.
+bindir="$1"
+if [ x"$bindir" = x ]; then
+ printf "$0: no argument (location of the 'bin/' directory "
+ printf "containing the 'bash' executable)\n"
+ exit 1
+elif ! [ -d "$bindir" ]; then
+ printf "$0: the directory given as the first argument ('$bindir')"
+ printf "does not exist"
+fi
+
+
+
+
+
+# Find all the files that contain the '/bin/sh' string and correct them to
+# Maneage's own Bash. We are using 'while read' to read the file names line
+# by line. This is necessary to account file names that include the 'SPACE'
+# character (happens in CMake for example!).
+#
+# Note that dates are important in the source directory (files depend on
+# each other), so we should read the original date and after making. We are
+# also not using GNU SED's '-i' ('--in-place') option because the host OS
+# may not have GNU SED.
+#
+# Actual situation which prompted the addition of this step: a Maneage'd
+# project (with GNU Bash 5.1.8 and Readline 8.1.1) was being built on a
+# system where '/bin/sh' was GNU Bash 5.2.26 and had Readline 8.2.010. The
+# newer version of Bash needed the newer Readline library function(s) that
+# were not available in Maneage's Readline library. Therefore, as soon as
+# the basic software were built and Maneage entered the creation of
+# high-level software (where we completely close-off the host environment),
+# Maneage crashed with the following '/bin/sh' error:
+#
+# /bin/sh: symbol lookup error: /bin/sh: undefined symbol: rl_trim_arg_from_keyseq
+#
+# This lead to the discovery that through '/bin/sh' the host operating
+# system was leaking into our closed Maneage environment which needs to be
+# closed. This needs a source-level correction because '/bin/sh' is
+# hard-coded in the source code of almost all programs (their build
+# scripts); and in special programs like GNU Make, GNU M4 or CMake it is
+# actually hardcoded in the source code (not just build scripts).
+if [ -f "$bindir/bash" ]; then shpath="$bindir"/bash
+else shpath="$bindir"/dash
+fi
+grep -I -r -e'/bin/sh' $(pwd)/* \
+ | sed -e's|:|\t|' \
+ | awk 'BEGIN{FS="\t"}{print $1}' \
+ | sort \
+ | uniq \
+ | while read filename; do \
+ tmp="$filename".tmp; \
+ origtime="$(date -R -r "$filename")"; \
+ origperm=$(stat -c '%a' "$filename"); \
+ sed -e's|/bin/sh|'"$shpath"'|g' "$filename" > "$tmp"; \
+ mv "$tmp" "$filename"; \
+ chmod $origperm "$filename"; \
+ touch -d"$origtime" "$filename"; \
+ echo "Corrected /bin/sh in $filename"; \
+ done
diff --git a/reproduce/software/shell/run-parts.in b/reproduce/software/shell/run-parts.in
index a7b7705..053f5f3 100755
--- a/reproduce/software/shell/run-parts.in
+++ b/reproduce/software/shell/run-parts.in
@@ -10,8 +10,8 @@
# However, it didn't have a copyright statement. So one is being added
# here.
#
-# Copyright (C) 2023 Authors mentioned above.
-# Copyright (C) 2020-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2025 Authors mentioned above.
+# Copyright (C) 2025-2024 Mohammad Akhlaghi <mohammad@akhlaghi.org>
#
# This script is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/reproduce/software/shell/tarball-prepare.sh b/reproduce/software/shell/tarball-prepare.sh
index 472b4c0..8e30931 100755
--- a/reproduce/software/shell/tarball-prepare.sh
+++ b/reproduce/software/shell/tarball-prepare.sh
@@ -15,9 +15,26 @@
#
# Discussion: https://savannah.nongnu.org/task/?15699
#
-# Copyright (C) 2022-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2022-2023 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
-# Released under GNU GPLv3+
+# Copyright (C) 2022-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2022-2025 Pedram Ashofteh Ardakani <pedramardakani@pm.me>
+# Copyright (C) 2025-2025 Giacomo Lorenzetti <glorenzetti@cefca.es>
+#
+# This script 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 script is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this script. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
# Abort the script in case of an error.
set -e
@@ -159,12 +176,23 @@ for f in $allfiles; do
name=$(echo $(basename $f) \
| sed -e 's/.tar.*//' -e's/_/-/')
+ # Extract the software's name from the tarball name (needed later
+ # for software-specific checks).
+ sname=$(echo $name | sed -e's|-| |' | awk '{print $1}')
+
+ # Lzip will not be available to unpack Lzip itself, so just use Tar.
+ if [[ $name =~ ^lzip ]]; then
+ outname=$name.tar
+ else
+ outname=$name.tar.lz
+ fi
+
# Skip previously packed files
- if [ -f $odir/$name.tar.lz ]; then
+ if [ -f $odir/$outname ]; then
# Print the info message if not in quiet mode
if [ -z $quiet ]; then
- echo "$scriptname: $odir/$name.tar.lz: already present in output directory"
+ echo "$scriptname: $odir/$outname: already present in output directory"
fi
# skip this file
@@ -180,8 +208,9 @@ for f in $allfiles; do
# Create a temporary directory name
tmpdir=$odir/$name-tmpunpack
- # If the temporary directory exists, mkdir will throw an error. The
- # developer needs to intervene manually to fix the issue.
+ # If the temporary directory exists, delete it and build an empty
+ # directory to work on (to avoid potential conflicts).
+ if [ -d $tmpdir ]; then rm -rf $tmpdir; fi
mkdir $tmpdir
@@ -206,19 +235,33 @@ for f in $allfiles; do
# Put the current date on all the files because some packagers will not
# add dates to their release tarballs, resulting in dates of the
# Unix-time zero'th second (1970-01-01 at 00:00:00)!
- touch $(find "$name"/ -type f)
+ # -print0 is needed for those tarballs that has paths with spaces. For
+ # the same reason it's needed also `xargs -0`. (`xargs` is needed also
+ # for large tarballs such as gcc's)
+ find "$name"/ -type f -print0 | xargs -0 touch
+
+ # Some software source files (like Boost; https://www.boost.io)
+ # have names that are too long for the more robust 'ustar'
+ # format. So for we should use 'pax' for them.
+ if [ $sname = boost ]; then tarformat=pax
+ else tarformat=ustar
+ fi
# Pack with recommended options
- tar -c -Hustar --owner=root --group=root \
+ tar -c -H$tarformat --owner=root --group=root \
-f $name.tar $name/
- lzip -9 $name.tar
+
+ # Lzip will not be available when unpacking Lzip, so we just use Tar.
+ if [[ ! $name =~ ^lzip ]]; then
+ lzip -9 $name.tar
+ fi
# Move the compressed file from the temporary directory to the target
# output directory
- mv $name.tar.lz $odir/
+ mv $outname $odir/
# Print the sha512sum along with the filename for a quick reference
- echo $(sha512sum $odir/$name.tar.lz)
+ echo $(sha512sum $odir/$outname)
# Clean up the temporary directory
rm -rf $tmpdir