From b1e1522a5a5b6d0800ea207f2d93a4f36bffa68d Mon Sep 17 00:00:00 2001 From: Raul Infante-Sainz Date: Fri, 1 May 2020 12:09:18 +0100 Subject: GNU Gettext built as a dependency of Bash Until now Maneage used the host's GNU Gettext if it was present. Gettext is a relatively low-level software that enables programs to print messages in different languages based on the host environment. Even though it has not direct effect on the running of the software for Maneage and the lanugage environment in Maneage is pre-determined, it is necessary to have it because if the basic programs see it in the host they will link with it and will have problems if/when the host's Gettext is updated. With this commit (which is actually a squashed rebase of 9 commits by Raul and Mohammad), Gettext and its two extra dependencies (libxml2 and libunistring) are now installed within Maneage as a basic software and built before GNU Bash. As a result, all programs built afterwards will successfully link with our own internal version of Gettext and libraries. To get this working, some of the basic software dependencies had to updated and re-ordered and it has been tested in both GNU/Linux and macoS. Some other minor issues that are fixed with this commit - Until this commit, when TeX was not installed, the warning message saying how to run the configure step in order to re-configure the project was not showing the option `-e'. However, the use of this option is more convenient than entering the top-build directory and etc every time. So with this commit, the warning message has been changed in order use the option `-e' in the re-configure of the project. - Until now, on macOS systems, Bash was not linking with our internally built `libncurses'. With this commit, this has been fixed by setting `--withcurses=yes' for Bash's configure script. --- reproduce/software/config/checksums.conf | 7 ++- reproduce/software/config/versions.conf | 6 +- reproduce/software/make/basic.mk | 98 +++++++++++++++++++------------- reproduce/software/make/high-level.mk | 13 ----- reproduce/software/shell/configure.sh | 43 +------------- 5 files changed, 69 insertions(+), 98 deletions(-) (limited to 'reproduce') diff --git a/reproduce/software/config/checksums.conf b/reproduce/software/config/checksums.conf index b173589..b9fb637 100644 --- a/reproduce/software/config/checksums.conf +++ b/reproduce/software/config/checksums.conf @@ -1,6 +1,7 @@ # sha512 checksums of all the necessary software tarballs. # # Copyright (C) 2018-2020 Mohammad Akhlaghi +# Copyright (C) 2019-2020 Raul Infante-Sainz # # This Makefile is part of Maneage. Maneage is free software: you can # redistribute it and/or modify it under the terms of the GNU General @@ -30,7 +31,8 @@ findutils-checksum = 650a24507f8f4ebff83ad28dd27daa4785b4038dcaadc4fe00823b976e8 flock-checksum = 2fe663839b5fd03a08e8b3d0596ce1b4216d8f19a1c4da4fa3db8b409aa4aa292358cc671be857e0f308315458bb2e10288f9d2152dce9940085d33cb7e4a24b gawk-checksum = 3734740b7406ddfec9e04bb7774e76c6446cba76642a6180266e7b1822de20aab824c29c4e417256d877762ef04ef3f9df855cd4a3ca414a9225323b49d79195 gcc-checksum = a12dff52af876aee0fd89a8d09cdc455f35ec46845e154023202392adc164848faf8ee881b59b681b696e27c69fd143a214014db4214db62f9891a1c8365c040 -git-checksum = c0bb29b3689ec2e157f90df849599ca149a08fc0c69f6a68b1f3219b6335d521983e6ed58cd364b86398e4dcf9e84892fb9eded79a1c97b74150edca299cf671 +gettext-checksum = 08d20c659004a77e607af17df15f5ce9bd4fc0feca9436aa206b0cbd2516f9f0c98c7ee1faacf7ff429f9b0dd9de219947b300216887a60727602a688acabc82 +git-checksum = 5d92d07b171c5cd6e89a29c1211c73c1c900cd51c74d690aebfb4a3d0e93b541b09b42b6d6a1a82f5c3d953096771f9a8605c63be139f559f58698c1a0eabcfc gmp-checksum = 8aea94f867174eacac44f395ceb9212530c208e8de69d0bb53056f52360317230fc84ac177fd3ffc9fdb19a07c7549305dcc34c83c34821ccfab9dc63a16e67e grep-checksum = e4805dbddf7cd0f0faf412557d408509650c1ccf703bc450f10a3f727c690dbfaa1235aa81939a0e4b7ac6190f88c15ea1fcc562b343d4b4c7550f967aeb15db gzip-checksum = 7939043e74554ced0c1c05d354ab4eb36cd6dce89ad79d02ccdc5ed6b7ee390759689b2d47c07227b9b44a62851afe7c76c4cae9f92527d999f3f1b4df1cccff @@ -38,6 +40,8 @@ isl-checksum = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f35102 libbsd-checksum = 435822b8f2495a5e2705e5ab5c834a4f0f3a177b3e5c46a7c6162924507ca984e957e94a512b5ebd0067ecb413bac458fade357709ef199e9b75edf0315de91c libiconv-checksum = 365dac0b34b4255a0066e8033a8b3db4bdb94b9b57a9dca17ebf2d779139fe935caf51a465d17fd8ae229ec4b926f3f7025264f37243432075e5583925bb77b7 libtool-checksum = a6eef35f3cbccf2c9e2667f44a476ebc80ab888725eb768e91a3a6c33b8c931afc46eb23efaee76c8696d3e4eed74ab1c71157bcb924f38ee912c8a90a6521a4 +libunistring-checksum = 01dcab6e05ea4c33572bf96cc0558bcffbfc0e62fc86410cef06c1597a0073d5750525fe2dee4fdb39c9bd704557fcbab864f9645958108a2e07950bc539fe54 +libxml2-checksum = cb7784ba4e72e942614e12e4f83f4ceb275f3d738b30e3b5c1f25edf8e9fa6789e854685974eed95b362049dbf6c8e7357e0327d64c681ed390534ac154e6810 lzip-checksum= 0349b4c6c0b41e601b7ee381c3254d741397beb3ef9354c08162f346f131f4f48f6613ee0a610cdc6d827530df634f884ecfeee35215b10045a40fee76f8e938 m4-checksum = a92cad4441b3fd7c033837389ca3499494523d364a5fda043d92c517051510f1758b3b837f0477f42d2258a179ab79a4993e5d1694ef2673db6d96d1faff84fe make-checksum = 9a1185cc468368f4ec06478b1cfa343bf90b5cd7c92c0536567db0315b0ee909af53ecce3d44cfd93dd137dbca1ed13af5713e8663590c4fdd21ea635d78496b @@ -106,7 +110,6 @@ libnsl-checksum = a3c8f674357674b7ed4b26c05adde607f39be8d6dc9ff715448e1fcc5fc23d libpng-checksum = 59e8c1059013497ae616a14c3abbe239322d3873c6ded0912403fc62fb260561768230b6ab997e2cccc3b868c09f539fd13635616b9fa0dd6279a3f63ec7e074 libtiff-checksum = d213e5db09fd56b8977b187c5a756f60d6e3e998be172550c2892dbdb4b2a8e8c750202bc863fe27d0d1c577ab9de1710d15e9f6ed665aadbfd857525a81eea8 libtirpc-checksum = 392f391f9fc1bd68d81dc44e4058831a64b32790b5c8c37338b0ab416fad2ae4d16389e632596734dba09780347918cc65c6f134e0c1afd09e81ec250785ed23 -libxml2-checksum = cb7784ba4e72e942614e12e4f83f4ceb275f3d738b30e3b5c1f25edf8e9fa6789e854685974eed95b362049dbf6c8e7357e0327d64c681ed390534ac154e6810 missfits-checksum = 32727f5eb30573a1cedacb8900e2536867e4815059eee32e64e3db65be9291b8a91b9f45b2c9f3cf6fc2a8cc448012ea3d502bdd9dee516008e17d5086aee795 netpbm-checksum = 064720f8a9d0a502488e1af4daecdbf3936910996507ca6f311073a0ad842346692a148eb1ddf7b717f7b108f60500246cb4b83f4d3665f5fc285a84ae1d63d6 openblas-checksum = 91b3074eb922453bf843158b4281cde65db9e8bbdd7590e75e9e6cdcb486157f7973f2936f327bb3eb4f1702ce0ba51ae6729d8d4baf2d986c50771e8f696df0 diff --git a/reproduce/software/config/versions.conf b/reproduce/software/config/versions.conf index d19f095..6caa449 100644 --- a/reproduce/software/config/versions.conf +++ b/reproduce/software/config/versions.conf @@ -28,7 +28,8 @@ file-version = 5.36 findutils-version = 4.7.0 gawk-version = 5.0.1 gcc-version = 9.2.0 -git-version = 2.23.0 +gettext-version = 0.20.2 +git-version = 2.26.2 gmp-version = 6.1.2 grep-version = 3.3 gzip-version = 1.10 @@ -36,6 +37,8 @@ isl-version = 0.18 libbsd-version = 0.9.1 libiconv-version = 1.16 libtool-version = 2.4.6 +libunistring-version = 0.9.10 +libxml2-version = 2.9.9 lzip-version= 1.20 m4-version = 1.4.18 make-version = 4.3 @@ -102,7 +105,6 @@ libnsl-version = 1.2.0-4a062cf libpng-version = 1.6.37 libtiff-version = 4.0.10 libtirpc-version = 1.1.4 -libxml2-version = 2.9.9 missfits-version = 2.8.0 openblas-version = 0.3.5 openmpi-version = 4.0.1 diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk index 1709082..3c03fdc 100644 --- a/reproduce/software/make/basic.mk +++ b/reproduce/software/make/basic.mk @@ -124,6 +124,7 @@ tarballs = $(foreach t, bash-$(bash-version).tar.lz \ 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 \ @@ -132,6 +133,8 @@ tarballs = $(foreach t, bash-$(bash-version).tar.lz \ 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 \ @@ -176,6 +179,7 @@ $(tarballs): $(tdir)/%: | $(lockdir) 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; \ @@ -184,6 +188,8 @@ $(tarballs): $(tdir)/%: | $(lockdir) 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; \ @@ -312,9 +318,6 @@ $(ibidir)/low-level-links: | $(ibdir) $(ildir) # executable name `glibtool'. $(call makelink,libtool) - # GNU Gettext (translate messages) - $(call makelink,msgfmt) - # Necessary libraries: # Libdl (for dynamic loading libraries at runtime) # POSIX Threads library for multi-threaded programs. @@ -610,24 +613,14 @@ else needpatchelf = $(ibidir)/patchelf endif $(ibidir)/bash: $(needpatchelf) \ + $(ibidir)/gettext \ $(ibidir)/readline \ $(tdir)/bash-$(bash-version).tar.lz - # Delete the (possibly) existing Bash executable. + # Delete the (possibly) existing Bash executable in the project, + # let it use the default shell of the host. rm -f $(ibdir)/bash - # Build Bash. Note that we aren't building Bash with - # `--with-installed-readline'. This is because (as described above) - # Bash needs the `LD_LIBRARY_PATH' set properly before it is - # run. Within a recipe, things are fine (we do set - # `LD_LIBRARY_PATH'). However, Make will also call the shell - # outside of the recipe (for example in the `foreach' Make - # function!). In such cases, our new `LD_LIBRARY_PATH' is not set. - # This will cause a crash in the shell and thus the Makefile, - # complaining that it can't find `libreadline'. Therefore, even - # though we build readline below, we won't link Bash with an - # external readline. - # # Bash has many `--enable' features which are already enabled by # default. As described in the manual, they are mainly useful when # you disable them all with `--enable-minimal-config' and enable a @@ -635,9 +628,14 @@ $(ibidir)/bash: $(needpatchelf) \ if [ "x$(static_build)" = xyes ]; then stopt="--enable-static-link";\ else stopt=""; \ fi; \ - $(call gbuild, bash-$(bash-version),, \ - --with-installed-readline=$(ildir) $$stopt, \ - -j$(numthreads)) + export CFLAGS="$$CFLAGS \ + -DDEFAULT_PATH_VALUE='\"$(ibdir)\"' \ + -DSTANDARD_UTILS_PATH='\"$(ibdir)\"' \ + -DSYS_BASHRC='\"$(BASH_ENV)\"' "; \ + $(call gbuild, bash-$(bash-version),, $$stopt \ + --with-installed-readline=$(ildir) \ + --with-curses=yes, \ + -j$(numthreads)) # Atleast on GNU/Linux systems, Bash doesn't include RPATH by # default. So, we have to manually include it, currently we are @@ -676,7 +674,7 @@ perl-conflddlflags = else perl-conflddlflags = -Dlddlflags="-shared $$LDFLAGS" endif -$(ibidir)/perl: $(ibidir)/bash \ +$(ibidir)/perl: $(ibidir)/make \ $(tdir)/perl-$(perl-version).tar.gz major_version=$$(echo $(perl-version) \ | sed -e's/\./ /g' \ @@ -690,11 +688,6 @@ $(ibidir)/perl: $(ibidir)/bash \ echo; echo "Tar error"; exit 1; \ fi \ && cd perl-$(perl-version) \ - && sed -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \ - -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \ - Configure > Configure-tmp \ - && mv -f Configure-tmp Configure \ - && chmod +x Configure \ && ./Configure -des \ -Dusethreads \ -Duseshrplib \ @@ -715,8 +708,8 @@ $(ibidir)/perl: $(ibidir)/bash \ -Dcccdlflags='-fPIC' \ $(perl-conflddlflags) \ -Dldflags="$$LDFLAGS" \ - && make SHELL=$(ibdir)/bash -j$(numthreads) \ - && make SHELL=$(ibdir)/bash install \ + && make -j$(numthreads) \ + && make install \ && cd .. \ && rm -rf perl-$(perl-version) \ && cd $$topdir \ @@ -747,7 +740,8 @@ $(ibidir)/perl: $(ibidir)/bash \ # an error). # # Coreutils uses Perl to create man pages! -$(ibidir)/coreutils: $(ibidir)/perl \ +$(ibidir)/coreutils: $(ibidir)/bash \ + $(ibidir)/perl \ $(ibidir)/openssl \ $(tdir)/coreutils-$(coreutils-version).tar.xz cd $(ddir) \ @@ -971,7 +965,34 @@ $(ibidir)/libiconv: $(ibidir)/pkg-config \ $(call gbuild, libiconv-$(libiconv-version), static) \ && echo "GNU libiconv $(libiconv-version)" > $@ +$(ibidir)/libunistring: $(ibidir)/make \ + $(tdir)/libunistring-$(libunistring-version).tar.xz + $(call gbuild, libunistring-$(libunistring-version), static,, \ + -j$(numthreads)) \ + && echo "GNU libunistring $(libunistring-version)" > $@ + +$(ibidir)/libxml2: $(ibidir)/make \ + $(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 + # 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. + $(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 \ @@ -1013,9 +1034,7 @@ $(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)/sed \ - $(ibidir)/texinfo \ - $(ibidir)/coreutils \ +$(ibidir)/m4: $(ibidir)/texinfo \ $(tdir)/m4-$(m4-version).tar.gz cd $(ddir); \ unpackdir=m4-$(m4-version); \ @@ -1025,15 +1044,14 @@ $(ibidir)/m4: $(ibidir)/sed \ fi \ && cd $$unpackdir \ && if [ x$(on_mac_os) = xyes ]; then \ - sed -i -e's|if !(((__GLIBC__ > 2|if !defined(__APPLE__) \&\& !(((__GLIBC__ > 2|' lib/vasnprintf.c; \ + 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 \ - && sed -i -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \ - -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \ - configure \ - && ./configure --prefix=$(idir) SHELL=$(ibdir)/bash \ - LDFLAGS="$(LDFLAGS)" CPPFLAGS="$(CPPFLAGS)" \ - && make SHELL=$(ibdir)/bash V=1 -j$(numthreads) \ - && make SHELL=$(ibdir)/bash V=1 install \ + && ./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)" > $@ @@ -1128,7 +1146,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)/coreutils \ +$(ibidir)/pkg-config: $(ibidir)/make \ $(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, diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk index 21cc4ea..8caa968 100644 --- a/reproduce/software/make/high-level.mk +++ b/reproduce/software/make/high-level.mk @@ -180,7 +180,6 @@ tarballs = $(foreach t, apachelog4cxx-$(apachelog4cxx-version).tar.lz \ libnsl-$(libnsl-version).tar.gz \ libpng-$(libpng-version).tar.xz \ libtirpc-$(libtirpc-version).tar.bz2 \ - libxml2-$(libxml2-version).tar.gz \ missfits-$(missfits-version).tar.gz \ netpbm-$(netpbm-version).tar.gz \ openblas-$(openblas-version).tar.gz \ @@ -280,7 +279,6 @@ $(tarballs): $(tdir)/%: | $(lockdir) 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 = libxml2 ]; then c=$(libxml2-checksum); w=ftp://xmlsoft.org/libxml2 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 @@ -689,17 +687,6 @@ $(ibidir)/libtirpc: $(tdir)/libtirpc-$(libtirpc-version).tar.bz2 --disable-gssapi, V=1) \ echo "libtirpc $(libtirpc-version)" > $@ -$(ibidir)/libxml2: | $(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 the Python - # bindings, the easiest solution is to compile without Python support: - # ./configure --without-python - # If you really need the Python bindings, try the - # --with-python-install-dir=DIR option - $(call gbuild, libxml2-$(libxml2-version), static, \ - --without-python) \ - && echo "Libxml2 $(libxml2-version)" > $@ - $(ibidir)/openblas: $(tdir)/openblas-$(openblas-version).tar.gz if [ x$(on_mac_os) = xyes ]; then \ export CC=clang; \ diff --git a/reproduce/software/shell/configure.sh b/reproduce/software/shell/configure.sh index cce6e62..a381fcf 100755 --- a/reproduce/software/shell/configure.sh +++ b/reproduce/software/shell/configure.sh @@ -316,44 +316,6 @@ static_build=no -# Check for GNU gettext -# --------------------- -# -# Some of the basic sofware need GNU gettext which we don't yet install. -has_gettext=0 -if type msgfmt > /dev/null 2>/dev/null; then has_gettext=1; fi -if [ $has_gettext = 0 ]; then - cat <