diff options
Diffstat (limited to 'reproduce/software/make')
| -rw-r--r--[-rwxr-xr-x] | reproduce/software/make/atlas-multiple.mk | 0 | ||||
| -rw-r--r--[-rwxr-xr-x] | reproduce/software/make/atlas-single.mk | 0 | ||||
| -rw-r--r-- | reproduce/software/make/basic.mk | 1456 | ||||
| -rw-r--r-- | reproduce/software/make/build-rules.mk | 139 | ||||
| -rw-r--r-- | reproduce/software/make/high-level.mk | 1569 | ||||
| -rw-r--r-- | reproduce/software/make/python.mk | 929 | 
6 files changed, 2002 insertions, 2091 deletions
| diff --git a/reproduce/software/make/atlas-multiple.mk b/reproduce/software/make/atlas-multiple.mk index 9bd26b1..9bd26b1 100755..100644 --- a/reproduce/software/make/atlas-multiple.mk +++ b/reproduce/software/make/atlas-multiple.mk diff --git a/reproduce/software/make/atlas-single.mk b/reproduce/software/make/atlas-single.mk index 29373e0..29373e0 100755..100644 --- a/reproduce/software/make/atlas-single.mk +++ b/reproduce/software/make/atlas-single.mk diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk index dc28631..94bb5d4 100644 --- a/reproduce/software/make/basic.mk +++ b/reproduce/software/make/basic.mk @@ -5,13 +5,19 @@  #                      !!!!! IMPORTANT NOTES !!!!!  #  # This Makefile will be run by the initial `./project configure' script. It -# is not included into the project after that. +# is not included into the project afterwards.  # -# This Makefile builds very low-level and basic tools like GNU Tar, GNU -# Bash, GNU Make, GCC and etc. Therefore this is the only Makefile in the -# project where you CANNOT assume that GNU Bash or GNU Make are used. After -# this Makefile (where GNU Bash and GNU Make are built), other Makefiles -# can safely assume the fixed version of all these software. +# This Makefile builds low-level and basic tools that are necessary in any +# project like like GNU Tar, GNU Bash, GNU Make, GCC and etc. But before +# control reaches here, the 'configure.sh' script has already built the +# extremely low-level tools: Lzip (a compressing program), GNU Make (to be +# able to run this Makefile with a fixed version), Dash (a minimalist +# POSIX-compatible shell) and Flock (to allow locking files, and +# serializing when necessary: downloading during the software building +# phase). Thanks to GNU Make and Dash, we can assume a fixed structure in +# this Makefile. However, the 'PATH's in this Makefile still include the +# host's paths because we will be using the hosts tools (gradually +# decreasing) to build our own tools.  #  # ------------------------------------------------------------------------  # @@ -31,13 +37,17 @@  # You should have received a copy of the GNU General Public License  # along with this Makefile.  If not, see <http://www.gnu.org/licenses/>. -  # Top level environment  include reproduce/software/config/LOCAL.conf  include reproduce/software/make/build-rules.mk  include reproduce/software/config/versions.conf  include reproduce/software/config/checksums.conf +# The optional URLs of software. Note that these may need the software +# version, so it is important that they be loaded after 'versions.conf'. +include reproduce/software/config/urls.conf + +# Basic directories  lockdir = $(BDIR)/locks  tdir    = $(BDIR)/software/tarballs  ddir    = $(BDIR)/software/build-tmp @@ -46,31 +56,34 @@ ibdir   = $(BDIR)/software/installed/bin  ildir   = $(BDIR)/software/installed/lib  ibidir  = $(BDIR)/software/installed/version-info/proglib -# We'll need the system's PATH for making links to low-level programs we -# won't be building ourselves. -syspath := $(PATH) +# Ultimate Makefile target. +targets-proglib = low-level-links gcc-$(gcc-version) +all: $(foreach p, $(targets-proglib), $(ibidir)/$(p)) +# Define the shell environment +# ---------------------------- +# +# We build GNU Bash here in 'basic.mk'. So here we must must assume DASH +# shell that was built before calling this Makefile: +# http://gondor.apana.org.au/~herbert/dash. DASH is a minimalist POSIX +# shell, so it doesn't have startup options like '--noprofile --norc'. But +# from its manual, to load startup files, Dash actually requires that it be +# called with a '-' before it (for example '-dash'), so it shouldn't be +# loading any startup files if it was interpretted properly. +#  # As we build more programs, we want to use this project's built programs -# and libraries, not the host's. +# and libraries, not the host's, so in all PATH-related environments, our +# own build-directory comes first.  .ONESHELL: +.SHELLFLAGS := -e -c  export CCACHE_DISABLE := 1 +export SHELL := $(ibdir)/dash  export PATH := $(ibdir):$(PATH)  export PKG_CONFIG_PATH := $(ildir)/pkgconfig  export PKG_CONFIG_LIBDIR := $(ildir)/pkgconfig  export CPPFLAGS := -I$(idir)/include $(CPPFLAGS)  export LDFLAGS := $(rpath_command) -L$(ildir) $(LDFLAGS) -# Note that we build GNU Bash here in 'basic.mk'. So we can't assume Bash -# in this Makefile and use the DASH shell that was before calling this -# Makefile: http://gondor.apana.org.au/~herbert/dash. Dash is a minimalist -# POSIX shell, so it doesn't have startup options like '--noprofile -# --norc'. But from its manual, to load startup files, Dash actually -# requires that it be called with a '-' before it (for example '-dash'), so -# it shouldn't be loading any startup files if it was interpretted -# properly. -.SHELLFLAGS := -e -c -export SHELL := $(ibdir)/dash -  # 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, @@ -86,202 +99,29 @@ export LD_LIBRARY_PATH := $(shell echo $(LD_LIBRARY_PATH):$(ildir) \  # causes crashs (see bug #56682). So we'll just give it no value at all.  export DYLD_LIBRARY_PATH := -# Recipe startup script. -export PROJECT_STATUS := configure_basic -export BASH_ENV := $(shell pwd)/reproduce/software/shell/bashrc.sh - -# Define the top-level basic programs (that don't depend on any other). -top-level-programs = low-level-links gcc -all: $(foreach p, $(top-level-programs), $(ibidir)/$(p)) - -# Servers to use as backup, later this should go in a file that is not -# under version control (the actual server that the tarbal comes from is -# irrelevant). -backupservers := $(shell awk '!/^#/{printf "%s ", $$1}' \ -                         reproduce/software/config/servers-backup.conf) - - - - - - -# Tarballs -# -------- -# -# Prepare tarballs. Difference with that in `high-level.mk': `.ONESHELL' is -# not recognized by some versions of Make (even older GNU Makes). So we'll -# have to make sure the recipe doesn't break into multiple shell calls (so -# we can preserve the variables). +# Servers to use as backup. Maneage already has some fixed servers that can +# be used to download software tarballs. They are in a configuation +# file. But we give precedence to the "user" backup servers.  # -# Software with main webpage at our backup repository -# (http://akhlaghi.org/maneage-software): As of our latest check their -# major release tarballs either crash or don't build on some systems (for -# example Make or Gzip), or they don't exist (for example Bzip2). So we are -# building them from their Git history (which builds properly) or host them -# directly. +# One important "user" server (which the user doesn't actually give, but is +# found at configuration time in 'configure.sh') is Zenodo (see the +# description in 'configure.sh' for more on why this depends on +# configuration time).  # -# In the first case, we used their Git repo and bootstrapped them (just -# like Gnuastro) and built the most recent tarball off of that. In the case -# of Bzip2: its webpage has expired and doesn't host the data any more. It -# is available on the link below (archive.org): -# -# https://web.archive.org/web/20180624184806/http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz -# -# However, downloading from this link is slow (because its just a link). So -# its easier to just keep a with the others. -$(lockdir): | $(BDIR); mkdir $@ +# 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 -tarballs = $(foreach t, bash-$(bash-version).tar.lz \ -                        binutils-$(binutils-version).tar.lz \ -                        bzip2-$(bzip2-version).tar.gz \ -                        cert.pem \ -                        coreutils-$(coreutils-version).tar.xz \ -                        curl-$(curl-version).tar.gz \ -                        diffutils-$(diffutils-version).tar.xz \ -                        file-$(file-version).tar.gz \ -                        findutils-$(findutils-version).tar.xz \ -                        gawk-$(gawk-version).tar.lz \ -                        gcc-$(gcc-version).tar.xz \ -                        gettext-$(gettext-version).tar.xz \ -                        git-$(git-version).tar.xz \ -                        gmp-$(gmp-version).tar.lz \ -                        grep-$(grep-version).tar.xz \ -                        gzip-$(gzip-version).tar.lz \ -                        isl-$(isl-version).tar.bz2 \ -                        libbsd-$(libbsd-version).tar.xz	\ -                        libiconv-$(libiconv-version).tar.gz \ -                        libtool-$(libtool-version).tar.xz \ -                        libunistring-$(libunistring-version).tar.xz \ -                        libxml2-$(libxml2-version).tar.gz \ -                        m4-$(m4-version).tar.gz \ -                        metastore-$(metastore-version).tar.gz \ -                        mpfr-$(mpfr-version).tar.xz \ -                        mpc-$(mpc-version).tar.gz \ -                        ncurses-$(ncurses-version).tar.gz \ -                        openssl-$(openssl-version).tar.gz \ -                        patchelf-$(patchelf-version).tar.gz \ -                        perl-$(perl-version).tar.gz \ -                        pkg-config-$(pkgconfig-version).tar.gz \ -                        readline-$(readline-version).tar.gz \ -                        sed-$(sed-version).tar.xz \ -                        tar-$(tar-version).tar.gz \ -                        texinfo-$(texinfo-version).tar.xz \ -                        unzip-$(unzip-version).tar.gz \ -                        wget-$(wget-version).tar.lz \ -                        which-$(which-version).tar.gz \ -                        xz-$(xz-version).tar.gz \ -                        zip-$(zip-version).tar.gz \ -                        zlib-$(zlib-version).tar.gz \ -                      , $(tdir)/$(t) ) -$(tarballs): $(tdir)/%: | $(lockdir) - -        # Remove the version numbers and suffix from the tarball name so we -        # can search more easily only with the program name. This requires -        # the first character of the version to be a digit: packages such -        # as `foo' and `foo-3' will not be distinguished, but `foo' and -        # `foo2' will be distinguished. -	@n=$$(echo $* | sed -e's/-[0-9]/ /' -e's/\./ /g' \ -	             | awk '{print $$1}' ) - -	mergenames=1; \ -	if   [ $$n = bash      ]; then c=$(bash-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = binutils  ]; then c=$(binutils-checksum); w=http://ftp.gnu.org/gnu/binutils -	elif [ $$n = bzip2     ]; then c=$(bzip2-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = cert      ]; then c=$(cert-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = coreutils ]; then c=$(coreutils-checksum); w=http://ftp.gnu.org/gnu/coreutils -	elif [ $$n = curl      ]; then c=$(curl-checksum); w=https://curl.haxx.se/download -	elif [ $$n = diffutils ]; then c=$(diffutils-checksum); w=http://ftp.gnu.org/gnu/diffutils -	elif [ $$n = file      ]; then c=$(file-checksum); w=ftp://ftp.astron.com/pub/file -	elif [ $$n = findutils ]; then c=$(findutils-checksum); w=http://ftp.gnu.org/gnu/findutils -	elif [ $$n = gawk      ]; then c=$(gawk-checksum); w=http://ftp.gnu.org/gnu/gawk -	elif [ $$n = gcc       ]; then c=$(gcc-checksum); w=http://ftp.gnu.org/gnu/gcc/gcc-$(gcc-version) -	elif [ $$n = gettext   ]; then c=$(gettext-checksum); w=https://ftp.gnu.org/gnu/gettext -	elif [ $$n = git       ]; then c=$(git-checksum); w=http://mirrors.edge.kernel.org/pub/software/scm/git -	elif [ $$n = gmp       ]; then c=$(gmp-checksum); w=https://gmplib.org/download/gmp -	elif [ $$n = grep      ]; then c=$(grep-checksum); w=http://ftp.gnu.org/gnu/grep -	elif [ $$n = gzip      ]; then c=$(gzip-checksum); w=http://akhlaghi.org/src -	elif [ $$n = isl       ]; then c=$(isl-checksum); w=ftp://gcc.gnu.org/pub/gcc/infrastructure -	elif [ $$n = libbsd    ]; then c=$(libbsd-checksum); w=http://libbsd.freedesktop.org/releases -	elif [ $$n = libiconv  ]; then c=$(libiconv-checksum); w=https://ftp.gnu.org/pub/gnu/libiconv -	elif [ $$n = libtool   ]; then c=$(libtool-checksum); w=http://ftp.gnu.org/gnu/libtool -	elif [ $$n = libunistring ]; then c=$(libunistring-checksum); w=http://ftp.gnu.org/gnu/libunistring -	elif [ $$n = libxml2   ]; then c=$(libxml2-checksum); w=ftp://xmlsoft.org/libxml2 -	elif [ $$n = m4        ]; then -	  mergenames=0 -	  c=$(m4-checksum) -	  w=http://akhlaghi.org/maneage-software/m4-1.4.18-patched.tar.gz -	elif [ $$n = metastore ]; then c=$(metastore-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = mpc       ]; then c=$(mpc-checksum); w=http://ftp.gnu.org/gnu/mpc -	elif [ $$n = mpfr      ]; then c=$(mpfr-checksum); w=http://www.mpfr.org/mpfr-current -	elif [ $$n = ncurses   ]; then c=$(ncurses-checksum); w=http://ftp.gnu.org/gnu/ncurses -	elif [ $$n = openssl   ]; then c=$(openssl-checksum); w=http://www.openssl.org/source -	elif [ $$n = patchelf  ]; then c=$(patchelf-checksum); w=http://nixos.org/releases/patchelf/patchelf-$(patchelf-version) -	elif [ $$n = perl      ]; then -	  c=$(perl-checksum) -	  v=$$(echo $(perl-version) | sed -e's/\./ /g' | awk '{printf("%d.0", $$1)}') -	  w=https://www.cpan.org/src/$$v -	elif [ $$n = pkg-config ]; then c=$(pkgconfig-checksum); w=http://pkg-config.freedesktop.org/releases -	elif [ $$n = readline  ]; then c=$(readline-checksum); w=http://ftp.gnu.org/gnu/readline -	elif [ $$n = sed       ]; then c=$(sed-checksum); w=http://ftp.gnu.org/gnu/sed -	elif [ $$n = tar       ]; then c=$(tar-checksum); w=http://ftp.gnu.org/gnu/tar -	elif [ $$n = texinfo   ]; then c=$(texinfo-checksum); w=http://ftp.gnu.org/gnu/texinfo -	elif [ $$n = unzip     ]; then -	  c=$(unzip-checksum) -	  mergenames=0; v=$$(echo $(unzip-version) | sed -e's/\.//') -	  w=ftp://ftp.info-zip.org/pub/infozip/src/unzip$$v.tgz -	elif [ $$n = wget      ]; then c=$(wget-checksum); w=http://ftp.gnu.org/gnu/wget -	elif [ $$n = which     ]; then c=$(which-checksum); w=http://ftp.gnu.org/gnu/which -	elif [ $$n = xz        ]; then c=$(xz-checksum); w=http://tukaani.org/xz -	elif [ $$n = zip       ]; then -	  c=$(zip-checksum) -	  mergenames=0; v=$$(echo $(zip-version) | sed -e's/\.//') -	  w=ftp://ftp.info-zip.org/pub/infozip/src/zip$$v.tgz -	elif [ $$n = zlib      ]; then c=$(zlib-checksum); w=http://www.zlib.net -	else -	  echo; echo; echo -	  echo "'$$n' not recognized as a software tarball name to download." -	  echo; echo; echo -	  exit 1 -	fi +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)) + -        # Download the raw tarball, using an '.unchecked' suffix to specify -        # that it is not yet fully checked and usable. But first, since the -        # download may be interrupted in a previous build and an incomplete -        # '.unchecked' file may remain, we'll remove any possibly existing -        # uncheked file. -	rm -f "$@.unchecked" -	if [ -f $(DEPENDENCIES-DIR)/$* ]; then -	  cp $(DEPENDENCIES-DIR)/$* "$@.unchecked" -	else -	  if [ $$mergenames = 1 ]; then  tarballurl=$$w/"$*" -	  else                           tarballurl=$$w -	  fi -	  echo "Downloading $$tarballurl" -	  if [ -f $(ibdir)/wget ]; then -	    downloader="wget --no-use-server-timestamps -O" -	  else -	    downloader="$(DOWNLOADER)" -	  fi -	  touch $(lockdir)/download -	  $(downloadwrapper) "$$downloader" $(lockdir)/download \ -	                     $$tarballurl "$@.unchecked" "$(backupservers)" -	fi -        # Make sure the file's Checksum is correct. -	if type sha512sum > /dev/null 2>/dev/null; then -	  checksum=$$(sha512sum "$@.unchecked" | awk '{print $$1}') -	  if [ x"$$checksum" = x"$$c" ]; then -	    mv "$@.unchecked" "$@" -	  else -	    echo "ERROR: Non-matching checksum for '$*'." -	    echo "Checksum should be: $$c" -	    echo "Checksum is:        $$checksum" -	    exit 1 -	  fi -	else mv "$@.unchecked" "$@" -	fi @@ -301,6 +141,10 @@ $(tarballs): $(tdir)/%: | $(lockdir)  # purpose here, it is very annoying and can cause many complications. We  # thus remove any part of PATH of that has `ccache' in it before making  # symbolic links to the programs we are not building ourselves. +# +# We'll need the system's PATH for making links to low-level programs we +# won't be building ourselves. +syspath := $(PATH)  makelink = origpath="$$PATH"; \  	export PATH=$$(echo $(syspath) \  	                    | tr : '\n' \ @@ -322,7 +166,8 @@ makelink = origpath="$$PATH"; \  	export PATH="$$origpath"  $(ibdir) $(ildir):; mkdir $@ -$(ibidir)/low-level-links: $(ibidir)/coreutils | $(ibdir) $(ildir) +$(ibidir)/low-level-links: $(ibidir)/coreutils-$(coreutils-version) \ +                           | $(ibdir) $(ildir)          # Not-installed (but necessary in some cases) compilers.          #  Clang is necessary for CMake. @@ -331,6 +176,7 @@ $(ibidir)/low-level-links: $(ibidir)/coreutils | $(ibdir) $(ildir)          # Mac OS specific  	$(call makelink,mig) +	$(call makelink,xcrun)  	$(call makelink,sysctl)  	$(call makelink,sw_vers)  	$(call makelink,dsymutil) @@ -374,17 +220,25 @@ $(ibidir)/low-level-links: $(ibidir)/coreutils | $(ibdir) $(ildir)  # 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. -$(ibidir)/gzip: $(tdir)/gzip-$(gzip-version).tar.lz -	$(call gbuild, gzip-$(gzip-version), static, , V=1) \ -	&& echo "GNU Gzip $(gzip-version)" > $@ +$(lockdir): | $(BDIR); mkdir $@ +$(ibidir)/gzip-$(gzip-version): | $(ibdir) $(ildir) $(lockdir) +	tarball=gzip-$(gzip-version).tar.lz +	$(call import-source, $(gzip-url), $(gzip-checksum)) +	$(call gbuild, gzip-$(gzip-version), static, , V=1) +	echo "GNU Gzip $(gzip-version)" > $@ + +$(ibidir)/xz-$(xz-version): $(ibidir)/gzip-$(gzip-version) +	tarball=xz-$(xz-version).tar.gz +	$(call import-source, $(xz-url), $(xz-checksum)) +	$(call gbuild, xz-$(xz-version), static) +	echo "XZ Utils $(xz-version)" > $@ + +$(ibidir)/bzip2-$(bzip2-version): $(ibidir)/gzip-$(gzip-version) -$(ibidir)/xz: $(ibidir)/gzip \ -              $(tdir)/xz-$(xz-version).tar.gz -	$(call gbuild, xz-$(xz-version), static) \ -	&& echo "XZ Utils $(xz-version)" > $@ +        # Download the tarball. +	tarball=bzip2-$(bzip2-version).tar.gz +	$(call import-source, $(bzip2-url), $(bzip2-checksum)) -$(ibidir)/bzip2: $(ibidir)/gzip \ -                 $(tdir)/bzip2-$(bzip2-version).tar.gz          # Bzip2 doesn't have a `./configure' script, and its Makefile          # doesn't build a shared library. So we can't use the `gbuild'          # function here and we need to take some extra steps (inspired @@ -406,71 +260,77 @@ $(ibidir)/bzip2: $(ibidir)/gzip \  	    makeshared="make -f Makefile-libbz2_so"  	  fi  	fi -	cd $(ddir) && rm -rf $$tdir \ -	&& tar xf $(word 1,$(filter $(tdir)/%,$^)) \ -	&& cd $$tdir \ -	&& sed -e 's@\(ln -s -f \)$$(PREFIX)/bin/@\1@' Makefile \ -	       > Makefile.sed \ -	&& mv Makefile.sed Makefile \ -	&& $$makeshared CC=cc \ -	&& cp -a libbz2* $(ildir)/ \ -	&& make clean \ -	&& $$makecommand CC=cc \ -	&& make install PREFIX=$(idir) \ -	&& cd .. \ -	&& rm -rf $$tdir \ -	&& cd $(ildir) \ -	&& ln -fs libbz2.so.1.0 libbz2.so \ -	&& echo "Bzip2 $(bzip2-version)" > $@ - -$(ibidir)/unzip: $(ibidir)/gzip \ -                 $(tdir)/unzip-$(unzip-version).tar.gz +	cd $(ddir) +	rm -rf $$tdir +	tar xf $(tdir)/$$tarball +	cd $$tdir +	sed -e 's@\(ln -s -f \)$$(PREFIX)/bin/@\1@' Makefile \ +	    > Makefile.sed +	mv Makefile.sed Makefile +	$$makeshared CC=cc +	cp -a libbz2* $(ildir)/ +	make clean +	$$makecommand CC=cc +	make install PREFIX=$(idir) +	cd .. +	rm -rf $$tdir +	cd $(ildir) +	ln -fs libbz2.so.1.0 libbz2.so +	echo "Bzip2 $(bzip2-version)" > $@ + +$(ibidir)/unzip-$(unzip-version): $(ibidir)/gzip-$(gzip-version) +	tarball=unzip-$(unzip-version).tar.gz  	v=$$(echo $(unzip-version) | sed -e's/\.//') +	$(call import-source, $(unzip-url), $(unzip-checksum))  	$(call gbuild, unzip$$v, static,, \  	               -f unix/Makefile generic \  	               CFLAGS="-DBIG_MEM -DMMAP",,pwd, \  	               -f unix/Makefile generic \ -	               BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) \ -	&& echo "Unzip $(unzip-version)" > $@ +	               BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) +	echo "Unzip $(unzip-version)" > $@ -$(ibidir)/zip: $(ibidir)/gzip \ -               $(tdir)/zip-$(zip-version).tar.gz +$(ibidir)/zip-$(zip-version): $(ibidir)/gzip-$(gzip-version) +	tarball=zip-$(zip-version).tar.gz  	v=$$(echo $(zip-version) | sed -e's/\.//') +	$(call import-source, $(zip-url), $(zip-checksum))  	$(call gbuild, zip$$v, static,, \  	               -f unix/Makefile generic \  	               CFLAGS="-DBIG_MEM -DMMAP",,pwd, \  	               -f unix/Makefile generic \ -	               BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) \ -	&& echo "Zip $(zip-version)" > $@ +	               BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) +	echo "Zip $(zip-version)" > $@  # Some programs (like Wget and CMake) that use zlib need it to be dynamic  # so they use our custom build. So we won't force a static-only build.  #  # Note for a static-only build: Zlib's `./configure' doesn't use Autoconf's  # configure script, it just accepts a direct `--static' option. -$(ibidir)/zlib: $(ibidir)/gzip \ -                $(tdir)/zlib-$(zlib-version).tar.gz -	$(call gbuild, zlib-$(zlib-version)) \ -	&& echo "Zlib $(zlib-version)" > $@ +$(ibidir)/zlib-$(zlib-version): $(ibidir)/gzip-$(gzip-version) +	tarball=zlib-$(zlib-version).tar.gz +	$(call import-source, $(zlib-url), $(zlib-checksum)) +	$(call gbuild, zlib-$(zlib-version)) +	echo "Zlib $(zlib-version)" > $@  # GNU Tar: When built statically, tar gives a segmentation fault on  # unpacking Bash. So we'll build it dynamically. Note that technically, zip  # and unzip aren't dependencies of Tar, but for a clean build, we'll set  # Tar to be the last compression-related software (the first-set of  # software to be built). -$(ibidir)/tar: $(ibidir)/xz \ -               $(ibidir)/zip \ -               $(ibidir)/gzip \ -               $(ibidir)/zlib \ -               $(ibidir)/bzip2 \ -               $(ibidir)/unzip \ -               $(tdir)/tar-$(tar-version).tar.gz +$(ibidir)/tar-$(tar-version): \ +              $(ibidir)/xz-$(xz-version) \ +              $(ibidir)/zip-$(zip-version) \ +              $(ibidir)/gzip-$(gzip-version) \ +              $(ibidir)/zlib-$(zlib-version) \ +              $(ibidir)/bzip2-$(bzip2-version) \ +              $(ibidir)/unzip-$(unzip-version)          # Since all later programs depend on Tar, the configuration will be          # stuck here, only making Tar. So its more efficient to built it on          # multiple threads (when the user's Make doesn't pass down the          # number of threads). -	$(call gbuild, tar-$(tar-version), , , -j$(numthreads) V=1) \ -	&& echo "GNU Tar $(tar-version)" > $@ +	tarball=tar-$(tar-version).tar.gz +	$(call import-source, $(tar-url), $(tar-checksum)) +	$(call gbuild, tar-$(tar-version), , , -j$(numthreads) V=1) +	echo "GNU Tar $(tar-version)" > $@ @@ -481,8 +341,34 @@ $(ibidir)/tar: $(ibidir)/xz \ -# Level 2 (SECOND MOST BASIC): Bash and Make -# ------------------------------------------ +# Level 2 (necessary for linking) +# +# 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'. +$(ibidir)/patchelf-$(patchelf-version): $(ibidir)/tar-$(tar-version) +	tarball=patchelf-$(patchelf-version).tar.gz +	$(call import-source, $(patchelf-url), $(patchelf-checksum)) +	if [ x$(on_mac_os) = xyes ]; then +	  echo "" > $@ +	else +	  $(call gbuild, patchelf-$(patchelf-version)) +	  echo "PatchELF $(patchelf-version)" > $@ +	fi + + + + + + + + + + +# Level 3 (THIRD MOST BASIC): Bash +# --------------------------------  #  # GNU Make and GNU Bash are the second layer that we'll need to build the  # basic dependencies. @@ -492,8 +378,9 @@ $(ibidir)/tar: $(ibidir)/xz \  # 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: $(ibidir)/tar \ -                   $(tdir)/ncurses-$(ncurses-version).tar.gz +$(ibidir)/ncurses-$(ncurses-version): $(ibidir)/patchelf-$(patchelf-version) +	tarball=ncurses-$(ncurses-version).tar.gz +	$(call import-source, $(ncurses-url), $(ncurses-checksum))          # Delete the library that will be installed (so we can make sure          # the build process completed afterwards and reset the links). @@ -578,21 +465,14 @@ $(ibidir)/ncurses: $(ibidir)/tar \  	  exit 1  	fi -$(ibidir)/readline: $(ibidir)/ncurses \ -                    $(tdir)/readline-$(readline-version).tar.gz +$(ibidir)/readline-$(readline-version): \ +                   $(ibidir)/ncurses-$(ncurses-version) +	tarball=readline-$(readline-version).tar.gz +	$(call import-source, $(readline-url), $(readline-checksum))  	$(call gbuild, readline-$(readline-version), static, \  	               --with-curses --disable-install-examples, \ -	               SHLIB_LIBS="-lncursesw" -j$(numthreads)) \ -	&& echo "GNU Readline $(readline-version)" > $@ - -$(ibidir)/patchelf: $(ibidir)/tar \ -                    $(tdir)/patchelf-$(patchelf-version).tar.gz -	if [ x$(on_mac_os) = xyes ]; then -	  echo "" > $@ -	else -	  $(call gbuild, patchelf-$(patchelf-version)) \ -	  && echo "PatchELF $(patchelf-version)" > $@ -	fi +	               SHLIB_LIBS="-lncursesw" -j$(numthreads)) +	echo "GNU Readline $(readline-version)" > $@  # IMPORTANT: Even though we have enabled `rpath', Bash doesn't write the @@ -624,10 +504,13 @@ $(ibidir)/patchelf: $(ibidir)/tar \  #   $ tar cf bash-5.0.$number.tar bash-5.0.$number  #   $ lzip --best bash-5.0.$number.tar  #   $ rm -rf bash50-* bash-5.0.$number bash-5.0.tar.gz -$(ibidir)/bash: $(ibidir)/gettext \ -                $(ibidir)/patchelf \ -                $(ibidir)/readline \ -                $(tdir)/bash-$(bash-version).tar.lz +$(ibidir)/bash-$(bash-version): \ +               $(ibidir)/gettext-$(gettext-version) \ +               $(ibidir)/readline-$(readline-version) + +        # Download the tarball. +	tarball=bash-$(bash-version).tar.lz +	$(call import-source, $(bash-url), $(bash-checksum))          # Delete the (possibly) existing Bash executable in the project,          # let it use the default shell of the host. @@ -653,9 +536,8 @@ $(ibidir)/bash: $(ibidir)/gettext \          # default. So, we have to manually include it, currently we are          # only doing this on GNU/Linux systems (using the `patchelf'          # program). -	if [ "x$(needpatchelf)" != x ]; then -	  if [ -f $(ibdir)/bash ]; then -	    $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/bash; fi +	if [ -f $(ibdir)/patchelf ]; then +	  $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/bash;  	fi          # To be generic, some systems use the `sh' command to call the @@ -666,11 +548,8 @@ $(ibidir)/bash: $(ibidir)/gettext \          # Just to be sure that the installation step above went well,          # before making the link, we'll see if the file actually exists          # there. -	if [ -f $(ibdir)/bash ]; then -	  ln -fs $(ibdir)/bash $(ibdir)/sh -	  echo "GNU Bash $(bash-version)" > $@ -	else -	  echo "GNU Bash not built!"; exit 1; fi +	ln -fs $(ibdir)/bash $(ibdir)/sh +	echo "GNU Bash $(bash-version)" > $@ @@ -686,46 +565,45 @@ perl-conflddlflags =  else  perl-conflddlflags = -Dlddlflags="-shared $$LDFLAGS"  endif -$(ibidir)/perl: $(ibidir)/tar \ -                $(tdir)/perl-$(perl-version).tar.gz +$(ibidir)/perl-$(perl-version): $(ibidir)/patchelf-$(patchelf-version) +	tarball=perl-$(perl-version).tar.gz +	$(call import-source, $(perl-url), $(perl-checksum))  	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)}') -	cd $(ddir) \ -	&& rm -rf perl-$(perl-version) \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd perl-$(perl-version) \ -	&& ./Configure -des \ -	               -Dusethreads \ -	               -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/$$basever/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 \ -	               -Dinc_version_list=none \ -	               -Dman1ext=1perl \ -	               -Dman3ext=3perl \ -	               -Dcccdlflags='-fPIC' \ -	               $(perl-conflddlflags) \ -	               -Dldflags="$$LDFLAGS" \ -	&& make -j$(numthreads) \ -	&& make install \ -	&& cd .. \ -	&& rm -rf perl-$(perl-version) \ -	&& cd $$topdir \ -	&& echo "Perl $(perl-version)" > $@ +	cd $(ddir) +	rm -rf perl-$(perl-version) +	tar xf $(tdir)/$$tarball +	cd perl-$(perl-version) +	./Configure -des \ +	            -Dusethreads \ +	            -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/$$basever/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 \ +	            -Dinc_version_list=none \ +	            -Dman1ext=1perl \ +	            -Dman3ext=3perl \ +	            -Dcccdlflags='-fPIC' \ +	            $(perl-conflddlflags) \ +	            -Dldflags="$$LDFLAGS" +	make -j$(numthreads) +	make install +	cd .. +	rm -rf perl-$(perl-version) +	cd $$topdir +	echo "Perl $(perl-version)" > $@ @@ -752,61 +630,70 @@ $(ibidir)/perl: $(ibidir)/tar \  # an error).  #  # Coreutils uses Perl to create man pages! -$(ibidir)/coreutils: $(ibidir)/bash \ -                     $(ibidir)/perl \ -                     $(ibidir)/openssl \ -                     $(tdir)/coreutils-$(coreutils-version).tar.xz -	cd $(ddir) \ -	&& rm -rf coreutils-$(coreutils-version) \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd coreutils-$(coreutils-version) \ -	&& sed -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \ -	       -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \ -	       configure > configure-tmp \ -	&& mv configure-tmp configure \ -	&& chmod +x configure \ -	&& ./configure --prefix=$(idir) SHELL=$(ibdir)/bash  \ -	               LDFLAGS="$(LDFLAGS)" CPPFLAGS="$(CPPFLAGS)" \ -	               --disable-silent-rules --with-openssl=yes \ -	&& make SHELL=$(ibdir)/bash -j$(numthreads) \ -	&& make SHELL=$(ibdir)/bash install \ -	&& if [ x$(on_mac_os) != xyes ]; then \ -	     make SHELL=$(ibdir)/bash install DESTDIR=junkinst; \ -	     instprogs=$$(ls junkinst/$(ibdir)); \ -	     for f in $$instprogs; do \ -	       $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/$$f; \ -	     done; \ -	     echo "PatchELF applied to all programs."; \ -	   fi \ -	&& cd .. \ -	&& rm -rf coreutils-$(coreutils-version) \ -	&& echo "GNU Coreutils $(coreutils-version)" > $@ +$(ibidir)/coreutils-$(coreutils-version): \ +                    $(ibidir)/bash-$(bash-version) \ +                    $(ibidir)/perl-$(perl-version) \ +                    $(ibidir)/openssl-$(openssl-version) + +        # Import, unpack and enter the source directory. +	tarball=coreutils-$(coreutils-version).tar.xz +	$(call import-source, $(coreutils-url), $(coreutils-checksum)) +	cd $(ddir) +	rm -rf coreutils-$(coreutils-version) +	tar xf $(tdir)/$$tarball +	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 + +        # Configure, build and install Coreutils. +	./configure --prefix=$(idir) SHELL=$(ibdir)/bash  \ +	            LDFLAGS="$(LDFLAGS)" CPPFLAGS="$(CPPFLAGS)" \ +	            --disable-silent-rules --with-openssl=yes +	make SHELL=$(ibdir)/bash -j$(numthreads) +	make SHELL=$(ibdir)/bash install + +        # Fix RPATH if necessary. +	if [ -f $(ibdir)/patchelf ]; then +	  make SHELL=$(ibdir)/bash install DESTDIR=junkinst +	  instprogs=$$(ls junkinst/$(ibdir)) +	  for f in $$instprogs; do +	    $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/$$f +	  done +	  echo "PatchELF applied to all programs." +	fi + +        # Come back up to the unpacking directory, delete the source +        # directory and write the final target. +	cd .. +	rm -rf coreutils-$(coreutils-version) +	echo "GNU Coreutils $(coreutils-version)" > $@  # OpenSSL  # -# Some programs/libraries later need dynamic linking. So we'll build libssl -# (and libcrypto) dynamically also. -#  # Until we find a nice and generic way to create an updated CA file in the  # project, the certificates will be available in a file for this project  # along with the other tarballs. -# -# In case you do want a static OpenSSL and libcrypto, then uncomment the -# following conditional and put $(openssl-static) in the configure options. -# -#ifeq ($(static_build),yes) -#openssl-static = no-dso no-dynamic-engine no-shared -#endif  $(idir)/etc:; mkdir $@ -# Note: cert.pm has to be AFTER the tarball, otherwise the build script -# will try to unpack cert.pm and crash (it unpacks the first dependency -# under `tdir'). -$(ibidir)/openssl: $(ibidir)/perl \ -                   $(tdir)/openssl-$(openssl-version).tar.gz \ -                   $(tdir)/cert.pem \ -                   | $(idir)/etc +$(idir)/etc/ssl: | $(idir)/etc; mkdir $@ +$(ibidir)/openssl-$(openssl-version): $(ibidir)/perl-$(perl-version) \ +                  | $(idir)/etc/ssl + +        # First download the certificates and copy them into the +        # installation directory. +	tarball=cert.pem +	$(call import-source, $(cert-url), $(cert-checksum)) +	cp $(tdir)/cert.pem $(idir)/etc/ssl/cert.pem + +        # Now download the OpenSSL tarball. +	tarball=openssl-$(openssl-version).tar.gz +	$(call import-source, $(openssl-url), $(openssl-checksum)) +          # According to OpenSSL's Wiki (link bellow), it can't automatically          # detect Mac OS's structure. It will need some help. So we'll use          # the `on_mac_os' Make variable that we defined in the configure @@ -814,18 +701,10 @@ $(ibidir)/openssl: $(ibidir)/perl \          # environment variable.          #          # https://wiki.openssl.org/index.php/Compilation_and_Installation -        # -        # Bug 58263 (https://savannah.nongnu.org/bugs/?58263): In OpenSSL -        # Version 1.1.1a (also checked in 1.1.1g), `openssl/ec.h' fails to -        # include `openssl/openconf.h' on some OSs. The SED hack below -        # inserts a hardwired element of `openssl/openconf.h' that is -        # needed to include sections of code `f` that are deprecated in -        # 1.2.0, but not yet in 1.1.1. This problem may be solved in -        # version 1.2.x, so please check again in that bug. -	if [ x$(on_mac_os) = xyes ]; then \ -	  export KERNEL_BITS=64; \ -	  copt="shared no-ssl2 no-ssl3 enable-ec_nistp_64_gcc_128";  \ -	fi; \ +	if [ x$(on_mac_os) = xyes ]; then +	  export KERNEL_BITS=64 +	  copt="shared no-ssl2 no-ssl3 enable-ec_nistp_64_gcc_128" +	fi  	$(call gbuild, openssl-$(openssl-version), , \  	               zlib \  	               $$copt \ @@ -833,19 +712,26 @@ $(ibidir)/openssl: $(ibidir)/perl \  	               --openssldir=$(idir)/etc/ssl \  	               --with-zlib-lib=$(ildir) \  	               --with-zlib-include=$(idir)/include, \ -	               -j$(numthreads), , ./config ) \ -	&& mv -v $(idir)/include/openssl/ec.h $(idir)/include/openssl/ec.h.orig \ -	&& sed -e 's,\(# include .openssl/opensslconf\.h.\),\1\n#ifndef DEPRECATEDIN_1_2_0\n#define DEPRECATEDIN_1_2_0(f)   f;\n#endif\n,' \ -	   $(idir)/include/openssl/ec.h.orig > $(idir)/include/openssl/ec.h \ -	&& cp $(tdir)/cert.pem $(idir)/etc/ssl/cert.pem \ -	&& if [ $$? = 0 ]; then \ -	     if [ x$(on_mac_os) = xyes ]; then \ -	       echo "No need to fix rpath in libssl"; \ -	     else \ -	       patchelf --set-rpath $(ildir) $(ildir)/libssl.so; \ -	     fi; \ -	     echo "OpenSSL $(openssl-version)" > $@; \ -	   fi +	               -j$(numthreads), , ./config ) + +        # Manually insert RPATH inside the OpenSSL library. +	if [ -f $(ibdir)/patchelf ]; then +	   patchelf --set-rpath $(ildir) $(ildir)/libssl.so; \ +	fi + +        # Bug 58263 (https://savannah.nongnu.org/bugs/?58263): In OpenSSL +        # Version 1.1.1a (also checked in 1.1.1g), `openssl/ec.h' fails to +        # include `openssl/openconf.h' on some OSs. The SED hack below +        # inserts a hardwired element of `openssl/openconf.h' that is +        # needed to include sections of code `f` that are deprecated in +        # 1.2.0, but not yet in 1.1.1. This problem may be solved in +        # version 1.2.x, so please check again in that bug. +	mv -v $(idir)/include/openssl/ec.h $(idir)/include/openssl/ec.h.orig +	sed -e 's,\(# include .openssl/opensslconf\.h.\),\1\n#ifndef DEPRECATEDIN_1_2_0\n#define DEPRECATEDIN_1_2_0(f)   f;\n#endif\n,' \ +	   $(idir)/include/openssl/ec.h.orig > $(idir)/include/openssl/ec.h + +        # Build the final target. +	echo "OpenSSL $(openssl-version)" > $@ @@ -862,8 +748,11 @@ $(ibidir)/openssl: $(ibidir)/perl \  # them. Note that if it does link with them, the configuration will crash  # when the library is updated/changed by the host, and the whole purpose of  # this project is avoid dependency on the host as much as possible. -$(ibidir)/curl: $(ibidir)/coreutils \ -                $(tdir)/curl-$(curl-version).tar.gz +$(ibidir)/curl-$(curl-version): $(ibidir)/coreutils-$(coreutils-version) + +	tarball=curl-$(curl-version).tar.gz +	$(call import-source, $(curl-url), $(curl-checksum)) +  	$(call gbuild, curl-$(curl-version), , \  	               LIBS="-pthread" \  	               --with-zlib=$(ildir) \ @@ -880,11 +769,12 @@ $(ibidir)/curl: $(ibidir)/coreutils \  	               --without-axtls \  	               --disable-ldaps \  	               --disable-ldap \ -	               --without-nss, V=1) \ -	&& if [ "x$(needpatchelf)" != x ]; then \ -	     $(ibdir)/patchelf --set-rpath $(ildir) $(ildir)/libcurl.so; \ -	   fi \ -	&& echo "cURL $(curl-version)" > $@ +	               --without-nss, V=1) + +	if [ -f $(ibdir)/patchelf ]; then +	   $(ibdir)/patchelf --set-rpath $(ildir) $(ildir)/libcurl.so +	fi +	echo "cURL $(curl-version)" > $@  # GNU Wget @@ -900,13 +790,18 @@ $(ibidir)/curl: $(ibidir)/coreutils \  # building as part of this project. So to avoid too much dependency on the  # host system (especially a crash when these libraries are updated on the  # host), they are disabled here. -$(ibidir)/wget: $(ibidir)/libiconv \ -                $(ibidir)/coreutils \ -                $(tdir)/wget-$(wget-version).tar.lz +$(ibidir)/wget-$(wget-version): \ +               $(ibidir)/libiconv-$(libiconv-version) \ +               $(ibidir)/coreutils-$(coreutils-version) + +        # Download the tarball. +	tarball=wget-$(wget-version).tar.lz +	$(call import-source, $(wget-url), $(wget-checksum)) +          # We need to explicitly disable `libiconv', because of the          # `pkg-config' and `libiconv' problem. -	libs="-pthread"; \ -	if [ x$(needs_ldl) = xyes ]; then libs="$$libs -ldl"; fi; \ +	libs="-pthread" +	if [ x$(needs_ldl) = xyes ]; then libs="$$libs -ldl"; fi  	$(call gbuild, wget-$(wget-version), , \  	               LIBS="$$LIBS $$libs" \  	               --with-libssl-prefix=$(idir) \ @@ -919,8 +814,8 @@ $(ibidir)/wget: $(ibidir)/libiconv \  	               --without-libidn \  	               --disable-pcre2 \  	               --disable-pcre \ -	               --disable-iri, V=1) \ -	&& echo "GNU Wget $(wget-version)" > $@ +	               --disable-iri, V=1 -j$(numthreads)) +	echo "GNU Wget $(wget-version)" > $@ @@ -935,114 +830,144 @@ $(ibidir)/wget: $(ibidir)/libiconv \  # process of the higher-level programs and libraries. Note that during the  # building of those higher-level programs (after this Makefile finishes),  # there is no access to the system's PATH. -$(ibidir)/diffutils: $(ibidir)/coreutils \ -                     $(tdir)/diffutils-$(diffutils-version).tar.xz -	$(call gbuild, diffutils-$(diffutils-version), static,,V=1) \ -	&& echo "GNU Diffutils $(diffutils-version)" > $@ - -$(ibidir)/file: $(ibidir)/coreutils \ -                $(tdir)/file-$(file-version).tar.gz -	$(call gbuild, file-$(file-version), static,,V=1) \ -	&& echo "File $(file-version)" > $@ - -$(ibidir)/findutils: $(ibidir)/coreutils \ -                     $(tdir)/findutils-$(findutils-version).tar.xz -	$(call gbuild, findutils-$(findutils-version), static,,V=1) \ -	&& echo "GNU Findutils $(findutils-version)" > $@ - -$(ibidir)/gawk: $(ibidir)/gmp \ -                $(ibidir)/mpfr \ -                $(ibidir)/coreutils \ -                $(tdir)/gawk-$(gawk-version).tar.lz +$(ibidir)/diffutils-$(diffutils-version): \ +                    $(ibidir)/coreutils-$(coreutils-version) +	tarball=diffutils-$(diffutils-version).tar.xz +	$(call import-source, $(diffutils-url), $(diffutils-checksum)) +	$(call gbuild, diffutils-$(diffutils-version), static,,V=1) +	echo "GNU Diffutils $(diffutils-version)" > $@ + +$(ibidir)/file-$(file-version): $(ibidir)/coreutils-$(coreutils-version) +	tarball=file-$(file-version).tar.gz +	$(call import-source, $(file-url), $(file-checksum)) +	$(call gbuild, file-$(file-version), static,,V=1) +	echo "File $(file-version)" > $@ + +$(ibidir)/findutils-$(findutils-version): \ +                    $(ibidir)/coreutils-$(coreutils-version) +	tarball=findutils-$(findutils-version).tar.xz +	$(call import-source, $(findutils-url), $(findutils-checksum)) +	$(call gbuild, findutils-$(findutils-version), static,,V=1) +	echo "GNU Findutils $(findutils-version)" > $@ + +$(ibidir)/gawk-$(gawk-version): \ +               $(ibidir)/gmp-$(gmp-version) \ +               $(ibidir)/mpfr-$(mpfr-version) \ +               $(ibidir)/coreutils-$(coreutils-version) + +        # Download the tarball. +	tarball=gawk-$(gawk-version).tar.lz +	$(call import-source, $(gawk-url), $(gawk-checksum)) +          # AWK doesn't include RPATH by default, so we'll have to manually          # include it using the `patchelf' program (which was a dependency          # of Bash). Just note that AWK produces two executables (for          # example `gawk-4.2.1' and `gawk') and a symbolic link `awk' to one          # of those executables.  	$(call gbuild, gawk-$(gawk-version), static, \ -	               --with-readline=$(idir)) \ -	&& if [ "x$(needpatchelf)" != x ]; then \ -	     if [ -f $(ibdir)/gawk ]; then \ -	       $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/gawk; \ -	     fi; \ -	     if [ -f $(ibdir)/gawk-$(gawk-version) ]; then \ -	       $(ibdir)/patchelf --set-rpath $(ildir) \ -	                         $(ibdir)/gawk-$(gawk-version); \ -	    fi; \ -	   fi \ -	&& echo "GNU AWK $(gawk-version)" > $@ - -$(ibidir)/libiconv: $(ibidir)/pkg-config \ -                    $(tdir)/libiconv-$(libiconv-version).tar.gz -	$(call gbuild, libiconv-$(libiconv-version), static) \ -	&& echo "GNU libiconv $(libiconv-version)" > $@ - -$(ibidir)/libunistring: $(ibidir)/libiconv \ -                        $(tdir)/libunistring-$(libunistring-version).tar.xz +	               --with-readline=$(idir)) + +        # Correct the RPATH on systems that have installed patchelf. +	if [ -f $(ibdir)/patchelf ]; then +	  if [ -f $(ibdir)/gawk ]; then +	    $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/gawk +	  fi +	  if [ -f $(ibdir)/gawk-$(gawk-version) ]; then +	    $(ibdir)/patchelf --set-rpath $(ildir) \ +	                      $(ibdir)/gawk-$(gawk-version); +	  fi +	fi + +        # Build final target. +	echo "GNU AWK $(gawk-version)" > $@ + +$(ibidir)/libiconv-$(libiconv-version): \ +                   $(ibidir)/pkg-config-$(pkgconfig-version) +	tarball=libiconv-$(libiconv-version).tar.gz +	$(call import-source, $(libiconv-url), $(libiconv-checksum)) +	$(call gbuild, libiconv-$(libiconv-version), static) +	echo "GNU libiconv $(libiconv-version)" > $@ + +$(ibidir)/libunistring-$(libunistring-version): \ +                       $(ibidir)/libiconv-$(libiconv-version) +	tarball=libunistring-$(libunistring-version).tar.xz +	$(call import-source, $(libunistring-url), $(libunistring-checksum))  	$(call gbuild, libunistring-$(libunistring-version), static,, \ -	               -j$(numthreads)) \ -	&& echo "GNU libunistring $(libunistring-version)" > $@ +	               -j$(numthreads)) +	echo "GNU libunistring $(libunistring-version)" > $@ -$(ibidir)/libxml2: $(ibidir)/tar \ -                   $(tdir)/libxml2-$(libxml2-version).tar.gz +$(ibidir)/libxml2-$(libxml2-version): $(ibidir)/patchelf-$(patchelf-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. +	tarball=libxml2-$(libxml2-version).tar.gz +	$(call import-source, $(libxml2-url), $(libxml2-checksum))  	$(call gbuild, libxml2-$(libxml2-version), static, \ -	               --without-python) \ -	&& echo "Libxml2 $(libxml2-version)" > $@ - -$(ibidir)/gettext: $(ibidir)/m4 \ -                   $(ibidir)/libxml2 \ -                   $(ibidir)/ncurses \ -                   $(ibidir)/libiconv \ -                   $(ibidir)/libunistring \ -                   $(tdir)/gettext-$(gettext-version).tar.xz -	$(call gbuild, gettext-$(gettext-version), static, V=1) \ -	&& echo "GNU gettext $(gettext-version)" > $@ - -$(ibidir)/git: $(ibidir)/curl \ -               $(ibidir)/gettext \ -               $(ibidir)/libiconv \ -               $(tdir)/git-$(git-version).tar.xz -	if [ x$(on_mac_os) = xyes ]; then \ -	  export LDFLAGS="$$LDFLAGS -lcharset"; \ -	fi; \ +	               --without-python, V=1) +	echo "Libxml2 $(libxml2-version)" > $@ + +$(ibidir)/gettext-$(gettext-version): \ +                  $(ibidir)/m4-$(m4-version) \ +                  $(ibidir)/libxml2-$(libxml2-version) \ +                  $(ibidir)/ncurses-$(ncurses-version) \ +                  $(ibidir)/libiconv-$(libiconv-version) \ +                  $(ibidir)/libunistring-$(libunistring-version) +	tarball=gettext-$(gettext-version).tar.xz +	$(call import-source, $(gettext-url), $(gettext-checksum)) +	$(call gbuild, gettext-$(gettext-version), static,, \ +	               V=1 -j$(numthreads)) +	echo "GNU gettext $(gettext-version)" > $@ + +$(ibidir)/git-$(git-version): \ +              $(ibidir)/curl-$(curl-version) \ +              $(ibidir)/gettext-$(gettext-version) \ +              $(ibidir)/libiconv-$(libiconv-version) +	tarball=git-$(git-version).tar.xz +	if [ x$(on_mac_os) = xyes ]; then +	  export LDFLAGS="$$LDFLAGS -lcharset" +	fi +	$(call import-source, $(git-url), $(git-checksum))  	$(call gbuild, git-$(git-version), static, \  	               --without-tcltk --with-shell=$(ibdir)/bash \ -	               --with-iconv=$(idir), V=1) \ -	&& echo "Git $(git-version)" > $@ - -$(ibidir)/gmp: $(ibidir)/m4 \ -               $(ibidir)/coreutils \ -               $(tdir)/gmp-$(gmp-version).tar.lz +	               --with-iconv=$(idir), V=1 -j$(numthreads)) +	echo "Git $(git-version)" > $@ + +$(ibidir)/gmp-$(gmp-version): \ +              $(ibidir)/m4-$(m4-version) \ +              $(ibidir)/coreutils-$(coreutils-version) +	tarball=gmp-$(gmp-version).tar.lz +	$(call import-source, $(gmp-url), $(gmp-checksum))  	$(call gbuild, gmp-$(gmp-version), static, \ -	               --enable-cxx --enable-fat, ,make check)  \ -	&& echo "GNU Multiple Precision Arithmetic Library $(gmp-version)" > $@ +	               --enable-cxx --enable-fat, \ +	               -j$(numthreads) ,make check) +	echo "GNU Multiple Precision Arithmetic Library $(gmp-version)" > $@  # On Mac OS, libtool does different things, so to avoid confusion, we'll  # prefix GNU's libtool executables with `glibtool'. -$(ibidir)/glibtool: $(ibidir)/m4 \ -                    $(tdir)/libtool-$(libtool-version).tar.xz +$(ibidir)/libtool-$(libtool-version): $(ibidir)/m4-$(m4-version) +	tarball=libtool-$(libtool-version).tar.xz +	$(call import-source, $(libtool-url), $(libtool-checksum))  	$(call gbuild, libtool-$(libtool-version), static, \ -                       --program-prefix=g, V=1) \ -	&& ln -s $(ibdir)/glibtoolize $(ibdir)/libtoolize \ -	&& echo "GNU Libtool $(libtool-version)" > $@ - -$(ibidir)/grep: $(ibidir)/coreutils \ -                $(tdir)/grep-$(grep-version).tar.xz -	$(call gbuild, grep-$(grep-version), static,,V=1) \ -	&& echo "GNU Grep $(grep-version)" > $@ - -$(ibidir)/libbsd: $(ibidir)/coreutils \ -                  $(tdir)/libbsd-$(libbsd-version).tar.xz +                       --program-prefix=g, V=1 -j$(numthreads)) +	ln -s $(ibdir)/glibtoolize $(ibdir)/libtoolize +	echo "GNU Libtool $(libtool-version)" > $@ + +$(ibidir)/grep-$(grep-version): $(ibidir)/coreutils-$(coreutils-version) +	tarball=grep-$(grep-version).tar.xz +	$(call import-source, $(grep-url), $(grep-checksum)) +	$(call gbuild, grep-$(grep-version), static,,V=1) +	echo "GNU Grep $(grep-version)" > $@ + +$(ibidir)/libbsd-$(libbsd-version): $(ibidir)/coreutils-$(coreutils-version) +	tarball=libbsd-$(libbsd-version).tar.xz +	$(call import-source, $(libbsd-url), $(libbsd-checksum))  	if [ x$(on_mac_os) = xyes ]; then  	  echo "" > $@  	else -	  $(call gbuild, libbsd-$(libbsd-version), static,,V=1) \ -	  && echo "Libbsd $(libbsd-version)" > $@ +	  $(call gbuild, libbsd-$(libbsd-version), static,,V=1) +	  echo "Libbsd $(libbsd-version)" > $@  	fi  # We need to apply a patch to the M4 source to be used properly on macOS. @@ -1050,27 +975,27 @@ $(ibidir)/libbsd: $(ibidir)/coreutils \  #  # [1] https://raw.githubusercontent.com/macports/macports-ports/edf0ee1e2cf/devel/m4/files/secure_snprintf.patch  # [2] https://github.com/Homebrew/homebrew-core/blob/master/Formula/m4.rb -$(ibidir)/m4: $(ibidir)/texinfo \ -              $(tdir)/m4-$(m4-version).tar.gz -	cd $(ddir); \ -	unpackdir=m4-$(m4-version); \ -	rm -rf $$unpackdir \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd $$unpackdir \ -	&& if [ x$(on_mac_os) = xyes ]; then \ -	     sed 's|if !(((__GLIBC__ > 2|if !defined(__APPLE__) \&\& !(((__GLIBC__ > 2|' \ -	         lib/vasnprintf.c > lib/vasnprintf_edited.c;  \ -	     mv lib/vasnprintf_edited.c lib/vasnprintf.c; \ -	   fi \ -	&& ./configure --prefix=$(idir) LDFLAGS="$(LDFLAGS)" \ -	               CPPFLAGS="$(CPPFLAGS)" \ -	&& make V=1 -j$(numthreads) \ -	&& make V=1 install \ -	&& cd .. \ -	&& rm -rf $$unpackdir \ -	&& echo "GNU M4 $(m4-version)" > $@ +$(ibidir)/m4-$(m4-version): $(ibidir)/texinfo-$(texinfo-version) +	tarball=m4-$(m4-version).tar.gz +	$(call import-source, $(m4-url), $(m4-checksum)) +	cd $(ddir) +	unpackdir=m4-$(m4-version) +	rm -rf $$unpackdir +	tar xf $(tdir)/$$tarball +	mv m4-* $$unpackdir +	cd $$unpackdir +	if [ x$(on_mac_os) = xyes ]; then +	   sed 's|if !(((__GLIBC__ > 2|if !defined(__APPLE__) \&\& !(((__GLIBC__ > 2|' \ +	       lib/vasnprintf.c > lib/vasnprintf_edited.c +	   mv lib/vasnprintf_edited.c lib/vasnprintf.c +	fi +	./configure --prefix=$(idir) LDFLAGS="$(LDFLAGS)" \ +	            CPPFLAGS="$(CPPFLAGS)" +	make V=1 -j$(numthreads) +	make V=1 install +	cd .. +	rm -rf $$unpackdir +	echo "GNU M4 $(m4-version)" > $@  # Metastore is used (through a Git hook) to restore the source modification  # dates of files after a Git checkout. Another Git hook saves all file @@ -1089,12 +1014,16 @@ $(ibidir)/m4: $(ibidir)/texinfo \  #  # Libbsd is not necessary on macOS systems, because macOS is already a  # BSD-based distribution. But on GNU/Linux systems, it is necessary. -$(ibidir)/metastore: $(ibidir)/sed \ -                     $(ibidir)/git \ -                     $(ibidir)/gawk \ -                     $(ibidir)/libbsd \ -                     $(ibidir)/coreutils \ -                     $(tdir)/metastore-$(metastore-version).tar.gz +$(ibidir)/metastore-$(metastore-version): \ +                    $(ibidir)/sed-$(sed-version) \ +                    $(ibidir)/git-$(git-version) \ +                    $(ibidir)/gawk-$(gawk-version) \ +                    $(ibidir)/libbsd-$(libbsd-version) \ +                    $(ibidir)/coreutils-$(coreutils-version) + +        # Download the tarball. +	tarball=metastore-$(metastore-version).tar.gz +	$(call import-source, $(metastore-url), $(metastore-checksum))          # Metastore doesn't have any `./configure' script. So we'll just          # call `pwd' as a place-holder for the `./configure' command. @@ -1111,54 +1040,61 @@ $(ibidir)/metastore: $(ibidir)/sed \          # are currently only available in a fork of `metastore' hosted at:          # https://github.com/mohammad-akhlaghi/metastore          # -        # We want to inform the user if Metastore isn't built, so we don't -        # continue the call to `gbuild' with an `&&'. -        #          # Checking for presence of `.git'. When the project source is          # downloaded from a non-Git source (for example from arXiv), there          # is no `.git' directory to work with. So until we find a better          # solution, avoid the step to to add the Git hooks.  	current_dir=$$(pwd); \  	$(call gbuild, metastore-$(metastore-version), static,, \ -	               NO_XATTR=1 V=1,,pwd,PREFIX=$(idir)); \ -	if [ -f $(ibdir)/metastore ]; then \ -	  if [ "x$(needpatchelf)" != x ]; then \ -	    $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/metastore; \ -	  fi; \ -	  if [ -d .git ]; then \ -	    user=$$(whoami); \ -	    group=$$(groups | awk '{print $$1}'); \ -	    cd $$current_dir; \ -	    for f in pre-commit post-checkout; do \ +	               NO_XATTR=1 V=1,,pwd,PREFIX=$(idir)) + +        # Correct RPATH when necessary. +	if [ -f $(ibdir)/patchelf ]; then +	  $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/metastore +	fi + +        # If this project is being built in a directory version controlled +        # by Git, copy the hooks into the Git configuation. +	if [ -f $(ibdir)/metastore ]; then +	  if [ -d .git ]; then +	    user=$$(whoami) +	    group=$$(groups | awk '{print $$1}') +	    cd $$current_dir +	    for f in pre-commit post-checkout; do  	       sed -e's|@USER[@]|'$$user'|g' \  	           -e's|@GROUP[@]|'$$group'|g' \  	           -e's|@BINDIR[@]|$(ibdir)|g' \  	           -e's|@TOP_PROJECT_DIR[@]|'$$current_dir'|g' \ -	           reproduce/software/shell/git-$$f > .git/hooks/$$f \ -	       && chmod +x .git/hooks/$$f; \ -	    done; \ -	  fi \ -	  && echo "Metastore (forked) $(metastore-version)" > $@; \ -	else \ -	  echo; echo; echo; \ -	  echo "*****************"; \ -	  echo "metastore couldn't be installed!"; \ -	  echo; \ -	  echo "Its used for preserving timestamps on Git commits."; \ -	  echo "Its useful for development, not simple running of "; \ -	  echo "the project. So we won't stop the configuration "; \ -	  echo "because it wasn't built."; \ -	  echo "*****************"; \ +	           reproduce/software/shell/git-$$f > .git/hooks/$$f +	       chmod +x .git/hooks/$$f +	    done +	  fi +	  echo "Metastore (forked) $(metastore-version)" > $@ +	else +	  echo; echo; echo +	  echo "*****************" +	  echo "metastore couldn't be installed!" +	  echo +	  echo "Its used for preserving timestamps on Git commits." +	  echo "Its useful for development, not simple running of " +	  echo "the project. So we won't stop the configuration " +	  echo "because it wasn't built." +	  echo "*****************" +	  echo "" > $@  	fi +$(ibidir)/mpfr-$(mpfr-version): $(ibidir)/gmp-$(gmp-version) +	tarball=mpfr-$(mpfr-version).tar.xz +	$(call import-source, $(mpfr-url), $(mpfr-checksum)) +	$(call gbuild, mpfr-$(mpfr-version), static, , , make check) +	echo "GNU Multiple Precision Floating-Point Reliably $(mpfr-version)" > $@ + +$(ibidir)/pkg-config-$(pkgconfig-version): $(ibidir)/patchelf-$(patchelf-version) -$(ibidir)/mpfr: $(ibidir)/gmp \ -                $(tdir)/mpfr-$(mpfr-version).tar.xz -	$(call gbuild, mpfr-$(mpfr-version), static, , , make check)  \ -	&& echo "GNU Multiple Precision Floating-Point Reliably $(mpfr-version)" > $@ +        # Download the tarball. +	tarball=pkg-config-$(pkgconfig-version).tar.gz +	$(call import-source, $(pkgconfig-url), $(pkgconfig-checksum)) -$(ibidir)/pkg-config: $(ibidir)/tar \ -                      $(tdir)/pkg-config-$(pkgconfig-version).tar.gz          # 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 @@ -1171,32 +1107,36 @@ $(ibidir)/pkg-config: $(ibidir)/tar \          # (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; \ +	if [ x$(on_mac_os) = xyes ]; then export compiler="CC=clang" +	else                              export compiler="" +	fi  	$(call gbuild, pkg-config-$(pkgconfig-version), static, \  	               $$compiler --with-internal-glib \ -	               --with-pc-path=$(ildir)/pkgconfig, V=1) \ -	&& echo "pkg-config $(pkgconfig-version)" > $@ - -$(ibidir)/sed: $(ibidir)/coreutils \ -               $(tdir)/sed-$(sed-version).tar.xz -	$(call gbuild, sed-$(sed-version), static,,V=1) \ -	&& echo "GNU Sed $(sed-version)" > $@ - -$(ibidir)/texinfo: $(ibidir)/perl \ -                   $(tdir)/texinfo-$(texinfo-version).tar.xz -	$(call gbuild, texinfo-$(texinfo-version), static) \ -	&& if [ "x$(needpatchelf)" != x ]; then \ -	     $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/info; \ -	     $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/install-info; \ -	   fi \ -	&& echo "GNU Texinfo $(texinfo-version)" > $@ +	               --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.xz +	$(call import-source, $(sed-url), $(sed-checksum)) +	$(call gbuild, sed-$(sed-version), static,,V=1) +	echo "GNU Sed $(sed-version)" > $@ + +$(ibidir)/texinfo-$(texinfo-version): \ +                  $(ibidir)/perl-$(perl-version) +	tarball=texinfo-$(texinfo-version).tar.xz +	$(call import-source, $(texinfo-url), $(texinfo-checksum)) +	$(call gbuild, texinfo-$(texinfo-version), static) +	if [ -f $(ibdir)/patchelf ]; then +	  $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/info +	  $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/install-info +	fi +	echo "GNU Texinfo $(texinfo-version)" > $@ -$(ibidir)/which: $(ibidir)/coreutils \ -                 $(tdir)/which-$(which-version).tar.gz -	$(call gbuild, which-$(which-version), static) \ -	&& echo "GNU Which $(which-version)" > $@ +$(ibidir)/which-$(which-version): $(ibidir)/coreutils-$(coreutils-version) +	tarball=/which-$(which-version).tar.gz +	$(call import-source, $(which-url), $(which-checksum)) +	$(call gbuild, which-$(which-version), static) +	echo "GNU Which $(which-version)" > $@ @@ -1209,74 +1149,86 @@ $(ibidir)/which: $(ibidir)/coreutils \  # GCC and its prerequisites  # ------------------------- -$(ibidir)/isl: $(ibidir)/gmp \ -               $(tdir)/isl-$(isl-version).tar.bz2 +$(ibidir)/isl-$(isl-version): $(ibidir)/gmp-$(gmp-version) +	tarball=isl-$(isl-version).tar.bz2 +	$(call import-source, $(isl-url), $(isl-checksum))  	if [ $(host_cc) = 1 ]; then  	  echo "" > $@  	else -	  $(call gbuild, isl-$(isl-version), static, , V=1)  \ -	  && echo "GNU Integer Set Library $(isl-version)" > $@ +	  $(call gbuild, isl-$(isl-version), static, , \ +	                 V=1 -j$(numthreads)) +	  echo "GNU Integer Set Library $(isl-version)" > $@  	fi -$(ibidir)/mpc: $(ibidir)/mpfr \ -               $(tdir)/mpc-$(mpc-version).tar.gz +$(ibidir)/mpc-$(mpc-version): $(ibidir)/mpfr-$(mpfr-version) +	tarball=mpc-$(mpc-version).tar.gz +	$(call import-source, $(mpc-url), $(mpc-checksum))  	if [ $(host_cc) = 1 ]; then  	  echo "" > $@  	else -	  $(call gbuild, mpc-$(mpc-version), static, , , make check)  \ -	  && echo "GNU Multiple Precision Complex library" > $@ +	  $(call gbuild, mpc-$(mpc-version), static, , \ +	                 -j$(numthreads), make check) +	  echo "GNU Multiple Precision Complex library" > $@  	fi  # The installation of Binutils can cause problems during the build of other  # programs (http://savannah.nongnu.org/bugs/?56294). Therefore, we'll set  # all other basic programs as Binutils prerequisite and GCC (the final  # basic target) ultimately just depends on Binutils. -# -# The `ld' linker of Binutils needs several `*crt*.o' file to run. On some -# systems these object files aren't installed in standard places. We -# defined `LIBRARY_PATH' and that fixed the problem for many -# systems. However, some software (for example ImageMagick) over-write -# `LIBRARY_PATH', therefore there is no other way than to put a link to -# these necessary files in our local build directory. IMPORTANT NOTE: -# later, when we build the GNU C Library in the project, we should remove -# this step. -$(ibidir)/binutils: $(ibidir)/sed \ -                    $(ibidir)/isl \ -                    $(ibidir)/mpc \ -                    $(ibidir)/wget \ -                    $(ibidir)/grep \ -                    $(ibidir)/file \ -                    $(ibidir)/gawk \ -                    $(ibidir)/which \ -                    $(ibidir)/glibtool \ -                    $(ibidir)/metastore \ -                    $(ibidir)/findutils \ -                    $(ibidir)/diffutils \ -                    $(ibidir)/coreutils \ -                    $(tdir)/binutils-$(binutils-version).tar.lz +$(ibidir)/binutils-$(binutils-version): \ +                   $(ibidir)/sed-$(sed-version) \ +                   $(ibidir)/isl-$(isl-version) \ +                   $(ibidir)/mpc-$(mpc-version) \ +                   $(ibidir)/wget-$(wget-version) \ +                   $(ibidir)/grep-$(grep-version) \ +                   $(ibidir)/file-$(file-version) \ +                   $(ibidir)/gawk-$(gawk-version) \ +                   $(ibidir)/which-$(which-version) \ +                   $(ibidir)/libtool-$(libtool-version) \ +                   $(ibidir)/metastore-$(metastore-version) \ +                   $(ibidir)/findutils-$(findutils-version) \ +                   $(ibidir)/diffutils-$(diffutils-version) \ +                   $(ibidir)/coreutils-$(coreutils-version) + +        # Download the tarball. +	tarball=binutils-$(binutils-version).tar.lz +	$(call import-source, $(binutils-url), $(binutils-checksum))          # Binutils' assembler (`as') and linker (`ld') will conflict with -        # other compilers. So until then, on Mac systems we'll use the host -        # opertating system's Binutils equivalents by just making links. -	if [ x$(on_mac_os) = xyes ]; then \ -	  $(call makelink,as); \ -	  $(call makelink,ar); \ -	  $(call makelink,ld); \ -	  $(call makelink,nm); \ -	  $(call makelink,ps); \ -	  $(call makelink,ranlib); \ -	  echo "" > $@; \ -	else \ +        # other compilers. So if we don't build our own compiler, we'll use +        # the host opertating system's equivalents by just making links. +	if [ x$(on_mac_os) = xyes ]; then +	  $(call makelink,as) +	  $(call makelink,ar) +	  $(call makelink,ld) +	  $(call makelink,nm) +	  $(call makelink,ps) +	  $(call makelink,ranlib) +	  echo "" > $@ +	else + +          # Build binutils with the standard 'gbuild' function.  	  $(call gbuild, binutils-$(binutils-version), static, \  	                 --with-lib-path=$(sys_library_path), \ -	                 -j$(numthreads) ) \ -	  && if ! [ x"$(sys_library_path)" = x ]; then \ -	       for f in $(sys_library_path)/*crt*.o; do \ -	         b=$$($(ibdir)/basename $$f); \ -	         ln -s $$f $(ildir)/$$b; \ -	       done; \ -	     fi \ -	  && echo "GNU Binutils $(binutils-version)" > $@; \ +	                 -j$(numthreads) ) + +          # The `ld' linker of Binutils needs several `*crt*.o' file to +          # run. On some systems these object files aren't installed in +          # standard places. We defined `LIBRARY_PATH' and that fixed the +          # problem for many systems. However, some software (for example +          # ImageMagick) over-write `LIBRARY_PATH', therefore there is no +          # other way than to put a link to these necessary files in our +          # local build directory. IMPORTANT NOTE: later, when we build the +          # GNU C Library in the project, we should remove this step. +	  if ! [ x"$(sys_library_path)" = x ]; then +	    for f in $(sys_library_path)/*crt*.o; do +	      b=$$($(ibdir)/basename $$f) +	      ln -s $$f $(ildir)/$$b +	    done +	  fi + +          # Write the final target. +	  echo "GNU Binutils $(binutils-version)" > $@  	fi  # We are having issues with `libiberty' (part of GCC) on Mac. So for now, @@ -1292,112 +1244,162 @@ $(ibidir)/binutils: $(ibidir)/sed \  #  # We are currently having problems installing GCC on macOS, so for the time  # being, if the project is being run on a macOS, we'll just set a link. -$(ibidir)/gcc: $(ibidir)/binutils \ -               $(tdir)/gcc-$(gcc-version).tar.xz +$(ibidir)/gcc-$(gcc-version): $(ibidir)/binutils-$(binutils-version) + +        # Function to let the users know what to do if build fails. +	error_message() { +	    echo; echo +	    echo "_________________________________________________" +	    echo "!!!!!!!!       Warning from Maneage      !!!!!!!!" +	    echo +	    echo "Unfortunately building of GCC failed on this system!" +	    echo "Can you please copy the last ~500 lines above and post it" +	    echo "as a bug here (as an attached file):" +	    echo "  https://sv.nongnu.org/support/?func=additem&group=reproduce" +	    echo +	    echo "In the meantime, please re-configure Maneage with '--host-cc'" +	    echo "like below so it uses your own C compiler for building the" +	    echo "high-level software ('-e' is to use the existing configuration):" +	    echo +	    echo "  ./project configure -e --host-cc" +	    echo +	    echo "__________ SEE NOTE FROM MANEAGE ABOVE __________" +	    echo; exit 1 +	} + +        # Download the tarball. +	tarball=gcc-$(gcc-version).tar.xz +	$(call import-source, $(gcc-url), $(gcc-checksum))          # GCC builds is own libraries in '$(idir)/lib64'. But all other          # libraries are in '$(idir)/lib'. Since this project is only for a          # single architecture, we can trick GCC into building its libraries          # in '$(idir)/lib' by defining the '$(idir)/lib64' as a symbolic          # link to '$(idir)/lib'. -	if [ $(host_cc) = 1 ]; then \ -	  $(call makelink,cc); \ -	  $(call makelink,cc,,gcc); \ -	  $(call makelink,c++,,g++); \ -	  $(call makelink,gfortran); \ -	  $(call makelink,strip,mandatory); \ -	  ccinfo=$$(gcc --version | awk 'NR==1'); \ -	  echo "C compiler (""$$ccinfo"")" > $@; \ -	else \ -	  current_dir=$$(pwd); \ -	  rm -f $(ibdir)/gcc* $(ibdir)/g++ $(ibdir)/gfortran $(ibdir)/gcov*;\ -	  rm -rf $(ildir)/gcc $(ildir)/libcc* $(ildir)/libgcc*; \ -	  rm -rf $(ildir)/libgfortran* $(ildir)/libstdc* rm $(idir)/x86_64*;\ -	                                 \ -	  ln -fs $(ildir) $(idir)/lib64; \ -	                       \ +	if [ $(host_cc) = 1 ]; then + +          # Make sure we don't have any of the program we want to link to +          # in the '.local/bin' directory. +	  rm -f $(ibdir)/cc +	  rm -f $(ibdir)/c++ +	  rm -f $(ibdir)/gcc +	  rm -f $(ibdir)/cpp +	  rm -f $(ibdir)/strip; +	  rm -f $(ibdir)/gfortran; + +          # Put links to the host's tools in '.local/bin'. +	  $(call makelink,cc) +	  $(call makelink,cpp) +	  $(call makelink,cc,,gcc) +	  $(call makelink,gfortran) +	  $(call makelink,c++,,g++) +	  $(call makelink,strip,mandatory) +	  ccinfo=$$(gcc --version | awk 'NR==1') +	  echo "C compiler (""$$ccinfo"")" > $@ + +	else + +          # We are building GCC, so to avoid any previous build in +          # '.local/bin', we'll delete all the files that GCC builds from +          # there. +	  current_dir=$$(pwd) +	  rm -f $(ibdir)/gcc* $(ibdir)/g++ $(ibdir)/gfortran $(ibdir)/gcov* +	  rm -rf $(ildir)/gcc $(ildir)/libcc* $(ildir)/libgcc* +	  rm -rf $(ildir)/libgfortran* $(ildir)/libstdc* rm $(idir)/x86_64* + +          # We don't want '.local/lib' and '.local/lib64' to be separate. +	  ln -fs $(ildir) $(idir)/lib64 + +          # By default we'll build GCC in the RAM to avoid building so many +          # files and possibly harming the hard-drive or SSD. But if the +          # RAM doesn't have enough space, we can't use it.  	  in_ram=$$(df $(ddir) \  	               | awk 'NR==2{print ($$4>10000000) ? "yes" : "no"}'); \ -	  if [ $$in_ram = "yes" ]; then odir=$(ddir); \ -	  else \ -	    odir=$(BDIR)/software/build-tmp-gcc; \ -	    if [ -d $$odir ]; then rm -rf $$odir; fi; \ -	    mkdir $$odir; \ -	  fi; \ -	  cd $$odir; \ -	  rm -rf gcc-$(gcc-version); \ -	  tar xf $(word 1,$(filter $(tdir)/%,$^)); \ -	  if [ $$odir != $(ddir) ]; then \ -	    ln -s $$odir/gcc-$(gcc-version) $(ddir)/gcc-$(gcc-version); \ -	  fi; \ -	  if cd gcc-$(gcc-version) \ -	  && mkdir build \ -	  && cd build \ -	  && ../configure SHELL=$(ibdir)/bash \ -	                  --prefix=$(idir) \ -	                  --with-mpc=$(idir) \ -	                  --with-gmp=$(idir) \ -	                  --with-isl=$(idir) \ -	                  --with-mpfr=$(idir) \ -	                  --with-local-prefix=$(idir) \ -	                  --with-build-time-tools=$(idir) \ -	                  --enable-lto \ -	                  --enable-shared \ -	                  --enable-cet=auto \ -	                  --enable-default-pie \ -	                  --enable-default-ssp \ -	                  --enable-decimal-float \ -	                  --enable-threads=posix \ -	                  --enable-languages=c,c++,fortran,objc,obj-c++ \ -	                  --disable-nls \ -	                  --disable-libada \ -	                  --disable-multilib \ -	                  --disable-multiarch \ -	  && make SHELL=$(ibdir)/bash -j$(numthreads) \ -	  && make SHELL=$(ibdir)/bash install \ -	  && cd ../.. \ -	  && tempname=$$odir/gcc-$(gcc-version)/build/rpath-temp-copy \ -	  && if [ "x$(on_mac_os)" != xyes ]; then \ -	       for f in $$(find $(idir)/libexec/gcc) $(ildir)/libstdc++*; do \ -	         isdynamic=$$(file $$f | grep "dynamically linked"); \ -	         if [ x"$$isdynamic" != x ]; then \ -	           cp $$f $$tempname; \ -	           patchelf --set-rpath $(ildir) $$tempname; \ -	           echo "$$f: added rpath"; \ -	           islibcpp=$$(echo $$f | grep "libstdc++"); \ -	           if [ x"$$islibcpp" != x ]; then \ -	             patchelf --add-needed $(ildir)/libiconv.so $$tempname; \ -	             echo "$$f: linked with libiconv"; \ -	           fi; \ -	           mv $$tempname $$f; \ -	         fi; \ -	       done; \ -	     fi \ -	  && rm -rf gcc-$(gcc-version) \ -	  && cd $$current_dir \ -	  && if [ "$$odir" != "$(ddir)" ]; then \ -	       rm -rf $$odir; \ -	       rm $(ddir)/gcc-$(gcc-version); \ -	     fi \ -	  && ln -sf $(ibdir)/gcc $(ibdir)/cc; \ -	  then \ -	    echo "GNU Compiler Collection (GCC) $(gcc-version)" > $@; \ -	  else echo; echo; echo; \ -	    echo "_________________________________________________"; \ -	    echo "!!!!!!!!       Warning from Maneage      !!!!!!!!"; \ -	    echo; \ -	    echo "Unfortunately building of GCC failed on this system!"; \ -	    echo "Can you please copy the last ~500 lines above and post it"; \ -	    echo "as a bug here (as an attached file):"; \ -	    echo "  https://sv.nongnu.org/support/?func=additem&group=reproduce"; \ -	    echo; \ -	    echo "In the meantime, please re-configure Maneage with '--host-cc'"; \ -	    echo "like below so it uses your own C compiler for building the"; \ -	    echo "high-level software ('-e' is to use the existing configuration):"; \ -	    echo; \ -	    echo "  ./project configure -e --host-cc"; \ -	    echo; \ -	    echo "__________ SEE NOTE FROM MANEAGE ABOVE __________"; \ -	    echo; exit 1; \ -	  fi; \ +	  if [ $$in_ram = "yes" ]; then odir=$(ddir) +	  else +	    odir=$(BDIR)/software/build-tmp-gcc +	    if [ -d $$odir ]; then rm -rf $$odir; fi +	    mkdir $$odir +	  fi + +          # Go into the proper directory, unpack GCC and prepare the +          # 'build' directory inside it for all the built files. +	  cd $$odir +	  rm -rf gcc-$(gcc-version) +	  tar xf $(tdir)/$$tarball +	  if [ $$odir != $(ddir) ]; then +	    ln -s $$odir/gcc-$(gcc-version) $(ddir)/gcc-$(gcc-version) +	  fi +	  cd gcc-$(gcc-version) +	  mkdir build +	  cd build + +          # Configure, build and install GCC, if any of three steps fails, +          # the error message will be printed. +	  if ! ../configure SHELL=$(ibdir)/bash \ +	                    --prefix=$(idir) \ +	                    --with-mpc=$(idir) \ +	                    --with-gmp=$(idir) \ +	                    --with-isl=$(idir) \ +	                    --with-mpfr=$(idir) \ +	                    --with-local-prefix=$(idir) \ +	                    --with-build-time-tools=$(idir) \ +	                    --enable-lto \ +	                    --enable-shared \ +	                    --enable-cet=auto \ +	                    --enable-default-pie \ +	                    --enable-default-ssp \ +	                    --enable-decimal-float \ +	                    --enable-threads=posix \ +	                    --enable-languages=c,c++,fortran,objc,obj-c++ \ +	                    --disable-nls \ +	                    --disable-libada \ +	                    --disable-multilib \ +	                    --disable-multiarch; then error_message; fi +	  if ! make SHELL=$(ibdir)/bash -j$(numthreads); then error_message; fi +	  if ! make SHELL=$(ibdir)/bash install; then error_message; fi + +          # We need to manually fix the RPATH inside GCC's libraries, the +          # programs built by GCC already have RPATH. +	  tempname=$$odir/gcc-$(gcc-version)/build/rpath-temp-copy +	  if [ -f $(ibdir)/patchelf ]; then + +            # Go over all the installed GCC libraries (its executables are +            # fine!). +	    for f in $$(find $(idir)/libexec/gcc -type f) $(ildir)/libstdc++*; do + +              # Make sure this is a static library, copy it to a temporary +              # name (to avoid any possible usage of the file while it is +              # being corrected), and add RPATH inside of it and put the +              # corrected file back in its place. In the case of the +              # standard C++ library, we also need to manually insert a +              # linking to libiconv. +	      if file $$f | grep -q "dynamically linked"; then +	        cp $$f $$tempname +	        patchelf --set-rpath $(ildir) $$tempname +	        echo "$$f: added rpath" +	        if echo $$f | grep -q "libstdc++"; then +	          patchelf --add-needed $(ildir)/libiconv.so $$tempname +	          echo "$$f: linked with libiconv" +	        fi +	        mv $$tempname $$f +	      fi +	    done +	  fi + +          # Come back up to the un-packing directory and delete the GCC +          # source directory. +	  cd ../.. +	  rm -rf gcc-$(gcc-version) +	  cd $$current_dir +	  if [ "$$odir" != "$(ddir)" ]; then +	    rm -rf $$odir; +	    rm $(ddir)/gcc-$(gcc-version); +	  fi + +          # Set 'cc' to point to 'gcc'. +	  ln -sf $(ibdir)/gcc $(ibdir)/cc + +          # Write the final target. +	  echo "GNU Compiler Collection (GCC) $(gcc-version)" > $@  	fi diff --git a/reproduce/software/make/build-rules.mk b/reproduce/software/make/build-rules.mk index 260ded8..7471e5b 100644 --- a/reproduce/software/make/build-rules.mk +++ b/reproduce/software/make/build-rules.mk @@ -1,7 +1,7 @@  # Generic configurable recipes to build packages with GNU Build system or  # CMake. This is Makefile is not intended to be run directly, it will be -# imported into `basic.mk' and `high-level.mk'. They should be activated -# with Make's `Call' function. +# imported into 'basic.mk' and 'high-level.mk'. They should be activated +# with Make's 'Call' function.  #  # Copyright (C) 2018-2020 Mohammad Akhlaghi <mohammad@akhlaghi.org>  # @@ -22,31 +22,84 @@ -# IMPORTANT note -# -------------- +# Import/download project's source +# --------------------------------  # -# Without using `&&', if a step fails, the process will continue. However, -# in the `if' statements, we need `;' (particularly between `]' and -# `then'). So we need to put any necessary checks at the start, then when -# we start the process, every command will be separated by an `&&'. +# Copy/Download the raw tarball into an '.unchecked' suffix. Then calculate +# its checksum and if it is correct, remove the extra suffix. +# +# Arguments: +#   1: The optional URL to use for this tarball. +#   2: The expeced checksum of the tarball. +# +# Necessary shell variables +#   'tarball': This is the name of the actual tarball file without a +#   directory. +import-source = final=$(tdir)/$$tarball; \ +	url=$(strip $(1)); \ +	exp_checksum="$(strip $(2))"; \ +	if [ -f $$final ]; then \ +	  echo "$(tdir)/$$tarball: already present in project."; \ +	else \ +	  unchecked="$$final.unchecked"; \ +	  rm -f "$$unchecked"; \ +	  if [ -f $(DEPENDENCIES-DIR)/$$tarball ]; then \ +	    cp $(DEPENDENCIES-DIR)/$$tarball "$$unchecked"; \ +	  else \ +	    if [ x"$$url" = x ]; then \ +	      bservers="$(backupservers)"; \ +	      tarballurl=$(topbackupserver)/$$tarball; \ +	    else \ +	      bservers="$(backupservers_all)"; \ +	      tarballurl=$$url/$$tarball; \ +	    fi; \ +	    if [ -f $(ibdir)/wget ]; then \ +	      downloader="wget --no-use-server-timestamps -O"; \ +	    else \ +	      downloader="$(DOWNLOADER)"; \ +	    fi; \ +	    touch $(lockdir)/download; \ +	    $(downloadwrapper) "$$downloader" $(lockdir)/download \ +	                       $$tarballurl "$$unchecked" "$$bservers"; \ +	  fi; \ +	  if [ x"$$exp_checksum" = x"NO-CHECK-SUM" ]; then \ +	    mv "$$unchecked" "$$final"; \ +	  else \ +	    if type sha512sum > /dev/null 2>/dev/null; then \ +	      checksum=$$(sha512sum "$$unchecked" | awk '{print $$1}'); \ +	      if [ x"$$checksum" = x"$$exp_checksum" ]; then \ +	        mv "$$unchecked" "$$final"; \ +	      else \ +	        echo "ERROR: Non-matching checksum for '$$tarball'."; \ +	        echo "Checksum should be: $$exp_checksum"; \ +	        echo "Checksum is:        $$checksum"; \ +	        exit 1; \ +	      fi; \ +	    else mv "$$unchecked" "$$final"; \ +	    fi; \ +	  fi; \ +	fi +# Unpack a tarball +# ---------------- +#  # Unpack a tarball in the current directory. The issue is that until we  # install GNU Tar within Maneage, we have to use the host's Tar  # implementation and in some cases, they don't recognize '.lz'. -uncompress = csuffix=$$(echo $$tarball \ +uncompress = csuffix=$$(echo $$utarball \  	                     | sed -e's/\./ /g' \  	                     | awk '{print $$NF}'); \  	if [ x$$csuffix = xlz ]; then \  	  intarrm=1; \ -	  intar=$$(echo $$tarball | sed -e's/.lz//'); \ -	  lzip -c -d $$tarball > $$intar; \ +	  intar=$$(echo $$utarball | sed -e's/.lz//'); \ +	  lzip -c -d $$utarball > $$intar; \  	else \  	  intarrm=0; \ -	  intar=$$tarball; \ +	  intar=$$utarball; \  	fi; \  	if tar xf $$intar; then \  	  if [ x$$intarrm = x1 ]; then rm $$intar; fi; \ @@ -64,20 +117,20 @@ uncompress = csuffix=$$(echo $$tarball \  #  # Arguments:  #  1: Directory name after unpacking. -#  2: Set to `static' for a static build. +#  2: Set to 'static' for a static build.  #  3: Extra configuration options.  #  4: Extra options/arguments to pass to Make. -#  5: Step to run between `make' and `make install': usually `make check'. -#  6: The configuration script (`configure' by default). -#  7: Arguments for `make install'. +#  5: Step to run between 'make' and 'make install': usually 'make check'. +#  6: The configuration script ('configure' by default). +#  7: Arguments for 'make install'.  # -# NOTE: Unfortunately the configure script of `zlib' doesn't recognize -# `SHELL'. So we'll have to remove it from the call to the configure +# NOTE: Unfortunately the configure script of 'zlib' doesn't recognize +# 'SHELL'. So we'll have to remove it from the call to the configure  # script.  #  # NOTE: A program might not contain any configure script. In this case, -# we'll just pass a non-relevant function like `pwd'. So SED should be used -# to modify `confscript' or to set `configop'. +# we'll just pass a non-relevant function like 'pwd'. So SED should be used +# to modify 'confscript' or to set 'configop'.  gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \  	   export LDFLAGS="$$LDFLAGS -static"; \  	 fi; \ @@ -85,9 +138,8 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \  	 if [ x"$$check" = x ]; then check="echo Skipping-check"; fi; \  	 cd $(ddir); \  	 rm -rf $(1); \ -	 if [ x"$$gbuild_tar" = x ]; then \ -	   tarball=$(word 1,$(filter $(tdir)/%,$^)); \ -	 else tarball=$$gbuild_tar; \ +	 if [ x"$$gbuild_tar" = x ]; then utarball=$(tdir)/$$tarball; \ +	 else                             utarball=$$gbuild_tar;      \  	 fi; \  	 $(call uncompress); \  	 cd $(1); \ @@ -95,7 +147,7 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \  	 if   [ x"$(strip $(6))" = x ]; then confscript=./configure; \  	 else confscript="$(strip $(6))"; \  	 fi; \ -             \ +	     \  	 if   [ -f $(ibdir)/bash ]; then \  	   if [ -f "$$confscript" ]; then \  	     sed -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \ @@ -108,7 +160,7 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \  	 elif [ -f /bin/bash ]; then shellop="SHELL=/bin/bash"; \  	 else shellop="SHELL=/bin/sh"; \  	 fi; \ -             \ +	     \  	 if [ -f "$$confscript" ]; then \  	   if [ x"$(strip $(1))" = x"zlib-$(zlib-version)" ]; then \  	     configop="--prefix=$(idir)"; \ @@ -118,12 +170,12 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \  	     \  	 echo; echo "Using '$$confscript' to configure:"; echo; \  	 echo "$$confscript $(3) $$configop"; echo; \ -	 $$confscript $(3) $$configop \ -	 && make "$$shellop" $(4) \ -	 && $$check \ -	 && make "$$shellop" install $(7) \ -	 && cd .. \ -	 && rm -rf $(1) +	 $$confscript $(3) $$configop; \ +	 make "$$shellop" $(4); \ +	 $$check; \ +	 make "$$shellop" install $(7); \ +	 cd ..; \ +	 rm -rf $(1) @@ -131,7 +183,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 +# 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 @@ -139,17 +191,18 @@ cbuild = if [ x$(static_build) = xyes ] && [ $(2)x = staticx ]; then \  	   export LDFLAGS="$$LDFLAGS -static"; \  	   opts="-DBUILD_SHARED_LIBS=OFF"; \  	 fi; \ -	 tarball=$(word 1,$(filter $(tdir)/%,$^)); \  	 cd $(ddir); \  	 rm -rf $(1); \ +	 utarball=$(tdir)/$$tarball; \  	 $(call uncompress); \ -	 cd $(1) \ -	 && rm -rf project-build \ -	 && mkdir project-build \ -	 && cd project-build \ -	 && cmake .. -DCMAKE_LIBRARY_PATH=$(ildir) \ -	             -DCMAKE_INSTALL_PREFIX=$(idir) \ -	             -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON $$opts $(3) \ -	 && make && make install \ -	 && cd ../.. \ -	 && rm -rf $(1) +	 cd $(1); \ +	 rm -rf project-build; \ +	 mkdir project-build; \ +	 cd project-build; \ +	 cmake .. -DCMAKE_LIBRARY_PATH=$(ildir) \ +	          -DCMAKE_INSTALL_PREFIX=$(idir) \ +	          -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON $$opts $(3); \ +	 make; \ +	 make install; \ +	 cd ../..; \ +	 rm -rf $(1) diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk index c25bc68..b756cb9 100644 --- a/reproduce/software/make/high-level.mk +++ b/reproduce/software/make/high-level.mk @@ -4,7 +4,11 @@  #                      !!!!! IMPORTANT NOTES !!!!!  #  # This Makefile will be run by the initial `./project configure' script. It -# is not included into the reproduction pipe after that. +# is not included into the project afterwards. +# +# This Makefile builds the high-level (optional) software in Maneage that +# users can choose for different projects. It thus assumes that the +# low-level tools (like GNU Tar and etc) are already build by 'basic.mk'.  #  # ------------------------------------------------------------------------  # @@ -24,35 +28,82 @@  # You should have received a copy of the GNU General Public License  # along with this Makefile.  If not, see <http://www.gnu.org/licenses/>. - - -# Top level environment +# Top level environment (same as 'basic.mk')  include reproduce/software/config/LOCAL.conf  include reproduce/software/make/build-rules.mk -include reproduce/software/config/TARGETS.conf  include reproduce/software/config/versions.conf  include reproduce/software/config/checksums.conf + +# The optional URLs of software. Note that these may need the software +# version, so it is important that they be loaded after 'versions.conf'. +include reproduce/software/config/urls.conf + +# Configurations specific to this Makefile +include reproduce/software/config/TARGETS.conf  include reproduce/software/config/texlive-packages.conf +# Basic directories (similar to 'basic.mk').  lockdir = $(BDIR)/locks  tdir    = $(BDIR)/software/tarballs  ddir    = $(BDIR)/software/build-tmp  idir    = $(BDIR)/software/installed  ibdir   = $(BDIR)/software/installed/bin  ildir   = $(BDIR)/software/installed/lib -iidir   = $(BDIR)/software/installed/include -dtexdir = $(shell pwd)/reproduce/software/bibtex -patchdir= $(shell pwd)/reproduce/software/patches -itidir  = $(BDIR)/software/installed/version-info/tex -ictdir  = $(BDIR)/software/installed/version-info/cite -ipydir  = $(BDIR)/software/installed/version-info/python  ibidir  = $(BDIR)/software/installed/version-info/proglib -# Set the top-level software to build. -all: $(foreach p, $(top-level-programs),  $(ibidir)/$(p)) \ -     $(foreach p, $(top-level-python),    $(ipydir)/$(p)) \ +# Basic directories (specific to this Makefile). +iidir    = $(BDIR)/software/installed/include +shsrcdir = $(shell pwd)/reproduce/software/shell +dtexdir  = $(shell pwd)/reproduce/software/bibtex +patchdir = $(shell pwd)/reproduce/software/patches +itidir   = $(BDIR)/software/installed/version-info/tex +ictdir   = $(BDIR)/software/installed/version-info/cite +ipydir   = $(BDIR)/software/installed/version-info/python + +# Targets to build. +ifeq ($(strip $(all_highlevel)),1) + +  # Set it to build all programs. Pay attention to special software: +  # +  # Versions as variables (for example minizip): they have the same as the +  # version as others and the version number is actually a variable. So +  # we'll need to filter it out, then add it in the end: minizip (has same +  # version as zlib) +  # +  # Packages that are installed in the same recipe as others. These need to +  # be totally removed when testing all the builds (they will be built +  # anyway).  lapack (installed with ATLAS) +  targets-proglib := $(filter-out minizip-% lapack-%, \ +      $(shell awk '/^# CLASS:PYTHON/{good=0} \ +                   good==1 && !/^#/ && $$1 ~ /-version$$/ { \ +                       printf("%s %s ", $$1, $$3)} \ +                   /^# CLASS:HIGHLEVEL/{good=1}' \ +                  reproduce/software/config/versions.conf \ +              | sed 's/version //g')) \ +      minizip-$(minizip-version) + +  # List all existing Python packages. +  targets-python := $(shell \ +    awk '/^# CLASS:PYTHON/{good=1} \ +         good==1 && !/^#/ && $$1 ~ /-version$$/ {printf("%s %s ",$$1,$$3)}' \ +        reproduce/software/config/versions.conf | sed 's/version //g') +else + +  # Append the version of each software to its name. We are using a Make +  # feature where a variable name is defined with another variable. +  targets-python := $(foreach p,$(top-level-python),$(p)-$($(p)-version)) +  targets-proglib := $(foreach p,$(top-level-programs),$(p)-$($(p)-version)) + +endif + +# Ultimate Makefile target. +all: $(foreach p, $(targets-proglib), $(ibidir)/$(p)) \ +     $(foreach p, $(targets-python), $(ipydir)/$(p)) \       $(itidir)/texlive +# Define the shell environment +# ---------------------------- +#  # Other basic environment settings: We are only including the host  # operating system's PATH environment variable (after our own!) for the  # compiler and linker. For the library binaries and headers, we are only @@ -67,18 +118,28 @@ all: $(foreach p, $(top-level-programs),  $(ibidir)/$(p)) \  #  #    2) Add `--noprofile --norc' to `.SHELLFLAGS' so doesn't load the  #       user's environment. +# +# Shell settings similar to 'basic.mk':  .ONESHELL: -.SHELLFLAGS := --noprofile --norc -ec -export CCACHE_DISABLE := 1  export PATH := $(ibdir) +export CCACHE_DISABLE := 1 +export SHELL := $(ibdir)/bash +export CPPFLAGS := -I$(idir)/include +.SHELLFLAGS := --noprofile --norc -ec +export PKG_CONFIG_PATH := $(ildir)/pkgconfig +export LDFLAGS := $(rpath_command) -L$(ildir) +export PKG_CONFIG_LIBDIR := $(ildir)/pkgconfig + +# Settings specific to this Makefile.  export CC := $(ibdir)/gcc  export CXX := $(ibdir)/g++ -export SHELL := $(ibdir)/bash  export F77 := $(ibdir)/gfortran  export LD_RUN_PATH := $(ildir):$(il64dir) -export PKG_CONFIG_PATH := $(ildir)/pkgconfig  export LD_LIBRARY_PATH := $(ildir):$(il64dir) -export PKG_CONFIG_LIBDIR := $(ildir)/pkgconfig + +# Recipe startup script, see `reproduce/software/shell/bashrc.sh'. +export PROJECT_STATUS := configure_highlevel +export BASH_ENV := $(shell pwd)/reproduce/software/shell/bashrc.sh  # Until we build our own C library, without this, our GCC won't be able to  # compile anything! Note that on most systems (in particular @@ -97,282 +158,45 @@ export DYLD_LIBRARY_PATH :=  # for `ld'.  export LIBRARY_PATH := $(sys_library_path) -# Recipe startup script, see `reproduce/software/shell/bashrc.sh'. -export PROJECT_STATUS := configure_highlevel -export BASH_ENV := $(shell pwd)/reproduce/software/shell/bashrc.sh - -# Servers to use as backup, later this should go in a file that is not -# under version control (the actual server that the tarbal comes from is -# irrelevant). -backupservers := $(shell awk '!/^#/{printf "%s ", $$1}' \ -                         reproduce/software/config/servers-backup.conf) -  # Building flags:  #  # C++ flags: when we build GCC, the C++ standard library needs to link with  # libiconv. So it is necessary to generically include `-liconv' for all C++  # builds. -export CPPFLAGS          := -I$(idir)/include -export LDFLAGS           := $(rpath_command) -L$(ildir)  ifeq ($(host_cc),0)  export CXXFLAGS          := -liconv  endif - - - - -# We want the download to happen on a single thread. So we need to define a -# lock, and call a special script we have written for this job. These are -# placed here because we want them both in the `high-level.mk' and -# `python.mk'. -$(lockdir): | $(BDIR); mkdir $@ -downloader="wget --no-use-server-timestamps -O"; +# Servers to use as backup. Maneage already has some fixed servers that can +# be used to download software tarballs. They are in a configuation +# file. But we give precedence to the "user" backup servers. +# +# One important "user" server (which the user doesn't actually give, but is +# found at configuration time in 'configure.sh') is Zenodo (see the +# description in 'configure.sh' for more on why this depends on +# configuration time). +# +# 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 +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)) -# Mini-environment software +# Import rules to build Python packages,  include reproduce/software/make/python.mk -# Tarballs -# -------- -# -# All the necessary tarballs are defined and prepared with this rule. -# -# Note that we want the tarballs to follow the convention of NAME-VERSION -# before the `tar.XX' prefix. For those programs that don't follow this -# convention, but include the name/version in their tarball names with -# another format, we'll do the modification before the download so the -# downloaded file has our desired format. -tarballs = $(foreach t, apachelog4cxx-$(apachelog4cxx-version).tar.lz \ -                        apr-$(apr-version).tar.gz \ -                        apr-util-$(apr-util-version).tar.gz \ -                        astrometry.net-$(astrometrynet-version).tar.gz \ -                        atlas-$(atlas-version).tar.bz2 \ -                        autoconf-$(autoconf-version).tar.lz \ -                        automake-$(automake-version).tar.gz \ -                        bison-$(bison-version).tar.xz \ -                        boost-$(boost-version).tar.gz \ -                        cairo-$(cairo-version).tar.xz \ -                        cdsclient-$(cdsclient-version).tar.gz \ -                        cfitsio-$(cfitsio-version).tar.gz \ -                        cmake-$(cmake-version).tar.gz \ -                        eigen-$(eigen-version).tar.gz \ -                        expat-$(expat-version).tar.lz \ -                        fftw-$(fftw-version).tar.gz \ -                        flex-$(flex-version).tar.gz \ -                        freetype-$(freetype-version).tar.gz \ -                        gdb-$(gdb-version).tar.gz \ -                        ghostscript-$(ghostscript-version).tar.gz \ -                        gnuastro-$(gnuastro-version).tar.lz \ -                        gsl-$(gsl-version).tar.gz \ -                        hdf5-$(hdf5-version).tar.gz \ -                        healpix-$(healpix-version).tar.gz \ -                        help2man-$(help2man-version).tar.xz \ -                        imagemagick-$(imagemagick-version).tar.xz \ -                        imfit-$(imfit-version).tar.gz \ -                        install-tl-unx.tar.gz \ -                        jpegsrc.$(libjpeg-version).tar.gz \ -                        lapack-$(lapack-version).tar.gz \ -                        libgit2-$(libgit2-version).tar.gz \ -                        libnsl-$(libnsl-version).tar.gz \ -                        libpng-$(libpng-version).tar.xz \ -                        libtirpc-$(libtirpc-version).tar.bz2 \ -                        missfits-$(missfits-version).tar.gz \ -                        netpbm-$(netpbm-version).tar.gz \ -                        openblas-$(openblas-version).tar.gz \ -                        openmpi-$(openmpi-version).tar.gz \ -                        openssh-$(openssh-version).tar.gz \ -                        patch-$(patch-version).tar.gz \ -                        pixman-$(pixman-version).tar.gz \ -                        R-$(R-version).tar.gz \ -                        scamp-$(scamp-version).tar.lz \ -                        scons-$(scons-version).tar.gz \ -                        sextractor-$(sextractor-version).tar.lz \ -                        swarp-$(swarp-version).tar.gz \ -                        swig-$(swig-version).tar.gz \ -                        rpcsvc-proto-$(rpcsvc-proto-version).tar.xz \ -                        tides-$(tides-version).tar.gz \ -                        tiff-$(libtiff-version).tar.gz \ -                        valgrind-$(valgrind-version).tar.bz2 \ -                        wcslib-$(wcslib-version).tar.bz2 \ -                        xlsxio-$(xlsxio-version).tar.gz \ -                        yaml-$(yaml-version).tar.gz \ -                        zlib-$(zlib-version).tar.gz \ -                      , $(tdir)/$(t) ) -$(tarballs): $(tdir)/%: | $(lockdir) - -        # Remove the version numbers and suffix from the tarball name so we -        # can search more easily only with the program name. This requires -        # the first character of the version to be a digit: packages such -        # as `foo' and `foo-3' will not be distinguished, but `foo' and -        # `foo2' will be distinguished. -	@n=$$(echo $* | sed -e's/-[0-9]/ /' -e's/\./ /g' \ -	              | awk '{print $$1}' ) - -        # Set the top download link of the requested tarball. -	mergenames=1 -	if   [ $$n = apachelog4cxx ]; then c=$(apachelog4cxx-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = apr         ]; then c=$(apr-checksum); w=https://www-us.apache.org/dist/apr -	elif [ $$n = apr-util    ]; then c=$(apr-util-checksum); w=https://www-us.apache.org/dist/apr -	elif [ $$n = astrometry  ]; then c=$(astrometrynet-checksum); w=http://astrometry.net/downloads -	elif [ $$n = atlas       ]; then -	  mergenames=0 -	  c=$(atlas-checksum) -	  w=https://sourceforge.net/projects/math-atlas/files/Stable/$(atlas-version)/atlas$(atlas-version).tar.bz2/download -	elif [ $$n = autoconf    ]; then c=$(autoconf-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = automake    ]; then c=$(automake-checksum); w=http://ftp.gnu.org/gnu/automake -	elif [ $$n = bison       ]; then c=$(bison-checksum); w=http://ftp.gnu.org/gnu/bison -	elif [ $$n = boost       ]; then -	  mergenames=0 -	  c=$(boost-checksum) -	  vstr=$$(echo $(boost-version) | sed -e's/\./_/g') -	  w=https://dl.bintray.com/boostorg/release/$(boost-version)/source/boost_$$vstr.tar.gz -	elif [ $$n = cairo       ]; then c=$(cairo-checksum); w=https://www.cairographics.org/releases -	elif [ $$n = cdsclient   ]; then c=$(cdsclient-checksum); w=http://cdsarc.u-strasbg.fr/ftp/pub/sw -	elif [ $$n = cfitsio     ]; then c=$(cfitsio-checksum); w=https://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c -	elif [ $$n = cmake       ]; then -	  mergenames=0 -	  c=$(cmake-checksum) -	  majv=$$(echo $(cmake-version) \ -	               | sed -e's/\./ /' \ -	               | awk '{printf("%d.%d", $$1, $$2)}') -	  w=https://cmake.org/files/v$$majv/cmake-$(cmake-version).tar.gz -	elif [ $$n = eigen       ]; then -	  mergenames=0 -	  c=$(eigen-checksum); -	  w=http://bitbucket.org/eigen/eigen/get/$(eigen-version).tar.gz -	elif [ $$n = expat    ]; then -	  mergenames=0 -	  c=$(expat-checksum) -	  vstr=$$(echo $(expat-version) | sed -e's/\./_/g') -	  w=https://github.com/libexpat/libexpat/releases/download/R_$$vstr/expat-$(expat-version).tar.lz -	elif [ $$n = fftw        ]; then c=$(fftw-checksum); w=ftp://ftp.fftw.org/pub/fftw -	elif [ $$n = flex        ]; then c=$(flex-checksum); w=https://github.com/westes/flex/files/981163 -	elif [ $$n = freetype    ]; then c=$(freetype-checksum); w=https://download.savannah.gnu.org/releases/freetype -	elif [ $$n = gdb         ]; then c=$(gdb-checksum); w=http://ftp.gnu.org/gnu/gdb -	elif [ $$n = ghostscript ]; then -	  c=$(ghostscript-checksum) -	  v=$$(echo $(ghostscript-version) | sed -e's/\.//') -	  w=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs$$v -	elif [ $$n = gnuastro    ]; then c=$(gnuastro-checksum); w=http://ftp.gnu.org/gnu/gnuastro -	elif [ $$n = gsl         ]; then c=$(gsl-checksum); w=http://ftp.gnu.org/gnu/gsl -	elif [ $$n = hdf5        ]; then -	  mergenames=0 -	  c=$(hdf5-checksum) -	  majorver=$$(echo $(hdf5-version) | sed -e 's/\./ /g' | awk '{printf("%d.%d", $$1, $$2)}') -	  w=https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-$$majorver/hdf5-$(hdf5-version)/src/$* -	elif [ $$n = healpix     ]; then c=$(healpix-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = help2man    ]; then c=$(help2man-checksum); w=http://ftp.gnu.org/gnu/help2man -	elif [ $$n = imagemagick ]; then c=$(imagemagick-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = imfit       ]; then -	  mergenames=0 -	  c=$(imfit-checksum) -	  w=http://www.mpe.mpg.de/~erwin/resources/imfit/imfit-$(imfit-version)-source.tar.gz -	elif [ $$n = install-tl-unx ]; then c=NO-CHECK-SUM; w=http://mirror.ctan.org/systems/texlive/tlnet -	elif [ $$n = jpegsrc     ]; then c=$(libjpeg-checksum); w=http://ijg.org/files -	elif [ $$n = lapack      ]; then c=$(lapack-checksum); w=http://www.netlib.org/lapack -	elif [ $$n = libnsl      ]; then c=$(libnsl-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = libpng      ]; then c=$(libpng-checksum); w=https://download.sourceforge.net/libpng -	elif [ $$n = libgit2     ]; then -	  mergenames=0 -	  c=$(libgit2-checksum) -	  w=https://github.com/libgit2/libgit2/archive/v$(libgit2-version).tar.gz -	elif [ $$n = libtirpc    ]; then c=$(libtirpc-checksum); w=https://downloads.sourceforge.net/libtirpc -	elif [ $$n = missfits    ]; then c=$(missfits-checksum); w=https://www.astromatic.net/download/missfits -	elif [ $$n = netpbm      ]; then c=$(netpbm-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = openblas    ]; then -	  mergenames=0 -	  c=$(openblas-checksum) -	  w=https://github.com/xianyi/OpenBLAS/archive/v$(openblas-version).tar.gz -	elif [ $$n = openmpi     ]; then -	  mergenames=0 -	  c=$(openmpi-checksum) -	  majorver=$$(echo $(openmpi-version) | sed -e 's/\./ /g' | awk '{printf("%d.%d", $$1, $$2)}') -	  w=https://download.open-mpi.org/release/open-mpi/v$$majorver/$* -	elif [ $$n = openssh     ]; then c=$(openssh-checksum); w=https://artfiles.org/openbsd/OpenSSH/portable -	elif [ $$n = patch       ]; then c=$(patch-checksum); w=http://ftp.gnu.org/gnu/patch -	elif [ $$n = pixman      ]; then c=$(pixman-checksum); w=https://www.cairographics.org/releases -	elif [ $$n = R           ]; then c=$(R-checksum); -	  majver=$$(echo $(R-version) | sed -e's/\./ /g' | awk '{print $$1}') -	  w=https://cran.r-project.org/src/base/R-$$majver -	elif [ $$n = rpcsvc-proto ]; then c=$(rpcsvc-proto-checksum); w=https://github.com/thkukuk/rpcsvc-proto/releases/download/v$(rpcsvc-proto-version) -	elif [ $$n = scamp       ]; then c=$(scamp-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = scons       ]; then -	  mergenames=0 -	  c=$(scons-checksum) -	  w=https://sourceforge.net/projects/scons/files/scons/$(scons-version)/scons-$(scons-version).tar.gz/download -	elif [ $$n = sextractor  ]; then c=$(sextractor-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = swarp       ]; then c=$(swarp-checksum); w=https://www.astromatic.net/download/swarp -	elif [ $$n = swig        ]; then c=$(swig-checksum); w=https://sourceforge.net/projects/swig/files/swig/swig-$(swig-version) -	elif [ $$n = tides       ]; then c=$(tides-checksum); w=http://akhlaghi.org/maneage-software -	elif [ $$n = tiff        ]; then c=$(libtiff-checksum); w=https://download.osgeo.org/libtiff -	elif [ $$n = valgrind    ]; then c=$(valgrind-checksum); w=https://sourceware.org/pub/valgrind -	elif [ $$n = wcslib      ]; then c=$(wcslib-checksum); w=ftp://ftp.atnf.csiro.au/pub/software/wcslib -	elif [ $$n = xlsxio      ]; then -	  mergenames=0 -	  c=$(xlsxio-checksum); -	  w=https://github.com/brechtsanders/xlsxio/archive/$(xlsxio-version).tar.gz -	elif [ $$n = yaml        ]; then c=$(yaml-checksum); w=pyyaml.org/download/libyaml -	elif [ $$n = zlib        ]; then c=$(zlib-checksum); w=https://zlib.net -	else -	  echo; echo; echo; -	  echo "'$$n' not recognized as a software tarball name to download." -	  echo; echo; echo; -	  exit 1 -	fi - -        # Download the requested tarball. Note that some packages may not -        # follow our naming convention (where the package name is merged -        # with its version number). In such cases, `w' will be the full -        # address, not just the top directory address. But since we are -        # storing all the tarballs in one directory, we want it to have the -        # same naming convention, so we'll download it to a temporary name, -        # then rename that. -	rm -f "$@.unchecked" -	if [ -f $(DEPENDENCIES-DIR)/$* ]; then -	  cp $(DEPENDENCIES-DIR)/$* "$@.unchecked" -	else -	  if [ $$mergenames = 1 ]; then  tarballurl=$$w/"$*" -	  else                           tarballurl=$$w -	  fi - -          # Download using the script specially defined for this job. -	  touch $(lockdir)/download -	  downloader="wget --no-use-server-timestamps -O" -	  $(downloadwrapper) "$$downloader" $(lockdir)/download \ -	                     $$tarballurl "$@.unchecked" "$(backupservers)" -	fi - -        # Make sure this is the expected tarball. Note that we now have a -        # controlled `sha512sum' build (as part of GNU Coreutils). So we -        # don't need to check its existance like `basic.mk'. But for LaTeX, -        # we need to ignore a checksum (it downloads the binaries). -	if [ x"$$c" == x"NO-CHECK-SUM" ]; then -	  mv "$@.unchecked" "$@" -	else -	  checksum=$$(sha512sum "$@.unchecked" | awk '{print $$1}') -	  if [ x"$$checksum" = x"$$c" ]; then -	    mv "$@.unchecked" "$@" -	  else -	    echo "ERROR: Non-matching checksum for '$*'." -	    echo "Checksum should be: $$c" -	    echo "Checksum is:        $$checksum" -	    exit 1 -	  fi -	fi - - - - - @@ -409,39 +233,50 @@ $(tarballs): $(tdir)/%: | $(lockdir)  # build it because it will complain about the version of libtool, so until  # the version 0.11.0 of log4cxx, we'll have to run `autogen.sh' on the  # unpacked source also. -$(ibidir)/apachelog4cxx: $(ibidir)/automake \ -                         $(tdir)/apachelog4cxx-$(apachelog4cxx-version).tar.lz - +$(ibidir)/apachelog4cxx-$(apachelog4cxx-version): \ +                        $(ibidir)/expat-$(expat-version) \ +                        $(ibidir)/apr-util-$(apr-util-version) \ +                        $(ibidir)/automake-$(automake-version) +	tarball=apachelog4cxx-$(apachelog4cxx-version).tar.lz +	$(call import-source, $(apachelog4cxx-url), $(apachelog4cxx-checksum))  	pdir=apachelog4cxx-$(apachelog4cxx-version)  	rm -rf $(ddir)/$$pdir  	topdir=$(pwd)  	cd $(ddir) -	tar xf $(word 1,$(filter $(tdir)/%,$^)) +	tar xf $(tdir)/$$tarball  	cd $$pdir -	./autogen.sh \ -	&& ./configure SHELL=$(ibdir)/bash --prefix=$(idir) \ -	&& make -j$(numthreads) SHELL=$(ibdir)/bash \ -	&& make install \ -	&& cd .. \ -	&& rm -rf $$pdir \ -	&& cd $$topdir \ -	&& echo "Apache log4cxx $(apachelog4cxx-version)" > $@ - -$(ibidir)/apr: $(tdir)/apr-$(apr-version).tar.gz -	$(call gbuild, apr-$(apr-version), ,--disable-static) \ -	&& echo "Apache Portable Runtime $(apr-version)" > $@ - -$(ibidir)/apr-util: $(ibidir)/apr \ -                    $(tdir)/apr-util-$(apr-util-version).tar.gz +	./autogen.sh +	./configure SHELL=$(ibdir)/bash --prefix=$(idir) +	make -j$(numthreads) SHELL=$(ibdir)/bash +	make install +	cd .. +	rm -rf $$pdir +	cd $$topdir +	echo "Apache log4cxx $(apachelog4cxx-version)" > $@ + +$(ibidir)/apr-$(apr-version): +	tarball=apr-$(apr-version).tar.gz +	$(call import-source, $(apr-url), $(apr-checksum)) +	$(call gbuild, apr-$(apr-version), ,--disable-static) +	echo "Apache Portable Runtime $(apr-version)" > $@ + +$(ibidir)/apr-util-$(apr-util-version): $(ibidir)/apr-$(apr-version) +	tarball=apr-util-$(apr-util-version).tar.gz +	$(call import-source, $(apr-util-url), $(apr-util-checksum))  	$(call gbuild, apr-util-$(apr-util-version), , \  	               --disable-static \  	               --with-apr=$(idir) \  	               --with-openssl=$(idir) \ -	               --with-crypto ) \ -	&& echo "Apache Portable Runtime Utility $(apr-util-version)" > $@ +	               --with-crypto ) +	echo "Apache Portable Runtime Utility $(apr-util-version)" > $@ + +$(ibidir)/atlas-$(atlas-version): -$(ibidir)/atlas: $(tdir)/atlas-$(atlas-version).tar.bz2 \ -                 $(tdir)/lapack-$(lapack-version).tar.gz +	tarball=lapack-$(lapack-version).tar.gz +	$(call import-source, $(lapack-url), $(lapack-checksum)) + +	tarball=atlas-$(atlas-version).tar.bz2 +	$(call import-source, $(atlas-url), $(atlas-checksum))          # Get the operating system specific features (how to get          # CPU frequency and the library suffixes). To make the steps @@ -470,39 +305,46 @@ $(ibidir)/atlas: $(tdir)/atlas-$(atlas-version).tar.bz2 \          # See if the shared libraries should be build for a single CPU          # thread or multiple threads.  	N=$$(nproc) -	srcdir=$$(pwd)/reproduce/src/make +	srcdir=$$(pwd)/reproduce/software/make  	if [ $$N = 1 ]; then -	  sharedmk=$$srcdir/dependencies-atlas-single.mk +	  sharedmk=$$srcdir/atlas-single.mk  	else -	  sharedmk=$$srcdir/dependencies-atlas-multiple.mk +	  sharedmk=$$srcdir/atlas-multiple.mk  	fi          # The linking step here doesn't recognize the `-Wl' in the          # `rpath_command'.  	export LDFLAGS=-L$(ildir) -	cd $(ddir) \ -	&& tar xf $(tdir)/atlas-$(atlas-version).tar.bz2 \ -	&& cd ATLAS \ -	&& rm -rf build \ -	&& mkdir build \ -	&& cd build \ -	&& ../configure -b 64 -D c -DPentiumCPS=$$core \ +	cd $(ddir) +	tar xf $(tdir)/atlas-$(atlas-version).tar.bz2 +	cd ATLAS +	rm -rf build +	mkdir build +	cd build +	../configure -b 64 -D c -DPentiumCPS=$$core \  	             --with-netlib-lapack-tarfile=$(tdir)/lapack-$(lapack-version).tar.gz \  	             --cripple-atlas-performance \  	             -Fa alg -fPIC --shared $$clangflag \ -	             --prefix=$(idir) \ -	&& make \ -	&& if [ "x$(on_mac_os)" != xyes ]; then \ -	     cd lib && make -f $$sharedmk && cd .. \ -	     && for l in lib/*.$$s*; do \ -	          patchelf --set-rpath $(ildir) $$l; done \ -	     && cp -d lib/*.$$s* $(ildir) \ -	     && ln -fs $(ildir)/libblas.$$s  $(ildir)/libblas.$$m \ -	     && ln -fs $(ildir)/libf77blas.$$s $(ildir)/libf77blas.$$m \ -	     && ln -fs $(ildir)/liblapack.$$f  $(ildir)/liblapack.$$s \ -	     && ln -fs $(ildir)/liblapack.$$f  $(ildir)/liblapack.$$m; \ -	   fi \ -	&& make install +	             --prefix=$(idir) + +        # Static build. +	make + +        # Currently the shared libraries have problems on macOS. +	if [ "x$(on_mac_os)" != xyes ]; then +	     cd lib +	     make -f $$sharedmk +	     cd .. +	     for l in lib/*.$$s*; do patchelf --set-rpath $(ildir) $$l; done +	     cp -d lib/*.$$s* $(ildir) +	     ln -fs $(ildir)/libblas.$$s  $(ildir)/libblas.$$m +	     ln -fs $(ildir)/libf77blas.$$s $(ildir)/libf77blas.$$m +	     ln -fs $(ildir)/liblapack.$$f  $(ildir)/liblapack.$$s +	     ln -fs $(ildir)/liblapack.$$f  $(ildir)/liblapack.$$m +	   fi + +        # Install the libraries. +	make install          # We need to check the existance of `libptlapack.a', but we can't          # do this in the `&&' steps above (it will conflict). So we'll do @@ -521,31 +363,37 @@ $(ibidir)/atlas: $(tdir)/atlas-$(atlas-version).tar.bz2 \  	fi  # Boost doesn't use the standard GNU Build System. -$(ibidir)/boost: $(ibidir)/openmpi \ -                 $(ibidir)/python \ -                 $(tdir)/boost-$(boost-version).tar.gz -	vstr=$$(echo $(boost-version) | sed -e's/\./_/g') -	rm -rf $(ddir)/boost_$$vstr -	topdir=$(pwd); cd $(ddir); -	tar xf $(word 1,$(filter $(tdir)/%,$^)) \ -	&& cd boost_$$vstr \ -	&& ./bootstrap.sh --prefix=$(idir) --with-libraries=all \ -	                  --with-python=python3 \ -	&& echo "using mpi ;" > project-config.jam \ -	&& ./b2 stage threading=multi link=shared --prefix=$(idir) -j$(numthreads) \ -	&& ./b2 install threading=multi link=shared --prefix=$(idir) -j$(numthreads) \ -	&& cd $$topdir \ -	&& rm -rf $(ddir)/boost_$$vstr \ -	&& echo "Boost $(boost-version)" > $@ - -$(ibidir)/cfitsio: $(ibidir)/curl \ -                   $(tdir)/cfitsio-$(cfitsio-version).tar.gz +$(ibidir)/boost-$(boost-version): \ +                $(ibidir)/python-$(python-version) \ +                $(ibidir)/openmpi-$(openmpi-version) +	tarball=boost-$(boost-version).tar.lz +	$(call import-source, $(boost-url), $(boost-checksum)) +	unpackdir=boost-$(boost-version) +	rm -rf $(ddir)/$$unpackdir +	topdir=$(pwd) +	cd $(ddir) +	tar xf $(tdir)/$$tarball +	cd $$unpackdir +	./bootstrap.sh --prefix=$(idir) --with-libraries=all \ +	               --with-python=python3 +	echo "using mpi ;" > project-config.jam +	./b2 stage threading=multi link=shared --prefix=$(idir) -j$(numthreads) +	./b2 install threading=multi link=shared --prefix=$(idir) -j$(numthreads) +	cd $$topdir +	rm -rf $(ddir)/$$unpackdir +	echo "Boost $(boost-version)" > $@ + +$(ibidir)/cfitsio-$(cfitsio-version): + +        # Download the tarball +	tarball=cfitsio-$(cfitsio-version).tar.gz +	$(call import-source, $(cfitsio-url), $(cfitsio-checksum))          # CFITSIO hard-codes '@rpath' inside the shared library on          # Mac 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 $(word 1,$(filter $(tdir)/%,$^)) +	topdir=$(pwd); cd $(ddir); tar xf $(tdir)/$$tarball  	customtar=cfitsio-$(cfitsio-version)-custom.tar.gz  	cd cfitsio-$(cfitsio-version)  	sed configure -e's|@rpath|$(ildir)|g' > configure_tmp @@ -558,68 +406,82 @@ $(ibidir)/cfitsio: $(ibidir)/curl \          # 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. -	export gbuild_tar=$$customtar +	export gbuild_tar=$(ddir)/$$customtar  	$(call gbuild, cfitsio-$(cfitsio-version), , \  	               --enable-sse2 --enable-reentrant \ -	               --with-bzip2=$(idir), , make shared fpack funpack) \ -	&& rm $$customtar \ -	&& echo "CFITSIO $(cfitsio-version)" > $@ - -$(ibidir)/cairo: $(ibidir)/freetype \ -                 $(ibidir)/libpng \ -                 $(ibidir)/pixman \ -                 $(tdir)/cairo-$(cairo-version).tar.xz +	               --with-bzip2=$(idir), , make shared fpack funpack) +	rm $$customtar +	echo "CFITSIO $(cfitsio-version)" > $@ + +$(ibidir)/cairo-$(cairo-version): \ +                $(ibidir)/pixman-$(pixman-version) \ +                $(ibidir)/libpng-$(libpng-version) \ +                $(ibidir)/freetype-$(freetype-version) +	tarball=cairo-$(cairo-version).tar.xz +	$(call import-source, $(cairo-url), $(cairo-checksum))  	$(call gbuild, cairo-$(cairo-version), static, \ -	               --with-x=no, -j$(numthreads) V=1) \ -	&& echo "Cairo $(cairo-version)" > $@ +	               --with-x=yes, -j$(numthreads) V=1) +	echo "Cairo $(cairo-version)" > $@  # Eigen is just headers! So it doesn't need to be compiled. Once unpacked  # it has a checksum after `eigen-eigen', so we'll just use a `*' to choose  # the unpacked directory. -$(ibidir)/eigen: $(tdir)/eigen-$(eigen-version).tar.gz +$(ibidir)/eigen-$(eigen-version): +	tarball=eigen-$(eigen-version).tar.gz +	$(call import-source, $(eigen-url), $(eigen-checksum))  	rm -rf $(ddir)/eigen-eigen-* -	topdir=$(pwd); cd $(ddir); tar xf $(word 1,$(filter $(tdir)/%,$^)) +	topdir=$(pwd); cd $(ddir); tar xf $(tdir)/$$tarball  	cd eigen-eigen-* -	cp -r Eigen $(iidir)/eigen3 \ -	&& cd $$topdir \ -	&& rm -rf $(ddir)/eigen-eigen-* \ -	&& echo "Eigen $(eigen-version)" > $@ +	cp -r Eigen $(iidir)/eigen3 +	cd $$topdir +	rm -rf $(ddir)/eigen-eigen-* +	echo "Eigen $(eigen-version)" > $@ + +$(ibidir)/expat-$(expat-version): +	tarball=expat-$(expat-version).tar.lz +	$(call import-source, $(expat-url), $(expat-checksum)) +	$(call gbuild, expat-$(expat-version), static) +	echo "Expat $(expat-version)" > $@ -$(ibidir)/expat: $(tdir)/expat-$(expat-version).tar.lz -	$(call gbuild, expat-$(expat-version), static) \ -	&& echo "Expat $(expat-version)" > $@ +$(ibidir)/fftw-$(fftw-version): +        # Prepare the source tarball. +	tarball=fftw-$(fftw-version).tar.gz +	$(call import-source, $(fftw-url), $(fftw-checksum)) -$(ibidir)/fftw: $(tdir)/fftw-$(fftw-version).tar.gz          # FFTW's single and double precission 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.  	confop="--enable-shared --enable-threads --enable-avx --enable-sse2"  	$(call gbuild, fftw-$(fftw-version), static, \ -	               $$confop --enable-float) \ -	&& $(call gbuild, fftw-$(fftw-version), static, \ -	               $$confop) \ -	&& cp $(dtexdir)/fftw.tex $(ictdir)/ \ -	&& echo "FFTW $(fftw-version) \citep{fftw}" > $@ - -# Freetype is necessary to install matplotlib -$(ibidir)/freetype: $(ibidir)/libpng \ -                    $(tdir)/freetype-$(freetype-version).tar.gz -	$(call gbuild, freetype-$(freetype-version), static) \ -	&& echo "FreeType $(freetype-version)" > $@ - -$(ibidir)/gsl: $(tdir)/gsl-$(gsl-version).tar.gz -	$(call gbuild, gsl-$(gsl-version), static) \ -	&& echo "GNU Scientific Library $(gsl-version)" > $@ - -$(ibidir)/hdf5: $(ibidir)/openmpi \ -                $(tdir)/hdf5-$(hdf5-version).tar.gz -	export CC=mpicc; \ -	export FC=mpif90; \ +	               $$confop --enable-float) +	$(call gbuild, fftw-$(fftw-version), static, \ +	               $$confop) +	cp $(dtexdir)/fftw.tex $(ictdir)/ +	echo "FFTW $(fftw-version) \citep{fftw}" > $@ + +$(ibidir)/freetype-$(freetype-version): $(ibidir)/libpng-$(libpng-version) +	tarball=freetype-$(freetype-version).tar.gz +	$(call import-source, $(freetype-url), $(freetype-checksum)) +	$(call gbuild, freetype-$(freetype-version), static) +	echo "FreeType $(freetype-version)" > $@ + +$(ibidir)/gsl-$(gsl-version): +	tarball=gsl-$(gsl-version).tar.gz +	$(call import-source, $(gsl-url), $(gsl-checksum)) +	$(call gbuild, gsl-$(gsl-version), static) +	echo "GNU Scientific Library $(gsl-version)" > $@ + +$(ibidir)/hdf5-$(hdf5-version): $(ibidir)/openmpi-$(openmpi-version) +	export CC=mpicc +	export FC=mpif90 +	tarball=hdf5-$(hdf5-version).tar.gz +	$(call import-source, $(hdf5-url), $(hdf5-checksum))  	$(call gbuild, hdf5-$(hdf5-version), static, \  	               --enable-parallel \ -	               --enable-fortran, -j$(numthreads) V=1) \ -	&& echo "HDF5 library $(hdf5-version)" > $@ +	               --enable-fortran, \ +	               -j$(numthreads) V=1) +	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 @@ -634,13 +496,15 @@ $(ibidir)/hdf5: $(ibidir)/openmpi \  ifeq ($(strip $(top-level-python)),)  healpix-python-dep =  else -healpix-python-dep = $(ipydir)/matplotlib $(ipydir)/astropy +healpix-python-dep = $(ipydir)/matplotlib-$(matplotlib-version) \ +                     $(ipydir)/astropy-$(astropy-version)  endif -$(ibidir)/healpix: $(ibidir)/cfitsio \ -                   $(ibidir)/autoconf \ -                   $(ibidir)/automake \ -                   $(healpix-python-dep) \ -                   $(tdir)/healpix-$(healpix-version).tar.gz +$(ibidir)/healpix-$(healpix-version): $(healpix-python-dep) \ +                  $(ibidir)/cfitsio-$(cfitsio-version) \ +                  $(ibidir)/autoconf-$(autoconf-version) \ +                  $(ibidir)/automake-$(automake-version) +	tarball=healpix-$(healpix-version).tar.gz +	$(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" @@ -650,130 +514,194 @@ $(ibidir)/healpix: $(ibidir)/cfitsio \  	fi  	rm -rf $(ddir)/Healpix_$(healpix-version)  	topdir=$(pwd); cd $(ddir); -	tar xf $(word 1,$(filter $(tdir)/%,$^)) -	&& cd Healpix_$(healpix-version)/src/C/autotools/ \ -	&& autoreconf --install \ -	&& ./configure --prefix=$(idir) \ -	&& make V=1 -j$(numthreads) SHELL=$(ibdir)/bash \ -	&& make install \ -	&& cd ../../cxx/autotools/ \ -	&& autoreconf --install \ -	&& ./configure --prefix=$(idir) \ -	&& make V=1 -j$(numthreads) SHELL=$(ibdir)/bash \ -	&& make install \ -	&& cd ../../healpy \ -	&& $$pycommand1 \ -	&& $$pycommand2 \ -	&& cd $$topdir \ -	&& rm -rf $(ddir)/Healpix_$(healpix-version) \ -	&& cp $(dtexdir)/healpix.tex $(ictdir)/ \ -	&& echo "HEALPix $(healpix-version) \citep{healpix}" > $@ - -$(ibidir)/libjpeg: $(tdir)/jpegsrc.$(libjpeg-version).tar.gz -	$(call gbuild, jpeg-9b, static,,V=1) \ -	&& echo "Libjpeg $(libjpeg-version)" > $@ - -$(ibidir)/libnsl: $(ibidir)/libtirpc \ -                  $(ibidir)/rpcsvc-proto \ -                  $(tdir)/libnsl-$(libnsl-version).tar.gz +	tar xf $(tdir)/$$tarball +	cd Healpix_$(healpix-version)/src/C/autotools/ +	autoreconf --install +	./configure --prefix=$(idir) +	make V=1 -j$(numthreads) SHELL=$(ibdir)/bash +	make install +	cd ../../cxx/autotools/ +	autoreconf --install +	./configure --prefix=$(idir) +	make V=1 -j$(numthreads) SHELL=$(ibdir)/bash +	make install +	cd ../../healpy +	$$pycommand1 +	$$pycommand2 +	cd $$topdir +	rm -rf $(ddir)/Healpix_$(healpix-version) +	cp $(dtexdir)/healpix.tex $(ictdir)/ +	echo "HEALPix $(healpix-version) \citep{healpix}" > $@ + +$(ibidir)/libjpeg-$(libjpeg-version): +	tarball=jpegsrc.$(libjpeg-version).tar.gz +	$(call import-source, $(libjpeg-url), $(libjpeg-checksum)) +	$(call gbuild, jpeg-9b, static,,V=1) +	echo "Libjpeg $(libjpeg-version)" > $@ + +$(ibidir)/libnsl-$(libnsl-version): \ +                 $(ibidir)/libtirpc-$(libtirpc-version) \ +                 $(ibidir)/rpcsvc-proto-$(rpcsvc-proto-version) +	tarball=libnsl-$(libnsl-version).tar.gz +	$(call import-source, $(libnsl-url), $(libnsl-checksum))  	$(call gbuild, libnsl-$(libnsl-version), static, \ -	               --sysconfdir=$(idir)/etc) \ -	&& echo "Libnsl $(libnsl-version)" > $@ +	               --sysconfdir=$(idir)/etc) +	echo "Libnsl $(libnsl-version)" > $@ + +$(ibidir)/libpaper-$(libpaper-version): \ +                   $(ibidir)/automake-$(automake-version) -$(ibidir)/libpng: $(tdir)/libpng-$(libpng-version).tar.xz -	$(call gbuild, libpng-$(libpng-version), static) \ -	&& echo "Libpng $(libpng-version)" > $@ +        # Download the tarball. +	tarball=libpaper-$(libpaper-version).tar.gz +	$(call import-source, $(libpaper-url), $(libpaper-checksum)) -$(ibidir)/libtiff: $(ibidir)/libjpeg \ -                   $(tdir)/tiff-$(libtiff-version).tar.gz +        # Unpack, build the configure system, build and install. +	cd $(ddir) +	tar -xf $(tdir)/$$tarball +	unpackdir=libpaper-$(libpaper-version) +	cd $$unpackdir +	autoreconf -fi +	./configure --prefix=$(idir) --sysconfdir=$(idir)/etc \ +	            --disable-static +	make +	make install +	cd .. +	rm -rf $$unpackdir + +        # Post-processing: according to Linux From Scratch, libpaper +        # expects that packages will install files into this directory and +        # 'paperconfig' is a script which will invoke 'run-parts' if +        # '/etc/libpaper.d' exists +	mkdir -vp $(idir)/etc/libpaper.d +	sed -e's|MANEAGESHELL|$(SHELL)|' $(shsrcdir)/run-parts.in \ +	    > $(ibdir)/run-parts +	chmod +x $(ibdir)/run-parts +	echo "Libpaper $(libpaper-version)" > $@ + +$(ibidir)/libpng-$(libpng-version): +	tarball=libpng-$(libpng-version).tar.xz +	$(call import-source, $(libpng-url), $(libpng-checksum)) +	$(call gbuild, libpng-$(libpng-version), static) +	echo "Libpng $(libpng-version)" > $@ + +$(ibidir)/libtiff-$(libtiff-version): $(ibidir)/libjpeg-$(libjpeg-version) +	tarball=tiff-$(libtiff-version).tar.gz +	$(call import-source, $(libtiff-url), $(libtiff-checksum))  	$(call gbuild, tiff-$(libtiff-version), static, \  	               --disable-jbig \  	               --disable-webp \ -	               --disable-zstd) \ -	&& echo "Libtiff $(libtiff-version)" > $@ +	               --disable-zstd) +	echo "Libtiff $(libtiff-version)" > $@ -$(ibidir)/libtirpc: $(tdir)/libtirpc-$(libtirpc-version).tar.bz2 +$(ibidir)/libtirpc-$(libtirpc-version): +	tarball=libtirpc-$(libtirpc-version).tar.bz2 +	$(call import-source, $(libtirpc-url), $(libtirpc-checksum))  	$(call gbuild, libtirpc-$(libtirpc-version), static, \ -	               --disable-gssapi, V=1) \ +	               --disable-gssapi, V=1)  	echo "libtirpc $(libtirpc-version)" > $@ -$(ibidir)/openblas: $(tdir)/openblas-$(openblas-version).tar.gz -	if [ x$(on_mac_os) = xyes ]; then \ -	  export CC=clang; \ -	fi; \ -	cd $(ddir) \ -	&& tar xf $(word 1,$(filter $(tdir)/%,$^)) \ -	&& cd OpenBLAS-$(openblas-version) \ -	&& make \ -	&& make PREFIX=$(idir) install \ -	&& cd .. \ -	&& rm -rf OpenBLAS-$(openblas-version) \ -	&& echo "OpenBLAS $(openblas-version)" > $@ - -$(ibidir)/openmpi: $(tdir)/openmpi-$(openmpi-version).tar.gz +$(ibidir)/openblas-$(openblas-version): +	tarball=OpenBLAS-$(openblas-version).tar.gz +	$(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) +	make -j$(numthreads) +	make PREFIX=$(idir) install +	cd .. +	rm -rf OpenBLAS-$(openblas-version) +	echo "OpenBLAS $(openblas-version)" > $@ + +$(ibidir)/openmpi-$(openmpi-version): +	tarball=openmpi-$(openmpi-version).tar.gz +	$(call import-source, $(openmpi-url), $(openmpi-checksum))  	$(call gbuild, openmpi-$(openmpi-version), static, , \ -	               -j$(numthreads) V=1) \ -	&& echo "Open MPI $(openmpi-version)" > $@ +	               -j$(numthreads) V=1) +	echo "Open MPI $(openmpi-version)" > $@  # IMPORTANT NOTE: The build instructions for OpenSSH are defined here, but  # it is best that it not be prerequisite of any program and thus not built  # within the project because of all the security issues it may cause. Only  # enable/build it in a project with caution, and if there is no other  # solution (for example to disable SSH in a program that may ask for it. -$(ibidir)/openssh: $(tdir)/openssh-$(openssh-version).tar.gz +$(ibidir)/openssh-$(openssh-version): +	tarball=openssh-$(openssh-version).tar.gz +	$(call import-source, $(openssh-url), $(openssh-checksum))  	$(call gbuild, openssh-$(openssh-version), static, \  	               --with-privsep-path=$(ibdir)/.ssh_privsep \  	               --with-privsep-user=nobody \  	               --with-md5-passwords \  	               --with-ssl-engine \ -	               , -j$(numthreads) V=1) \ -	&& echo "OpenSSH $(openssh-version)" > $@ +	               , -j$(numthreads) V=1) +	echo "OpenSSH $(openssh-version)" > $@ -$(ibidir)/pixman: $(tdir)/pixman-$(pixman-version).tar.gz +$(ibidir)/pixman-$(pixman-version): +	tarball=pixman-$(pixman-version).tar.gz +	$(call import-source, $(pixman-url), $(pixman-checksum))  	$(call gbuild, pixman-$(pixman-version), static, , \ -	                   -j$(numthreads) V=1) \ -	&& echo "Pixman $(pixman-version)" > $@ +	               -j$(numthreads) V=1) +	echo "Pixman $(pixman-version)" > $@ + +$(ibidir)/rpcsvc-proto-$(rpcsvc-proto-version): +        # 'libintl' is installed as part of GNU Gettext in +        # 'basic.mk'. rpcsvc-proto needs to link with it on macOS. +	if [ x$(on_mac_os) = xyes ]; then +	  export CC=clang +	  export CXX=clang++ +	  export LDFLAGS="-lintl $$LDFLAGS" +	fi -$(ibidir)/rpcsvc-proto: $(tdir)/rpcsvc-proto-$(rpcsvc-proto-version).tar.xz -	$(call gbuild, rpcsvc-proto-$(rpcsvc-proto-version), static) \ -	&& echo "rpcsvc $(rpcsvc-proto-version)" > $@ +        # Download the tarball and build rpcsvc-proto. +	tarball=rpcsvc-proto-$(rpcsvc-proto-version).tar.xz +	$(call import-source, $(rpcsvc-proto-url), $(rpcsvc-proto-checksum)) +	$(call gbuild, rpcsvc-proto-$(rpcsvc-proto-version), static) +	echo "rpcsvc $(rpcsvc-proto-version)" > $@ -$(ibidir)/tides: $(tdir)/tides-$(tides-version).tar.gz +$(ibidir)/tides-$(tides-version): +	tarball=tides-$(tides-version).tar.gz +	$(call import-source, $(tides-url), $(tides-checksum))  	$(call gbuild, tides-$(tides-version), static,\ -	               --with-gmp=$(idir) --with-mpfr=$(idir)) \ -	&& cp $(dtexdir)/tides.tex $(ictdir)/ \ -	&& echo "TIDES $(tides-version) \citep{tides}" > $@ - -$(ibidir)/valgrind: $(ibidir)/patch \ -                    $(ibidir)/autoconf \ -                    $(ibidir)/automake \ -                    $(tdir)/valgrind-$(valgrind-version).tar.bz2 +	               --with-gmp=$(idir) --with-mpfr=$(idir)) +	cp $(dtexdir)/tides.tex $(ictdir)/ +	echo "TIDES $(tides-version) \citep{tides}" > $@ + +$(ibidir)/valgrind-$(valgrind-version): \ +                   $(ibidir)/patch-$(patch-version) \ +                   $(ibidir)/autoconf-$(autoconf-version) \ +                   $(ibidir)/automake-$(automake-version) +        # Import the tarball +	tarball=valgrind-$(valgrind-version).tar.bz2 +	$(call import-source, $(valgrind-url), $(valgrind-checksum)) +          # For valgrind-3.15.0, see          # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=946329 for a          # report on an MPI-related compile bug and the two patches          # below. These two patches and `automake` should allow valgrind to          # compile with gcc-9.2.0. -	cd $(ddir) \ -	&& tar -x -f $(word 1,$(filter $(tdir)/%,$^)) \ -	&& valgrinddir=valgrind-$(valgrind-version) \ -	&& cd $${valgrinddir} \ -	&& printf "valgrindir=$${valgrinddir} ; pwd = %s .\n" $$($(ibdir)/pwd) \ -	&& if [ "x$(valgrind-version)" = "x3.15.0" ]; then \ -	     patch --verbose -p1 < $(patchdir)/valgrind-3.15.0-mpi-fix1.patch; \ -	     patch --verbose -p1 < $(patchdir)/valgrind-3.15.0-mpi-fix2.patch; \ -	   fi \ -	&& autoreconf \ -	&& ./configure --prefix=$(idir) \ -	&& make -j$(numthreads) \ -	&& if ! make check -j$(numthreads); then \ -	     echo; echo "Valgrind's 'make check' failed!"; echo; \ -	   fi \ -	&& make install \ -	&& echo "Valgrind $(valgrind-version)" > $@ +	cd $(ddir) +	tar -xf $(tdir)/$$tarball +	valgrinddir=valgrind-$(valgrind-version) +	cd $${valgrinddir} +	printf "valgrindir=$${valgrinddir} ; pwd = %s .\n" $$($(ibdir)/pwd) +	if [ "x$(valgrind-version)" = "x3.15.0" ]; then +	  patch --verbose -p1 < $(patchdir)/valgrind-3.15.0-mpi-fix1.patch +	  patch --verbose -p1 < $(patchdir)/valgrind-3.15.0-mpi-fix2.patch +	fi +	autoreconf +	./configure --prefix=$(idir) +	make -j$(numthreads) +	if ! make check -j$(numthreads); then +	  echo; echo "Valgrind's 'make check' failed!"; echo +	fi +	make install +	echo "Valgrind $(valgrind-version)" > $@ -$(ibidir)/yaml: $(tdir)/yaml-$(yaml-version).tar.gz -	$(call gbuild, yaml-$(yaml-version), static) \ -	&& echo "LibYAML $(yaml-version)" > $@ +$(ibidir)/yaml-$(yaml-version): +	tarball=yaml-$(yaml-version).tar.gz +	$(call import-source, $(yaml-url), $(yaml-checksum)) +	$(call gbuild, yaml-$(yaml-version), static) +	echo "LibYAML $(yaml-version)" > $@ @@ -800,20 +728,23 @@ $(ibidir)/yaml: $(tdir)/yaml-$(yaml-version).tar.gz  # functions! But apparently `libgit2' has its own implementation of libiconv  # that it uses if it can't find libiconv on macOS. So, to fix this problem  # it is necessary to use the option `-DUSE_ICONV=OFF` in the configure step. -$(ibidir)/libgit2: $(ibidir)/curl \ -                   $(ibidir)/cmake \ -                   $(tdir)/libgit2-$(libgit2-version).tar.gz +$(ibidir)/libgit2-$(libgit2-version): $(ibidir)/cmake-$(cmake-version) +	tarball=libgit2-$(libgit2-version).tar.gz +	$(call import-source, $(libgit2-url), $(libgit2-checksum))  	$(call cbuild, libgit2-$(libgit2-version), static, \  	              -DUSE_SSH=OFF -DBUILD_CLAR=OFF \ -	              -DTHREADSAFE=ON -DUSE_ICONV=OFF ) \ -	&& if [ x$(on_mac_os) = xyes ]; then \ -	     install_name_tool -id $(ildir)/libgit2.28.dylib \ -	                           $(ildir)/libgit2.28.dylib; \ -	   fi \ -	&& echo "Libgit2 $(libgit2-version)" > $@ - -$(ibidir)/wcslib: $(ibidir)/cfitsio \ -                  $(tdir)/wcslib-$(wcslib-version).tar.bz2 +	              -DTHREADSAFE=ON -DUSE_ICONV=OFF ) +	if [ x$(on_mac_os) = xyes ]; then +	  install_name_tool -id $(ildir)/libgit2.28.dylib \ +	                        $(ildir)/libgit2.28.dylib +	fi +	echo "Libgit2 $(libgit2-version)" > $@ + +$(ibidir)/wcslib-$(wcslib-version): $(ibidir)/cfitsio-$(cfitsio-version) +        # Import the tarball. +	tarball=wcslib-$(wcslib-version).tar.bz2 +	$(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" @@ -824,12 +755,12 @@ $(ibidir)/wcslib: $(ibidir)/cfitsio \  	               LIBS="-pthread -lcurl -lm" \                         --with-cfitsiolib=$(ildir) \                         --with-cfitsioinc=$(idir)/include \ -                       --without-pgplot $$fortranopt) \ -	&& if [ x$(on_mac_os) = xyes ]; then \ -	     install_name_tool -id $(ildir)/libwcs.6.4.dylib \ -	                           $(ildir)/libwcs.6.4.dylib; \ -	   fi \ -	&& echo "WCSLIB $(wcslib-version)" > $@ +                       --without-pgplot $$fortranopt) +	if [ x$(on_mac_os) = xyes ]; then +	  install_name_tool -id $(ildir)/libwcs.6.4.dylib \ +	                        $(ildir)/libwcs.6.4.dylib +	fi +	echo "WCSLIB $(wcslib-version)" > $@ @@ -846,51 +777,58 @@ $(ibidir)/wcslib: $(ibidir)/cfitsio \  # Astrometry-net contains a lot of programs. We need to specify the  # installation directory and the Python executable (by default it will look  # for /usr/bin/python) -$(ibidir)/astrometrynet: $(ibidir)/gsl \ -                         $(ibidir)/swig \ -                         $(ipydir)/numpy \ -                         $(ibidir)/cairo \ -                         $(ibidir)/libpng \ -                         $(ibidir)/netpbm \ -                         $(ibidir)/wcslib \ -                         $(ibidir)/cfitsio \ -                         $(ibidir)/libjpeg \ -                         $(tdir)/astrometry.net-$(astrometrynet-version).tar.gz +$(ibidir)/astrometrynet-$(astrometrynet-version): \ +                        $(ibidir)/gsl-$(gsl-version) \ +                        $(ibidir)/swig-$(swig-version) \ +                        $(ipydir)/numpy-$(numpy-version) \ +                        $(ibidir)/cairo-$(cairo-version) \ +                        $(ibidir)/libpng-$(libpng-version) \ +                        $(ibidir)/netpbm-$(netpbm-version) \ +                        $(ibidir)/wcslib-$(wcslib-version) \ +                        $(ibidir)/cfitsio-$(cfitsio-version) \ +                        $(ibidir)/libjpeg-$(libjpeg-version) + +        # Import the tarball +	tarball=astrometry.net-$(astrometrynet-version).tar.gz +	$(call import-source, $(astrometrynet-url), $(astrometrynet-checksum)) +          # We are modifying the Makefile in two steps because on Mac OS          # system we do not have `/proc/cpuinfo' nor `free'. Since this is          # only for the `report.txt', this changes do not causes problems in          # running `astrometrynet' -	cd $(ddir) \ -	&& rm -rf astrometry.net-$(astrometrynet-version) \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd astrometry.net-$(astrometrynet-version) \ -	&& sed -e 's|cat /proc/cpuinfo|echo "Ignoring CPU info"|' \ -	       -e 's|-free|echo "Ignoring RAM info"|' Makefile > Makefile.tmp \ -	&& mv Makefile.tmp Makefile \ -	&& make \ -	&& make py \ -	&& make extra \ -	&& make install INSTALL_DIR=$(idir) PYTHON_SCRIPT="$(ibdir)/python" \ -	&& cd .. \ -	&& rm -rf astrometry.net-$(astrometrynet-version) \ -	&& cp $(dtexdir)/astrometrynet.tex $(ictdir)/ \ -	&& echo "Astrometry.net $(astrometrynet-version) \citep{astrometrynet}" > $@ - -$(ibidir)/autoconf: $(tdir)/autoconf-$(autoconf-version).tar.lz -	$(call gbuild, autoconf-$(autoconf-version), static, ,V=1) \ -	&& echo "GNU Autoconf $(autoconf-version)" > $@ - -$(ibidir)/automake: $(ibidir)/autoconf \ -                    $(tdir)/automake-$(automake-version).tar.gz -	$(call gbuild, automake-$(automake-version), static, ,V=1) \ -	&& echo "GNU Automake $(automake-version)" > $@ - -$(ibidir)/bison: $(ibidir)/help2man \ -                 $(tdir)/bison-$(bison-version).tar.xz -	$(call gbuild, bison-$(bison-version), static, ,V=1) \ -	&& echo "GNU Bison $(bison-version)" > $@ +	cd $(ddir) +	rm -rf astrometry.net-$(astrometrynet-version) +	tar xf $(tdir)/$$tarball +	cd astrometry.net-$(astrometrynet-version) +	sed -e 's|cat /proc/cpuinfo|echo "Ignoring CPU info"|' \ +	    -e 's|-free|echo "Ignoring RAM info"|' Makefile > Makefile.tmp +	mv Makefile.tmp Makefile +	make +	make py +	make extra +	make install INSTALL_DIR=$(idir) PYTHON_SCRIPT="$(ibdir)/python" +	cd .. +	rm -rf astrometry.net-$(astrometrynet-version) +	cp $(dtexdir)/astrometrynet.tex $(ictdir)/ +	echo "Astrometry.net $(astrometrynet-version) \citep{astrometrynet}" > $@ + +$(ibidir)/autoconf-$(autoconf-version): +	tarball=autoconf-$(autoconf-version).tar.lz +	$(call import-source, $(autoconf-url), $(autoconf-checksum)) +	$(call gbuild, autoconf-$(autoconf-version), static, ,V=1) +	echo "GNU Autoconf $(autoconf-version)" > $@ + +$(ibidir)/automake-$(automake-version): $(ibidir)/autoconf-$(autoconf-version) +	tarball=automake-$(automake-version).tar.gz +	$(call import-source, $(automake-url), $(automake-checksum)) +	$(call gbuild, automake-$(automake-version), static, ,V=1) +	echo "GNU Automake $(automake-version)" > $@ + +$(ibidir)/bison-$(bison-version): $(ibidir)/help2man-$(help2man-version) +	tarball=bison-$(bison-version).tar.xz +	$(call import-source, $(bison-url), $(bison-checksum)) +	$(call gbuild, bison-$(bison-version), static, ,V=1 -j$(numthreads)) +	echo "GNU Bison $(bison-version)" > $@  # cdsclient is a set of software written in c to interact with astronomical  # database servers. It is a dependency of `scamp' to be able to download @@ -899,57 +837,69 @@ $(ibidir)/bison: $(ibidir)/help2man \  # programs are scripts and we need to touch them before installing.  # Otherwise this software will be re-built each time the configure step is  # invoked. -$(ibidir)/cdsclient: $(tdir)/cdsclient-$(cdsclient-version).tar.gz -	cd $(ddir) \ -	&& tar xf $(word 1,$(filter $(tdir)/%,$^)) \ -	&& cd cdsclient-$(cdsclient-version) \ -	&& touch * \ -	&& ./configure --prefix=$(idir) \ -	&& make \ -	&& make install \ -	&& cd .. \ -	&& rm -rf cdsclient-$(cdsclient-version) \ -	&& echo "cdsclient $(cdsclient-version)" > $@ +$(ibidir)/cdsclient-$(cdsclient-version): +	tarball=cdsclient-$(cdsclient-version).tar.gz +	$(call import-source, $(cdsclient-url), $(cdsclient-checksum)) +	cd $(ddir) +	tar xf $(tdir)/$$tarball +	cd cdsclient-$(cdsclient-version) +	touch * +	./configure --prefix=$(idir) +	make +	make install +	cd .. +	rm -rf cdsclient-$(cdsclient-version) +	echo "cdsclient $(cdsclient-version)" > $@  # CMake can be built with its custom `./bootstrap' script. -$(ibidir)/cmake: $(ibidir)/curl \ -                 $(tdir)/cmake-$(cmake-version).tar.gz +$(ibidir)/cmake-$(cmake-version): $(ibidir)/curl-$(curl-version) +        # Import the tarball +	tarball=cmake-$(cmake-version).tar.gz +	$(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; \ -	cd $(ddir) \ -	&& rm -rf cmake-$(cmake-version) \ -	&& tar xf $(word 1,$(filter $(tdir)/%,$^)) \ -	&& cd cmake-$(cmake-version) \ -	&& ./bootstrap --prefix=$(idir) --system-curl --system-zlib \ -	               --system-bzip2 --system-liblzma --no-qt-gui \ -	               --parallel=$(numthreads) \ -	&& make -j$(numthreads) LIBS="$$LIBS -lssl -lcrypto -lz" VERBOSE=1  \ -	&& make install \ -	&& cd .. \ -	&& rm -rf cmake-$(cmake-version) \ -	&& echo "CMake $(cmake-version)" > $@ - -$(ibidir)/flex: $(ibidir)/bison \ -                $(tdir)/flex-$(flex-version).tar.gz -	$(call gbuild, flex-$(flex-version), static, ,V=1) \ -	&& echo "Flex $(flex-version)" > $@ - -$(ibidir)/gdb: $(ibidir)/python \ -               $(tdir)/gdb-$(gdb-version).tar.gz -	$(call gbuild, gdb-$(gdb-version),,,V=1) \ -	&& echo "GNU Project Debugger (GDB) $(gdb-version)" > $@ - -$(ibidir)/ghostscript: $(ibidir)/libpng \ -                       $(ibidir)/libtiff \ -                       $(tdir)/ghostscript-$(ghostscript-version).tar.gz +	if [ x$(on_mac_os) = xyes ]; then +	  export CC=clang +	  export CXX=clang++ +	fi +	cd $(ddir) +	rm -rf cmake-$(cmake-version) +	tar xf $(tdir)/$$tarball +	cd cmake-$(cmake-version) +	./bootstrap --prefix=$(idir) --system-curl --system-zlib \ +	            --system-bzip2 --system-liblzma --no-qt-gui \ +	            --parallel=$(numthreads) +	make -j$(numthreads) LIBS="$$LIBS -lssl -lcrypto -lz" VERBOSE=1 +	make install +	cd .. +	rm -rf cmake-$(cmake-version) +	echo "CMake $(cmake-version)" > $@ + +$(ibidir)/flex-$(flex-version): $(ibidir)/bison-$(bison-version) +	tarball=flex-$(flex-version).tar.lz +	$(call import-source, $(flex-url), $(flex-checksum)) +	$(call gbuild, flex-$(flex-version), static, ,V=1 -j$(numthreads)) +	echo "Flex $(flex-version)" > $@ + +$(ibidir)/gdb-$(gdb-version): $(ibidir)/python-$(python-version) +	tarball=gdb-$(gdb-version).tar.gz +	$(call import-source, $(gdb-url), $(gdb-checksum)) +	$(call gbuild, gdb-$(gdb-version),,,V=1 -j$(numthreads)) +	echo "GNU Project Debugger (GDB) $(gdb-version)" > $@ + +$(ibidir)/ghostscript-$(ghostscript-version): \ +                      $(ibidir)/libpng-$(libpng-version) \ +                      $(ibidir)/libtiff-$(libtiff-version) + +        # Import the tarball. +	tarball=ghostscript-$(ghostscript-version).tar.gz +	$(call import-source, $(ghostscript-url), $(ghostscript-checksum)) +          # First we need to make sure some necessary X11 libraries that we          # don't yet install in this template are present on the host          # system, see https://savannah.nongnu.org/task/?15481 . @@ -986,35 +936,38 @@ $(ibidir)/ghostscript: $(ibidir)/libpng \  	fi          # If they were present, go onto building Ghostscript. -	$(call gbuild, ghostscript-$(ghostscript-version)) \ -	&& echo "GPL Ghostscript $(ghostscript-version)" > $@ - -$(ibidir)/gnuastro: $(ibidir)/gsl \ -                    $(ibidir)/wcslib \ -                    $(ibidir)/libjpeg \ -                    $(ibidir)/libtiff \ -                    $(ibidir)/libgit2 \ -                    $(ibidir)/ghostscript \ -                    $(tdir)/gnuastro-$(gnuastro-version).tar.lz -ifeq ($(static_build),yes) -	staticopts="--enable-static=yes --enable-shared=no"; -endif -	$(call gbuild, gnuastro-$(gnuastro-version), static, \ -	               $$staticopts, -j$(numthreads)) \ -	&& cp $(dtexdir)/gnuastro.tex $(ictdir)/ \ -	&& echo "GNU Astronomy Utilities $(gnuastro-version) \citep{gnuastro}" > $@ - -$(ibidir)/help2man: $(tdir)/help2man-$(help2man-version).tar.xz -	$(call gbuild, help2man-$(help2man-version), static, ,V=1) \ -	&& echo "Help2man $(Help2man-version)" > $@ - -$(ibidir)/imagemagick: $(ibidir)/zlib \ -                       $(ibidir)/libjpeg \ -                       $(ibidir)/libtiff \ -                       $(tdir)/imagemagick-$(imagemagick-version).tar.xz +	$(call gbuild, ghostscript-$(ghostscript-version),,,V=1 -j$(numthreads)) +	echo "GPL Ghostscript $(ghostscript-version)" > $@ + +$(ibidir)/gnuastro-$(gnuastro-version): \ +                   $(ibidir)/gsl-$(gsl-version) \ +                   $(ibidir)/wcslib-$(wcslib-version) \ +                   $(ibidir)/libjpeg-$(libjpeg-version) \ +                   $(ibidir)/libtiff-$(libtiff-version) \ +                   $(ibidir)/libgit2-$(libgit2-version) \ +                   $(ibidir)/ghostscript-$(ghostscript-version) +	tarball=gnuastro-$(gnuastro-version).tar.lz +	$(call import-source, $(gnuastro-url), $(gnuastro-checksum)) +	$(call gbuild, gnuastro-$(gnuastro-version), static, , \ +	               -j$(numthreads)) +	cp $(dtexdir)/gnuastro.tex $(ictdir)/ +	echo "GNU Astronomy Utilities $(gnuastro-version) \citep{gnuastro}" > $@ + +$(ibidir)/help2man-$(help2man-version): +	tarball=help2man-$(help2man-version).tar.xz +	$(call import-source, $(help2man-url), $(help2man-checksum)) +	$(call gbuild, help2man-$(help2man-version), static, ,V=1) +	echo "Help2man $(Help2man-version)" > $@ + +$(ibidir)/imagemagick-$(imagemagick-version): \ +                      $(ibidir)/zlib-$(zlib-version) \ +                      $(ibidir)/libjpeg-$(libjpeg-version) \ +                      $(ibidir)/libtiff-$(libtiff-version) +	tarball=imagemagick-$(imagemagick-version).tar.xz +	$(call import-source, $(imagemagick-url), $(imagemagick-checksum))  	$(call gbuild, ImageMagick-$(imagemagick-version), static, \ -		       --without-x --disable-openmp, V=1 -j$(numthreads)) \ -	&& echo "ImageMagick $(imagemagick-version)" > $@ +		       --without-x --disable-openmp, V=1 -j$(numthreads)) +	echo "ImageMagick $(imagemagick-version)" > $@  # `imfit' doesn't use the traditional `configure' and `make' to install  # itself.  Instead of that, it uses `scons'. As a consequence, the @@ -1025,42 +978,51 @@ $(ibidir)/imagemagick: $(ibidir)/zlib \  # by `$(idir)'. After that, each compiled program (`imfit', `imfit-mcmc'  # and `makeimage') is copied into the installation directory and an `rpath'  # is added. -$(ibidir)/imfit: $(ibidir)/gsl \ -                 $(ibidir)/fftw \ -                 $(ibidir)/scons \ -                 $(ibidir)/cfitsio \ -                 $(tdir)/imfit-$(imfit-version).tar.gz -	cd $(ddir) \ -	&& unpackdir=imfit-$(imfit-version) \ -	&& rm -rf $$unpackdir \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd $$unpackdir \ -	&& 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 \ -	&& scons --no-openmp  --no-nlopt \ -	         --cc=$(ibdir)/gcc --cpp=$(ibdir)/g++ \ -	         --header-path=$(idir)/include --lib-path=$(idir)/lib imfit \ -	&& cp imfit $(ibdir) \ -	&& scons --no-openmp  --no-nlopt\ -	         --cc=$(ibdir)/gcc --cpp=$(ibdir)/g++ \ -	         --header-path=$(idir)/include --lib-path=$(idir)/lib \ -                 imfit-mcmc \ -	&& cp imfit-mcmc $(ibdir) \ -	&& scons --no-openmp  --no-nlopt\ -	         --cc=$(ibdir)/gcc --cpp=$(ibdir)/g++ \ -	         --header-path=$(idir)/include --lib-path=$(idir)/lib \ -                 makeimage \ -	&& cp makeimage $(ibdir) \ -	&& cp $(dtexdir)/imfit.tex $(ictdir)/ \ -	&& if [ "x$(on_mac_os)" != xyes ]; then \ -	     for p in imfit imfit-mcmc makeimage; do \ -	         patchelf --set-rpath $(ildir) $(ibdir)/$$p; \ -	     done; \ -	   fi \ -	&& echo "Imfit $(imfit-version) \citep{imfit2015}" > $@ +$(ibidir)/imfit-$(imfit-version): \ +                $(ibidir)/gsl-$(gsl-version) \ +                $(ibidir)/fftw-$(fftw-version) \ +                $(ibidir)/scons-$(scons-version) \ +                $(ibidir)/cfitsio-$(cfitsio-version) +	tarball=imfit-$(imfit-version).tar.gz +	$(call import-source, $(imfit-url), $(imfit-checksum)) + +        # If the C library is in a non-standard location. +	if ! [ x$(SYS_CPATH) = x ]; then +	  headerpath="--header-path=$(SYS_CPATH)" +	fi + +        # Unpack and build imfit and its accompanying programs. +	cd $(ddir) +	unpackdir=imfit-$(imfit-version) +	rm -rf $$unpackdir +	tar xf $(tdir)/$$tarball +	cd $$unpackdir +	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 +	scons --no-openmp  --no-nlopt \ +	      --cc=$(ibdir)/gcc --cpp=$(ibdir)/g++ \ +	      --header-path=$(idir)/include $$headerpath \ +	      --lib-path=$(idir)/lib imfit +	cp imfit $(ibdir) +	scons --no-openmp  --no-nlopt \ +	      --cc=$(ibdir)/gcc --cpp=$(ibdir)/g++ \ +	      --header-path=$(idir)/include $$headerpath \ +	      --lib-path=$(idir)/lib imfit-mcmc +	cp imfit-mcmc $(ibdir) +	scons --no-openmp  --no-nlopt \ +	      --cc=$(ibdir)/gcc --cpp=$(ibdir)/g++ \ +	      --header-path=$(idir)/include $$headerpath \ +	      --lib-path=$(idir)/lib makeimage +	cp makeimage $(ibdir) +	cp $(dtexdir)/imfit.tex $(ictdir)/ +	if [ -f $(ibdir)/patchelf ]; then +	  for p in imfit imfit-mcmc makeimage; do +	      patchelf --set-rpath $(ildir) $(ibdir)/$$p +	  done +	fi +	cp $(dtexdir)/imfit.tex $(ictdir)/ +	echo "Imfit $(imfit-version) \citep{imfit2015}" > $@  # 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 @@ -1071,39 +1033,39 @@ $(ibidir)/imfit: $(ibidir)/gsl \  #  # About deleting the final crypt.h file after installation, see  # https://bugzilla.redhat.com/show_bug.cgi?id=1424609 -$(ibidir)/minizip: $(ibidir)/automake \ -                   $(tdir)/zlib-$(zlib-version).tar.gz -	cd $(ddir) \ -	&& unpackdir=minizip-$(minizip-version) \ -	&& rm -rf $$unpackdir \ -	&& mkdir $$unpackdir \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)) \ -	            -C$$unpackdir --strip-components=1; then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd $$unpackdir\ -	&& ./configure --prefix=$(idir) \ -	&& make \ -	&& cd contrib/minizip \ -	&& cp Makefile Makefile.orig \ -	&& cp ../README.contrib readme.txt \ -	&& autoreconf --install \ -	&& ./configure --prefix=$(idir) \ -	&& make \ -	&& cd ../../ \ -	&& make test \ -	&& cd contrib/minizip \ -	&& make -f Makefile.orig test \ -	&& make install \ -	&& rm $(iidir)/minizip/crypt.h \ -	&& cd ../../.. \ -	&& rm -rf $$unpackdir \ -	&& echo "Minizip $(minizip-version)" > $@ - -$(ibidir)/missfits: $(tdir)/missfits-$(missfits-version).tar.gz -	$(call gbuild, missfits-$(missfits-version), static) \ -	&& cp $(dtexdir)/missfits.tex $(ictdir)/ \ -	&& echo "MissFITS $(missfits-version) \citep{missfits}" > $@ +$(ibidir)/minizip-$(minizip-version): $(ibidir)/automake-$(automake-version) +	tarball=zlib-$(zlib-version).tar.gz +	$(call import-source, $(minizip-url), $(minizip-checksum)) +	cd $(ddir) +	unpackdir=minizip-$(minizip-version) +	rm -rf $$unpackdir +	mkdir $$unpackdir +	tar xf $(tdir)/$$tarball -C$$unpackdir --strip-components=1 +	cd $$unpackdir +	./configure --prefix=$(idir) +	make +	cd contrib/minizip +	cp Makefile Makefile.orig +	cp ../README.contrib readme.txt +	autoreconf --install +	./configure --prefix=$(idir) +	make +	cd ../../ +	make test +	cd contrib/minizip +	make -f Makefile.orig test +	make install +	rm $(iidir)/minizip/crypt.h +	cd ../../.. +	rm -rf $$unpackdir +	echo "Minizip $(minizip-version)" > $@ + +$(ibidir)/missfits-$(missfits-version): +	tarball=missfits-$(missfits-version).tar.gz +	$(call import-source, $(missfits-url), $(missfits-checksum)) +	$(call gbuild, missfits-$(missfits-version), static) +	cp $(dtexdir)/missfits.tex $(ictdir)/ +	echo "MissFITS $(missfits-version) \citep{missfits}" > $@  # Netpbm is a prerequisite of Astrometry-net, it contains a lot of programs.  # This program has a crazy dialogue installation which is override using the @@ -1111,58 +1073,78 @@ $(ibidir)/missfits: $(tdir)/missfits-$(missfits-version).tar.gz  # ask to the user. We give all answers with a pipe to the scripts (configure  # and install). The questions are different depending on the system (tested  # on GNU/Linux and Mac OS). -$(ibidir)/netpbm: $(ibidir)/unzip \ -                  $(ibidir)/libpng \ -                  $(ibidir)/libjpeg \ -                  $(ibidir)/libtiff \ -                  $(ibidir)/libxml2 \ -                  $(tdir)/netpbm-$(netpbm-version).tar.gz -	if [ x$(on_mac_os) = xyes ]; then \ -	  answers='\n\n$(ildir)\n\n\n\n\n\n$(ildir)/include\n\n$(ildir)/include\n\n$(ildir)/include\nnone\n\n'; \ -	else \ -	  answers='\n\n\n\n\n\n\n\n\n\n\n\n\nnone\n\n\n'; \ -	fi; \ -	cd $(ddir) \ -	&& unpackdir=netpbm-$(netpbm-version) \ -	&& rm -rf $$unpackdir \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd $$unpackdir \ -	&& printf "$$answers" | ./configure \ -	&& make \ -	&& rm -rf $(ddir)/$$unpackdir/install \ -	&& make package pkgdir=$(ddir)/$$unpackdir/install \ -	&& printf "$(ddir)/$$unpackdir/install\n$(idir)\n\n\nN\n\n\n\n\nN\n\n" \ -	          | ./installnetpbm \ -	&& cd .. \ -	&& rm -rf $$unpackdir \ -	&& echo "Netpbm $(netpbm-version)" > $@ - -$(ibidir)/patch: $(tdir)/patch-$(patch-version).tar.gz -	$(call gbuild, patch-$(patch-version), static, ,V=1) \ -	&& echo "GNU Patch $(patch-version)" > $@ - -# R programming language -$(ibidir)/R: $(ibidir)/libpng \ -             $(ibidir)/libjpeg \ -             $(ibidir)/libtiff \ -             $(tdir)/R-$(R-version).tar.gz -	export R_SHELL=$(SHELL); \ +$(ibidir)/netpbm-$(netpbm-version): \ +                 $(ibidir)/libpng-$(libpng-version) \ +                 $(ibidir)/libjpeg-$(libjpeg-version) \ +                 $(ibidir)/libtiff-$(libtiff-version) \ +                 $(ibidir)/libxml2-$(libxml2-version) +	tarball=netpbm-$(netpbm-version).tar.gz +	$(call import-source, $(netpbm-url), $(netpbm-checksum)) +	if [ x$(on_mac_os) = xyes ]; then +	  answers='\n\n$(ildir)\n\n\n\n\n\n$(ildir)/include\n\n$(ildir)/include\n\n$(ildir)/include\nnone\n\n' +	else +	  answers='\n\n\n\n\n\n\n\n\n\n\n\n\nnone\n\n\n' +	fi +	cd $(ddir) +	unpackdir=netpbm-$(netpbm-version) +	rm -rf $$unpackdir +	tar xf $(tdir)/$$tarball +	cd $$unpackdir +	printf "$$answers" | ./configure +	make +	rm -rf $(ddir)/$$unpackdir/install +	make package pkgdir=$(ddir)/$$unpackdir/install +	printf "$(ddir)/$$unpackdir/install\n$(idir)\n\n\nN\n\n\n\n\nN\n\n" \ +	       | ./installnetpbm +	cd .. +	rm -rf $$unpackdir +	echo "Netpbm $(netpbm-version)" > $@ + +$(ibidir)/patch-$(patch-version): +	tarball=patch-$(patch-version).tar.gz +	$(call import-source, $(patch-url), $(patch-checksum)) +	$(call gbuild, patch-$(patch-version), static, ,V=1) +	echo "GNU Patch $(patch-version)" > $@ + +$(ibidir)/pcre-$(pcre-version): +	tarball=pcre-$(pcre-version).tar.gz +	$(call import-source, $(pcre-url), $(pcre-checksum)) +	$(call gbuild, pcre-$(pcre-version), static, \ +	               --enable-pcretest-libreadline \ +	               --enable-unicode-properties \ +	               --includedir=$(iidir)/pcre \ +	               --enable-pcregrep-libbz2 \ +	               --enable-pcregrep-libz \ +	               , V=1 -j$(numthreads)) +	echo "Perl Compatible Regular Expressions $(pcre-version)" > $@ + +$(ibidir)/R-$(R-version): \ +            $(ibidir)/pcre-$(pcre-version) \ +            $(ibidir)/cairo-$(cairo-version) \ +            $(ibidir)/libpng-$(libpng-version) \ +            $(ibidir)/libjpeg-$(libjpeg-version) \ +            $(ibidir)/libtiff-$(libtiff-version) \ +            $(ibidir)/libpaper-$(libpaper-version) +	tarball=R-$(R-version).tar.gz +	$(call import-source, $(R-url), $(R-checksum)) + +	export R_SHELL=$(SHELL)  	$(call gbuild, R-$(R-version), static, \                         --without-x --with-readline \ -	               --disable-openmp) \ -	&& echo "R $(R-version)" > $@ +	               --disable-openmp, -j$(numthreads)) +	echo "R $(R-version)" > $@  # SCAMP documentation says ATLAS is a mandatory prerequisite for using  # SCAMP. We have ATLAS into the project but there are some problems with the  # libraries that are not yet solved. However, we tried to install it with  # the option --enable-openblas and it worked (same issue happened with  # `sextractor'. -$(ibidir)/scamp: $(ibidir)/fftw \ -                 $(ibidir)/openblas \ -                 $(ibidir)/cdsclient \ -                 $(tdir)/scamp-$(scamp-version).tar.lz +$(ibidir)/scamp-$(scamp-version): \ +                $(ibidir)/fftw-$(fftw-version) \ +                $(ibidir)/openblas-$(openblas-version) \ +                $(ibidir)/cdsclient-$(cdsclient-version) +	tarball=scamp-$(scamp-version).tar.lz +	$(call import-source, $(scamp-url), $(scamp-checksum))  	$(call gbuild, scamp-$(scamp-version), static, \                     --enable-threads \                     --enable-openblas \ @@ -1170,84 +1152,90 @@ $(ibidir)/scamp: $(ibidir)/fftw \                     --with-fftw-libdir=$(idir) \                     --with-fftw-incdir=$(idir)/include \                     --with-openblas-libdir=$(ildir) \ -                   --with-openblas-incdir=$(idir)/include) \ -	&& cp $(dtexdir)/scamp.tex $(ictdir)/ \ -	&& echo "SCAMP $(scamp-version) \citep{scamp}" > $@ +                   --with-openblas-incdir=$(idir)/include) +	cp $(dtexdir)/scamp.tex $(ictdir)/ +	echo "SCAMP $(scamp-version) \citep{scamp}" > $@  # Since `scons' doesn't use the traditional GNU installation with  # `configure' and `make' it is installed manually using `python'. -$(ibidir)/scons: $(ibidir)/python \ -                 $(tdir)/scons-$(scons-version).tar.gz -	cd $(ddir) \ -	&& unpackdir=scons-$(scons-version) \ -	&& rm -rf $$unpackdir \ -	&& if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ -	      echo; echo "Tar error"; exit 1; \ -	   fi \ -	&& cd $$unpackdir \ -	&& python setup.py install \ -	&& echo "SCons $(scons-version)" > $@ +$(ibidir)/scons-$(scons-version): $(ibidir)/python-$(python-version) +	tarball=scons-$(scons-version).tar.gz +	$(call import-source, $(scons-url), $(scons-checksum)) +	cd $(ddir) +	unpackdir=scons-$(scons-version) +	rm -rf $$unpackdir +	tar xf $(tdir)/$$tarball +	cd $$unpackdir +	python setup.py install +	echo "SCons $(scons-version)" > $@  # Sextractor crashes complaining about not linking with some ATLAS  # libraries. But we can override this issue since we have Openblas  # installed, it is just necessary to explicity tell sextractor to use it in  # the configuration step. -$(ibidir)/sextractor: $(ibidir)/fftw \ -                      $(ibidir)/openblas \ -                      $(tdir)/sextractor-$(sextractor-version).tar.lz +$(ibidir)/sextractor-$(sextractor-version): \ +                     $(ibidir)/fftw-$(fftw-version) \ +                     $(ibidir)/openblas-$(openblas-version) +	tarball=sextractor-$(sextractor-version).tar.lz +	$(call import-source, $(sextractor-url), $(sextractor-checksum))  	$(call gbuild, sextractor-$(sextractor-version), static, \  	               --enable-threads --enable-openblas \  	               --with-openblas-libdir=$(ildir) \ -	               --with-openblas-incdir=$(idir)/include) \ -	&& ln -fs $(ibdir)/sex $(ibdir)/sextractor \ -	&& cp $(dtexdir)/sextractor.tex $(ictdir)/ \ -	&& echo "SExtractor $(sextractor-version) \citep{sextractor}" > $@ - -$(ibidir)/swarp: $(ibidir)/fftw \ -                 $(tdir)/swarp-$(swarp-version).tar.gz +	               --with-openblas-incdir=$(idir)/include) +	ln -fs $(ibdir)/sex $(ibdir)/sextractor +	cp $(dtexdir)/sextractor.tex $(ictdir)/ +	echo "SExtractor $(sextractor-version) \citep{sextractor}" > $@ + +$(ibidir)/swarp-$(swarp-version): $(ibidir)/fftw-$(fftw-version) +	tarball=swarp-$(swarp-version).tar.gz +	$(call import-source, $(swarp-url), $(swarp-checksum))  	$(call gbuild, swarp-$(swarp-version), static, \ -                       --enable-threads) \ -	&& cp $(dtexdir)/swarp.tex $(ictdir)/ \ -	&& echo "SWarp $(swarp-version) \citep{swarp}" > $@ +                       --enable-threads) +	cp $(dtexdir)/swarp.tex $(ictdir)/ +	echo "SWarp $(swarp-version) \citep{swarp}" > $@ -$(ibidir)/swig: $(tdir)/swig-$(swig-version).tar.gz +$(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 -	$(call gbuild, swig-$(swig-version), static, --without-pcre) \ -	&& echo "Swig $(swig-version)" > $@ - -$(ibidir)/xlsxio: $(ibidir)/cmake \ -                  $(ibidir)/expat \ -                  $(ibidir)/minizip \ -                  $(tdir)/xlsxio-$(xlsxio-version).tar.gz -	if [ x$(on_mac_os) = xyes ]; then \ -	  export CC=clang; \ -	  export CXX=clang++; \ -	  export LDFLAGS="$$LDFLAGS -lbz2"; \ -	else \ -	  export LDFLAGS="$$LDFLAGS -lbz2 -lbsd"; \ -	fi; \ +	tarball=swig-$(swig-version).tar.gz +	$(call import-source, $(swig-url), $(swig-checksum)) +	$(call gbuild, swig-$(swig-version), static, --without-pcre) +	echo "Swig $(swig-version)" > $@ + +$(ibidir)/xlsxio-$(xlsxio-version): \ +                 $(ibidir)/cmake-$(cmake-version) \ +                 $(ibidir)/expat-$(expat-version) \ +                 $(ibidir)/minizip-$(minizip-version) +	tarball=xlsxio-$(xlsxio-version).tar.gz +	$(call import-source, $(xlsxio-url), $(xlsxio-checksum)) +	if [ x$(on_mac_os) = xyes ]; then +	  export CC=clang +	  export CXX=clang++ +	  export LDFLAGS="$$LDFLAGS -lbz2" +	else +	  export LDFLAGS="$$LDFLAGS -lbz2 -lbsd" +	fi  	$(call cbuild, xlsxio-$(xlsxio-version), static, \  	       -DMINIZIP_DIR:PATH=$(idir) \  	       -DMINIZIP_LIBRARIES=$(idir) \ -	       -DMINIZIP_INCLUDE_DIRS=$(iidir)) \ -	&& echo "Correcting internal linking of XLSX I/O executables..." \ -	&& if [ "x$(on_mac_os)" = xyes ]; then \ -	     for f in $(ibdir)/xlsxio_* $(ildir)/libxlsxio_*.dylib; do \ -	       install_name_tool -change  libxlsxio_read.dylib \ -	                         $(ildir)/libxlsxio_read.dylib $$f; \ -	       install_name_tool -change  libxlsxio_write.dylib \ -	                         $(ildir)/libxlsxio_write.dylib $$f; \ -	     done; \ -	   else \ -	     for f in $(ibdir)/xlsxio_* $(ildir)/libxlsxio_*.so; do \ -	       patchelf --set-rpath $(ildir) $$f; \ -	     done; \ -	   fi \ -	&& echo "Deleting XLSX I/O example files..." \ -	&& rm $(ibdir)/example_xlsxio_* \ -	&& echo "XLSX I/O $(xlsxio-version)" > $@ +	       -DMINIZIP_INCLUDE_DIRS=$(iidir)) +	echo "Correcting internal linking of XLSX I/O executables..." +	if [ "x$(on_mac_os)" = xyes ]; then +	  for f in $(ibdir)/xlsxio_* $(ildir)/libxlsxio_*.dylib; do +	    install_name_tool -change  libxlsxio_read.dylib \ +	                      $(ildir)/libxlsxio_read.dylib $$f +	    install_name_tool -change  libxlsxio_write.dylib \ +	                      $(ildir)/libxlsxio_write.dylib $$f +	  done +	else +	  for f in $(ibdir)/xlsxio_* $(ildir)/libxlsxio_*.so; do +	     patchelf --set-rpath $(ildir) $$f +	  done +	fi +	echo "Deleting XLSX I/O example files..." +	rm $(ibdir)/example_xlsxio_* +	echo "XLSX I/O $(xlsxio-version)" > $@ @@ -1272,11 +1260,11 @@ $(ibidir)/xlsxio: $(ibidir)/cmake \  # (`ftp.dante.de'), however, it is far too slow (when I tested it). The  # `rit.edu' server seems to be a good alternative (given the importance of  # NY on the internet infrastructure). -tlmirror=http://mirrors.rit.edu/CTAN/systems/texlive/tlnet +texlive-url=http://mirrors.rit.edu/CTAN/systems/texlive/tlnet +$(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf -# The core TeX Live system. -$(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf \ -                               $(tdir)/install-tl-unx.tar.gz +	tarball=install-tl-unx.tar.gz +	$(call import-source, $(texlive-url), NO-CHECK-SUM)          # Unpack, enter the directory, and install based on the given          # configuration (prerequisite of this rule). @@ -1318,7 +1306,7 @@ $(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf \          # TeXLive using that. The old tarball will be preserved, but will          # have an '-OLD' suffix after it.  	if ./install-tl --profile=texlive.conf -repository \ -	                $(tlmirror) 2> log.txt; then +	                $(texlive-url) 2> log.txt; then            # Put a symbolic link of the TeX Live executables in `ibdir' to            # avoid all the complexities of its sub-directories and additions @@ -1368,7 +1356,7 @@ $(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf \  	          $$topdir/reproduce/software/config/texlive.conf \  	          > texlive.conf  	      if ./install-tl --profile=texlive.conf -repository \ -	                      $(tlmirror); then +	                      $(texlive-url); then  	        ln -fs $(idir)/texlive/maneage/bin/*/* $(ibdir)/  	        echo "TeX Live is ready." > $@  	      else @@ -1399,8 +1387,7 @@ $(itidir)/texlive-ready-tlmgr: reproduce/software/config/texlive.conf \  # 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.  $(itidir)/texlive: reproduce/software/config/texlive-packages.conf \ -                   $(itidir)/texlive-ready-tlmgr \ -                   $(forbiber) +                   $(itidir)/texlive-ready-tlmgr          # To work with TeX live installation, we'll need the internet.  	@res=$$(cat $(itidir)/texlive-ready-tlmgr) @@ -1413,7 +1400,7 @@ $(itidir)/texlive: reproduce/software/config/texlive-packages.conf \            # Before checking LaTeX packages, update tlmgr itself.  	  tlmgr option backupdir $$backupdir -	  tlmgr -repository $(tlmirror) update --self +	  tlmgr -repository $(texlive-url) update --self            # Install all the extra necessary packages. If LaTeX complains            # about not finding a command/file/what-ever/XXXXXX, simply run diff --git a/reproduce/software/make/python.mk b/reproduce/software/make/python.mk index eef8279..ccfbc72 100644 --- a/reproduce/software/make/python.mk +++ b/reproduce/software/make/python.mk @@ -3,8 +3,12 @@  # ------------------------------------------------------------------------  #                      !!!!! IMPORTANT NOTES !!!!!  # -# This Makefile will be run by the initial `./project configure' script. It -# is not included into the reproduction pipe after that. +# This Makefile will be loaded into 'high-level.mk', which is called by the +# `./project configure' script. It is not included into the project +# afterwards. +# +# This Makefile contains instructions to build all the Python-related +# software within the project.  #  # ------------------------------------------------------------------------  # @@ -52,274 +56,52 @@ python-major-version = $(shell echo $(python-version) | awk 'BEGIN{FS="."} \ -# Tarballs -# -------- -# -# All the necessary tarballs are defined and prepared with this rule. -# -# Note that we want the tarballs to follow the convention of NAME-VERSION -# before the `tar.XX' prefix. For those programs that don't follow this -# convention, but include the name/version in their tarball names with -# another format, we'll do the modification before the download so the -# downloaded file has our desired format. -pytarballs = $(foreach t, asn1crypto-$(asn1crypto-version).tar.gz \ -                        asteval-$(asteval-version).tar.gz \ -                        astroquery-$(astroquery-version).tar.gz \ -                        astropy-$(astropy-version).tar.gz \ -                        beautifulsoup4-$(beautifulsoup4-version).tar.gz \ -                        certifi-$(certifi-version).tar.gz \ -                        cffi-$(cffi-version).tar.gz \ -                        chardet-$(chardet-version).tar.gz \ -                        corner-$(corner-version).tar.gz \ -                        cryptography-$(cryptography-version).tar.gz \ -                        cycler-$(cycler-version).tar.gz \ -                        cython-$(cython-version).tar.gz \ -                        eigency-$(eigency-version).tar.gz \ -                        emcee-$(emcee-version).tar.gz \ -                        esutil-$(esutil-version).tar.gz \ -                        entrypoints-$(entrypoints-version).tar.gz \ -                        flake8-$(flake8-version).tar.gz \ -                        future-$(future-version).tar.gz \ -                        galsim-$(galsim-version).tar.gz \ -                        h5py-$(h5py-version).tar.gz \ -                        html5lib-$(html5lib-version).tar.gz \ -                        idna-$(idna-version).tar.gz \ -                        jeepney-$(jeepney-version).tar.gz \ -                        kiwisolver-$(kiwisolver-version).tar.gz \ -                        keyring-$(keyring-version).tar.gz \ -                        libffi-$(libffi-version).tar.gz \ -                        lmfit-$(lmfit-version).tar.gz \ -                        lsstdesccoord-$(lsstdesccoord-version).tar.gz \ -                        matplotlib-$(matplotlib-version).tar.gz \ -                        mpi4py-$(mpi4py-version).tar.gz \ -                        mpmath-$(mpmath-version).tar.gz \ -                        numpy-$(numpy-version).zip \ -                        pkgconfig-$(pypkgconfig-version).tar.gz \ -                        pip-$(pip-version).tar.gz \ -                        pexpect-$(pexpect-version).tar.gz \ -                        pybind11-$(pybind11-version).tar.gz \ -                        pycodestyle-$(pycodestyle-version).tar.gz \ -                        pycparser-$(pycparser-version).tar.gz \ -                        pyflakes-$(pyflakes-version).tar.gz \ -                        python-$(python-version).tar.gz \ -                        python-dateutil-$(python-dateutil-version).tar.gz \ -                        pyparsing-$(pyparsing-version).tar.gz \ -                        pyyaml-$(pyyaml-version).tar.gz \ -                        requests-$(requests-version).tar.gz \ -                        scipy-$(scipy-version).tar.gz \ -                        secretstorage-$(secretstorage-version).tar.gz \ -                        setuptools-$(setuptools-version).zip \ -                        setuptools_scm-$(setuptools_scm-version).tar.gz \ -                        sip_tpv-$(sip_tpv-version).tar.gz \ -                        six-$(six-version).tar.gz \ -                        soupsieve-$(soupsieve-version).tar.gz \ -                        sympy-$(sympy-version).tar.gz \ -                        uncertainties-$(uncertainties-version).tar.gz \ -                        urllib3-$(urllib3-version).tar.gz \ -                        webencodings-$(webencodings-version).tar.gz \ -                        virtualenv-$(virtualenv-version).tar.gz \ -                      , $(tdir)/$(t) ) -pytopurl=https://files.pythonhosted.org/packages -$(pytarballs): $(tdir)/%: - -        # Convenience variable -        # -------------------- -        # -        # `n' is just for convenience and to avoid having to repeat the -        # package tarball name in the conditional to find its URL. -        # -        # For some packages (for example `python-dateutil', or those with -        # a number or dash in their name), we need special consideration -        # because the tokenization above will produce `python' as the -        # first string. -	@if [ $* = python-dateutil-$(python-dateutil-version).tar.gz ]; then -	  n=dateutil - -        # elif [ $* = strange-tarball5name-version.tar.gz ]; then -        #  n=strange5-name -	else -          # Remove the version numbers and suffix from the tarball name so -          # we can search more easily only with the program name. This -          # requires the first character of the version to be a digit: -          # packages such as `foo' and `foo-3' will not be distinguished, -          # but `foo' and `foo2' will be distinguished. -	  n=$$(echo $* | sed -e's/-[0-9]/ /' -e's/\./ /g' \ -	               | awk '{print $$1}' ) - -	fi - -        # Set the top download link of the requested tarball. The ones -        # that have non-standard filenames (differing from our archived -        # tarball names) are treated first, then the standard ones. -	mergenames=1 -	if [ $$n = cython ]; then -	  mergenames=0 -	  c=$(cython-checksum) -	  hash=36/da/fcb979fc8cb486a67a013d6aefefbb95a3e19e67e49dff8a35e014046c5e -	  h=$(pytopurl)/$$hash/Cython-$(cython-version).tar.gz -	elif [ $$n = galsim ]; then -	  mergenames=0 -	  c=$(galsim-checksum) -	  hash=8f/3b/bbc7cff7590d3624d528564f08745f071e316c67fce154ad38210833c103 -	  h=$(pytopurl)/$$hash/GalSim-$(galsim-version).tar.gz -	elif [ $$n = lsstdesccoord ]; then -	  mergenames=0 -	  c=$(lsstdesccoord-checksum) -	  hash=9d/39/ad17697571c9aed36d20ed9ae0a135e3a734fb7f15a8605f92bf27c3b02c -	  h=$(pytopurl)/$$hash/LSSTDESC.Coord-$(lsstdesccoord-version).tar.gz -	elif [ $$n = python ]; then -	  mergenames=0 -	  c=$(python-checksum) -	  h=https://www.python.org/ftp/python/$(python-version)/Python-$(python-version).tgz -	elif [ $$n = pyyaml ]; then -	  mergenames=0 -	  c=$(pyyaml-checksum) -	  hash=9f/2c/9417b5c774792634834e730932745bc09a7d36754ca00acf1ccd1ac2594d -	  h=$(pytopurl)/$$hash/PyYAML-$(pyyaml-version).tar.gz -	elif [ $$n = libffi ]; then -	  mergenames=0 -	  c=$(libffi-checksum) -	  h=ftp://sourceware.org/pub/libffi/libffi-$(libffi-version).tar.gz -	elif [ $$n = secretstorage  ]; then -	  mergenames=0 -	  c=$(secretstorage-checksum) -	  hash=a6/89/df343dbc2957a317127e7ff2983230dc5336273be34f2e1911519d85aeb5 -	  h=$(pytopurl)/$$hash/SecretStorage-$(secretstorage-version).tar.gz -	elif [ $$n = asn1crypto     ]; then h=fc/f1/8db7daa71f414ddabfa056c4ef792e1461ff655c2ae2928a2b675bfed6b4; c=$(asn1crypto-checksum) -	elif [ $$n = asteval        ]; then h=50/3f/29b7935c6dc09ee96dc347edc66c57e8ef68d595dd35b763a36a117acc8c; c=$(asteval-checksum) -	elif [ $$n = astroquery     ]; then h=e2/af/a3cd3b30745832a0e81f5f13327234099aaf5d03b7979ac947a888e68e91; c=$(astroquery-checksum) -	elif [ $$n = astropy        ]; then h=de/96/7feaca4b9be134128838395a9d924ea0b389ed4381702dcd9d11ae31789f; c=$(astropy-checksum) -	elif [ $$n = beautifulsoup4 ]; then h=80/f2/f6aca7f1b209bb9a7ef069d68813b091c8c3620642b568dac4eb0e507748; c=$(beautifulsoup4-checksum) -	elif [ $$n = certifi        ]; then h=55/54/3ce77783acba5979ce16674fc98b1920d00b01d337cfaaf5db22543505ed; c=$(certifi-checksum) -	elif [ $$n = cffi           ]; then h=64/7c/27367b38e6cc3e1f49f193deb761fe75cda9f95da37b67b422e62281fcac; c=$(cffi-checksum) -	elif [ $$n = chardet        ]; then h=fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d; c=$(chardet-checksum) -	elif [ $$n = corner         ]; then h=65/af/a7ba022f2d5787f51db91b5550cbe8e8c40a6eebd8f15119e743a09a9c19; c=$(corner-checksum) -	elif [ $$n = cryptography   ]; then h=07/ca/bc827c5e55918ad223d59d299fff92f3563476c3b00d0a9157d9c0217449; c=$(cryptography-checksum) -	elif [ $$n = cycler         ]; then h=c2/4b/137dea450d6e1e3d474e1d873cd1d4f7d3beed7e0dc973b06e8e10d32488; c=$(cycler-checksum) -	elif [ $$n = eigency        ]; then h=fb/6e/bc4359fbfb0bb0b588ec328251b0d0836bdd7c0a4c568959ea06df023e18; c=$(eigency-checksum) -	elif [ $$n = emcee          ]; then h=f0/c0/cd433f2aedeef9b1e5ed7d236c82564f7518fe7fe2238fa141ea9ce08e73; c=$(emcee-checksum) -	elif [ $$n = entrypoints    ]; then h=b4/ef/063484f1f9ba3081e920ec9972c96664e2edb9fdc3d8669b0e3b8fc0ad7c; c=$(entrypoints-checksum) -	elif [ $$n = esutil         ]; then h=5b/91/77e38282fd3d47b55e351544ab179eb209b309a8d2d40f8cdb6241beda00; c=$(esutil-checksum) -	elif [ $$n = flake8         ]; then h=8d/a7/99222c9200af533c1ecb1120d99adbd1c033b57296ac5cb39d121db007a8; c=$(flake8-checksum) -	elif [ $$n = future         ]; then h=3f/bf/57733d44afd0cf67580658507bd11d3ec629612d5e0e432beb4b8f6fbb04; c=$(future-checksum) -	elif [ $$n = h5py           ]; then h=43/27/a6e7dcb8ae20a4dbf3725321058923fec262b6f7835179d78ccc8d98deec; c=$(h5py-checksum) -	elif [ $$n = html5lib       ]; then h=85/3e/cf449cf1b5004e87510b9368e7a5f1acd8831c2d6691edd3c62a0823f98f; c=$(html5lib-checksum) -	elif [ $$n = idna           ]; then h=ad/13/eb56951b6f7950cadb579ca166e448ba77f9d24efc03edd7e55fa57d04b7; c=$(idna-checksum) -	elif [ $$n = jeepney        ]; then h=16/1d/74adf3b164a8d19a60d0fcf706a751ffa2a1eaa8e5bbb1b6705c92a05263; c=$(jeepney-checksum) -	elif [ $$n = keyring        ]; then h=15/88/c6ce9509438bc02d54cf214923cfba814412f90c31c95028af852b19f9b2; c=$(keyring-checksum) -	elif [ $$n = kiwisolver     ]; then h=31/60/494fcce70d60a598c32ee00e71542e52e27c978e5f8219fae0d4ac6e2864; c=$(kiwisolver-checksum) -	elif [ $$n = lmfit          ]; then h=59/6e/117794cf85b7345361877e49245870490ae438f1981dea3c6af1316b30e7; c=$(lmfit-checksum) -	elif [ $$n = matplotlib     ]; then h=12/d1/7b12cd79c791348cb0c78ce6e7d16bd72992f13c9f1e8e43d2725a6d8adf; c=$(matplotlib-checksum) -	elif [ $$n = mpi4py         ]; then h=04/f5/a615603ce4ab7f40b65dba63759455e3da610d9a155d4d4cece1d8fd6706; c=$(mpi4py-checksum) -	elif [ $$n = mpmath         ]; then h=ca/63/3384ebb3b51af9610086b23ea976e6d27d6d97bf140a76a365bd77a3eb32; c=$(mpmath-checksum) -	elif [ $$n = numpy          ]; then h=ac/36/325b27ef698684c38b1fe2e546e2e7ef9cecd7037bcdb35c87efec4356af; c=$(numpy-checksum) -	elif [ $$n = pexpect        ]; then h=1c/b1/362a0d4235496cb42c33d1d8732b5e2c607b0129ad5fdd76f5a583b9fcb3; c=$(pexpect-checksum) -	elif [ $$n = pip            ]; then h=4c/4d/88bc9413da11702cbbace3ccc51350ae099bb351febae8acc85fec34f9af; c=$(pip-checksum) -	elif [ $$n = pkgconfig      ]; then h=6e/a9/ff67ef67217dfdf2aca847685fe789f82b931a6957a3deac861297585db6; c=$(pypkgconfig-checksum) -	elif [ $$n = pybind11       ]; then h=aa/91/deb6743e79e22ab01502296570b39b8404f10cc507a6692d612a7fee8d51; c=$(pybind11-checksum) -	elif [ $$n = pycodestyle    ]; then h=1c/d1/41294da5915f4cae7f4b388cea6c2cd0d6cd53039788635f6875dfe8c72f; c=$(pycodestyle-checksum) -	elif [ $$n = pycparser      ]; then h=68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a; c=$(pycparser-checksum) -	elif [ $$n = pyflakes       ]; then h=52/64/87303747635c2988fcaef18af54bfdec925b6ea3b80bcd28aaca5ba41c9e; c=$(pyflakes-checksum) -	elif [ $$n = pyparsing      ]; then h=b9/b8/6b32b3e84014148dcd60dd05795e35c2e7f4b72f918616c61fdce83d27fc; c=$(pyparsing-checksum) -	elif [ $$n = dateutil       ]; then h=ad/99/5b2e99737edeb28c71bcbec5b5dda19d0d9ef3ca3e92e3e925e7c0bb364c; c=$(python-dateutil-checksum) -	elif [ $$n = requests       ]; then h=52/2c/514e4ac25da2b08ca5a464c50463682126385c4272c18193876e91f4bc38; c=$(requests-checksum) -	elif [ $$n = scipy          ]; then h=ee/5b/5afcd1c46f97b3c2ac3489dbc95d6ca28eacf8e3634e51f495da68d97f0f; c=$(scipy-checksum) -	elif [ $$n = secretstorage  ]; then h=a6/89/df343dbc2957a317127e7ff2983230dc5336273be34f2e1911519d85aeb5; c=$(secretstorage-checksum) -	elif [ $$n = setuptools     ]; then h=11/0a/7f13ef5cd932a107cd4c0f3ebc9d831d9b78e1a0e8c98a098ca17b1d7d97; c=$(setuptools-checksum) -	elif [ $$n = setuptools_scm ]; then h=83/44/53cad68ce686585d12222e6769682c4bdb9686808d2739671f9175e2938b; c=$(setuptools_scm-checksum) -	elif [ $$n = six            ]; then h=dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca; c=$(six-checksum) -	elif [ $$n = sip_tpv        ]; then h=27/93/a973aab2a3bf0c12cb385611819710921e13b090304c6bd015026cf9c502; c=$(sip_tpv-checksum) -	elif [ $$n = soupsieve      ]; then h=0c/52/e9088bb9b96e2d39fc3b33fcda5b4fde9d71473536ac660a1ca9a0958a2f; c=$(soupsieve-checksum) -	elif [ $$n = sympy          ]; then h=54/2e/6adb11fe599d4cfb7e8833753350ac51aa2c0603c226b36f9051cc9d2425; c=$(sympy-checksum) -	elif [ $$n = uncertainties  ]; then h=2a/c2/babbe5b16141859dd799ed31c03987100a7b6d0ca7c0ed4429c96ce60fdf; c=$(uncertainties-checksum) -	elif [ $$n = urllib3        ]; then h=b1/53/37d82ab391393565f2f831b8eedbffd57db5a718216f82f1a8b4d381a1c1; c=$(urllib3-checksum) -	elif [ $$n = virtualenv     ]; then h=51/aa/c395a6e6eaaedfa5a04723b6446a1df783b16cca6fec66e671cede514688; c=$(virtualenv-checksum) -	elif [ $$n = webencodings   ]; then h=0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47; c=$(webencodings-checksum) -#	elif [ $$n = strange5-name  ]; then h=XXXXX; c=$(XXXXX-checksum) -	else -	  echo; echo; echo; -	  echo "'$$n' not recognized as a dependency name to download." -	  echo; echo; echo; -	  exit 1 -	fi - -        # Download the requested tarball. Note that some packages may not -        # follow our naming convention (where the package name is merged -        # with its version number). In such cases, `w' will be the full -        # address, not just the top directory address. But since we are -        # storing all the tarballs in one directory, we want it to have -        # the same naming convention, so we'll download it to a temporary -        # name, then rename that. -	rm -f "$@.unchecked" -	if [ -f $(DEPENDENCIES-DIR)/$* ]; then -	  cp $(DEPENDENCIES-DIR)/$* "$@.unchecked" -	else -	  if [ $$mergenames = 1 ]; then  tarballurl=$(pytopurl)/$$h/"$*" -	  else                           tarballurl=$$h -	  fi - -          # Download using the script specially defined for this job. -	  touch $(lockdir)/download -	  downloader="wget --no-use-server-timestamps -O" -	  $(downloadwrapper) "$$downloader" $(lockdir)/download \ -	                     $$tarballurl "$@.unchecked" "$(backupservers)" -	fi - -        # Make sure this is the expected tarball. Note that we now have a -        # controlled `sha512sum' build (as part of GNU Coreutils). So we -        # don't need to check its existance like `basic.mk'. -	checksum=$$(sha512sum "$@.unchecked" | awk '{print $$1}') -	if [ x"$$checksum" = x"$$c" ]; then -	  mv "$@.unchecked" "$@" -	else -	  echo "ERROR: Non-matching checksum for '$*'." -	  echo "Checksum should be: $$c" -	  echo "Checksum is:        $$checksum" -	  exit 1 -	fi - - - - -  # Necessary programs and libraries  # --------------------------------  #  # While this Makefile is for Python programs, in some cases, we need  # certain programs (like Python itself), or libraries for the modules. -$(ibidir)/libffi: $(tdir)/libffi-$(libffi-version).tar.gz +$(ibidir)/libffi-$(libffi-version): +        # Prepare the source. +	tarball=libffi-$(libffi-version).tar.gz +	$(call import-source, $(libffi-url), $(libffi-checksum)) + +        # Build libffi. +	$(call gbuild, libffi-$(libffi-version), , \ +                       CFLAGS="-DNO_JAVA_RAW_API=1")          # On some Fedora systems, libffi installs in `lib64', not          # `lib'. This will cause problems when building setuptools          # later. To fix this problem, we'll first check if this has indeed          # happened (it exists under `lib64', but not under `lib'). If so,          # we'll put a copy of the installed libffi libraries in `lib'. -	$(call gbuild, libffi-$(libffi-version), , \ -                       CFLAGS="-DNO_JAVA_RAW_API=1") \ -	&& if [ -f $(idir)/lib64/libffi.a ] \ -	      && ! [ -f $(idir)/lib/libffi.a ]; then \ -	        cp $(idir)/lib64/libffi* $(ildir)/; \ -	   fi \ -	&& echo "Libffi $(libffi-version)" > $@ - -$(ibidir)/python: $(ibidir)/libffi \ -                  $(tdir)/python-$(python-version).tar.gz +	if [ -f $(idir)/lib64/libffi.a ] && ! [ -f $(idir)/lib/libffi.a ]; then +	  cp $(idir)/lib64/libffi* $(ildir)/ +	fi +	echo "Libffi $(libffi-version)" > $@ + +$(ibidir)/python-$(python-version): $(ibidir)/libffi-$(libffi-version) + +        # Download the source. +	tarball=python-$(python-version).tar.gz +	$(call import-source, $(python-url), $(python-checksum)) +          # 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; \ +	if [ x$(on_mac_os) = xyes ]; then +	  export CC=clang +	  export CXX=clang++ +	fi  	$(call gbuild, Python-$(python-version),, \  	       --without-ensurepip \  	       --with-system-ffi \ -	       --enable-shared) \ -	&& 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) \ -	&& rm -rf $(ipydir) \ -	&& mkdir $(ipydir) \ -	&& echo "Python $(python-version)" > $@ +	       --enable-shared, -j$(numthreads)) +	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) +	rm -rf $(ipydir) +	mkdir $(ipydir) +	echo "Python $(python-version)" > $@ @@ -343,22 +125,22 @@ $(ibidir)/python: $(ibidir)/libffi \  #   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) $(word 1,$(filter $(tdir)/%,$^)); then \ -	   echo; echo "Tar error"; exit 1; \ -	 fi; \ -	 cd $(2); \ -	 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 \ -	 && if type pyhook_after &>/dev/null; then pyhook_after; fi \ -	 && cd .. \ -	 && rm -rf $(2) \ -	 && echo "$(4)" > $@ +	if ! $(1) $(tdir)/$$tarball; then \ +	  echo; echo "Tar error"; exit 1; \ +	fi; \ +	cd $(2); \ +	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; \ +	if type pyhook_after &>/dev/null; then pyhook_after; fi; \ +	cd ..; \ +	rm -rf $(2); \ +	echo "$(4)" > $@ @@ -368,31 +150,40 @@ pybuild = cd $(ddir); rm -rf $(2); \  # ---------------  #  # All the necessary Python modules go here. -$(ipydir)/asn1crypto: $(ipydir)/setuptools \ -                      $(tdir)/asn1crypto-$(asn1crypto-version).tar.gz +$(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), , \  	                Asn1crypto $(asn1crypto-version)) -$(ipydir)/asteval: $(ipydir)/numpy \ -                   $(tdir)/asteval-$(asteval-version).tar.gz +$(ipydir)/asteval-$(asteval-version): $(ipydir)/numpy-$(numpy-version) +	tarball=asteval-$(asteval-version).tar.gz +	$(call import-source, $(asteval-url), $(asteval-checksum))  	$(call pybuild, tar xf, asteval-$(asteval-version), , \  	                ASTEVAL $(asteval-version)) -$(ipydir)/astroquery: $(ipydir)/astropy \ -                      $(ipydir)/keyring \ -                      $(ipydir)/requests \ -                      $(tdir)/astroquery-$(astroquery-version).tar.gz -	$(call pybuild, tar xf, astroquery-$(astroquery-version), ,\ +$(ipydir)/astroquery-$(astroquery-version): \ +                     $(ipydir)/astropy-$(astropy-version) \ +                     $(ipydir)/keyring-$(keyring-version) \ +                     $(ipydir)/requests-$(requests-version) +	tarball=astroquery-$(astroquery-version).tar.gz +	$(call import-source, $(astroquery-url), $(astroquery-checksum)) +	$(call pybuild, tar xf, astroquery-$(astroquery-version), , \  	                Astroquery $(astroquery-version)) -$(ipydir)/astropy: $(ipydir)/h5py \ -                   $(ibidir)/expat \ -                   $(ipydir)/scipy \ -                   $(ipydir)/numpy \ -                   $(ipydir)/pyyaml \ -                   $(ipydir)/html5lib \ -                   $(ipydir)/beautifulsoup4 \ -                   $(tdir)/astropy-$(astropy-version).tar.gz +$(ipydir)/astropy-$(astropy-version): \ +                  $(ipydir)/h5py-$(h5py-version) \ +                  $(ibidir)/expat-$(expat-version) \ +                  $(ipydir)/scipy-$(scipy-version) \ +                  $(ipydir)/numpy-$(numpy-version) \ +                  $(ipydir)/pyyaml-$(pyyaml-version) \ +                  $(ipydir)/html5lib-$(html5lib-version) \ +                  $(ipydir)/beautifulsoup4-$(beautifulsoup4-version) + +        # Download the source. +	tarball=astropy-$(astropy-version).tar.gz +	$(call import-source, $(astropy-url), $(astropy-checksum)) +          # Currently, when the Expat library is already built in a project          # (for example as a dependency of another program), Astropy's          # internal building of Expat will conflict with the project's. So @@ -404,107 +195,133 @@ $(ipydir)/astropy: $(ipydir)/h5py \  	  echo "[build]"            >> setup.cfg  	  echo "use_system_expat=1" >> setup.cfg  	} -	$(call pybuild, tar xf, astropy-$(astropy-version)) \ -	&& cp $(dtexdir)/astropy.tex $(ictdir)/ \ -	&& echo "Astropy $(astropy-version) \citep{astropy2013,astropy2018}" > $@ - -$(ipydir)/beautifulsoup4: $(ipydir)/soupsieve \ -                          $(tdir)/beautifulsoup4-$(beautifulsoup4-version).tar.gz -	$(call pybuild, tar xf, beautifulsoup4-$(beautifulsoup4-version), ,\ +	$(call pybuild, tar xf, astropy-$(astropy-version)) +	cp $(dtexdir)/astropy.tex $(ictdir)/ +	echo "Astropy $(astropy-version) \citep{astropy2013,astropy2018}" > $@ + +$(ipydir)/beautifulsoup4-$(beautifulsoup4-version): \ +                         $(ipydir)/soupsieve-$(soupsieve-version) +	tarball=beautifulsoup4-$(beautifulsoup4-version).tar.gz +	$(call import-source, $(beautifulsoup4-url), $(beautifulsoup4-checksum)) +	$(call pybuild, tar xf, beautifulsoup4-$(beautifulsoup4-version), , \  	                BeautifulSoup $(beautifulsoup4-version)) -$(ipydir)/certifi: $(ipydir)/setuptools \ -                   $(tdir)/certifi-$(certifi-version).tar.gz -	$(call pybuild, tar xf, certifi-$(certifi-version), ,\ +$(ipydir)/certifi-$(certifi-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=certifi-$(certifi-version).tar.gz +	$(call import-source, $(certifi-url), $(certifi-checksum)) +	$(call pybuild, tar xf, certifi-$(certifi-version), , \  	                Certifi $(certifi-version)) -$(ipydir)/cffi: $(ibidir)/libffi \ -                $(ipydir)/pycparser \ -                $(tdir)/cffi-$(cffi-version).tar.gz -	$(call pybuild, tar xf, cffi-$(cffi-version), ,\ -	                cffi $(cffi-version)) - -$(ipydir)/chardet: $(ipydir)/setuptools \ -                   $(tdir)/chardet-$(chardet-version).tar.gz -	$(call pybuild, tar xf, chardet-$(chardet-version), ,\ +$(ipydir)/cffi-$(cffi-version): \ +               $(ibidir)/libffi-$(libffi-version) \ +               $(ipydir)/pycparser-$(pycparser-version) +	tarball=cffi-$(cffi-version).tar.gz +	$(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) +	tarball=chardet-$(chardet-version).tar.gz +	$(call import-source, $(chardet-url), $(chardet-checksum)) +	$(call pybuild, tar xf, chardet-$(chardet-version), , \  	                Chardet $(chardet-version)) -$(ipydir)/corner: $(ipydir)/matplotlib \ -                  $(tdir)/corner-$(corner-version).tar.gz -	$(call pybuild, tar xf, corner-$(corner-version), ,\ -	                Corner $(corner-version)) \ -	&& cp $(dtexdir)/corner.tex $(ictdir)/ \ -	&& echo "Corner $(corner-version) \citep{corner}" > $@ - -$(ipydir)/cryptography: $(ipydir)/cffi \ -                        $(ipydir)/asn1crypto \ -                        $(tdir)/cryptography-$(cryptography-version).tar.gz -	$(call pybuild, tar xf, cryptography-$(cryptography-version), ,\ +$(ipydir)/corner-$(corner-version): $(ipydir)/matplotlib-$(matplotlib-version) +	tarball=corner-$(corner-version).tar.gz +	$(call import-source, $(corner-url), $(corner-checksum)) +	$(call pybuild, tar xf, corner-$(corner-version), , \ +	                Corner $(corner-version)) +	cp $(dtexdir)/corner.tex $(ictdir)/ +	echo "Corner $(corner-version) \citep{corner}" > $@ + +$(ipydir)/cryptography-$(cryptography-version): \ +                       $(ipydir)/cffi-$(cffi-version) \ +                       $(ipydir)/asn1crypto-$(asn1crypto-version) +	tarball=cryptography-$(cryptography-version).tar.gz +	$(call import-source, $(cryptography-url), $(cryptography-checksum)) +	$(call pybuild, tar xf, cryptography-$(cryptography-version), , \  	                Cryptography $(cryptography-version)) -$(ipydir)/cycler: $(ipydir)/six \ -                  $(tdir)/cycler-$(cycler-version).tar.gz -	$(call pybuild, tar xf, cycler-$(cycler-version), ,\ +$(ipydir)/cycler-$(cycler-version): $(ipydir)/six-$(six-version) +	tarball=cycler-$(cycler-version).tar.gz +	$(call import-source, $(cycler-url), $(cycler-checksum)) +	$(call pybuild, tar xf, cycler-$(cycler-version), , \  	                Cycler $(cycler-version)) -$(ipydir)/cython: $(ipydir)/setuptools \ -                  $(tdir)/cython-$(cython-version).tar.gz -	$(call pybuild, tar xf, Cython-$(cython-version)) \ -	&& cp $(dtexdir)/cython.tex $(ictdir)/ \ -	&& echo "Cython $(cython-version) \citep{cython2011}" > $@ - -$(ipydir)/esutil: $(ipydir)/numpy \ -                  $(tdir)/esutil-$(esutil-version).tar.gz -	$(call pybuild, tar xf, esutil-$(esutil-version), ,\ +$(ipydir)/cython-$(cython-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=cython-$(cython-version).tar.gz +	$(call import-source, $(cython-url), $(cython-checksum)) +	$(call pybuild, tar xf, Cython-$(cython-version)) +	cp $(dtexdir)/cython.tex $(ictdir)/ +	echo "Cython $(cython-version) \citep{cython2011}" > $@ + +$(ipydir)/esutil-$(esutil-version): $(ipydir)/numpy-$(numpy-version) +	tarball=esutil-$(esutil-version).tar.gz +	$(call import-source, $(esutil-url), $(esutil-checksum)) +	$(call pybuild, tar xf, esutil-$(esutil-version), , \  	                esutil $(esutil-version)) -$(ipydir)/eigency: $(ibidir)/eigen \ -                   $(tdir)/eigency-$(eigency-version).tar.gz -	$(call pybuild, tar xf, eigency-$(eigency-version), ,\ +$(ipydir)/eigency-$(eigency-version): \ +                  $(ipydir)/numpy-$(numpy-version) \ +                  $(ibidir)/eigen-$(eigen-version) \ +                  $(ipydir)/cython-$(cython-version) +	tarball=eigency-$(eigency-version).tar.gz +	$(call import-source, $(eigency-url), $(eigency-checksum)) +	$(call pybuild, tar xf, eigency-$(eigency-version), , \  	                eigency $(eigency-version)) -$(ipydir)/emcee: $(ipydir)/numpy \ -                 $(ipydir)/setuptools_scm \ -                 $(tdir)/emcee-$(emcee-version).tar.gz -	$(call pybuild, tar xf, emcee-$(emcee-version), ,\ +$(ipydir)/emcee-$(emcee-version): \ +                $(ipydir)/numpy-$(numpy-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: $(ipydir)/setuptools \ -                       $(tdir)/entrypoints-$(entrypoints-version).tar.gz -	$(call pybuild, tar xf, entrypoints-$(entrypoints-version), ,\ +$(ipydir)/entrypoints-$(entrypoints-version): \ +                      $(ipydir)/setuptools-$(setuptools-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)/flake8: $(ipydir)/pyflakes \ -                  $(ipydir)/pycodestyle \ -                  $(tdir)/flake8-$(flake8-version).tar.gz -	$(call pybuild, tar xf, flake8-$(flake8-version), ,\ +$(ipydir)/flake8-$(flake8-version): \ +                 $(ipydir)/pyflakes-$(pyflakes-version) \ +                 $(ipydir)/pycodestyle-$(pycodestyle-version) +	tarball=flake8-$(flake8-version).tar.gz +	$(call import-source, $(flake8-url), $(flake8-checksum)) +	$(call pybuild, tar xf, flake8-$(flake8-version), , \  	                Flake8 $(flake8-version)) -$(ipydir)/future: $(ipydir)/setuptools \ -                  $(tdir)/future-$(future-version).tar.gz -	$(call pybuild, tar xf, future-$(future-version), ,\ +$(ipydir)/future-$(future-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=future-$(future-version).tar.gz +	$(call import-source, $(future-url), $(future-checksum)) +	$(call pybuild, tar xf, future-$(future-version), , \  	                Future $(future-version)) -$(ipydir)/galsim: $(ipydir)/future \ -                  $(ipydir)/astropy \ -                  $(ipydir)/eigency \ -                  $(ipydir)/pybind11 \ -                  $(ipydir)/lsstdesccoord \ -                  $(tdir)/galsim-$(galsim-version).tar.gz -	$(call pybuild, tar xf, GalSim-$(galsim-version)) \ -	&& cp $(dtexdir)/galsim.tex $(ictdir)/ \ -	&& echo "Galsim $(galsim-version) \citep{galsim}" > $@ - -$(ipydir)/h5py: $(ipydir)/six \ -                $(ibidir)/hdf5 \ -                $(ipydir)/numpy \ -                $(ipydir)/cython \ -                $(ipydir)/mpi4py \ -                $(ipydir)/pypkgconfig \ -                $(tdir)/h5py-$(h5py-version).tar.gz -	export HDF5_MPI=ON; \ -	export HDF5_DIR=$(ildir); \ -	$(call pybuild, tar xf, h5py-$(h5py-version), ,\ +$(ipydir)/galsim-$(galsim-version): \ +                 $(ipydir)/future-$(future-version) \ +                 $(ipydir)/astropy-$(astropy-version) \ +                 $(ipydir)/eigency-$(eigency-version) \ +                 $(ipydir)/pybind11-$(pybind11-version) \ +                 $(ipydir)/lsstdesccoord-$(lsstdesccoord-version) +	tarball=galsim-$(galsim-version).tar.gz +	$(call import-source, $(galsim-url), $(galsim-checksum)) +	$(call pybuild, tar xf, GalSim-$(galsim-version)) +	cp $(dtexdir)/galsim.tex $(ictdir)/ +	echo "Galsim $(galsim-version) \citep{galsim}" > $@ + +$(ipydir)/h5py-$(h5py-version): \ +               $(ipydir)/six-$(six-version) \ +               $(ibidir)/hdf5-$(hdf5-version) \ +               $(ipydir)/numpy-$(numpy-version) \ +               $(ipydir)/cython-$(cython-version) \ +               $(ipydir)/mpi4py-$(mpi4py-version) \ +               $(ipydir)/pypkgconfig-$(pypkgconfig-version) +	export HDF5_MPI=ON +	export HDF5_DIR=$(ildir) +	tarball=h5py-$(h5py-version).tar.gz +	$(call import-source, $(h5py-url), $(h5py-checksum)) +	$(call pybuild, tar xf, h5py-$(h5py-version), , \  	                h5py $(h5py-version))  # `healpy' is actually installed as part of the HEALPix package. It will be @@ -514,231 +331,283 @@ $(ipydir)/h5py: $(ipydir)/six \  # 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: $(ibidir)/healpix +$(ipydir)/healpy-$(healpy-version): $(ibidir)/healpix-$(healpy-version)  	touch $@ -$(ipydir)/html5lib: $(ipydir)/six \ -                    $(ipydir)/webencodings \ -                    $(tdir)/html5lib-$(html5lib-version).tar.gz -	$(call pybuild, tar xf, html5lib-$(html5lib-version), ,\ +$(ipydir)/html5lib-$(html5lib-version): \ +                   $(ipydir)/six-$(six-version) \ +                   $(ipydir)/webencodings-$(webencodings-version) +	tarball=html5lib-$(html5lib-version).tar.gz +	$(call import-source, $(html5lib-url), $(html5lib-checksum)) +	$(call pybuild, tar xf, html5lib-$(html5lib-version), , \  	                HTML5lib $(html5lib-version)) -$(ipydir)/idna: $(ipydir)/setuptools \ -                $(tdir)/idna-$(idna-version).tar.gz -	$(call pybuild, tar xf, idna-$(idna-version), ,\ +$(ipydir)/idna-$(idna-version): $(ipydir)/setuptools-$(setuptools-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: $(ipydir)/setuptools \ -                   $(tdir)/jeepney-$(jeepney-version).tar.gz -	$(call pybuild, tar xf, jeepney-$(jeepney-version), ,\ +$(ipydir)/jeepney-$(jeepney-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=jeepney-$(jeepney-version).tar.gz +	$(call import-source, $(jeepney-url), $(jeepney-checksum)) +	$(call pybuild, tar xf, jeepney-$(jeepney-version), , \  	                Jeepney $(jeepney-version)) -$(ipydir)/keyring: $(ipydir)/entrypoints \ -                   $(ipydir)/secretstorage \ -                   $(ipydir)/setuptools_scm \ -                   $(tdir)/keyring-$(keyring-version).tar.gz -	$(call pybuild, tar xf, keyring-$(keyring-version), ,\ +$(ipydir)/keyring-$(keyring-version): \ +                  $(ipydir)/entrypoints-$(entrypoints-version) \ +                  $(ipydir)/secretstorage-$(secretstorage-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: $(ipydir)/setuptools \ -                      $(tdir)/kiwisolver-$(kiwisolver-version).tar.gz -	$(call pybuild, tar xf, kiwisolver-$(kiwisolver-version), ,\ +$(ipydir)/kiwisolver-$(kiwisolver-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=kiwisolver-$(kiwisolver-version).tar.gz +	$(call import-source, $(kiwisolver-url), $(kiwisolver-checksum)) +	$(call pybuild, tar xf, kiwisolver-$(kiwisolver-version), , \  	                Kiwisolver $(kiwisolver-version)) -$(ipydir)/lmfit: $(ipydir)/six \ -                 $(ipydir)/scipy \ -                 $(ipydir)/emcee \ -                 $(ipydir)/corner \ -                 $(ipydir)/asteval \ -                 $(ipydir)/matplotlib \ -                 $(ipydir)/uncertainties \ -                 $(tdir)/lmfit-$(lmfit-version).tar.gz -	$(call pybuild, tar xf, lmfit-$(lmfit-version), ,\ +$(ipydir)/lmfit-$(lmfit-version): \ +                $(ipydir)/six-$(six-version) \ +                $(ipydir)/scipy-$(scipy-version) \ +                $(ipydir)/emcee-$(emcee-version) \ +                $(ipydir)/corner-$(corner-version) \ +                $(ipydir)/asteval-$(asteval-version) \ +                $(ipydir)/matplotlib-$(matplotlib-version) \ +                $(ipydir)/uncertainties-$(uncertainties-version) +	tarball=lmfit-$(lmfit-version).tar.gz +	$(call import-source, $(lmfit-url), $(lmfit-checksum)) +	$(call pybuild, tar xf, lmfit-$(lmfit-version), , \  	                LMFIT $(lmfit-version)) -$(ipydir)/lsstdesccoord: $(ipydir)/setuptools \ -                         $(tdir)/lsstdesccoord-$(lsstdesccoord-version).tar.gz -	$(call pybuild, tar xf, LSSTDESC.Coord-$(lsstdesccoord-version), ,\ +$(ipydir)/lsstdesccoord-$(lsstdesccoord-version): \ +                        $(ipydir)/setuptools-$(setuptools-version) +	tarball=lsstdesccoord-$(lsstdesccoord-version).tar.gz +	$(call import-source, $(lsstdesccoord-url), $(lsstdesccoord-checksum)) +	$(call pybuild, tar xf, LSSTDESC.Coord-$(lsstdesccoord-version), , \  	                LSSTDESC.Coord $(lsstdesccoord-version)) -$(ipydir)/matplotlib: $(ipydir)/numpy \ -                      $(ipydir)/cycler \ -                      $(itidir)/texlive \ -                      $(ibidir)/freetype \ -                      $(ipydir)/pyparsing \ -                      $(ipydir)/kiwisolver \ -                      $(ibidir)/ghostscript \ -                      $(ibidir)/imagemagick \ -                      $(ipydir)/python-dateutil \ -                      $(tdir)/matplotlib-$(matplotlib-version).tar.gz +$(ipydir)/matplotlib-$(matplotlib-version): \ +                     $(itidir)/texlive \ +                     $(ipydir)/numpy-$(numpy-version) \ +                     $(ipydir)/cycler-$(cycler-version) \ +                     $(ibidir)/freetype-$(freetype-version) \ +                     $(ipydir)/pyparsing-$(pyparsing-version) \ +                     $(ipydir)/kiwisolver-$(kiwisolver-version) \ +                     $(ibidir)/ghostscript-$(ghostscript-version) \ +                     $(ibidir)/imagemagick-$(imagemagick-version) \ +                     $(ipydir)/python-dateutil-$(python-dateutil-version) + +        # Download the source. +	tarball=matplotlib-$(matplotlib-version).tar.gz +	$(call import-source, $(matplotlib-url), $(matplotlib-checksum)) +          # On Mac systems, the build complains about `clang' specific          # features, so we can't use our own GCC build here. -	if [ x$(on_mac_os) = xyes ]; then \ -	  export CC=clang; \ -	  export CXX=clang++; \ -	fi; \ -	$(call pybuild, tar xf, matplotlib-$(matplotlib-version)) \ -	&& cp $(dtexdir)/matplotlib.tex $(ictdir)/ \ -	&& echo "Matplotlib $(matplotlib-version) \citep{matplotlib2007}" > $@ - -$(ipydir)/mpi4py: $(ibidir)/openmpi \ -                  $(ipydir)/setuptools \ -                  $(tdir)/mpi4py-$(mpi4py-version).tar.gz -	$(call pybuild, tar xf, mpi4py-$(mpi4py-version)) \ -	&& cp $(dtexdir)/mpi4py.tex $(ictdir)/ \ -	&& echo "mpi4py $(mpi4py-version) \citep{mpi4py2011}" > $@ - -$(ipydir)/mpmath: $(ipydir)/setuptools \ -                  $(tdir)/mpmath-$(mpmath-version).tar.gz -	$(call pybuild, tar xf, mpmath-$(mpmath-version), ,\ +	if [ x$(on_mac_os) = xyes ]; then +	  export CC=clang +	  export CXX=clang++ +	fi +	$(call pybuild, tar xf, matplotlib-$(matplotlib-version)) +	cp $(dtexdir)/matplotlib.tex $(ictdir)/ +	echo "Matplotlib $(matplotlib-version) \citep{matplotlib2007}" > $@ + +$(ipydir)/mpi4py-$(mpi4py-version): \ +                 $(ibidir)/openmpi-$(openmpi-version) \ +                 $(ipydir)/setuptools-$(setuptools-version) +	tarball=mpi4py-$(mpi4py-version).tar.gz +	$(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) +	tarball=mpmath-$(mpmath-version).tar.gz +	$(call import-source, $(mpmath-url), $(mpmath-checksum)) +	$(call pybuild, tar xf, mpmath-$(mpmath-version), , \  	                mpmath $(mpmath-version)) -$(ipydir)/numpy: $(ibidir)/unzip \ -                 $(ibidir)/openblas \ -                 $(ipydir)/setuptools \ -                 $(tdir)/numpy-$(numpy-version).zip -	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"; \ +$(ipydir)/numpy-$(numpy-version): \ +                $(ibidir)/unzip-$(unzip-version) \ +                $(ibidir)/openblas-$(openblas-version) \ +                $(ipydir)/setuptools-$(setuptools-version) +	tarball=numpy-$(numpy-version).zip +	$(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, unzip, numpy-$(numpy-version),$$conf, \ -	                Numpy $(numpy-version)) \ -	&& cp $(dtexdir)/numpy.tex $(ictdir)/ \ -	&& echo "Numpy $(numpy-version) \citep{numpy2011}" > $@ - -$(ipydir)/pexpect: $(ipydir)/setuptools \ -                   $(tdir)/pexpect-$(pexpect-version).tar.gz -	$(call pybuild, tar xf, pexpect-$(pexpect-version), ,\ +	                Numpy $(numpy-version)) +	cp $(dtexdir)/numpy.tex $(ictdir)/ +	echo "Numpy $(numpy-version) \citep{numpy2011}" > $@ + +$(ipydir)/pexpect-$(pexpect-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=pexpect-$(pexpect-version).tar.gz +	$(call import-source, $(pexpect-url), $(pexpect-checksum)) +	$(call pybuild, tar xf, pexpect-$(pexpect-version), , \  	                Pexpect $(pexpect-version)) -$(ibidir)/pip3: $(ipydir)/setuptools \ -                $(tdir)/pip-$(pip-version).tar.gz -	$(call pybuild, tar xf, pip-$(pip-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)/pycodestyle: $(ipydir)/setuptools \ -                       $(tdir)/pycodestyle-$(pycodestyle-version).tar.gz -	$(call pybuild, tar xf, pycodestyle-$(pycodestyle-version), ,\ +$(ipydir)/pycodestyle-$(pycodestyle-version): \ +                      $(ipydir)/setuptools-$(setuptools-version) +	tarball=pycodestyle-$(pycodestyle-version).tar.gz +	$(call import-source, $(pycodestyle-url), $(pycodestyle-checksum)) +	$(call pybuild, tar xf, pycodestyle-$(pycodestyle-version), , \  	                pycodestyle $(pycodestyle-version)) -$(ipydir)/pybind11: $(ibidir)/eigen \ -                    $(ibidir)/boost \ -                    $(ipydir)/setuptools \ -                    $(tdir)/pybind11-$(pybind11-version).tar.gz +$(ipydir)/pybind11-$(pybind11-version): \ +                   $(ibidir)/eigen-$(eigen-version) \ +                   $(ibidir)/boost-$(boost-version) \ +                   $(ipydir)/setuptools-$(setuptools-version) +	tarball=pybind11-$(pybind11-version).tar.gz +	$(call import-source, $(pybind11-url), $(pybind11-checksum))  	pyhook_after() {  	  cp -r include/pybind11 $(iidir)/python$(python-major-version)m/  	} -	$(call pybuild, tar xf, pybind11-$(pybind11-version), ,\ +	$(call pybuild, tar xf, pybind11-$(pybind11-version), , \  	                pybind11 $(pybind11-version)) -$(ipydir)/pycparser: $(ipydir)/setuptools \ -                     $(tdir)/pycparser-$(pycparser-version).tar.gz -	$(call pybuild, tar xf, pycparser-$(pycparser-version), ,\ +$(ipydir)/pycparser-$(pycparser-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=pycparser-$(pycparser-version).tar.gz +	$(call import-source, $(pycparser-url), $(pycparser-checksum)) +	$(call pybuild, tar xf, pycparser-$(pycparser-version), , \  	                pycparser $(pycparser-version)) -$(ipydir)/pyflakes: $(ipydir)/setuptools \ -                    $(tdir)/pyflakes-$(pyflakes-version).tar.gz -	$(call pybuild, tar xf, pyflakes-$(pyflakes-version), ,\ +$(ipydir)/pyflakes-$(pyflakes-version): $(ipydir)/setuptools-$(setuptools-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: $(ipydir)/setuptools \ -                     $(tdir)/pyparsing-$(pyparsing-version).tar.gz -	$(call pybuild, tar xf, pyparsing-$(pyparsing-version), ,\ +$(ipydir)/pyparsing-$(pyparsing-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=pyparsing-$(pyparsing-version).tar.gz +	$(call import-source, $(pyparsing-url), $(pyparsing-checksum)) +	$(call pybuild, tar xf, pyparsing-$(pyparsing-version), , \  	                PyParsing $(pyparsing-version)) -$(ipydir)/pypkgconfig: $(ipydir)/setuptools \ -                       $(tdir)/pkgconfig-$(pypkgconfig-version).tar.gz +$(ipydir)/pypkgconfig-$(pypkgconfig-version): $(ipydir)/setuptools-$(setuptools-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)/python-dateutil: $(ipydir)/six \ -                           $(ipydir)/setuptools_scm \ -                           $(tdir)/python-dateutil-$(python-dateutil-version).tar.gz -	$(call pybuild, tar xf, python-dateutil-$(python-dateutil-version), ,\ +$(ipydir)/python-dateutil-$(python-dateutil-version): \ +                          $(ipydir)/six-$(six-version) \ +                          $(ipydir)/setuptools_scm-$(setuptools_scm-version) +	tarball=python-dateutil-$(python-dateutil-version).tar.gz +	$(call import-source, $(python-dateutil-url), $(python-dateutil-checksum)) +	$(call pybuild, tar xf, python-dateutil-$(python-dateutil-version), , \  	                python-dateutil $(python-dateutil-version)) -$(ipydir)/pyyaml: $(ibidir)/yaml \ -                  $(ipydir)/cython \ -                  $(tdir)/pyyaml-$(pyyaml-version).tar.gz -	$(call pybuild, tar xf, PyYAML-$(pyyaml-version), ,\ +$(ipydir)/pyyaml-$(pyyaml-version): \ +                 $(ibidir)/yaml-$(yaml-version) \ +                 $(ipydir)/cython-$(cython-version) +	tarball=pyyaml-$(pyyaml-version).tar.gz +	$(call import-source, $(pyyaml-url), $(pyyaml-checksum)) +	$(call pybuild, tar xf, PyYAML-$(pyyaml-version), , \  	                PyYAML $(pyyaml-version)) -$(ipydir)/requests: $(ipydir)/idna \ -                    $(ipydir)/numpy \ -                    $(ipydir)/certifi \ -                    $(ipydir)/chardet \ -                    $(ipydir)/urllib3 \ -                    $(tdir)/requests-$(requests-version).tar.gz -	$(call pybuild, tar xf, requests-$(requests-version), ,\ +$(ipydir)/requests-$(requests-version): $(ipydir)/idna-$(idna-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)) -$(ipydir)/scipy: $(ipydir)/numpy \ -                 $(tdir)/scipy-$(scipy-version).tar.gz -	if [ x$(on_mac_os) = xyes ]; then \ -	  export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle"; \ -	else \ -	  export LDFLAGS="$(LDFLAGS) -shared"; \ -	fi; \ -	conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg"; \ -	$(call pybuild, tar xf, scipy-$(scipy-version),$$conf) \ -	&& cp $(dtexdir)/scipy.tex $(ictdir)/ \ -	&& echo "Scipy $(scipy-version) \citep{scipy2007,scipy2011}" > $@ - -$(ipydir)/secretstorage: $(ipydir)/jeepney \ -                         $(ipydir)/cryptography \ -                         $(tdir)/secretstorage-$(secretstorage-version).tar.gz -	$(call pybuild, tar xf, SecretStorage-$(secretstorage-version), ,\ +$(ipydir)/scipy-$(scipy-version): $(ipydir)/numpy-$(numpy-version) +	tarball=scipy-$(scipy-version).tar.gz +	$(call import-source, $(scipy-url), $(scipy-checksum)) +	if [ x$(on_mac_os) = xyes ]; then +	  export LDFLAGS="$(LDFLAGS) -undefined dynamic_lookup -bundle" +	else +	  export LDFLAGS="$(LDFLAGS) -shared" +	fi +	conf="$$(pwd)/reproduce/software/config/numpy-scipy.cfg" +	$(call pybuild, tar xf, scipy-$(scipy-version),$$conf) +	cp $(dtexdir)/scipy.tex $(ictdir)/ +	echo "Scipy $(scipy-version) \citep{scipy2007,scipy2011}" > $@ + +$(ipydir)/secretstorage-$(secretstorage-version): \ +                        $(ipydir)/jeepney-$(jeepney-version) \ +                        $(ipydir)/cryptography-$(cryptography-version) +	tarball=secretstorage-$(secretstorage-version).tar.gz +	$(call import-source, $(secretstorage-url), $(secretstorage-checksum)) +	$(call pybuild, tar xf, SecretStorage-$(secretstorage-version), , \  	                SecretStorage $(secretstorage-version)) -$(ipydir)/setuptools: $(ibidir)/unzip \ -                      $(ibidir)/python \ -                      $(tdir)/setuptools-$(setuptools-version).zip -	$(call pybuild, unzip, setuptools-$(setuptools-version), ,\ +$(ipydir)/setuptools-$(setuptools-version): \ +                     $(ibidir)/unzip-$(unzip-version) \ +                     $(ibidir)/python-$(python-version) +	tarball=setuptools-$(setuptools-version).zip +	$(call import-source, $(setuptools-url), $(setuptools-checksum)) +	$(call pybuild, unzip, setuptools-$(setuptools-version), , \  	                Setuptools $(setuptools-version)) -$(ipydir)/setuptools_scm: $(ipydir)/setuptools \ -                          $(tdir)/setuptools_scm-$(setuptools_scm-version).tar.gz -	$(call pybuild, tar xf, 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)) -$(ipydir)/sip_tpv: $(ipydir)/sympy \ -                   $(ipydir)/astropy \ -                   $(tdir)/sip_tpv-$(sip_tpv-version).tar.gz -	$(call pybuild, tar xf, sip_tpv-$(sip_tpv-version), ,) \ -	&& cp $(dtexdir)/sip_tpv.tex $(ictdir)/ \ -	&& echo "sip_tpv $(sip_tpv-version) \citep{sip-tpv}" > $@ +$(ipydir)/sip_tpv-$(sip_tpv-version): \ +                  $(ipydir)/sympy-$(sympy-version) \ +                  $(ipydir)/astropy-$(astropy-version) +	tarball=sip_tpv-$(sip_tpv-version).tar.gz +	$(call import-source, $(sip_tpv-url), $(sip_tpv-checksum)) +	$(call pybuild, tar xf, sip_tpv-$(sip_tpv-version), ,) +	cp $(dtexdir)/sip_tpv.tex $(ictdir)/ +	echo "sip_tpv $(sip_tpv-version) \citep{sip-tpv}" > $@ -$(ipydir)/six: $(ipydir)/setuptools \ -               $(tdir)/six-$(six-version).tar.gz -	$(call pybuild, tar xf, six-$(six-version), ,\ +$(ipydir)/six-$(six-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=six-$(six-version).tar.gz +	$(call import-source, $(six-url), $(six-checksum)) +	$(call pybuild, tar xf, six-$(six-version), , \  	                Six $(six-version)) -$(ipydir)/soupsieve: $(ipydir)/setuptools \ -                     $(tdir)/soupsieve-$(soupsieve-version).tar.gz -	$(call pybuild, tar xf, soupsieve-$(soupsieve-version), ,\ +$(ipydir)/soupsieve-$(soupsieve-version): $(ipydir)/setuptools-$(setuptools-version) +	tarball=soupsieve-$(soupsieve-version).tar.gz +	$(call import-source, $(soupsieve-url), $(soupsieve-checksum)) +	$(call pybuild, tar xf, soupsieve-$(soupsieve-version), , \  	                SoupSieve $(soupsieve-version)) -$(ipydir)/sympy: $(ipydir)/mpmath \ -                 $(tdir)/sympy-$(sympy-version).tar.gz -	$(call pybuild, tar xf, sympy-$(sympy-version), ,) \ -	&& cp $(dtexdir)/sympy.tex $(ictdir)/ \ -	&& echo "SymPy $(sympy-version) \citep{sympy}" > $@ - -$(ipydir)/uncertainties: $(ipydir)/numpy \ -                         $(tdir)/uncertainties-$(uncertainties-version).tar.gz -	$(call pybuild, tar xf, uncertainties-$(uncertainties-version), ,\ +$(ipydir)/sympy-$(sympy-version): $(ipydir)/mpmath-$(mpmath-version) +	tarball=sympy-$(sympy-version).tar.gz +	$(call import-source, $(sympy-url), $(sympy-checksum)) +	$(call pybuild, tar xf, sympy-$(sympy-version), ,) +	cp $(dtexdir)/sympy.tex $(ictdir)/ +	echo "SymPy $(sympy-version) \citep{sympy}" > $@ + +$(ipydir)/uncertainties-$(uncertainties-version): $(ipydir)/numpy-$(numpy-version) +	tarball=uncertainties-$(uncertainties-version).tar.gz +	$(call import-source, $(uncertainties-url), $(uncertainties-checksum)) +	$(call pybuild, tar xf, uncertainties-$(uncertainties-version), , \  	                uncertainties $(uncertainties-version)) -$(ipydir)/urllib3: $(ipydir)/setuptools \ -                   $(tdir)/urllib3-$(urllib3-version).tar.gz -	$(call pybuild, tar xf, urllib3-$(urllib3-version), ,\ +$(ipydir)/urllib3-$(urllib3-version): $(ipydir)/setuptools-$(setuptools-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: $(ipydir)/setuptools \ -                        $(tdir)/webencodings-$(webencodings-version).tar.gz -	$(call pybuild, tar xf, webencodings-$(webencodings-version), ,\ +$(ipydir)/webencodings-$(webencodings-version): \ +                       $(ipydir)/setuptools-$(setuptools-version) +	tarball=webencodings-$(webencodings-version).tar.gz +	$(call import-source, $(webencodings-url), $(webencodings-checksum)) +	$(call pybuild, tar xf, webencodings-$(webencodings-version), , \  	                Webencodings $(webencodings-version)) | 
