aboutsummaryrefslogtreecommitdiff
path: root/reproduce/software/make
diff options
context:
space:
mode:
Diffstat (limited to 'reproduce/software/make')
-rw-r--r--reproduce/software/make/basic.mk214
-rw-r--r--reproduce/software/make/high-level.mk545
-rw-r--r--reproduce/software/make/python.mk383
-rw-r--r--reproduce/software/make/xorg.mk1
4 files changed, 947 insertions, 196 deletions
diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk
index 4e85807..92fa8f0 100644
--- a/reproduce/software/make/basic.mk
+++ b/reproduce/software/make/basic.mk
@@ -105,12 +105,13 @@ endif
export CPPFLAGS := -I$(idir)/include $(CPPFLAGS) $(noccwarnings)
# This is the "basic" tools where we are relying on the host operating
-# system, but are slowly populating our basic software envirnoment. To run
-# (system or template) programs, 'LD_LIBRARY_PATH' is necessary, so here,
-# we'll first tell the programs to look into any possible pre-defined
-# '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 '::'.
+# system, but are slowly populating our basic software envirnoment. So
+# here, we are also appending the host's 'LD_LIBRARY_PATH' to Maneage's
+# installed library path. It is just important to keep Maneage's library
+# directories first so when something has been built, the newly built
+# software use (link-with) Maneage's libraries, not the host's. 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
@@ -120,7 +121,7 @@ export CPPFLAGS := -I$(idir)/include $(CPPFLAGS) $(noccwarnings)
ifeq ($(strip $(LD_LIBRARY_PATH)),)
export LD_LIBRARY_PATH=$(sys_library_sh_path)
endif
-export LD_LIBRARY_PATH := $(shell echo $(LD_LIBRARY_PATH):$(ildir) \
+export LD_LIBRARY_PATH := $(shell echo $(ildir):$(LD_LIBRARY_PATH) \
| sed -e's/::/:/g' -e's/^://' -e's/:$$//')
# RPATH is automatically written in macOS, so 'DYLD_LIBRARY_PATH' is
@@ -253,6 +254,23 @@ $(ibidir)/low-level-links: $(ibidir)/grep-$(grep-version) \
# systems)
$(call makelink,ldd)
+# zic: On some systems like Debian GNU/Linux, 'zic' may be in
+# '/usr/sbin' and is available to users. But it is not normally in
+# the 'PATH' of a non-root user. This is because the executables
+# there are normally system-level commands, and most are executable
+# only by the root user.
+ $(call makelink,zic)
+ if [ "x$$(command -v zic)" = x ]; then
+ zicfullpath=$$(PATH=$${PATH}:/usr/sbin command -v zic)
+ if [ "x$${zicfullpath}" = x ]; then
+ printf "Warning: 'zic' not found. You may need it for"
+ printf " higher-level packages such as 'tzdb'. Install"
+ printf " 'zic' if needed.\n"
+ else
+ ln -sf $$(realpath $${zicfullpath}) $(ibdir)/zic
+ fi
+ fi
+
# We want this to be empty (so it doesn't interefere with the other
# files in 'ibidir'.
touch $@
@@ -376,8 +394,8 @@ $(ibidir)/tar-$(tar-version): \
# Patchelf is necessary for some software on GNU/Linux systems, its job is
# to manually insert RPATH into the dynamically-linked executable. Since
# all the other software depend on Pathelf, to avoid manually repeating as
-# a prerequisite (and forgetting in others causing bugs), we'll put it as a
-# dependancy of 'tar'.
+# a prerequisite (and forgetting in others causing bugs), it is installed
+# in this phase (right after 'tar').
$(ibidir)/patchelf-$(patchelf-version): $(ibidir)/tar-$(tar-version)
tarball=patchelf-$(patchelf-version).tar.lz
$(call import-source, $(patchelf-url), $(patchelf-checksum))
@@ -388,7 +406,47 @@ $(ibidir)/patchelf-$(patchelf-version): $(ibidir)/tar-$(tar-version)
echo "PatchELF $(patchelf-version)" > $@
fi
+$(ibidir)/pkg-config-$(pkgconfig-version): $(ibidir)/tar-$(tar-version)
+# Download the tarball.
+ tarball=pkg-config-$(pkgconfig-version).tar.lz
+ $(call import-source, $(pkgconfig-url), $(pkgconfig-checksum))
+
+# An existing 'libiconv' can cause a conflict with 'pkg-config' (this
+# is why 'libiconv' depends on 'pkg-config'). On a clean build,
+# 'pkg-config' is built first. But when we don't have a clean build
+# (and 'libiconv' exists) there will be a problem. So before
+# re-building 'pkg-config', we'll remove any installation of
+# 'libiconv'.
+ rm -f $(ildir)/libiconv* $(idir)/include/iconv.h
+
+# Some Mac OS systems may have a version of the GNU C Compiler (GCC)
+# installed that doesn't support some necessary features of building
+# Glib (as part of pkg-config), so we will disable pkg-config's
+# internal Glib for Mac systems, and to be further safe, we'll make
+# sure it will use LLVM's Clang.
+#
+# On macOS systems, to ensure that Clang can build pkg-config, take
+# the following steps:
+# 1. Install the latest Glib via Homebrew:
+# brew install glib
+# 2. Set these environment variables before configuring Maneage:
+# export GLIB_CFLAGS=$(pkg-config --cflags glib-2.0)
+# export GLIB_LIBS=$(pkg-config --libs glib-2.0)
+# 3. Ensure PKG_CONFIG_PATH includes Homebrew's pkgconfig:
+# export PKG_CONFIG_PATH=/opt/homebrew/lib/pkgconfig:$PKG_CONFIG_PATH
+ if [ x$(on_mac_os) = xyes ]; then
+ extra_pkgconf=""
+ export compiler="CC=clang"
+ else
+ export compiler=""
+ extra_pkgconf="--with-internal-glib"
+ fi
+ export CFLAGS="-std=$(std_c_old) $$CFLAGS"
+ $(call gbuild, pkg-config-$(pkgconfig-version), static, \
+ $$compiler $$extra_pkgconf \
+ --with-pc-path=$(ildir)/pkgconfig, V=1)
+ echo "pkg-config $(pkgconfig-version)" > $@
@@ -408,7 +466,10 @@ $(ibidir)/patchelf-$(patchelf-version): $(ibidir)/tar-$(tar-version)
# function (for tilde expansion). The first can be disabled with
# '--disable-load', but unfortunately I don't know any way to fix the
# second. So, we'll have to build it dynamically for now.
-$(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version)
+$(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version) \
+ $(ibidir)/pkg-config-$(pkgconfig-version)
+
+# Prepare the input.
tarball=ncurses-$(ncurses-version).tar.lz
$(call import-source, $(ncurses-url), $(ncurses-checksum))
@@ -424,12 +485,18 @@ $(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version)
rm -f $(ibdir)/bash* $(ibdir)/awk* $(ibdir)/gawk*
# Standard build process.
- export CFLAGS="-std=gnu17 $$CFLAGS"
+ export CFLAGS="-std=$(std_c_old) $$CFLAGS"
$(call gbuild, ncurses-$(ncurses-version), static, \
- --with-shared --enable-rpath --without-normal \
- --without-debug --with-cxx-binding \
- --with-cxx-shared --enable-widec --enable-pc-files \
- --with-pkg-config=$(ildir)/pkgconfig, -j$(numthreads))
+ --with-shared \
+ --enable-rpath \
+ --enable-widec \
+ --without-debug \
+ --without-normal \
+ --enable-pc-files \
+ --with-cxx-shared \
+ --with-cxx-binding \
+ --with-pkg-config=$(ildir)/pkgconfig, \
+ -j$(numthreads))
# Unfortunately there are many problems with 'ncurses' using "normal"
# (or 8-bit) characters. The standard way that will work is to build
@@ -567,7 +634,7 @@ $(ibidir)/bash-$(bash-version): \
export CFLAGS="$$CFLAGS \
-DDEFAULT_PATH_VALUE='\"$(ibdir)\"' \
-DSTANDARD_UTILS_PATH='\"$(ibdir)\"' \
- -DSYS_BASHRC='\"$(BASH_ENV)\"' "
+ -DSYS_BASHRC='\"$(BASH_ENV)\"'"
$(call gbuild, bash-$(bash-version),, $$stopt \
--with-installed-readline=$(ildir) \
--with-curses=yes, \
@@ -584,9 +651,6 @@ $(ibidir)/bash-$(bash-version): \
# shell. By convention, 'sh' is just a symbolic link to the preferred
# shell executable. So we'll define '$(ibdir)/sh' as a symbolic link
# to the Bash that we just built and installed.
-#
-# Just to be sure that the installation step above went well, before
-# making the link, we'll see if the file actually exists there.
ln -fs $(ibdir)/bash $(ibdir)/sh
echo "GNU Bash $(bash-version)" > $@
@@ -599,6 +663,7 @@ $(ibidir)/bash-$(bash-version): \
+
# Level 4: Most other programs
# ----------------------------
@@ -612,15 +677,21 @@ perl-conflddlflags =
else
perl-conflddlflags = -Dlddlflags="-shared $$LDFLAGS"
endif
-$(ibidir)/perl-$(perl-version): $(ibidir)/patchelf-$(patchelf-version)
+$(ibidir)/perl-$(perl-version): $(ibidir)/tar-$(tar-version)
+
+# Import tarball.
tarball=perl-$(perl-version).tar.lz
$(call import-source, $(perl-url), $(perl-checksum))
+
+# Extract the version strings.
major_version=$$(echo $(perl-version) \
| sed -e's/\./ /g' \
| awk '{printf("%d", $$1)}')
base_version=$$(echo $(perl-version) \
| sed -e's/\./ /g' \
| awk '{printf("%d.%d", $$1, $$2)}')
+
+# Unpack, build and install.
cd $(ddir)
rm -rf perl-$(perl-version)
tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
@@ -631,15 +702,15 @@ $(ibidir)/perl-$(perl-version): $(ibidir)/patchelf-$(patchelf-version)
-Duseshrplib \
-Dprefix=$(idir) \
-Dvendorprefix=$(idir) \
- -Dprivlib=$(idir)/share/perl$$major_version/core_perl \
- -Darchlib=$(idir)/lib/perl$$major_version/$$base_version/core_perl \
- -Dsitelib=$(idir)/share/perl$$major_version/site_perl \
- -Dsitearch=$(idir)/lib/perl$$major_version/$$base_version/site_perl \
- -Dvendorlib=$(idir)/share/perl$$major_version/vendor_perl \
- -Dvendorarch=$(idir)/lib/perl$$major_version/$$base_version/vendor_perl \
- -Dscriptdir=$(idir)/bin/core_perl \
- -Dsitescript=$(idir)/bin/site_perl \
- -Dvendorscript=$(idir)/bin/vendor_perl \
+ -Dprivlib=$(idir)/share/perl$$major_version/perl-core \
+ -Darchlib=$(idir)/lib/perl$$major_version/$$base_version/perl-core \
+ -Dsitelib=$(idir)/share/perl$$major_version/perl-site \
+ -Dsitearch=$(idir)/lib/perl$$major_version/$$base_version/perl-site \
+ -Dvendorlib=$(idir)/share/perl$$major_version/perl-vendor \
+ -Dvendorarch=$(idir)/lib/perl$$major_version/$$base_version/perl-vendor \
+ -Dscriptdir=$(idir)/bin/perl-core \
+ -Dsitescript=$(idir)/bin/perl-site \
+ -Dvendorscript=$(idir)/bin/perl-vendor \
-Dinc_version_list=none \
-Dman1ext=1perl \
-Dman3ext=3perl \
@@ -650,7 +721,14 @@ $(ibidir)/perl-$(perl-version): $(ibidir)/patchelf-$(patchelf-version)
make install
cd ..
rm -rf perl-$(perl-version)
- cd $$topdir
+
+# Symbolic links to necessary Perl programs (that Perl installs in
+# the 'perl-core' directory.
+ ln -sf $(ibdir)/perl-core/xsubpp $(ibdir)/xsubpp
+ ln -sf $(ibdir)/perl-core/pod2man $(ibdir)/pod2man
+ ln -sf $(ibdir)/perl-core/pod2text $(ibdir)/pod2text
+
+# Final target.
echo "Perl $(perl-version)" > $@
@@ -719,29 +797,6 @@ $(ibidir)/coreutils-$(coreutils-version): \
rm -rf coreutils-$(coreutils-version)
echo "GNU Coreutils $(coreutils-version)" > $@
-# Podlators
-#
-# POD is short for "Plain Old Documentation", that is the format used in
-# Perl's documentation. Podlators provies two executables pod2man and
-# pod2text convert this into the roff format (used in man pages) or pod2 It
-# is used by some software like OpenSSL to create their man pages.
-$(ibidir)/podlators-$(podlators-version): $(ibidir)/perl-$(perl-version)
- tarball=podlators-$(podlators-version).tar.lz
- $(call import-source, $(podlators-url), $(podlators-checksum))
- cd $(ddir)
- rm -rf podlators-$(podlators-version)
- 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
- ln -sf $(ibdir)/site_perl/pod2man $(ibdir)/pod2man
- ln -sf $(ibdir)/site_perl/pod2text $(ibdir)/pod2text
- cd ..
- rm -rf podlators-$(podlators-version)
- echo "podlators $(podlators-version)" > $@
-
# OpenSSL
#
# Until we find a nice and generic way to create an updated CA file in the
@@ -749,8 +804,9 @@ $(ibidir)/podlators-$(podlators-version): $(ibidir)/perl-$(perl-version)
# along with the other tarballs.
$(idir)/etc:; mkdir $@
$(idir)/etc/ssl: | $(idir)/etc; mkdir $@
-$(ibidir)/openssl-$(openssl-version): $(ibidir)/podlators-$(podlators-version) \
- | $(idir)/etc/ssl
+$(ibidir)/openssl-$(openssl-version): $(ibidir)/perl-$(perl-version) \
+ $(ibidir)/patchelf-$(patchelf-version) \
+ | $(idir)/etc/ssl
# First download the certificates and copy them into the
# installation directory.
@@ -906,7 +962,7 @@ $(ibidir)/diffutils-$(diffutils-version): \
echo "GNU Diffutils $(diffutils-version)" > $@
$(ibidir)/file-$(file-version): $(ibidir)/coreutils-$(coreutils-version)
- export CFLAGS="-std=c99 $$CFLAGS"
+ export CFLAGS="-std=$(std_c_old) $$CFLAGS"
tarball=file-$(file-version).tar.lz
$(call import-source, $(file-url), $(file-checksum))
$(call gbuild, file-$(file-version), static, \
@@ -958,6 +1014,8 @@ $(ibidir)/help2man-$(help2man-version): \
$(call gbuild, help2man-$(help2man-version), static, ,V=1)
echo "Help2man $(Help2man-version)" > $@
+# Even though libiconv does not use pkg-config, pkg-config conflicts with
+# it, see the comments in pkg-config for more.
$(ibidir)/libiconv-$(libiconv-version): \
$(ibidir)/pkg-config-$(pkgconfig-version)
tarball=libiconv-$(libiconv-version).tar.lz
@@ -973,12 +1031,14 @@ $(ibidir)/libunistring-$(libunistring-version): \
-j$(numthreads))
echo "GNU libunistring $(libunistring-version)" > $@
-$(ibidir)/libxml2-$(libxml2-version): $(ibidir)/patchelf-$(patchelf-version)
+$(ibidir)/libxml2-$(libxml2-version): $(ibidir)/tar-$(tar-version)
# The libxml2 tarball also contains Python bindings which are built
# and installed to a system directory by default. If you don't need
# the Python bindings, the easiest solution is to compile without
# Python support: './configure --without-python'. If you really need
-# the Python bindings, use '--with-python-install-dir=DIR' instead.
+# its Python bindings:
+# 1. Add the Python dependency.
+# 2. Add the '--with-python-install-dir=DIR' configure option.
tarball=libxml2-$(libxml2-version).tar.lz
$(call import-source, $(libxml2-url), $(libxml2-checksum))
$(call gbuild, libxml2-$(libxml2-version), static, \
@@ -1017,7 +1077,7 @@ $(ibidir)/gmp-$(gmp-version): \
$(ibidir)/coreutils-$(coreutils-version)
tarball=gmp-$(gmp-version).tar.lz
$(call import-source, $(gmp-url), $(gmp-checksum))
- export CFLAGS="-std=gnu17 $$CFLAGS"
+ export CFLAGS="-std=$(std_c_old) $$CFLAGS"
$(call gbuild, gmp-$(gmp-version), static, \
--enable-cxx --enable-fat, \
-j$(numthreads))
@@ -1085,33 +1145,6 @@ $(ibidir)/mpfr-$(mpfr-version): $(ibidir)/gmp-$(gmp-version)
$(call gbuild, mpfr-$(mpfr-version), static)
echo "GNU Multiple Precision Floating-Point Reliably $(mpfr-version)" > $@
-$(ibidir)/pkg-config-$(pkgconfig-version): $(ibidir)/patchelf-$(patchelf-version)
-
-# Download the tarball.
- tarball=pkg-config-$(pkgconfig-version).tar.lz
- $(call import-source, $(pkgconfig-url), $(pkgconfig-checksum))
-
-# An existing 'libiconv' can cause a conflict with 'pkg-config', this
-# is why 'libiconv' depends on 'pkg-config'. On a clean build,
-# 'pkg-config' is built first. But when we don't have a clean build
-# (and 'libiconv' exists) there will be a problem. So before
-# re-building 'pkg-config', we'll remove any installation of
-# 'libiconv'.
- rm -f $(ildir)/libiconv* $(idir)/include/iconv.h
-
-# Some Mac OS systems may have a version of the GNU C Compiler (GCC)
-# installed that doesn't support some necessary features of building
-# Glib (as part of pkg-config). So to be safe, for Mac systems, we'll
-# make sure it will use LLVM's Clang.
- if [ x$(on_mac_os) = xyes ]; then export compiler="CC=clang"
- else export compiler=""
- fi
- export CFLAGS="-std=gnu17 $$CFLAGS"
- $(call gbuild, pkg-config-$(pkgconfig-version), static, \
- $$compiler --with-internal-glib \
- --with-pc-path=$(ildir)/pkgconfig, V=1)
- echo "pkg-config $(pkgconfig-version)" > $@
-
$(ibidir)/sed-$(sed-version): $(ibidir)/coreutils-$(coreutils-version)
tarball=sed-$(sed-version).tar.lz
$(call import-source, $(sed-url), $(sed-checksum))
@@ -1219,6 +1252,7 @@ $(ibidir)/binutils-$(binutils-version): \
$(call makelink,ld)
$(call makelink,nm)
$(call makelink,ps)
+ $(call makelink,lipo)
$(call makelink,strip)
$(call makelink,ranlib)
echo "" > $@
@@ -1442,6 +1476,14 @@ $(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version)
-e"s|FS_IOC_SETVERSION;|_IOW('v', 2, long);|" \
-i libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
+# Bug in GCC 15.2.0 using glibc 2.43 (see [1]) as fixed in [2].
+# [1] https://patchwork.ozlabs.org/project/gcc/patch/e1679277-d7c9-49aa-8365-a8dca082d9bd@web.de
+# [2] https://github.com/johnny-mnemonic/toolchain-autobuilds/commit/9585fdfc
+ sed -e's|char \*q = strchr (p + 1,|const char \*q = strchr (p + 1,|' \
+ libgomp/affinity-fmt.c > affinity-fmt-tmp.c
+ mv affinity-fmt-tmp.c libgomp/affinity-fmt.c
+
+
# Set the build directory for the processing.
mkdir build
cd build
diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk
index 83486dc..d059544 100644
--- a/reproduce/software/make/high-level.mk
+++ b/reproduce/software/make/high-level.mk
@@ -438,6 +438,23 @@ $(ibidir)/cfitsio-$(cfitsio-version):
tar cf $$customtar cfitsio-$(cfitsio-version)
cd $$topdir
+# Add SSE2 optimization only when we are on a Linux kernel or using
+# macOS on an Intel CPU.
+ arch=$$(uname -m)
+ unames=$$(uname -s)
+ if [ "$$unames" = "Linux" ]; then
+ confopts="$$confopts --enable-sse2"
+ elif [ "$$unames" = "Darwin" ] && [ "$$arch" = "x86_64" ]; then
+ confopts="$$confopts --enable-sse2"
+ fi
+
+# On macOS, system libraries (e.g., libSystem) are inside the SDK,
+# not standard paths. 'xcrun' provides the correct SDK path; use $$
+# so it is evaluated by the shell (not Make).
+ if [ $(on_mac_os) = yes ]; then
+ export SDKROOT=$$(xcrun --show-sdk-path)
+ fi
+
# 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.
@@ -446,7 +463,10 @@ $(ibidir)/cfitsio-$(cfitsio-version):
# specific 'shared' target for the building of the shared libraries.
export gbuild_tar=$(ddir)/$$customtar
$(call gbuild, cfitsio-$(cfitsio-version), , \
- --enable-sse2 --enable-reentrant \
+ $$confopts \
+ --disable-curl \
+ --disable-fortran \
+ --enable-reentrant \
--with-bzip2=$(idir), , \
make fpack funpack)
rm $$customtar
@@ -505,36 +525,62 @@ $(ibidir)/expat-$(expat-version):
$(call gbuild, expat-$(expat-version), static)
echo "Expat $(expat-version)" > $@
+# FFTW manual customizations:
+#
+# - To activate the OpenMPI features of FFTW, add OpenMPI as a dependency
+# of FFTW: the necessary flags are automatically added if OpenMPI was
+# installed before FFTW.
+#
+# - There are Intel-specific optimizations that can be enabled by adding
+# the following two options to 'opts'
+#
+# --enable-avx --enable-sse2
+#
+# However, they cause crashes on non-Intel processors (has been confirmed
+# in ARM's aarch64). So in the generic scenario they are
+# removed. Checking how these optimizations affect the numerical accuracy
+# of the result (and thus optionally adding them for Intel-based
+# processors) should be studied before they are optionally added for
+# Intel-based CPUs (and ignored for others).
$(ibidir)/fftw-$(fftw-version):
# Prepare the source tarball.
tarball=fftw-$(fftw-version).tar.lz
$(call import-source, $(fftw-url), $(fftw-checksum))
-# FFTW's single and double precision libraries must be built
-# independently: for the the single-precision library, we need to add
-# the '--enable-float' option. We will build this first, then the
-# default double-precision library.
-#
-# There are Intel-specific optimizations that can be enabled by
-# adding the following two options to 'confop'
-#
-# --enable-avx --enable-sse2
-#
-# However, they cause crashs on non-Intel processors (has been
-# confirmed in ARM's aarch64). So in the generic scenario they are
-# removed. Checking how these optimizations affect the numeric
-# accuracy of the result (and thus optionally adding them for
-# Intel-based processors) should be studied before they are
-# optionally added for Intel-based CPUs (and ignored for others).
- confop="--enable-shared --enable-threads"
- $(call gbuild, fftw-$(fftw-version), static, \
- $$confop --enable-float)
- $(call gbuild, fftw-$(fftw-version), static, \
- $$confop)
- cp $(dtexdir)/fftw.tex $(ictdir)/
+# Specific customizations: you can add the options mentioned above
+# after the 'if' statements, for example: "opts=$$opts EXTRA".
+ opts="--enable-shared --enable-threads"
+ if [ x$(on_mac_os) = xyes ]; then opts="$$opts --disable-fortran"
+ else
+ if [ -f $(ibidir)/openmpi-$(openmpi-version) ]; then
+ opts="$$opts --enable-openmp --enable-mpi"
+ fi
+ fi
+
+# FFTW's single, double and long-double precision libraries must be
+# built separately (fully independent builds and installs).
+ $(call gbuild, fftw-$(fftw-version), static, $$opts)
+ $(call gbuild, fftw-$(fftw-version), static, $$opts \
+ --enable-float)
+ $(call gbuild, fftw-$(fftw-version), static, $$opts \
+ --enable-long-double)
+ cp -pv $(dtexdir)/fftw.tex $(ictdir)/
echo "FFTW $(fftw-version) \citep{fftw}" > $@
+# 2026-02-20 'framel' is needed by the python package lalsuite, which is
+# needed by ligo-skymap; currently the compile of 'framel' 8.49.0 fails with
+#
+# error: initialization of 'void (*)(void)' from incompatible
+# pointer type 'void (*)(int, char *)' [-Wincompatible-pointer-types]
+#
+# Hints: try using gcc -std=gnu99 or -std=gnu11 (default is -std=gnu17).
+$(ibidir)/framel-$(framel-version): $(ibidir)/cmake-$(cmake-version)
+ tarball=framel-$(framel-version).tar.lz
+ $(call import-source, $(framel-url), $(framel-checksum))
+ $(call cbuild, framel-$(framel-version), static)
+ echo "Framel $(framel-version)" > $@
+
$(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
@@ -571,64 +617,114 @@ $(ibidir)/hdf5-$(hdf5-version): $(ibidir)/openmpi-$(openmpi-version)
echo "HDF5 library $(hdf5-version)" > $@
# HEALPix includes the source of its C, C++, Python (and several other
-# languages) libraries within one tarball. We will include the Python
-# installation only when any other Python module is requested (in
-# 'TARGETS.conf').
+# languages) libraries within one tarball. However, we do not build the
+# python version here; instead we provide 'healpy' as a separate package;
+# see 'python.mk' for the build rule.
#
# Note that the default './configure' script is an interactive script which
# is hard to automate. So we need to go into the 'autotools' directory of
# the 'C' and 'cxx' directories and configure the GNU Build System (with
# 'autoreconf', which uses 'autoconf' and 'automake') to easily build the
# HEALPix C/C++ libraries in batch mode.
-ifeq ($(strip $(targets-python)),)
-healpix-python-dep =
-else
-healpix-python-dep = $(ipydir)/matplotlib-$(matplotlib-version) \
- $(ipydir)/astropy-$(astropy-version)
-endif
-$(ibidir)/healpix-$(healpix-version): $(healpix-python-dep) \
+$(ibidir)/healpix-$(healpix-version): \
$(ibidir)/cfitsio-$(cfitsio-version) \
$(ibidir)/autoconf-$(autoconf-version) \
$(ibidir)/automake-$(automake-version)
+
+# Import the tarball.
tarball=healpix-$(healpix-version).tar.lz
$(call import-source, $(healpix-url), $(healpix-checksum))
- if [ x"$(healpix-python-dep)" = x ]; then
- pycommand1="echo no-healpy-because-no-other-python"
- pycommand2="echo no-healpy-because-no-other-python"
- else
- pycommand1="python setup.py build"
- pycommand2="python setup.py install"
- fi
- rm -rf $(ddir)/Healpix_$(healpix-version)
+
+# Setup the build directory
+ rm -rf $(ddir)/healpix-$(healpix-version)
topdir=$(pwd); cd $(ddir);
tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
- cd Healpix_$(healpix-version)
+ cd healpix-$(healpix-version)
$(shsrcdir)/prep-source.sh $(ibdir)
- cd src/C/autotools
+
+# Compile and install libsharp:
+ cd src/common_libraries/libsharp
autoreconf --install
./configure --prefix=$(idir)
make V=1 -j$(numthreads) SHELL=$(ibdir)/bash
make install
- cd ../../cxx/autotools/
+
+# Compile and install the C version:
+ cd ../../C/autotools
+ printf "\n\nDEBUG ONLY\n\n"; /bin/pwd; printf "\nGUBED\n\n\n"
+ autoreconf --install
+ ./configure --prefix=$(idir)
+ make V=1 -j$(numthreads) SHELL=$(ibdir)/bash
+ make install
+
+# Compile and install the C++ version:
+ cd ../../cxx/
+ printf "\n\nDEBUG.BBBB ONLY\n\n"; /bin/pwd; printf "\nBBB.GUBED\n\n\n"
autoreconf --install
./configure --prefix=$(idir)
# With CFITSIO 4.0, the 'CFITSIO_VERSION' macro has three
-# components. But this version of Healpix doesn't yet account for
-# this.
+# components. But this (which?) version of Healpix doesn't yet
+# account for this.
sed -i -e's/CFITSIO_VERSION/fitsversion/' cxxsupport/fitshandle.cc
# Continue with the building.
make V=1 -j$(numthreads) SHELL=$(ibdir)/bash
make install
- cd ../../healpy
- $$pycommand1
- $$pycommand2
+
+# Finalize the build
cd $$topdir
- rm -rf $(ddir)/Healpix_$(healpix-version)
+ rm -rf $(ddir)/healpix-$(healpix-version)
cp $(dtexdir)/healpix.tex $(ictdir)/
echo "HEALPix $(healpix-version) \citep{healpix}" > $@
+# 2025-05-24 The build rules here for 'lalsuite' include git initialisation
+# with a dummy commit of all the source files since this is required for an
+# install unless the .git/ directory (currently 650 Mb) is included in the
+# tarball. Our lalsuite tarball also has many big data test files removed,
+# since these are unlikely to be needed in typically astronomy usage; this
+# brings the .tar.lz file down to 25 Mb from the default of about 950 Mb
+# (tar.gz) or 740 Mb (tar.lz).
+#
+# If you need to do full gravitational wave work with 'lalsuite', then you
+# should provide an alternative tarball and edit the three files
+# reproduce/software/config/{versions,checksums,urls}.conf in order to use
+# your preferred tarball.
+$(ipydir)/lalsuite-$(lalsuite-version): \
+ $(ibidir)/automake-$(automake-version) \
+ $(ibidir)/swig-$(swig-version) \
+ $(ibidir)/metaio-$(metaio-version) \
+ $(ibidir)/framel-$(framel-version) \
+ $(ipydir)/astropy-$(astropy-version) \
+ $(ipydir)/igwn-segments-$(igwn-segments-version) \
+ $(ipydir)/lscsoft-glue-$(lscsoft-glue-version) \
+ $(ipydir)/python-dateutil-$(python-dateutil-version)
+ tarball=lalsuite-$(lalsuite-version).tar.lz
+ $(call import-source, $(lalsuite-url), \
+ $(lalsuite-checksum))
+
+# First: build from source as if it's a C source only.
+ cd $(ddir)
+ unpackdir=lalsuite-$(lalsuite-version)
+ rm -rf $$unpackdir
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd $$unpackdir
+ $(shsrcdir)/prep-source.sh $(ibdir)
+
+# A git commit is needed to generate version-control files; the
+# strings in these will be rather arbitrary and should be ignored.
+ git init && git add .
+ git commit -a --no-edit -m "Dummy commit" \
+ --author "Tarball <tar@ball.only>"
+ autoreconf
+ ./configure --prefix="$(idir)" --enable-swig-python
+ make
+ make install
+
+# Clean up and build final tarball
+ cd $(ddir); rm -fr $$unpackdir
+ echo "LALSuite $(lalsuite-version)" > $@
+
$(ibidir)/libbsd-$(libbsd-version): $(ibidir)/libmd-$(libmd-version)
tarball=libbsd-$(libbsd-version).tar.lz
$(call import-source, $(libbsd-url), $(libbsd-checksum))
@@ -840,9 +936,52 @@ $(ibidir)/ninjabuild-$(ninjabuild-version): $(ibidir)/cmake-$(cmake-version)
echo "Ninja build system $(ninjabuild-version)" > $@
$(ibidir)/openblas-$(openblas-version):
+
+# Import the tarball.
tarball=openblas-$(openblas-version).tar.lz
$(call import-source, $(openblas-url), $(openblas-checksum))
- if [ x$(on_mac_os) = xyes ]; then export CC=clang; fi
+
+# If 'gcc' is actually a symbolic link to 'clang', then print the
+# following message to guide the user on how to prepare their
+# environment.
+ if $$CC --version | grep clang &> /dev/null; then
+
+# Print message.
+ echo; echo
+ printf "*********************************************\n"
+ printf "OpenBlas could not be installed with Clang!\n\n"
+ printf "In order to install OpenBLAS, GCC and Gfortran are "
+ printf "needed. You can take the following steps to fix "
+ printf "this:\n\n"
+ printf "1. Install GCC with Homebrew.\n"
+ printf "2. Get the full path of 'gcc', 'g++', and 'gfortran' "
+ printf "(for example with 'which gcc').\n"
+ printf "3. Comment the 'exit 1' and un-comment (and edit) the "
+ printf "'export's that are below this message (in the "
+ printf "'openblas' rule of "
+ printf "'reproduce/software/make/high-level.mk', within the "
+ printf "'openblas' rule):\n\n"
+ printf " exit 1\n"
+ printf " #export CC=/opt/homebrew/bin/gcc-XX\n"
+ printf " #export CXX=/opt/homebrew/bin/g++-XX\n"
+ printf " #export FC=/opt/homebrew/bin/gfortran-XX\n\n"
+ printf " with the lines:\n\n"
+ printf " #exit 1\n"
+ printf " export CC=/opt/homebrew/bin/gcc-15\n"
+ printf " export CXX=/opt/homebrew/bin/g++-15\n"
+ printf " export FC=/opt/homebrew/bin/gfortran-15\n\n"
+ printf "5. Re-configure Maneage.\n"
+ printf "*********************************************\n"
+ echo; echo
+
+# Parts to modify when the message above is printed.
+ exit 1
+ #export CC=/opt/homebrew/bin/gcc-XX
+ #export CXX=/opt/homebrew/bin/g++-XX
+ #export FC=/opt/homebrew/bin/gfortran-XX
+ fi
+
+# Do the build.
cd $(ddir)
tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd openblas-$(openblas-version)
@@ -909,6 +1048,209 @@ $(ibidir)/tides-$(tides-version):
cp $(dtexdir)/tides.tex $(ictdir)/
echo "TIDES $(tides-version) \citep{tides}" > $@
+$(ibidir)/sqlite-$(sqlite-version): $(ibidir)/tcl-$(tcl-version)
+ tarball=sqlite-$(sqlite-version).tar.lz
+ $(call import-source, $(sqlite-url), $(sqlite-checksum))
+ $(call gbuild, sqlite-$(sqlite-version),, \
+ --enable-all --enable-static --enable-shared)
+ echo "Sqlite $(sqlite-version)" > $@
+
+$(ibidir)/tcl-$(tcl-version): $(ibidir)/zlib-$(zlib-version) \
+ $(ibidir)/tzdb-$(tzdb-version)
+
+# If both the tcl and tk packages are needed, then they must be built
+# together, with identical version numbers. Thus, for simplicity in
+# the build system, whether or not we build only tcl, or both tcl and
+# tk, we must check that the versions are identical.
+ if [ "x$(tcl-version)" != "x$(tk-version)" ]; then
+ printf "Error: This build system requires identical tcl and "
+ printf "tk versions to be selected **even if** tk is not "
+ printf "going to be built. However, tcl-version=$(tcl-version) "
+ printf "while tk-version=$(tk-version)\n"
+ exit 1
+ fi
+
+# Prepare the input tarball.
+ tarball=tcl-$(tcl-version).tar.lz
+ $(call import-source, $(tcl-url), $(tcl-checksum))
+
+# Setup the build directory
+ cd $(ddir)
+ unpackdir_tcl=tcl-$(tcl-version)
+ rm -rf $${unpackdir_tcl}
+
+# Install TCL
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd - # return to the top maneage directory
+ cd $(ddir)/$${unpackdir_tcl}/unix
+ $(shsrcdir)/prep-source.sh $(ibdir)
+ ./configure --prefix="$(idir)"
+ make -j$(numthreads)
+ make install
+ cd - # return to the top maneage directory
+
+# Setup the 'tclsh' symbolic link.
+ maj_min_version=$$(printf $(tcl-version)| \
+ sed -e "s;^\([0-9]*\.[0-9]*\).*\';\1;")
+ printf "Will symlink tclsh$${maj_min_version} as tclsh ...\n"
+ cd $(ibdir)
+ rm -fv tclsh && ln -sv tclsh$${maj_min_version} tclsh
+ cd -
+ cd $(ddir)
+
+# Finalize.
+ if (printf "$$unpackdir_tcl" | grep "[a-z][a-z]"); then \
+ rm -fr $$unpackdir_tcl
+ fi
+ echo "Tcl $(tcl-version)" > $(ibidir)/tcl-$(tcl-version)
+
+
+# The tk library needs the X11 library for building GUIs, and should not
+# normally be needed for a non-interactive project. However, GUIs built
+# with tk might be convenient during development of a project, since visual
+# checks within the maneage shell may be useful.
+#
+# We need to rebuild tcl temporarily in the temporary build area in order
+# to build tk. However, we want the tk target to be dependent on tcl as a
+# prerequisite to avoid the possibility of parallel builds that risk
+# conflicting within the build area because of duplicate use of the same
+# tcl package directory after untarring the archive.
+$(ibidir)/tk-$(tk-version): $(ibidir)/zip-$(zip-version) \
+ $(ibidir)/tcl-$(tcl-version) \
+ $(ibidir)/libx11-$(libx11-version) \
+
+# Prepare the tarball.
+ tarball=tk-$(tk-version).tar.lz
+ $(call import-source, $(tk-url), $(tk-checksum))
+
+# If both the tcl and tk packages are needed, then they must be built
+# together, with identical version numbers. Thus, for simplicity in
+# the build system, whether or not we build only tcl, or both tcl and
+# tk, we must check that the versions are identical.
+ if [ "x$(tcl-version)" != "x$(tk-version)" ]; then
+ printf "Error: This build system requires identical tcl and "
+ printf "tk versions to be selected **even if** tk is not "
+ printf "going to be built. However, tcl-version=$(tcl-version) "
+ printf "while tk-version=$(tk-version)\n"
+ exit 1
+ fi
+
+# Make sure no temporary directory exists.
+ cd $(ddir)
+ unpackdir=tk-$(tk-version)
+ if (printf "$$unpackdir" | grep "[a-z][a-z]"); then
+ rm -rf $$unpackdir
+ fi
+
+# Install TK: zipfs is being disabled because of the problem with
+# installing zip (see the comments above zip).
+ cd $(ddir)
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd $$unpackdir/unix
+ $(shsrcdir)/prep-source.sh $(ibdir)
+ ./configure --prefix="$(idir)" --with-tcl=$(ildir)
+ make -j$(numthreads)
+ make install
+
+# Finalize.
+ cd $(ddir)
+ if (printf "$$unpackdir" | grep "[a-z][a-z]"); then \
+ rm -fr $$unpackdir; fi
+ echo "Tk $(tk-version)" > $(ibidir)/tk-$(tk-version)
+
+
+
+# WARNING: Dependence on glibc: tzdb (time zone data base) uses the 'zic'
+# program from the GNU C library. Until Maneage builds its own glibc, it is
+# imported from the host operating system in the 'low-level-links' step of
+# 'basic.mk'.
+$(ibidir)/tzdb-$(tzdb-version):
+
+# Import the tarball
+ tarball=tzdb-$(tzdb-version).tar.lz
+ $(call import-source, $(tzdb-url), $(tzdb-checksum))
+
+# Unpack the tarball.
+ cd $(ddir)
+ unpackdir=tzdb-$(tzdb-version)
+ rm -rf $$unpackdir
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd $$unpackdir
+
+# Make necessary corrections.
+ TZGEN=$(strip $(ddir))/$$unpackdir/tzgen
+ printf "\n\n\n_____TZGEN=$${TZGEN}_____\n\n\n"
+ make AWK=gawk BACKWARD="backward" PACKRATDATA=backzone \
+ PACKRATLIST=zone.tab VERSION_DEPS= tzdata.zi leapseconds
+
+# Build the timezone data
+#
+# The '-b fat' option was created in glibc by around 2020, when
+# '-b slim' became the default. Allowing the default of '-b slim'
+# could potentially lead to a #Y2038 bug [3].
+#
+# Some other hacks are also needed for older glibc.
+#
+# [1] https://mm.icann.org/pipermail/tz-announce/2020-October/000059.html
+# [2] https://github.com/stub42/pytz/issues/48
+# [3] https://en.wikipedia.org/wiki/Year_2038_problem
+ BFAT_OPTION=$$(if (zic -b fat 2>/dev/null); then \
+ printf "%sb fat" "-"; else printf ""; fi)
+ if [ "x$${BFAT_OPTION}" = "x" ]; then \
+ sed -e 's/Sa\([^a-zA-Z]\)/Sat\1/g' \
+ -e 's/Su\([^a-zA-Z]\)/Sun\1/g' \
+ -e 's/^\(.\|..\) Sat/\1 Sa/' \
+ -e "s/lastSu\'/lastSun/" tzdata.zi \
+ | grep -v "^L" \
+ > tzdata.zi.3letter.days
+ zic $${BFAT_OPTION} -d $${TZGEN} -L /dev/null \
+ tzdata.zi.3letter.days
+ zic $${BFAT_OPTION} -d $${TZGEN}/right -L leapseconds \
+ tzdata.zi.3letter.days
+ else
+ zic $${BFAT_OPTION} -d $${TZGEN} -L /dev/null tzdata.zi
+ zic $${BFAT_OPTION} -d $${TZGEN}/right -L leapseconds \
+ tzdata.zi
+ fi
+
+# Replace hardlinks by symlinks
+ if [ "x$${BFAT_OPTION}" = "x" ]; then
+
+# Older method of creating symbolic links:
+ grep '^L ' $(ddir)/$$unpackdir/tzdata.zi \
+ | while read L target name ; do
+ absolute_name="$${TZGEN}/$$name"
+ relative_target=$$(realpath -m -s \
+ --relative-to="$${absolute_name%/*}" \
+ "$${TZGEN}/$$target")
+ maybe_newdir=$$(printf $$name | sed -e "s;/[^/]*\';;")
+ mkdir -p $${TZGEN}/$${maybe_newdir}
+ mkdir -p $${TZGEN}/right/$${maybe_newdir}
+ ln -sf "$$relative_target" "$${TZGEN}/$$name"
+ ln -sf "$$relative_target" "$${TZGEN}/right/$$name"
+ done
+
+ else
+
+# More recent (2025-05-25) method of creating symbolic links:
+ grep '^L ' $(ddir)/$$unpackdir/tzdata.zi \
+ | while read L target name ; do
+ absolute_name="$${TZGEN}/$$name"
+ relative_target=$$(realpath -m -s \
+ --relative-to="$${absolute_name%/*}" \
+ "$${TZGEN}/$$target")
+ ln -sf "$$relative_target" "$${TZGEN}/$$name"
+ ln -sf "$$relative_target" "$${TZGEN}/right/$$name"
+ done
+ fi
+
+# Generate a posixrules file (with a UTC timezone) and install.
+ ln -s Etc/UTC $${TZGEN}/posixrules
+ mkdir -p $(idir)/share/zoneinfo
+ cp -rv $${TZGEN}/* $(idir)/share/zoneinfo/
+ cd $(ddir); rm -rf $$unpackdir
+ echo "IANA Time Zone Database (tzdb) $(tzdb-version)" > $@
+
$(ibidir)/valgrind-$(valgrind-version):
tarball=valgrind-$(valgrind-version).tar.lz
$(call import-source, $(valgrind-url), $(valgrind-checksum))
@@ -964,7 +1306,19 @@ $(ibidir)/wcslib-$(wcslib-version): $(ibidir)/cfitsio-$(cfitsio-version)
tarball=wcslib-$(wcslib-version).tar.lz
$(call import-source, $(wcslib-url), $(wcslib-checksum))
+# macOS arm64 fix: reserve extra space in binary headers so
+# install_name_tool (called bellow, after installation) can safely
+# update library paths. Without this, we get the following error:
+# "larger updated load commands do not fit". SDKROOT is also
+# necessary for system libraries.
+ if [ x$(on_mac_os) = xyes ]; then
+ sdk=$$(xcrun --show-sdk-path)
+ LDFLAGS="$$LDFLAGS -isysroot $$sdk"
+ export LDFLAGS="$$LDFLAGS -Wl,-headerpad_max_install_names"
+ fi
+
# 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
@@ -973,11 +1327,18 @@ $(ibidir)/wcslib-$(wcslib-version): $(ibidir)/cfitsio-$(cfitsio-version)
# 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'.
+#
+# - Flex is disabled because we have not made it a prerequisite for
+# the 'wcslib' target, and we don't want the behaviour to differ
+# between host OSes that may or may not have 'flex', or may have
+# different versions of 'flex'.
$(call gbuild, wcslib-$(wcslib-version), , \
LIBS="-pthread -lcurl -lm" \
+ --disable-flex \
--without-pgplot \
--disable-fortran \
--with-cfitsiolib=$(ildir) \
@@ -1190,9 +1551,8 @@ $(ibidir)/ghostscript-$(ghostscript-version): \
# On macOS we use the system compiler and linker. The system linker
# there doesn't support '--copy-dt-needed-entries', while the one on
# Linux crashes if we remove it. So we only activate it on macOS.
- ldflags=""
if [ x$(on_mac_os) = xno ]; then
- ldflags="LDFLAGS=-Wl,--copy-dt-needed-entries"
+ export LDFLAGS="$$LDFLAGS -Wl,--copy-dt-needed-entries"
fi
# Unpack it and configure Ghostscript. The option
@@ -1202,8 +1562,7 @@ $(ibidir)/ghostscript-$(ghostscript-version): \
tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
cd ghostscript-$(ghostscript-version)
$(shsrcdir)/prep-source.sh $(ibdir)
- ./configure $$ldflags \
- --disable-cups \
+ ./configure --disable-cups \
--prefix=$(idir) \
--enable-dynamic \
--disable-compile-inits \
@@ -1405,6 +1764,16 @@ $(ibidir)/imfit-$(imfit-version): \
rm -rf $$unpackdir
echo "Imfit $(imfit-version) \citep{imfit2015}" > $@
+# This is the LIGO lscsoft package 'metaio' [1] (to be distinguished from
+# some other packages with the same name).
+#
+# [1] https://git.ligo.org/lscsoft/metaio
+$(ibidir)/metaio-$(metaio-version):
+ tarball=metaio-$(metaio-version).tar.lz
+ $(call import-source, $(metaio-url), $(metaio-checksum))
+ $(call gbuild, metaio-$(metaio-version), static)
+ echo "Lscsoft Metaio $(metaio-version)" > $@
+
# Minizip 1.x is actually distributed within zlib. It doesn't have its own
# independent tarball. So we need a custom build, which include the GNU
# Autotools (Autoconf and Automake). Note that Minizip 2.x isn't like this
@@ -1511,6 +1880,25 @@ $(ibidir)/netpbm-$(netpbm-version): \
rm -rf $$unpackdir
echo "Netpbm $(netpbm-version)" > $@
+$(ibidir)/parallel-$(parallel-version):
+
+# Prepare the tarball and build it.
+ tarball=parallel-$(parallel-version).tar.lz
+ $(call import-source, $(parallel-url), $(parallel-checksum))
+ $(call gbuild, parallel-$(parallel-version), static)
+
+# GNU Parallel requires the users to acknowledge that they will cite
+# it. Otherwise, it prints a warning on every run: reminding the user
+# to cite it. In Maneage, we make sure that all software that request
+# citation are cited automatically, so there is no need for a
+# Maneager to get this warning and we can automatically ensure the
+# developer that it will be cited.
+ echo "will cite" | $(ibdir)/parallel --citation
+
+# Copy the BibTeX source of the citation and finish.
+ cp -pv $(dtexdir)/parallel.tex $(ictdir)/
+ echo "GNU Parallel $(parallel-version) \citep{parallel}" > $@
+
$(ibidir)/patch-$(patch-version):
tarball=patch-$(patch-version).tar.gz
$(call import-source, $(patch-url), $(patch-checksum))
@@ -1529,6 +1917,13 @@ $(ibidir)/pcre-$(pcre-version):
, V=1 -j$(numthreads))
echo "Perl Compatible Regular Expressions $(pcre-version)" > $@
+$(ibidir)/pcre2-$(pcre2-version):
+ tarball=pcre2-$(pcre2-version).tar.lz
+ $(call import-source, $(pcre2-url), $(pcre2-checksum))
+ $(call gbuild, pcre2-$(pcre2-version), static)
+ echo "Perl Compatible Regular Expressions 2 $(pcre2-version)" > $@
+
+
# On macOS 12.3 Monterey with AppleClang 13.1.6.13160021, Plplot 5.15.0
# needs the 'finite' function of 'math.h' which has been deprecated in
# macOS. By manually adding "#define finite isfinite" in 'math.h' like
@@ -1695,15 +2090,13 @@ $(ibidir)/swarp-$(swarp-version): $(ibidir)/fftw-$(fftw-version)
cp $(dtexdir)/swarp.tex $(ictdir)/
echo "SWarp $(swarp-version) \citep{swarp}" > $@
-$(ibidir)/swig-$(swig-version):
-
-# Option --without-pcre was a suggestion once the configure step was
-# tried and it failed. It was not recommended but it works! pcr is a
-# dependency of swig
+$(ibidir)/swig-$(swig-version): \
+ $(ibidir)/pcre2-$(pcre2-version)
+# Not disabling pcre, since PCRE is needed for lalsuite (python).
tarball=swig-$(swig-version).tar.lz
$(call import-source, $(swig-url), $(swig-checksum))
$(call gbuild, swig-$(swig-version), static, \
- --without-pcre --without-tcl)
+ --without-tcl)
echo "Swig $(swig-version)" > $@
# The disables:
@@ -1779,6 +2172,10 @@ $(ibidir)/util-linux-$(util-linux-version): \
sed -i '/flex/d' autogen.sh
./autogen.sh
+# The 'autogen.sh' call resets the 'SHELL' (that was corrected in
+# 'prep-source.sh') to '/bin/sh'. Therefore, we need to correct it.
+ sed -i -e's|SHELL = /bin/sh|SHELL = $(SHELL)|' po/Makefile.in.in
+
# 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.
@@ -1892,16 +2289,28 @@ $(ibidir)/unzip-$(unzip-version): $(ibidir)/gzip-$(gzip-version)
BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 )
echo "Unzip $(unzip-version)" > $@
-$(ibidir)/zip-$(zip-version): $(ibidir)/gzip-$(gzip-version)
+$(ibidir)/zip-$(zip-version):
+
+# Prepare the tarball and build directory.
tarball=zip-$(zip-version).tar.lz
$(call import-source, $(zip-url), $(zip-checksum))
- $(call gbuild, zip-$(zip-version), static,, \
- -f unix/Makefile generic \
- CFLAGS="-DBIG_MEM -DMMAP",,pwd, \
- -f unix/Makefile generic \
- BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 )
- echo "Zip $(zip-version)" > $@
+# Unpack and go into the directory.
+ export LDFLAGS="$$LDFLAGS -static"
+ cd $(ddir)
+ rm -fr zip-$(zip-version)/
+ tar -xf $(tdir)/$$tarball --no-same-owner --no-same-permissions
+ cd zip-$(zip-version)/
+
+# Build and install
+ make SHELL=$(ibdir)/bash -f unix/Makefile generic
+ make SHELL=$(ibdir)/bash install -f unix/Makefile \
+ generic BINDIR=$(ibdir) MANDIR=$(idir)/man/man1
+
+# Go back to the top build directory, clean up and finalize.
+ cd $(ddir)
+ rm -rf zip-$(zip-version)/
+ echo "Zip $(zip-version)" > $@
diff --git a/reproduce/software/make/python.mk b/reproduce/software/make/python.mk
index c499996..6153f0a 100644
--- a/reproduce/software/make/python.mk
+++ b/reproduce/software/make/python.mk
@@ -83,7 +83,11 @@ $(ibidir)/libffi-$(libffi-version):
fi
echo "Libffi $(libffi-version)" > $@
-$(ibidir)/python-$(python-version): $(ibidir)/libffi-$(libffi-version)
+# 2025-05-26 '--with-system-ffi' seems to be obsolete
+# TODO: For a recommended list of dependencies, see
+# https://github.com/pyenv/pyenv/wiki#suggested-build-environment
+$(ibidir)/python-$(python-version): $(ibidir)/libffi-$(libffi-version) \
+ $(ibidir)/sqlite-$(sqlite-version)
# Download the source.
tarball=python-$(python-version).tar.lz
@@ -346,12 +350,27 @@ $(ipydir)/astropy-$(astropy-version): \
rm -fv $(idir)/bin/fits{diff,check,header,info,2bitmap}
rm -fv $(idir)/bin/{samp_hub,showtable,volint,wcslint}
+# Uncomment the 'export' command below only when building from a git
+# tarball, e.g. for testing if a bug still occurs:
+# export SETUPTOOLS_SCM_PRETEND_VERSION_FOR_ASTROPY=7.2.0.87
+
# 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-healpix-$(astropy-healpix-version): \
+ $(ipydir)/extension-helpers-$(extension-helpers-version) \
+ $(ipydir)/numpy-$(numpy-version)
+ tarball=astropy-healpix-$(astropy-healpix-version).tar.lz
+ $(call import-source, $(astropy-healpix-url), \
+ $(astropy-healpix-checksum))
+ $(call pybuild, tar -xf, \
+ astropy-healpix-$(astropy-healpix-version),,, \
+ GPEP517)
+ echo "Astropy-healpix $(astropy-healpix-version)" > $@
+
$(ipydir)/astropy-iers-data-$(astropy-iers-data-version): \
$(ipydir)/setuptools-$(setuptools-version)
tarball=astropy-iers-data-$(astropy-iers-data-version).tar.lz
@@ -360,7 +379,7 @@ $(ipydir)/astropy-iers-data-$(astropy-iers-data-version): \
$(call pybuild, tar -xf, \
astropy-iers-data-$(astropy-iers-data-version),,, \
GPEP517)
- echo "Astropy-Iers-Data $(astropy-iers-data-version)" > $@
+ echo "Astropy-IERS-data $(astropy-iers-data-version)" > $@
$(ipydir)/beautifulsoup4-$(beautifulsoup4-version): \
$(ipydir)/soupsieve-$(soupsieve-version)
@@ -400,6 +419,13 @@ $(ipydir)/chardet-$(chardet-version): \
$(call pybuild, tar -xf, chardet-$(chardet-version), , \
Chardet $(chardet-version))
+$(ipydir)/colorama-$(colorama-version): \
+ $(ipydir)/hatchling-$(hatchling-version)
+ tarball=colorama-$(colorama-version).tar.lz
+ $(call import-source, $(colorama-url), $(colorama-checksum))
+ $(call pybuild, tar -xf, \
+ colorama-$(colorama-version),,, GPEP517)
+
$(ipydir)/contourpy-$(contourpy-version): \
$(ipydir)/pybind11-$(pybind11-version) \
$(ipydir)/meson-python-$(meson-python-version)
@@ -417,6 +443,15 @@ $(ipydir)/corner-$(corner-version): $(ipydir)/matplotlib-$(matplotlib-version)
cp $(dtexdir)/corner.tex $(ictdir)/
echo "Corner $(corner-version) \citep{corner}" > $@
+$(ipydir)/cosmodesi-mpytools-$(cosmodesi-mpytools-version): \
+ $(ipydir)/numpy-$(numpy-version) \
+ $(ipydir)/scipy-$(scipy-version)
+ tarball=cosmodesi-mpytools-$(cosmodesi-mpytools-version).tar.lz
+ $(call import-source, $(cosmodesi-mpytools-url), $(cosmodesi-mpytools-checksum))
+ $(call pybuild, tar -xf, cosmodesi-mpytools-$(cosmodesi-mpytools-version), , \
+ Cosmodesi-mpytools $(cosmodesi-mpytools-version), GPEP517)
+ echo "Cosmodesi-mpytools $(cosmodesi-mpytools-version)" > $@
+
$(ipydir)/cppy-$(cppy-version): \
$(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=cppy-$(cppy-version).tar.lz
@@ -482,6 +517,15 @@ $(ipydir)/entrypoints-$(entrypoints-version): \
$(call pybuild, tar -xf, entrypoints-$(entrypoints-version), , \
EntryPoints $(entrypoints-version))
+$(ipydir)/exceptiongroup-$(exceptiongroup-version): \
+ $(ipydir)/setuptools-$(setuptools-version) \
+ $(ipydir)/flit-scm-$(flit-scm-version)
+ tarball=exceptiongroup-$(exceptiongroup-version).tar.lz
+ $(call import-source, $(exceptiongroup-url), $(exceptiongroup-checksum))
+ $(call pybuild, tar -xf, exceptiongroup-$(exceptiongroup-version), , \
+ Exceptiongroup $(exceptiongroup-version), GPEP517)
+
+
$(ipydir)/extension-helpers-$(extension-helpers-version): \
$(ipydir)/setuptools-scm-$(setuptools-scm-version)
tarball=extension-helpers-$(extension-helpers-version).tar.lz
@@ -507,6 +551,16 @@ $(ipydir)/flit-core-$(flit-core-version): \
$(call pybuild, tar -xf, flit-core-$(flit-core-version), , \
Flit-core $(flit-core-version), GPEP517)
+
+$(ipydir)/flit-scm-$(flit-scm-version): \
+ $(ipydir)/flit-core-$(flit-core-version) \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
+ tarball=flit-scm-$(flit-scm-version).tar.lz
+ $(call import-source, $(flit-scm-url), $(flit-scm-checksum))
+ $(call pybuild, tar -xf, flit-scm-$(flit-scm-version), , \
+ flit-scm $(flit-scm-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
@@ -558,6 +612,23 @@ $(ipydir)/gpep517-$(gpep517-version): \
BOOT_GPEP517)
echo "gpep517 $(gpep517-version)" > $@
+$(ipydir)/hatchling-$(hatchling-version): \
+ $(ipydir)/packaging-$(packaging-version) \
+ $(ipydir)/pathspec-$(pathspec-version) \
+ $(ipydir)/pluggy-$(pluggy-version) \
+ $(ipydir)/trove-classifiers-$(trove-classifiers-version)
+ tarball=hatchling-$(hatchling-version).tar.lz
+ $(call import-source, $(hatchling-url), $(hatchling-checksum))
+ $(call pybuild, tar -xf, \
+ hatchling-$(hatchling-version),,, GPEP517)
+
+$(ipydir)/hatch-vcs-$(hatch-vcs-version): \
+ $(ipydir)/hatchling-$(hatchling-version)
+ tarball=hatch-vcs-$(hatch-vcs-version).tar.lz
+ $(call import-source, $(hatch-vcs-url), $(hatch-vcs-checksum))
+ $(call pybuild, tar -xf, hatch-vcs-$(hatch-vcs-version), , \
+ Hatch-vcs $(hatch-vcs-version), GPEP517)
+
$(ipydir)/h5py-$(h5py-version): \
$(ipydir)/six-$(six-version) \
$(ibidir)/hdf5-$(hdf5-version) \
@@ -572,15 +643,38 @@ $(ipydir)/h5py-$(h5py-version): \
$(call pybuild, tar -xf, h5py-$(h5py-version), , \
h5py $(h5py-version))
-# 'healpy' is actually installed as part of the HEALPix package. It will be
-# installed with its C/C++ libraries if any other Python library is
-# requested with HEALPix. So actually calling for 'healpix' (when 'healpix'
-# is requested) is not necessary. But some users might not know about this
-# and just ask for 'healpy'. To avoid confusion in such cases, we'll just
-# set 'healpy' to be dependent on 'healpix' and not download any tarball
-# for it, or write anything in the final target.
-$(ipydir)/healpy-$(healpy-version): $(ibidir)/healpix-$(healpix-version)
- touch $@
+# As of 2025-05-20, there are at least three python healpix packages at
+# pypi.org, with versions:
+#
+# https://pypi.org/project/healpy 1.18.1
+# https://pypi.org/project/healpix 2024.2
+# https://pypi.org/project/astropy-healpix 1.1.2
+#
+# Maneage provides both 'healpy' and 'astropy-healpix', independently. We
+# ignore pypix 'healpix', whose name risks confusion with the C/C++/fortran
+# version of healpix.
+#
+# For simplicity and error tracing, you should best install either healpy
+# or astropy-healpix, not both. For example, astropy_healpix/healpy.py has
+# an interface to provide 'healpy' type function names. However, it may be
+# possible to use both if your python imports avoid namespace clashes. See
+# the documentation and source code of the respective packages to study how
+# they relate to one another.
+#
+# The 'healpy' package requires the C/C++ 'healpix' package to be built
+# in order to use the shared 'libsharp' library.
+$(ipydir)/healpy-$(healpy-version): \
+ $(ibidir)/healpix-$(healpix-version) \
+ $(ipydir)/matplotlib-$(matplotlib-version) \
+ $(ipydir)/scipy-$(scipy-version)
+ tarball=healpy-$(healpy-version).tar.lz
+ $(call import-source, $(healpy-url), \
+ $(healpy-checksum))
+ $(call pybuild, tar -xf, \
+ healpy-$(healpy-version),,, \
+ GPEP517)
+ echo "Healpy $(healpy-version)" > $@
+
$(ipydir)/html5lib-$(html5lib-version): \
$(ipydir)/six-$(six-version) \
@@ -612,6 +706,13 @@ $(ipydir)/jinja2-$(jinja2-version): $(ipydir)/markupsafe-$(markupsafe-version)
$(call pybuild, tar -xf, jinja2-$(jinja2-version), , \
Jinja2 $(jinja2-version))
+$(ipydir)/joblib-$(joblib-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=joblib-$(joblib-version).tar.lz
+ $(call import-source, $(joblib-url), $(joblib-checksum))
+ $(call pybuild, tar -xf, \
+ joblib-$(joblib-version),,, GPEP517)
+
$(ipydir)/keyring-$(keyring-version): \
$(ipydir)/entrypoints-$(entrypoints-version) \
$(ipydir)/secretstorage-$(secretstorage-version) \
@@ -631,6 +732,48 @@ $(ipydir)/kiwisolver-$(kiwisolver-version): \
cp -pv $(dtexdir)/kiwisolver.tex $(ictdir)/
echo "Kiwisolver $(kiwisolver-version) \citep{cassowary2001}" > $@
+# 2025-05-21: As of Feb 2025, it appears the lscsoft group is not maintaining
+# python-ligo-lw and ligo-segments; the LIGO Computing Group forked these
+# to igwn-ligolw and igwn-segments, respectively [1].
+# [1] https://github.com/ahnitz/ligo-segments/issues/1
+$(ipydir)/igwn-segments-$(igwn-segments-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=igwn-segments-$(igwn-segments-version).tar.lz
+ $(call import-source, $(igwn-segments-url), $(igwn-segments-checksum))
+ $(call pybuild, tar -xf, \
+ igwn-segments-$(igwn-segments-version),, \
+ Igwn-segments $(igwn-segments-version), GPEP517)
+
+
+$(ipydir)/iniconfig-$(iniconfig-version): \
+ $(ipydir)/hatch-vcs-$(hatch-vcs-version)
+ tarball=iniconfig-$(iniconfig-version).tar.lz
+ $(call import-source, $(iniconfig-url), $(iniconfig-checksum))
+ $(call pybuild, tar -xf, iniconfig-$(iniconfig-version), , \
+ Iniconfig $(iniconfig-version), GPEP517)
+
+# Upstream this is called ligo.skymap with a full stop '.'; we replace it
+# by a hyphen '-' to reduce the chance of regex errors.
+#
+# 2025-05-19 Warning: this might have some undetected dependencies.
+$(ipydir)/ligo-skymap-$(ligo-skymap-version): \
+ $(ibidir)/gsl-$(gsl-version) \
+ $(ipydir)/tqdm-$(tqdm-version) \
+ $(ibidir)/sqlite-$(sqlite3-version) \
+ $(ipydir)/astropy-$(astropy-version) \
+ $(ipydir)/lalsuite-$(lalsuite-version) \
+ $(ipydir)/igwn-ligolw-$(igwn-ligolw-version) \
+ $(ipydir)/igwn-segments-$(igwn-segments-version) \
+ $(ipydir)/astropy-healpix-$(astropy-healpix-version)
+ tarball=ligo-skymap-$(ligo-skymap-version).tar.lz
+ $(call import-source, $(ligo-skymap-url), \
+ $(ligo-skymap-checksum))
+ $(call pybuild, tar -xf, \
+ ligo-skymap-$(ligo-skymap-version),,, \
+ GPEP517)
+ echo "ligo-skymap $(ligo-skymap-version)" > $@
+
+
$(ipydir)/lmfit-$(lmfit-version): \
$(ipydir)/six-$(six-version) \
$(ipydir)/scipy-$(scipy-version) \
@@ -644,6 +787,14 @@ $(ipydir)/lmfit-$(lmfit-version): \
$(call pybuild, tar -xf, lmfit-$(lmfit-version), , \
LMFIT $(lmfit-version))
+$(ipydir)/lscsoft-glue-$(lscsoft-glue-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
+ tarball=lscsoft-glue-$(lscsoft-glue-version).tar.lz
+ $(call import-source, $(lscsoft-glue-url), $(lscsoft-glue-checksum))
+ $(call pybuild, tar -xf, \
+ lscsoft-glue-$(lscsoft-glue-version),,, GPEP517)
+
$(ipydir)/lsstdesccoord-$(lsstdesccoord-version): \
$(ipydir)/cffi-$(cffi-version) \
$(ipydir)/numpy-$(numpy-version) \
@@ -661,11 +812,19 @@ $(ipydir)/markupsafe-$(markupsafe-version): \
$(call pybuild, tar -xf, markupsafe-$(markupsafe-version), , \
MarkupSafe $(markupsafe-version))
+# As of 2026-04-19: Matplotlib needs internet to download and build its
+# custom versions of 'freetype' and 'qhull'. The proposed option to 'python
+# -m pip instsall' in [1] for using system libraries was tested, but did
+# not work in this setup (our 'pybuild' uses 'python -m gpep517
+# install-from-source', not 'pip').
+#
+# [1] https://matplotlib.org/stable/install/dependencies.html
$(ipydir)/matplotlib-$(matplotlib-version): \
$(itidir)/texlive \
$(ipydir)/numpy-$(numpy-version) \
$(ipydir)/cycler-$(cycler-version) \
$(ipydir)/pillow-$(pillow-version) \
+ $(ibidir)/freetype-$(freetype-version) \
$(ipydir)/fonttools-$(fonttools-version) \
$(ipydir)/contourpy-$(contourpy-version) \
$(ipydir)/kiwisolver-$(kiwisolver-version) \
@@ -706,12 +865,11 @@ $(ipydir)/meson-python-$(meson-python-version): \
echo "Meson-Python $(meson-python-version)" > $@
$(ipydir)/mpi4py-$(mpi4py-version): \
- $(ipydir)/gpep517-$(gpep517-version) \
$(ibidir)/openmpi-$(openmpi-version) \
- $(ipydir)/python-installer-$(python-installer-version)
+ $(ipydir)/cython-$(cython-version)
tarball=mpi4py-$(mpi4py-version).tar.lz
$(call import-source, $(mpi4py-url), $(mpi4py-checksum))
- $(call pybuild, tar -xf, mpi4py-$(mpi4py-version))
+ $(call pybuild, tar -xf, mpi4py-$(mpi4py-version),,, GPEP517)
cp $(dtexdir)/mpi4py.tex $(ictdir)/
echo "mpi4py $(mpi4py-version) \citep{mpi4py2011}" > $@
@@ -723,8 +881,17 @@ $(ipydir)/mpmath-$(mpmath-version): \
$(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)/networkx-$(networkx-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=networkx-$(networkx-version).tar.lz
+ $(call import-source, $(networkx-url), $(networkx-checksum))
+ $(call pybuild, tar -xf, \
+ networkx-$(networkx-version),,, \
+ GPEP517)
+ echo "networkx $(networkx-version)" > $@
+
+# Numpy's MacOS builds using Xcode prior to 26.3 needed the following flags
+# added to 'LDFLAGS': '-undefined dynamic_lookup -bundle'.
$(ipydir)/numpy-$(numpy-version): \
$(ipydir)/cython-$(cython-version) \
$(ibidir)/openblas-$(openblas-version) \
@@ -732,9 +899,6 @@ $(ipydir)/numpy-$(numpy-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"
- fi
conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg"
$(call pybuild, tar -xf, numpy-$(numpy-version),$$conf, \
Numpy $(numpy-version), GPEP517)
@@ -748,6 +912,23 @@ $(ipydir)/packaging-$(packaging-version): \
$(call pybuild, tar -xf, packaging-$(packaging-version), , \
Packaging $(packaging-version), GPEP517)
+$(ipydir)/pandas-$(pandas-version): \
+ $(ipydir)/numpy-$(numpy-version) \
+ $(ipydir)/versioneer-$(versioneer-version) \
+ $(ipydir)/pytz-$(pytz-version)
+ tarball=pandas-$(pandas-version).tar.lz
+ $(call import-source, $(pandas-url), $(pandas-checksum))
+ $(call pybuild, tar -xf, pandas-$(pandas-version), , \
+ Pandas $(pandas-version), GPEP517)
+ echo "pandas $(pandas-version)" > $@
+
+$(ipydir)/pathspec-$(pathspec-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=pathspec-$(pathspec-version).tar.lz
+ $(call import-source, $(pathspec-url), $(pathspec-checksum))
+ $(call pybuild, tar -xf, \
+ pathspec-$(pathspec-version),,, GPEP517)
+
$(ipydir)/pexpect-$(pexpect-version): \
$(ipydir)/gpep517-$(gpep517-version) \
$(ipydir)/python-installer-$(python-installer-version)
@@ -773,6 +954,13 @@ $(ipydir)/pillow-$(pillow-version): $(ibidir)/libjpeg-$(libjpeg-version) \
# $(call pybuild, tar -xf, pip-$(pip-version), , \
# PiP $(pip-version))
+$(ipydir)/pluggy-$(pluggy-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=pluggy-$(pluggy-version).tar.lz
+ $(call import-source, $(pluggy-url), $(pluggy-checksum))
+ $(call pybuild, tar -xf, \
+ pluggy-$(pluggy-version),,, GPEP517)
+
$(ipydir)/ply-$(ply-version): \
$(ipydir)/gpep517-$(gpep517-version) \
$(ipydir)/python-installer-$(python-installer-version)
@@ -828,6 +1016,13 @@ $(ipydir)/pyflakes-$(pyflakes-version): \
$(call pybuild, tar -xf, pyflakes-$(pyflakes-version), , \
pyflakes $(pyflakes-version))
+$(ipydir)/pygments-$(pygments-version): \
+ $(ipydir)/hatchling-$(hatchling-version)
+ tarball=pygments-$(pygments-version).tar.lz
+ $(call import-source, $(pygments-url), $(pygments-checksum))
+ $(call pybuild, tar -xf, pygments-$(pygments-version), , \
+ Pygments $(pygments-version), GPEP517)
+
$(ipydir)/pyparsing-$(pyparsing-version): \
$(ipydir)/gpep517-$(gpep517-version) \
$(ipydir)/flit-core-$(flit-core-version) \
@@ -854,8 +1049,26 @@ $(ipydir)/pyproject-metadata-$(pyproject-metadata-version): \
$(call pybuild, tar -xf, \
pyproject-metadata-$(pyproject-metadata-version),,, GPEP517)
+
+$(ipydir)/pytest-$(pytest-version): \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version) \
+ $(ipydir)/colorama-$(colorama-version) \
+ $(ipydir)/exceptiongroup-$(exceptiongroup-version) \
+ $(ipydir)/iniconfig-$(iniconfig-version) \
+ $(ipydir)/packaging-$(packaging-version) \
+ $(ipydir)/pluggy-$(pluggy-version) \
+ $(ipydir)/pygments-$(pygments-version)
+ tarball=pytest-$(pytest-version).tar.lz
+ $(call import-source, $(pytest-url), $(pytest-checksum))
+ $(call pybuild, tar -xf, \
+ pytest-$(pytest-version),,, \
+ GPEP517)
+ echo "pytest $(pytest-version)" > $@
+
+
$(ipydir)/python-dateutil-$(python-dateutil-version): \
- $(ipydir)/setuptools-scm-$(setuptools-scm-version)
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version) \
+ $(ipydir)/six-$(six-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), , \
@@ -885,6 +1098,37 @@ $(ipydir)/python-installer-$(python-installer-version): \
BOOT_INSTALLER)
echo "Python-installer $(python-installer-version)" > $@
+# 2025-05-21: As of Feb 2025, it appears the lscsoft group is not maintaining
+# python-ligo-lw and ligo-segments; the LIGO Computing Group forked these
+# to igwn-ligolw and igwn-segments, respectively [1].
+# [1] https://github.com/ahnitz/ligo-segments/issues/1
+$(ipydir)/igwn-ligolw-$(igwn-ligolw-version): \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
+ tarball=igwn-ligolw-$(igwn-ligolw-version).tar.lz
+ $(call import-source, $(igwn-ligolw-url), \
+ $(igwn-ligolw-checksum))
+ $(call pybuild, tar -xf, \
+ igwn-ligolw-$(igwn-ligolw-version),,, \
+ GPEP517)
+ echo "igwn-ligolw $(igwn-ligolw-version)" > $@
+
+$(ipydir)/pyfftw-$(pyfftw-version): $(ipydir)/numpy-$(numpy-version) \
+ $(ibidir)/fftw-$(fftw-version)
+ tarball=pyfftw-$(pyfftw-version).tar.lz
+ $(call import-source, $(pyfftw-url), $(pyfftw-checksum))
+ $(call pybuild, tar -xf, pyfftw-$(pyfftw-version), , \
+ Pyfftw $(pyfftw-version), GPEP517)
+
+
+# Called 'fitsio' in pypi.org: https://pypi.org/project/fitsio
+$(ipydir)/python3-fitsio-$(python3-fitsio-version): \
+ $(ibidir)/patch-$(patch-version) \
+ $(ipydir)/numpy-$(numpy-version)
+ tarball=python3-fitsio-$(python3-fitsio-version).tar.lz
+ $(call import-source, $(python3-fitsio-url), $(python3-fitsio-checksum))
+ $(call pybuild, tar -xf, python3-fitsio-$(python3-fitsio-version), , \
+ Python3 Fitsio $(python3-fitsio-version), GPEP517)
+
$(ipydir)/pythran-$(pythran-version): \
$(ipydir)/ply-$(ply-version) \
$(ipydir)/gast-$(gast-version) \
@@ -904,6 +1148,13 @@ $(ipydir)/pyyaml-$(pyyaml-version): \
$(call pybuild, tar -xf, pyyaml-$(pyyaml-version), , \
PyYAML $(pyyaml-version), GPEP517)
+$(ipydir)/pytz-$(pytz-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=pytz-$(pytz-version).tar.lz
+ $(call import-source, $(pytz-url), $(pytz-checksum))
+ $(call pybuild, tar -xf, pytz-$(pytz-version), , \
+ Pytz $(pytz-version), GPEP517)
+
$(ipydir)/requests-$(requests-version): $(ipydir)/idna-$(idna-version) \
$(ipydir)/numpy-$(numpy-version) \
$(ipydir)/certifi-$(certifi-version) \
@@ -914,41 +1165,39 @@ $(ipydir)/requests-$(requests-version): $(ipydir)/idna-$(idna-version) \
$(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. We explicitly disable it using a preprocessor
-# directive. 'Pythran' can in principle speed up compilation of scientific
-# software [1][2].
+# Scipy building notes:
+#
+# 1. 'pythran' is disabled in the build of Scipy because of complications
+# it caused on some systems. 'Pythran' can in principle speed up
+# compilation of scientific software [1][2]. We explicitly disable it by
+# modifying the source. Technically it should also be possible to pass
+# the following option to the gpep517 build recipes with correct
+# escaping of single and double quotes, but this has not tried as of
+# 2025-02-25.
+# --config-json='{"setup-args":"-Duse-pythran=false"}'
+#
+# 2. Scipy's MacOS builds using Xcode prior to 26.3 needed the following
+# flags added to 'LDFLAGS': '-undefined dynamic_lookup -bundle'.
+#
# [1] https://pythran.readthedocs.io/en/latest
-# [2] https://docs.scipy.org/doc/scipy-1.15.2/dev/roadmap-detailed.html
+# [2] https://docs.scipy.org/doc/scipy-1.15.2/dev/roadmap-detailed.html#use-of-pythran
$(ipydir)/scipy-$(scipy-version): \
$(ipydir)/numpy-$(numpy-version) \
$(ipydir)/pybind11-$(pybind11-version)
+
+# Import the tarball.
tarball=scipy-$(scipy-version).tar.lz
$(call import-source, $(scipy-url), $(scipy-checksum))
- if [ x$(on_mac_os) = xyes ]; then
- export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle"
- else
-# Same question as for 'numpy': why '-shared'? This obstructs
-# the meson build.
-# export LDFLAGS="$(LDFLAGS) -shared"
- :
- fi
- conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg"
-# 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:
+# Disable pythran (see above).
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.
+# Build Scipy.
+ conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg"
$(call pybuild, tar -xf, scipy-$(scipy-version),$$conf,, GPEP517)
cp $(dtexdir)/scipy.tex $(ictdir)/
echo "Scipy $(scipy-version) \citep{scipy2020}" > $@
@@ -1003,6 +1252,26 @@ $(ipydir)/sip_tpv-$(sip_tpv-version): \
cp $(dtexdir)/sip_tpv.tex $(ictdir)/
echo "sip_tpv $(sip_tpv-version) \citep{sip-tpv}" > $@
+$(ipydir)/scikit-base-$(scikit-base-version): \
+ $(ipydir)/gpep517-$(gpep517-version) \
+ $(ipydir)/python-installer-$(python-installer-version)
+ tarball=scikit-base-$(scikit-base-version).tar.lz
+ $(call import-source, $(scikit-base-url), $(scikit-base-checksum))
+ $(call pybuild, tar -xf, scikit-base-$(scikit-base-version), , \
+ Scikit-base $(scikit-base-version), GPEP517)
+ echo "scikit-base $(scikit-base-version)" > $@
+
+$(ipydir)/scikit-learn-$(scikit-learn-version): \
+ $(ipydir)/joblib-$(joblib-version) \
+ $(ipydir)/threadpoolctl-$(threadpoolctl-version) \
+ $(ipydir)/numpy-$(numpy-version) \
+ $(ipydir)/scipy-$(scipy-version)
+ tarball=scikit-learn-$(scikit-learn-version).tar.lz
+ $(call import-source, $(scikit-learn-url), $(scikit-learn-checksum))
+ $(call pybuild, tar -xf, scikit-learn-$(scikit-learn-version), , \
+ Scikit-learn $(scikit-learn-version), GPEP517)
+ echo "scikit-learn $(scikit-learn-version)" > $@
+
$(ipydir)/six-$(six-version): \
$(ipydir)/setuptools-$(setuptools-version)
tarball=six-$(six-version).tar.lz
@@ -1026,6 +1295,29 @@ $(ipydir)/sympy-$(sympy-version): $(ipydir)/mpmath-$(mpmath-version)
cp $(dtexdir)/sympy.tex $(ictdir)/
echo "SymPy $(sympy-version) \citep{sympy}" > $@
+$(ipydir)/threadpoolctl-$(threadpoolctl-version): \
+ $(ipydir)/flit-core-$(flit-core-version)
+ tarball=threadpoolctl-$(threadpoolctl-version).tar.lz
+ $(call import-source, $(threadpoolctl-url), $(threadpoolctl-checksum))
+ $(call pybuild, tar -xf, threadpoolctl-$(threadpoolctl-version), , \
+ threadpoolctl $(threadpoolctl-version), GPEP517)
+ echo "threadpoolctl $(threadpoolctl-version)" > $@
+
+$(ipydir)/tqdm-$(tqdm-version): \
+ $(ipydir)/setuptools-scm-$(setuptools-scm-version)
+ tarball=tqdm-$(tqdm-version).tar.lz
+ $(call import-source, $(tqdm-url), $(tqdm-checksum))
+ $(call pybuild, tar -xf, \
+ tqdm-$(tqdm-version),, \
+ Tqdm $(tqdm-version), GPEP517)
+
+$(ipydir)/trove-classifiers-$(trove-classifiers-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=trove-classifiers-$(trove-classifiers-version).tar.lz
+ $(call import-source, $(trove-classifiers-url), $(trove-classifiers-checksum))
+ $(call pybuild, tar -xf, \
+ trove-classifiers-$(trove-classifiers-version),,, GPEP517)
+
$(ipydir)/uncertainties-$(uncertainties-version): $(ipydir)/numpy-$(numpy-version)
tarball=uncertainties-$(uncertainties-version).tar.lz
$(call import-source, $(uncertainties-url), $(uncertainties-checksum))
@@ -1040,6 +1332,13 @@ $(ipydir)/urllib3-$(urllib3-version): \
$(call pybuild, tar -xf, urllib3-$(urllib3-version), , \
Urllib3 $(urllib3-version))
+$(ipydir)/versioneer-$(versioneer-version): \
+ $(ipydir)/setuptools-$(setuptools-version)
+ tarball=versioneer-$(versioneer-version).tar.lz
+ $(call import-source, $(versioneer-url), $(versioneer-checksum))
+ $(call pybuild, tar -xf, versioneer-$(versioneer-version), , \
+ Versioneer $(versioneer-version), GPEP517)
+
$(ipydir)/webencodings-$(webencodings-version): \
$(ipydir)/setuptools-$(setuptools-version) \
$(ipydir)/setuptools-scm-$(setuptools-scm-version)
diff --git a/reproduce/software/make/xorg.mk b/reproduce/software/make/xorg.mk
index db42d70..33847f3 100644
--- a/reproduce/software/make/xorg.mk
+++ b/reproduce/software/make/xorg.mk
@@ -120,6 +120,7 @@ $(ibidir)/fontconfig-$(fontconfig-version): \
$(ibidir)/libxml2-$(libxml2-version) \
$(ibidir)/freetype-$(freetype-version) \
$(ibidir)/util-linux-$(util-linux-version)
+
# Import the source.
tarball=fontconfig-$(fontconfig-version).tar.lz
$(call import-source, $(fontconfig-url), $(fontconfig-checksum))