From 3d8aa5953c4e0b79278ab2e27ec4e1051310d04f Mon Sep 17 00:00:00 2001 From: Mohammad Akhlaghi Date: Mon, 1 Jun 2020 03:05:37 +0100 Subject: Core software build before using Make to build other software Until now, Maneage would only build Flock before building everything else using Make (calling 'basic.mk') in parallel. Flock was necessary to avoid parallel downloads during the building of software (which could cause network problems). But after recently trying Maneage on FreeBSD (which is not yet complete, see bug #58465), we noticed that the BSD implemenation of Make couldn't parse 'basic.mk' (in particular, complaining with the 'ifeq' parts) and its shell also had some peculiarities. It was thus decided to also install our own minimalist shell, Make and compressor program before calling 'basic.mk'. In this way, 'basic.mk' can now assume the same GNU Make features that high-level.mk and python.mk assume. The pre-make building of software is now organized in 'reproduce/software/shell/pre-make-build.sh'. Another nice feature of this commit is for macOS users: until now the default macOS Make had problems for parallel building of software, so 'basic.mk' was built in one thread. But now that we can build the core tools with GNU Make on macOS too, it uses all threads. Furthermore, since we now run 'basic.mk' with GNU Make, we can use '.ONESHELL' and don't have to finish every line of a long rule with a backslash to keep variables and such. Generally, the pre-make software are now organized like this: first we build Lzip before anything else: it is downloaded as a simple '.tar' file that is not compressed (only ~400kb). Once Lzip is built, the pre-make phase continues with building GNU Make, Dash (a minimalist shell) and Flock. All of their tarballs are in '.tar.lz'. Maneage then enters 'basic.mk' and the first program it builds is GNU Gzip (itself packaged as '.tar.lz'). Once Gzip is built, we build all the other compression software (all downloaded as '.tar.gz'). Afterwards, any compression standard for other software is fine because we have it. In the process, a bug related to using backup servers was found in 'reproduce/analysis/bash/download-multi-try' for calling outside of 'basic.mk' and removed Bash-specific features. As a result of that bug-fix, because we now have multiple servers for software tarballs, the backup servers now have their own configuration file in 'reproduce/software/config/servers-backup.conf'. This makes it much easier to maintain the backup server list across the multiple places that we need it. Some other minor fixes: - In building Bzip2, we need to specify 'CC' so it doesn't use 'gcc'. - In building Zip, the 'generic_gcc' Make option caused a crash on FreeBSD (which doesn't have GCC). - We are now using 'uname -s' to specify if we are on a Linux kernel or not, if not, we are still using the old 'on_mac_os' variable. - While I was trying to build on FreeBSD, I noticed some further corrections that could help. For example the 'makelink' Make-function now takes a third argument which can be a different name compared to the actual program (used for examle to make a link to '/usr/bin/cc' from 'gcc'. - Until now we didn't know if the host's Make implementation supports placing a '@' at the start of the recipe (to avoid printing the actual commands to standard output). Especially in the tarball download phase, there are many lines that are printed for each download which was really annoying. We already used '@' in 'high-level.mk' and 'python.mk' before, but now that we also know that 'basic.mk' is called with our custom GNU Make, we can use it at the start for a cleaner stdout. - Until now, WCSLIB assumed a Fortran compiler, but when the user is on a system where we can't install GCC (or has activated the '--host-cc' option), it may not be present and the project shouldn't break because of this. So with this commit, when a Fortran compiler isn't present, WCSLIB will be built with the '--disable-fortran' configuration option. This commit (task #15667) was completed with help/checks by Raul Infante-Sainz and Boud Roukema. --- reproduce/software/make/basic.mk | 466 +++++++++++++++++---------------- reproduce/software/make/build-rules.mk | 40 ++- reproduce/software/make/high-level.mk | 12 +- reproduce/software/make/python.mk | 1 + 4 files changed, 282 insertions(+), 237 deletions(-) (limited to 'reproduce/software/make') diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk index e0da312..b4745e2 100644 --- a/reproduce/software/make/basic.mk +++ b/reproduce/software/make/basic.mk @@ -52,6 +52,7 @@ syspath := $(PATH) # As we build more programs, we want to use this project's built programs # and libraries, not the host's. +.ONESHELL: export CCACHE_DISABLE := 1 export PATH := $(ibdir):$(PATH) export PKG_CONFIG_PATH := $(ildir)/pkgconfig @@ -59,6 +60,17 @@ 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, @@ -85,7 +97,10 @@ 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 = http://akhlaghi.org/maneage-software +backupservers := $(shell awk '!/^#/{printf "%s ", $$1}' \ + reproduce/software/config/servers-backup.conf) + + @@ -131,16 +146,14 @@ tarballs = $(foreach t, bash-$(bash-version).tar.lz \ git-$(git-version).tar.xz \ gmp-$(gmp-version).tar.lz \ grep-$(grep-version).tar.xz \ - gzip-$(gzip-version).tar.gz \ + 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 \ - lzip-$(lzip-version).tar.gz \ m4-$(m4-version).tar.gz \ - make-$(make-version).tar.gz \ metastore-$(metastore-version).tar.gz \ mpfr-$(mpfr-version).tar.xz \ mpc-$(mpc-version).tar.gz \ @@ -167,105 +180,108 @@ $(tarballs): $(tdir)/%: | $(lockdir) # 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}' ); \ - \ + @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://ftp.gnu.org/gnu/gzip; \ - 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 = lzip ]; then c=$(lzip-checksum); w=http://download.savannah.gnu.org/releases/lzip; \ - elif [ $$n = m4 ]; then \ - mergenames=0; \ - c=$(m4-checksum); \ - w=http://akhlaghi.org/maneage-software/m4-1.4.18-patched.tar.gz; \ - elif [ $$n = make ]; then c=$(make-checksum); w=https://ftp.gnu.org/gnu/make; \ - 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; \ - \ - \ - 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; \ + 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 + + # 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; \ - \ - \ - 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; + $$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 @@ -274,36 +290,39 @@ $(tarballs): $(tdir)/%: | $(lockdir) # Low-level (not built) programs # ------------------------------ # -# For the time being, we aren't building a local C compiler, but we'll use -# any C compiler that the system already has and just make a symbolic link -# to it. +# For the time being, some components of the project on some systems, so we +# are simply making a symbolic link to the system's files here. We'll do +# this after building GNU Coreutils to have trustable elements. # -# ccache: ccache acts like a wrapper over the C compiler and is made to -# avoid/speed-up compiling of identical files in a system (it is commonly -# used on large servers). It actually makes `gcc' or `g++' a symbolic link -# to itself so it can control them internally. So, for our purpose here, it -# is very annoying and can cause many complications. We thus remove any -# part of PATH of that has `ccache' in it before making symbolic links to -# the programs we are not building ourselves. +# About ccache: ccache acts like a wrapper over the C compiler and is made +# to avoid/speed-up compiling of identical files in a system (it is +# commonly used on large servers). It actually makes `gcc' or `g++' a +# symbolic link to itself so it can control them internally. So, for our +# purpose here, it is very annoying and can cause many complications. We +# thus remove any part of PATH of that has `ccache' in it before making +# symbolic links to the programs we are not building ourselves. makelink = origpath="$$PATH"; \ - export PATH=$$(echo $(syspath) \ - | tr : '\n' \ - | grep -v ccache \ - | tr '\n' :); \ - a=$$(which $(1) 2> /dev/null); \ - if [ -e $(ibdir)/$(1) ]; then rm $(ibdir)/$(1); fi; \ - if [ x$$a = x ]; then \ - if [ "x$(strip $(2))" = xmandatory ]; then \ - echo "'$(1)' is necessary for higher-level tools."; \ - echo "Please install it for the configuration to continue."; \ - exit 1; \ - fi; \ - else \ - ln -s $$a $(ibdir)/$(1); \ - fi; \ - export PATH="$$origpath" + export PATH=$$(echo $(syspath) \ + | tr : '\n' \ + | grep -v ccache \ + | tr '\n' :); \ + if type $(1) > /dev/null 2> /dev/null; then \ + if [ x$(3) = x ]; then \ + ln -sf $$(which $(1)) $(ibdir)/$(1); \ + else \ + ln -sf $$(which $(1)) $(ibdir)/$(3); \ + fi; \ + else \ + if [ "x$(strip $(2))" = xmandatory ]; then \ + echo "'$(1)' is necessary for higher-level tools."; \ + echo "Please install it for the configuration to continue."; \ + exit 1; \ + fi; \ + fi; \ + export PATH="$$origpath" + $(ibdir) $(ildir):; mkdir $@ -$(ibidir)/low-level-links: | $(ibdir) $(ildir) +$(ibidir)/low-level-links: $(ibidir)/coreutils | $(ibdir) $(ildir) # Not-installed (but necessary in some cases) compilers. # Clang is necessary for CMake. @@ -325,11 +344,11 @@ $(ibidir)/low-level-links: | $(ibdir) $(ildir) # Necessary libraries: # Libdl (for dynamic loading libraries at runtime) # POSIX Threads library for multi-threaded programs. - for l in dl pthread; do \ - rm -f $(ildir)/lib$$l*; \ - if [ -f /usr/lib/lib$$l.a ]; then \ - ln -s /usr/lib/lib$$l.* $(ildir)/; \ - fi; \ + for l in dl pthread; do + rm -f $(ildir)/lib$$l*; + if [ -f /usr/lib/lib$$l.a ]; then + ln -s /usr/lib/lib$$l.* $(ildir)/ + fi done # We want this to be empty (so it doesn't interefere with the other @@ -349,28 +368,23 @@ $(ibidir)/low-level-links: | $(ibdir) $(ildir) # ------------------------------------------ # # The first set of programs to be built are those that we need to unpack -# the source code tarballs of each program. First, we'll build the -# necessary programs, then we'll build GNU Tar. -$(ibidir)/gzip: $(tdir)/gzip-$(gzip-version).tar.gz +# the source code tarballs of each program. We have already installed Lzip +# before calling 'basic.mk', so it is present and working. Hence we first +# build the Lzipped tarball of Gzip, then use our own Gzip to unpack the +# tarballs of the other compression programs. Once all the compression +# programs/libraries are complete, we build our own GNU Tar and continue +# with other software. +$(ibidir)/gzip: $(tdir)/gzip-$(gzip-version).tar.lz $(call gbuild, gzip-$(gzip-version), static, , V=1) \ && echo "GNU Gzip $(gzip-version)" > $@ -# GNU Lzip: For a static build, the `-static' flag should be given to -# LDFLAGS on the command-line (not from the environment). -ifeq ($(static_build),yes) -lzipconf="LDFLAGS=-static" -else -lzipconf= -endif -$(ibidir)/lzip: $(tdir)/lzip-$(lzip-version).tar.gz - $(call gbuild, lzip-$(lzip-version), , $(lzipconf)) \ - && echo "Lzip $(lzip-version)" > $@ - -$(ibidir)/xz: $(tdir)/xz-$(xz-version).tar.gz +$(ibidir)/xz: $(ibidir)/gzip \ + $(tdir)/xz-$(xz-version).tar.gz $(call gbuild, xz-$(xz-version), static) \ && echo "XZ Utils $(xz-version)" > $@ -$(ibidir)/bzip2: $(tdir)/bzip2-$(bzip2-version).tar.gz +$(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 @@ -380,28 +394,28 @@ $(ibidir)/bzip2: $(tdir)/bzip2-$(bzip2-version).tar.gz # # NOTE: the major version number appears in the final symbolic # link. - tdir=bzip2-$(bzip2-version); \ - if [ $(static_build) = yes ]; then \ - makecommand="make LDFLAGS=-static"; \ - makeshared="echo no-shared"; \ - else \ - makecommand="make"; \ - if [ x$(on_mac_os) = xyes ]; then \ - makeshared="echo no-shared"; \ - else \ - makeshared="make -f Makefile-libbz2_so"; \ - fi; \ - fi; \ + tdir=bzip2-$(bzip2-version) + if [ $(static_build) = yes ]; then + makecommand="make LDFLAGS=-static" + makeshared="echo no-shared" + else + makecommand="make" + if [ x$(on_mac_os) = xyes ]; then + makeshared="echo no-shared" + else + makeshared="make -f Makefile-libbz2_so" + fi + fi cd $(ddir) && rm -rf $$tdir \ && tar xf $(word 1,$(filter $(tdir)/%,$^)) \ && cd $$tdir \ && sed -e 's@\(ln -s -f \)$$(PREFIX)/bin/@\1@' Makefile \ > Makefile.sed \ && mv Makefile.sed Makefile \ - && $$makeshared \ + && $$makeshared CC=cc \ && cp -a libbz2* $(ildir)/ \ && make clean \ - && $$makecommand \ + && $$makecommand CC=cc \ && make install PREFIX=$(idir) \ && cd .. \ && rm -rf $$tdir \ @@ -409,21 +423,23 @@ $(ibidir)/bzip2: $(tdir)/bzip2-$(bzip2-version).tar.gz && ln -fs libbz2.so.1.0 libbz2.so \ && echo "Bzip2 $(bzip2-version)" > $@ -$(ibidir)/unzip: $(tdir)/unzip-$(unzip-version).tar.gz - v=$$(echo $(unzip-version) | sed -e's/\.//'); \ +$(ibidir)/unzip: $(ibidir)/gzip \ + $(tdir)/unzip-$(unzip-version).tar.gz + v=$$(echo $(unzip-version) | sed -e's/\.//') $(call gbuild, unzip$$v, static,, \ - -f unix/Makefile generic_gcc \ + -f unix/Makefile generic \ CFLAGS="-DBIG_MEM -DMMAP",,pwd, \ - -f unix/Makefile \ + -f unix/Makefile generic \ BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) \ && echo "Unzip $(unzip-version)" > $@ -$(ibidir)/zip: $(tdir)/zip-$(zip-version).tar.gz - v=$$(echo $(zip-version) | sed -e's/\.//'); \ +$(ibidir)/zip: $(ibidir)/gzip \ + $(tdir)/zip-$(zip-version).tar.gz + v=$$(echo $(zip-version) | sed -e's/\.//') $(call gbuild, zip$$v, static,, \ - -f unix/Makefile generic_gcc \ + -f unix/Makefile generic \ CFLAGS="-DBIG_MEM -DMMAP",,pwd, \ - -f unix/Makefile \ + -f unix/Makefile generic \ BINDIR=$(ibdir) MANDIR=$(idir)/man/man1 ) \ && echo "Zip $(zip-version)" > $@ @@ -432,7 +448,8 @@ $(ibidir)/zip: $(tdir)/zip-$(zip-version).tar.gz # # 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: $(tdir)/zlib-$(zlib-version).tar.gz +$(ibidir)/zlib: $(ibidir)/gzip \ + $(tdir)/zlib-$(zlib-version).tar.gz $(call gbuild, zlib-$(zlib-version)) \ && echo "Zlib $(zlib-version)" > $@ @@ -443,8 +460,7 @@ $(ibidir)/zlib: $(tdir)/zlib-$(zlib-version).tar.gz # software to be built). $(ibidir)/tar: $(ibidir)/xz \ $(ibidir)/zip \ - $(ibidir)/gzip \ - $(ibidir)/lzip \ + $(ibidir)/gzip \ $(ibidir)/zlib \ $(ibidir)/bzip2 \ $(ibidir)/unzip \ @@ -476,13 +492,7 @@ $(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)/make: $(ibidir)/tar \ - $(tdir)/make-$(make-version).tar.gz - # See Tar's comments for the `-j' option. - $(call gbuild, make-$(make-version), , , -j$(numthreads)) \ - && echo "GNU Make $(make-version)" > $@ - -$(ibidir)/ncurses: $(ibidir)/make \ +$(ibidir)/ncurses: $(ibidir)/tar \ $(tdir)/ncurses-$(ncurses-version).tar.gz # Delete the library that will be installed (so we can make sure @@ -540,32 +550,32 @@ $(ibidir)/ncurses: $(ibidir)/make \ # # 5. A link is made to also be able to include files from the # `ncurses' headers. - if [ x$(on_mac_os) = xyes ]; then so="dylib"; else so="so"; fi; \ - if [ -f $(ildir)/libncursesw.$$so ]; then \ - \ + if [ x$(on_mac_os) = xyes ]; then so="dylib"; else so="so"; fi + if [ -f $(ildir)/libncursesw.$$so ]; then + sov=$$(ls -l $(ildir)/libncursesw* \ | awk '/^-/{print $$NF}' \ - | sed -e's|'$(ildir)/libncursesw.'||'); \ - \ - cd "$(ildir)"; \ - for lib in ncurses ncurses++ form panel menu; do \ - ln -fs lib$$lib"w".$$sov lib$$lib.$$so; \ - ln -fs $(ildir)/pkgconfig/"$$lib"w.pc pkgconfig/$$lib.pc; \ - done; \ - for lib in tic tinfo; do \ - ln -fs libncursesw.$$sov lib$$lib.$$so; \ - ln -fs libncursesw.$$sov lib$$lib.$$sov; \ - ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/$$lib.pc; \ - done; \ - ln -fs libncursesw.$$sov libcurses.$$so; \ - ln -fs libncursesw.$$sov libcursesw.$$sov; \ - ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/curses.pc; \ - ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/cursesw.pc; \ - \ - ln -fs $(idir)/include/ncursesw $(idir)/include/ncurses; \ - echo "GNU NCURSES $(ncurses-version)" > $@; \ - else \ - exit 1; \ + | sed -e's|'$(ildir)/libncursesw.'||') + + cd "$(ildir)" + for lib in ncurses ncurses++ form panel menu; do + ln -fs lib$$lib"w".$$sov lib$$lib.$$so + ln -fs $(ildir)/pkgconfig/"$$lib"w.pc pkgconfig/$$lib.pc + done + for lib in tic tinfo; do + ln -fs libncursesw.$$sov lib$$lib.$$so + ln -fs libncursesw.$$sov lib$$lib.$$sov + ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/$$lib.pc + done + ln -fs libncursesw.$$sov libcurses.$$so + ln -fs libncursesw.$$sov libcursesw.$$sov + ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/curses.pc + ln -fs $(ildir)/pkgconfig/ncursesw.pc pkgconfig/cursesw.pc + + ln -fs $(idir)/include/ncursesw $(idir)/include/ncurses + echo "GNU NCURSES $(ncurses-version)" > $@ + else + exit 1 fi $(ibidir)/readline: $(ibidir)/ncurses \ @@ -575,7 +585,7 @@ $(ibidir)/readline: $(ibidir)/ncurses \ SHLIB_LIBS="-lncursesw" -j$(numthreads)) \ && echo "GNU Readline $(readline-version)" > $@ -$(ibidir)/patchelf: $(ibidir)/make \ +$(ibidir)/patchelf: $(ibidir)/tar \ $(tdir)/patchelf-$(patchelf-version).tar.gz $(call gbuild, patchelf-$(patchelf-version)) \ && echo "PatchELF $(patchelf-version)" > $@ @@ -629,13 +639,13 @@ $(ibidir)/bash: $(needpatchelf) \ # default. As described in the manual, they are mainly useful when # you disable them all with `--enable-minimal-config' and enable a # subset using the `--enable' options. - if [ "x$(static_build)" = xyes ]; then stopt="--enable-static-link";\ - else stopt=""; \ - fi; \ + if [ "x$(static_build)" = xyes ]; then stopt="--enable-static-link" + else stopt="" + fi; export CFLAGS="$$CFLAGS \ -DDEFAULT_PATH_VALUE='\"$(ibdir)\"' \ -DSTANDARD_UTILS_PATH='\"$(ibdir)\"' \ - -DSYS_BASHRC='\"$(BASH_ENV)\"' "; \ + -DSYS_BASHRC='\"$(BASH_ENV)\"' " $(call gbuild, bash-$(bash-version),, $$stopt \ --with-installed-readline=$(ildir) \ --with-curses=yes, \ @@ -645,9 +655,9 @@ $(ibidir)/bash: $(needpatchelf) \ # 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 [ "x$(needpatchelf)" != x ]; then + if [ -f $(ibdir)/bash ]; then + $(ibdir)/patchelf --set-rpath $(ildir) $(ibdir)/bash; fi fi # To be generic, some systems use the `sh' command to call the @@ -658,10 +668,10 @@ $(ibidir)/bash: $(needpatchelf) \ # 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 \ + 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 @@ -678,14 +688,14 @@ perl-conflddlflags = else perl-conflddlflags = -Dlddlflags="-shared $$LDFLAGS" endif -$(ibidir)/perl: $(ibidir)/make \ +$(ibidir)/perl: $(ibidir)/tar \ $(tdir)/perl-$(perl-version).tar.gz major_version=$$(echo $(perl-version) \ | sed -e's/\./ /g' \ - | awk '{printf("%d", $$1)}'); \ + | awk '{printf("%d", $$1)}') base_version=$$(echo $(perl-version) \ | sed -e's/\./ /g' \ - | awk '{printf("%d.%d", $$1, $$2)}'); \ + | awk '{printf("%d.%d", $$1, $$2)}') cd $(ddir) \ && rm -rf perl-$(perl-version) \ && if ! tar xf $(word 1,$(filter $(tdir)/%,$^)); then \ @@ -795,7 +805,7 @@ $(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)/make \ +$(ibidir)/openssl: $(ibidir)/tar \ $(tdir)/openssl-$(openssl-version).tar.gz \ $(tdir)/cert.pem \ | $(idir)/etc @@ -969,13 +979,13 @@ $(ibidir)/libiconv: $(ibidir)/pkg-config \ $(call gbuild, libiconv-$(libiconv-version), static) \ && echo "GNU libiconv $(libiconv-version)" > $@ -$(ibidir)/libunistring: $(ibidir)/make \ +$(ibidir)/libunistring: $(ibidir)/libiconv \ $(tdir)/libunistring-$(libunistring-version).tar.xz $(call gbuild, libunistring-$(libunistring-version), static,, \ -j$(numthreads)) \ && echo "GNU libunistring $(libunistring-version)" > $@ -$(ibidir)/libxml2: $(ibidir)/make \ +$(ibidir)/libxml2: $(ibidir)/tar \ $(tdir)/libxml2-$(libxml2-version).tar.gz # The libxml2 tarball also contains Python bindings which are built # and installed to a system directory by default. If you don't need @@ -1150,7 +1160,7 @@ $(ibidir)/mpfr: $(ibidir)/gmp \ $(call gbuild, mpfr-$(mpfr-version), static, , , make check) \ && echo "GNU Multiple Precision Floating-Point Reliably $(mpfr-version)" > $@ -$(ibidir)/pkg-config: $(ibidir)/make \ +$(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, @@ -1305,11 +1315,11 @@ $(ibidir)/gcc: $(gcc-tarball) \ # in '$(idir)/lib' by defining the '$(idir)/lib64' as a symbolic # link to '$(idir)/lib'. if [ $(host_cc) = 1 ]; then \ - $(call makelink,gcc); \ - $(call makelink,g++,mandatory); \ - $(call makelink,gfortran,mandatory); \ + $(call makelink,cc); \ + $(call makelink,cc,,gcc); \ + $(call makelink,c++,,g++); \ + $(call makelink,gfortran); \ $(call makelink,strip,mandatory); \ - ln -sf $$(which gcc) $(ibdir)/cc; \ ccinfo=$$(gcc --version | awk 'NR==1'); \ echo "C compiler (""$$ccinfo"")" > $@; \ else \ diff --git a/reproduce/software/make/build-rules.mk b/reproduce/software/make/build-rules.mk index 9f5b493..260ded8 100644 --- a/reproduce/software/make/build-rules.mk +++ b/reproduce/software/make/build-rules.mk @@ -34,6 +34,31 @@ +# 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 \ + | 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; \ + else \ + intarrm=0; \ + intar=$$tarball; \ + fi; \ + if tar xf $$intar; then \ + if [ x$$intarrm = x1 ]; then rm $$intar; fi; \ + else \ + echo; echo "Tar error"; exit 1; \ + fi + + + + + + # GNU Build system # ---------------- # @@ -58,13 +83,13 @@ gbuild = if [ x$(static_build) = xyes ] && [ "x$(2)" = xstatic ]; then \ fi; \ check="$(5)"; \ if [ x"$$check" = x ]; then check="echo Skipping-check"; fi; \ - cd $(ddir); rm -rf $(1); \ + cd $(ddir); \ + rm -rf $(1); \ if [ x"$$gbuild_tar" = x ]; then \ tarball=$(word 1,$(filter $(tdir)/%,$^)); \ else tarball=$$gbuild_tar; \ fi; \ - if ! tar xf $$tarball; then \ - echo; echo "Tar error"; exit 1; fi; \ + $(call uncompress); \ cd $(1); \ \ if [ x"$(strip $(6))" = x ]; then confscript=./configure; \ @@ -114,10 +139,11 @@ cbuild = if [ x$(static_build) = xyes ] && [ $(2)x = staticx ]; then \ export LDFLAGS="$$LDFLAGS -static"; \ opts="-DBUILD_SHARED_LIBS=OFF"; \ fi; \ - cd $(ddir) \ - && rm -rf $(1) \ - && tar xf $(word 1,$(filter $(tdir)/%,$^)) \ - && cd $(1) \ + tarball=$(word 1,$(filter $(tdir)/%,$^)); \ + cd $(ddir); \ + rm -rf $(1); \ + $(call uncompress); \ + cd $(1) \ && rm -rf project-build \ && mkdir project-build \ && cd project-build \ diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk index 19cb52f..7cc2d51 100644 --- a/reproduce/software/make/high-level.mk +++ b/reproduce/software/make/high-level.mk @@ -104,7 +104,8 @@ 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 = http://akhlaghi.org/maneage-software +backupservers := $(shell awk '!/^#/{printf "%s ", $$1}' \ + reproduce/software/config/servers-backup.conf) # Building flags: # @@ -335,6 +336,7 @@ $(tarballs): $(tdir)/%: | $(lockdir) # 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 @@ -812,11 +814,17 @@ $(ibidir)/libgit2: $(ibidir)/curl \ $(ibidir)/wcslib: $(ibidir)/cfitsio \ $(tdir)/wcslib-$(wcslib-version).tar.bz2 + # If Fortran isn't present, don't build WCSLIB with it. + if type gfortran &> /dev/null; then fortranopt=""; + else fortranopt="--disable-fortran" + fi + + # Build WCSLIB. $(call gbuild, wcslib-$(wcslib-version), , \ LIBS="-pthread -lcurl -lm" \ --with-cfitsiolib=$(ildir) \ --with-cfitsioinc=$(idir)/include \ - --without-pgplot) \ + --without-pgplot $$fortranopt) \ && if [ x$(on_mac_os) = xyes ]; then \ install_name_tool -id $(ildir)/libwcs.6.4.dylib \ $(ildir)/libwcs.6.4.dylib; \ diff --git a/reproduce/software/make/python.mk b/reproduce/software/make/python.mk index 43499c7..eef8279 100644 --- a/reproduce/software/make/python.mk +++ b/reproduce/software/make/python.mk @@ -250,6 +250,7 @@ $(pytarballs): $(tdir)/%: # 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 -- cgit v1.2.1