fixLibtool(): patch ./configure, add file to common-path.nix

libtool's libtool.m4 script assumes that `file` is available, and can
be found at `/usr/bin/file` (this path is hardwired).  Furthermore,
the script with this assumption is vendored into the ./configure
scripts of an enormous number of packages.  Without this commit, you
will frequently see errors like this during the configurePhase with
the sandbox enabled:

  ./configure: line 9595: /usr/bin/file: command not found

Due mostly to luck, this error does not affect native compiles on
nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux.
However it will cause incorrect linker flag detection and a failure to
generate shared libraries for sandboxed cross-builds to a x86_64-linux
host as well as any sandboxed build (cross or native) for the following
hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux,
s390x-linux, s390x-tpf, sparc-linux, and *-solaris.

This commit fixes the problem by adding an extra line to fixLibtool()
in pkgs/stdenv/generic/setup.sh.  This extra line will scan the
unpacked source code for executable files named "configure" which
contain the following text:

'GNU Libtool is free software; you can redistribute it and/or modify'

This text is taken to be an indicator of a vendored libtool.m4.  When
it is found, the configure script containing it is subjected to `sed
-i s_/usr/bin/file_file_` which replaces all occurrences of
`/usr/bin/file` with `file`.

Additionally, the `file` package is now considered to be part of
`stdenv`.  It has been added to `common-path.nix` so that the `file`
binary will be found in the `$PATH` of every build, except for the
bootstrap-tools and the first few stages of stdenv boostrapping.

Verified no regressions under:

  nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix

This commit allows the following commands to complete, which should
enable Hydra to produce bootstrap-files for mips64el:

  nix-build \
    --option sandbox true \
    --option sandbox-fallback false \
    pkgs/top-level/release-cross.nix \
    -A bootstrapTools.mips64el-linux-gnuabi64.build

  nix-build \
    --option sandbox true \
    --option sandbox-fallback false \
    . \
    -A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
This commit is contained in:
Adam Joseph
2022-05-26 13:53:36 -07:00
parent b20b6fa0d8
commit 97c43828fb
4 changed files with 27 additions and 1 deletions
+8
View File
@@ -12,4 +12,12 @@
pkgs.bash pkgs.bash
pkgs.patch pkgs.patch
pkgs.xz.bin pkgs.xz.bin
# The `file` command is added here because an enormous number of
# packages have a vendored dependency upon `file` in their
# `./configure` script, due to libtool<=2.4.6, or due to
# libtool>=2.4.7 in which the package author decided to set FILECMD
# when running libtoolize. In fact, file-5.4.6 *depends on itself*
# and tries to invoke `file` from its own ./configure script.
pkgs.file
] ]
+3
View File
@@ -486,6 +486,7 @@ rec {
gmp gmp
libiconv libiconv
brotli.lib brotli.lib
file
] ++ lib.optional haveKRB5 libkrb5) ++ ] ++ lib.optional haveKRB5 libkrb5) ++
(with pkgs."${finalLlvmPackages}"; [ (with pkgs."${finalLlvmPackages}"; [
libcxx libcxx
@@ -561,6 +562,7 @@ rec {
gmp gmp
libiconv libiconv
brotli.lib brotli.lib
file
] ++ lib.optional haveKRB5 libkrb5) ++ ] ++ lib.optional haveKRB5 libkrb5) ++
(with pkgs."${finalLlvmPackages}"; [ (with pkgs."${finalLlvmPackages}"; [
libcxx libcxx
@@ -737,6 +739,7 @@ rec {
brotli.lib brotli.lib
cc.expand-response-params cc.expand-response-params
libxml2.out libxml2.out
file
] ++ lib.optional haveKRB5 libkrb5 ] ++ lib.optional haveKRB5 libkrb5
++ lib.optionals localSystem.isAarch64 [ ++ lib.optionals localSystem.isAarch64 [
pkgs.updateAutotoolsGnuConfigScriptsHook pkgs.updateAutotoolsGnuConfigScriptsHook
+15
View File
@@ -1021,6 +1021,21 @@ configurePhase() {
echo "fixing libtool script $i" echo "fixing libtool script $i"
fixLibtool "$i" fixLibtool "$i"
done done
# replace `/usr/bin/file` with `file` in any `configure`
# scripts with vendored libtool code. Preserve mtimes to
# prevent some packages (e.g. libidn2) from spontaneously
# autoreconf'ing themselves
CONFIGURE_MTIME_REFERENCE=$(mktemp configure.mtime.reference.XXX)
find . \
-executable \
-type f \
-name configure \
-execdir grep -l 'GNU Libtool is free software; you can redistribute it and/or modify' {} \; \
-execdir touch -r {} "$CONFIGURE_MTIME_REFERENCE" \; \
-execdir sed -i s_/usr/bin/file_file_g {} \; \
-execdir touch -r "$CONFIGURE_MTIME_REFERENCE" {} \;
rm -f "$CONFIGURE_MTIME_REFERENCE"
fi fi
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
+1 -1
View File
@@ -414,7 +414,7 @@ in
# Simple executable tools # Simple executable tools
concatMap (p: [ (getBin p) (getLib p) ]) [ concatMap (p: [ (getBin p) (getLib p) ]) [
gzip bzip2 xz bash binutils.bintools coreutils diffutils findutils gzip bzip2 xz bash binutils.bintools coreutils diffutils findutils
gawk gnumake gnused gnutar gnugrep gnupatch patchelf ed gawk gnumake gnused gnutar gnugrep gnupatch patchelf ed file
] ]
# Library dependencies # Library dependencies
++ map getLib ( ++ map getLib (