aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Akhlaghi <mohammad@akhlaghi.org>2019-01-20 05:14:41 +0000
committerMohammad Akhlaghi <mohammad@akhlaghi.org>2019-01-20 05:14:41 +0000
commit2d5c3e19256ab716fa52567abb2989616f67dfda (patch)
treed7e0374e2cea765d2e41a030e194051168a75173
parent3929a9aa93f9304cde3f3791ec5ad9a55631b3e0 (diff)
Bash is built with its own libreadline, not using ours
While working on a pipeline based on this, I noticed many linking errors of our installed Bash, complaining that it can't link with libreadline. This was while readline was present in the proper directory and the Bash within a recipe would work properly. After some investigation, I found out that this is because Make's `foreach' function (which was used to define the targets) was apparently calling Bash without setting `LD_LIBRARY_PATH', causing this error. To avoid such sitations, Bash now uses its internal build of readline and we no longer ask it to link with the installed readline.
-rwxr-xr-x[-rw-r--r--]reproduce/src/make/dependencies-basic.mk217
1 files changed, 113 insertions, 104 deletions
diff --git a/reproduce/src/make/dependencies-basic.mk b/reproduce/src/make/dependencies-basic.mk
index 6e274ed..2904a0b 100644..100755
--- a/reproduce/src/make/dependencies-basic.mk
+++ b/reproduce/src/make/dependencies-basic.mk
@@ -19,9 +19,8 @@
# ------------------------------------------------------------------------
#
# Original author:
-# Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Contributing author(s):
# Your name <your@email.address>
+# Contributing author(s):
# Copyright (C) 2018-2019, Your Name.
#
# This Makefile is free software: you can redistribute it and/or modify it
@@ -149,10 +148,10 @@ $(tarballs): $(tdir)/%:
elif [ $$n = make ]; then w=http://akhlaghi.org/src; \
elif [ $$n = mpfr ]; then w=http://www.mpfr.org/mpfr-current;\
elif [ $$n = mpc ]; then w=http://ftpmirror.gnu.org/gnu/mpc;\
- elif [ $$n = ncurses ]; then w=http://ftpmirror.gnu.org/gnu/ncurses;\
+ elif [ $$n = ncurses ]; then w=http://ftpmirror.gnu.org/gnu/ncurses;\
elif [ $$n = openssl ]; then w=http://www.openssl.org/source; \
elif [ $$n = pkg ]; then w=http://pkg-config.freedesktop.org/releases; \
- elif [ $$n = readline ]; then w=http://ftpmirror.gnu.org/gnu/readline; \
+ elif [ $$n = readline ]; then w=http://ftpmirror.gnu.org/gnu/readline; \
elif [ $$n = sed ]; then w=http://ftpmirror.gnu.org/gnu/sed;\
elif [ $$n = tar ]; then w=http://ftpmirror.gnu.org/gnu/tar;\
elif [ $$n = wget ]; then w=http://ftpmirror.gnu.org/gnu/wget;\
@@ -333,111 +332,35 @@ $(ibdir)/make: $(tdir)/make-$(make-version).tar.lz \
# See Tar's comments for the `-j' option.
$(call gbuild, $<, make-$(make-version), , , -j$(numthreads))
-$(ilidir)/ncurses: $(tdir)/ncurses-$(ncurses-version).tar.gz \
- $(ibdir)/make | $(ilidir)
-
- # Delete the library that will be installed (so we can make sure
- # the build process completed afterwards and reset the links).
- rm -f $(ildir)/libncursesw*
-
- # Standard build process.
- $(call gbuild, $<, ncurses-$(ncurses-version), static, \
- --with-shared --enable-rpath --without-normal \
- --without-debug --with-cxx-binding \
- --with-cxx-shared --enable-widec --enable-pc-files \
- --with-pkg-config=$(ildir)/pkgconfig )
-
- # Unfortunately there are many problems with `ncurses' using
- # "normal" (or 8-bit) characters. The standard way that will work
- # is to build it with wide character mode as you see above in the
- # configuration (or the `w' prefix you see below). Also, most
- # programs (and in particular Bash and AWK), first look for other
- # (mostly obsolete) libraries like tinfo, which define the same
- # symbols. The links below address both situations: we need to fool
- # higher-level packages to find this library even if they aren't
- # explicitly mentioning its name correctly (as a value to `-l' at
- # link time in their configure scripts).
- #
- # This part is taken from the Arch Linux build script[1], then
- # extended to Mac thanks to Homebrew's script [2].
- #
- # [1] https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/ncurses
- # [2] https://github.com/Homebrew/homebrew-core/blob/master/Formula/ncurses.rb
- #
- # Since we can't have comments, in the connected script, here is a
- # summary:
- #
- # 1. We find the actual suffix of the library, from the file that
- # is not a symbolic link (starting with `-' in the output of
- # `ls -l').
- #
- # 2. We make symbolic links to all the "ncurses", "ncurses++",
- # "form", "panel" and "menu" libraries to point to their
- # "wide" (character) library.
- #
- # 3. We make symbolic links to the "tic" and "tinfo" libraries to
- # point to the same `libncursesw' library.
- #
- # 4. Some programs link with "curses" (not "ncurses", notice the
- # starting "n"), so we'll also make links for these to point
- # to the `libncursesw' library.
- #
- # 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 \
- \
- 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 is built and ready" > $@; \
- else \
- exit 1; \
- fi
-
-$(ilidir)/readline: $(tdir)/readline-$(readline-version).tar.gz \
- $(ilidir)/ncurses
- $(call gbuild, $<, readline-$(readline-version), static, \
- --with-curses --disable-install-examples, \
- SHLIB_LIBS="-lncursesw" ) && \
- echo "GNU Readline is built and ready" > $@
-
# IMPORTANT: Even though we have enabled `rpath', Bash doesn't write the
-# absolute adddress of the libraries it depends on. So if you run `ldd
-# $(ibdir)/bash' on the command-line, it will say that it is linking with
-# the system's `readline'. But if you run that same command within a rule
-# in this reproduction pipeline, you'll see that it is indeed linking with
-# our own built readline.
+# absolute adddress of the libraries it depends on! Therefore, if we
+# configure Bash with `--with-installed-readline' (so the installed version
+# of Readline, that we build below as a prerequisite or AWK, is used) and
+# you run `ldd $(ibdir)/bash' on the resulting binary, it will say that it
+# is linking with the system's `readline'. But if you run that same command
+# within a rule in this reproduction pipeline, you'll see that it is indeed
+# linking with our own built readline.
$(ibdir)/bash: $(tdir)/bash-$(bash-version).tar.gz \
- $(ilidir)/readline
+ $(ibdir)/make
# Delete any possibly existing output
rm -f $@
- # Build 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.
ifeq ($(static_build),yes)
- $(call gbuild, $<, bash-$(bash-version), , --enable-static-link \
- --with-installed-readline=$(idir))
+ $(call gbuild, $<, bash-$(bash-version), , --enable-static-link)
else
- $(call gbuild, $<, bash-$(bash-version), , \
- --with-installed-readline=$(idir))
+ $(call gbuild, $<, bash-$(bash-version))
endif
# To be generic, some systems use the `sh' command to call the
@@ -465,7 +388,7 @@ endif
$(idir)/etc:; mkdir $@
$(ilidir): | $(ildir); mkdir $@
$(ilidir)/zlib: $(tdir)/zlib-$(zlib-version).tar.gz \
- $(ibdir)/bash
+ $(ibdir)/bash | $(ilidir)
$(call gbuild, $<, zlib-$(zlib-version)) && echo "Zlib is built" > $@
# OpenSSL: Some programs/libraries later need dynamic linking. So we'll
@@ -544,6 +467,92 @@ $(ibdir)/wget: $(tdir)/wget-$(wget-version).tar.lz \
# Basic command-line programs necessary in build process of the
# higher-level dependencies: Note that during the building of those
# programs, there is no access to the system's PATH.
+$(ilidir)/ncurses: $(tdir)/ncurses-$(ncurses-version).tar.gz \
+ $(ibdir)/bash | $(ilidir)
+
+ # Delete the library that will be installed (so we can make sure
+ # the build process completed afterwards and reset the links).
+ rm -f $(ildir)/libncursesw*
+
+ # Standard build process.
+ $(call gbuild, $<, ncurses-$(ncurses-version), static, \
+ --with-shared --enable-rpath --without-normal \
+ --without-debug --with-cxx-binding \
+ --with-cxx-shared --enable-widec --enable-pc-files \
+ --with-pkg-config=$(ildir)/pkgconfig )
+
+ # Unfortunately there are many problems with `ncurses' using
+ # "normal" (or 8-bit) characters. The standard way that will work
+ # is to build it with wide character mode as you see above in the
+ # configuration (or the `w' prefix you see below). Also, most
+ # programs (and in particular Bash and AWK), first look for other
+ # (mostly obsolete) libraries like tinfo, which define the same
+ # symbols. The links below address both situations: we need to fool
+ # higher-level packages to find this library even if they aren't
+ # explicitly mentioning its name correctly (as a value to `-l' at
+ # link time in their configure scripts).
+ #
+ # This part is taken from the Arch Linux build script[1], then
+ # extended to Mac thanks to Homebrew's script [2].
+ #
+ # [1] https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/ncurses
+ # [2] https://github.com/Homebrew/homebrew-core/blob/master/Formula/ncurses.rb
+ #
+ # Since we can't have comments, in the connected script, here is a
+ # summary:
+ #
+ # 1. We find the actual suffix of the library, from the file that
+ # is not a symbolic link (starting with `-' in the output of
+ # `ls -l').
+ #
+ # 2. We make symbolic links to all the "ncurses", "ncurses++",
+ # "form", "panel" and "menu" libraries to point to their
+ # "wide" (character) library.
+ #
+ # 3. We make symbolic links to the "tic" and "tinfo" libraries to
+ # point to the same `libncursesw' library.
+ #
+ # 4. Some programs link with "curses" (not "ncurses", notice the
+ # starting "n"), so we'll also make links for these to point
+ # to the `libncursesw' library.
+ #
+ # 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 \
+ \
+ 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 is built and ready" > $@; \
+ else \
+ exit 1; \
+ fi
+
+$(ilidir)/readline: $(tdir)/readline-$(readline-version).tar.gz \
+ $(ilidir)/ncurses
+ $(call gbuild, $<, readline-$(readline-version), static, \
+ --with-curses --disable-install-examples, \
+ SHLIB_LIBS="-lncursesw" ) && \
+ echo "GNU Readline is built and ready" > $@
+
$(ibdir)/diff: $(tdir)/diffutils-$(diffutils-version).tar.xz \
$(ibdir)/bash
$(call gbuild, $<, diffutils-$(diffutils-version), static)
@@ -553,7 +562,7 @@ $(ibdir)/find: $(tdir)/findutils-$(findutils-version).tar.lz \
$(call gbuild, $<, findutils-$(findutils-version), static)
$(ibdir)/gawk: $(tdir)/gawk-$(gawk-version).tar.lz \
- $(ibdir)/bash
+ $(ilidir)/readline
$(call gbuild, $<, gawk-$(gawk-version), static, \
--with-readline=$(idir));
@@ -595,7 +604,7 @@ $(ibdir)/which: $(tdir)/which-$(which-version).tar.gz \
# (CURRENTLY IGNORED) GCC prerequisites
# -------------------------------------
$(ilidir)/gmp: $(tdir)/gmp-$(gmp-version).tar.lz \
- $(ibdir)/bash
+ $(ibdir)/bash | $(ilidir)
$(call gbuild, $<, gmp-$(gmp-version), static, , , make check) \
&& echo "GNU multiple precision arithmetic library is built" > $@