From ade144c501cf78383f8ad9c72a1e71bc839d8869 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Fri, 16 Jun 2023 01:45:41 -0700 Subject: [PATCH 1/9] gcc: substitute targetConfig from Nix, not bash This commit causes gcc/common/builder.nix to substitute the Nix variable `targetConfig` directly into the build script rather than having bash access it via variable reference. This also eliminates some fairly cryptic bash-wizardry ${like:+this} that most people don't grok at first sight. --- .../compilers/gcc/common/builder.nix | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index e73542263df2f..bd1963d52569d 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -3,7 +3,12 @@ , enableMultilib }: -originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { +originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // +(let + inherit (finalAttrs) targetConfig; + ifNullThen = val: default: if val==null then default else val; + targetConfigSlash = if targetConfig==null then "" else "${targetConfig}/"; +in { preUnpack = '' oldOpts="$(shopt -po nounset)" || true set -euo pipefail @@ -96,7 +101,7 @@ originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { declare -g EXTRA_FLAGS''${post}="''${extraFlags[*]}" done - if test -z "''${targetConfig-}"; then + if test -z "${ifNullThen targetConfig ""}"; then # host = target, so the flags are the same EXTRA_FLAGS_FOR_TARGET="$EXTRA_FLAGS" EXTRA_LDFLAGS_FOR_TARGET="$EXTRA_LDFLAGS" @@ -128,7 +133,7 @@ originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { "FLAGS_FOR_TARGET=$EXTRA_FLAGS_FOR_TARGET $EXTRA_LDFLAGS_FOR_TARGET" ) - if test -z "''${targetConfig-}"; then + if test -z "${ifNullThen targetConfig ""}"; then makeFlagsArray+=( "BOOT_CFLAGS=$EXTRA_FLAGS $EXTRA_LDFLAGS" "BOOT_LDFLAGS=$EXTRA_FLAGS_FOR_TARGET $EXTRA_LDFLAGS_FOR_TARGET" @@ -187,13 +192,13 @@ originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { ''; preInstall = '' - mkdir -p "$out/''${targetConfig}/lib" - mkdir -p "''${!outputLib}/''${targetConfig}/lib" + mkdir -p "$out/${ifNullThen targetConfig ""}/lib" + mkdir -p "''${!outputLib}/${ifNullThen targetConfig ""}/lib" '' + # Make `lib64` symlinks to `lib`. lib.optionalString (!enableMultilib && stdenv.hostPlatform.is64bit && !stdenv.hostPlatform.isMips64n32) '' - ln -s lib "$out/''${targetConfig}/lib64" - ln -s lib "''${!outputLib}/''${targetConfig}/lib64" + ln -s lib "$out/${ifNullThen targetConfig ""}/lib64" + ln -s lib "''${!outputLib}/${ifNullThen targetConfig ""}/lib64" '' + # On mips platforms, gcc follows the IRIX naming convention: # @@ -203,32 +208,32 @@ originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { # # Make `lib32` symlinks to `lib`. lib.optionalString (!enableMultilib && stdenv.targetPlatform.isMips64n32) '' - ln -s lib "$out/''${targetConfig}/lib32" - ln -s lib "''${!outputLib}/''${targetConfig}/lib32" + ln -s lib "$out/${ifNullThen targetConfig ""}/lib32" + ln -s lib "''${!outputLib}/${ifNullThen targetConfig ""}/lib32" ''; postInstall = '' # Move runtime libraries to lib output. - moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.so*" "''${!outputLib}" - moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.la" "''${!outputLib}" - moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.dylib" "''${!outputLib}" - moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.dll.a" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.so*" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.la" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.dylib" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.dll.a" "''${!outputLib}" moveToOutput "share/gcc-*/python" "''${!outputLib}" if [ -z "$enableShared" ]; then - moveToOutput "''${targetConfig+$targetConfig/}lib/lib*.a" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.a" "''${!outputLib}" fi - for i in "''${!outputLib}/''${targetConfig}"/lib/*.{la,py}; do + for i in "''${!outputLib}/${ifNullThen targetConfig ""}"/lib/*.{la,py}; do substituteInPlace "$i" --replace "$out" "''${!outputLib}" done if [ -n "$enableMultilib" ]; then - moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.so*" "''${!outputLib}" - moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.la" "''${!outputLib}" - moveToOutput "''${targetConfig+$targetConfig/}lib64/lib*.dylib" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib64/lib*.so*" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib64/lib*.la" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib64/lib*.dylib" "''${!outputLib}" - for i in "''${!outputLib}/''${targetConfig}"/lib64/*.{la,py}; do + for i in "''${!outputLib}/${ifNullThen targetConfig ""}"/lib64/*.{la,py}; do substituteInPlace "$i" --replace "$out" "''${!outputLib}" done fi @@ -256,10 +261,10 @@ originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { # of $dir headers and use it later as `-isysroot`. This prevents # cc-wrapper from overriding libc headers with `-idirafter`. # It should be safe to drop it and rely solely on the cc-wrapper. - local sysinc_dir=$out/''${targetConfig+$targetConfig/}sys-include + local sysinc_dir=$out/${targetConfigSlash}sys-include if [ -d "$sysinc_dir" ]; then - chmod -R u+w "$out/''${targetConfig+$targetConfig/}sys-include" - rm -rfv "$out/''${targetConfig+$targetConfig/}sys-include" + chmod -R u+w "$out/${targetConfigSlash}sys-include" + rm -rfv "$out/${targetConfigSlash}sys-include" fi # Get rid of some "fixed" header files @@ -286,4 +291,4 @@ originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // { fi done ''; -})) +}))) From bc16512bd2ececdb8370e6347028789ff002789b Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Fri, 16 Jun 2023 01:56:10 -0700 Subject: [PATCH 2/9] gcc: use builtins.placeholder instead of ${!foo} --- .../compilers/gcc/common/builder.nix | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index bd1963d52569d..45bf3ddd2081a 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -19,7 +19,7 @@ in { if test "$staticCompiler" = "1"; then EXTRA_LDFLAGS="-static" else - EXTRA_LDFLAGS="-Wl,-rpath,''${!outputLib}/lib" + EXTRA_LDFLAGS="-Wl,-rpath,${builtins.placeholder "lib"}/lib" fi # GCC interprets empty paths as ".", which we don't want. @@ -193,12 +193,12 @@ in { preInstall = '' mkdir -p "$out/${ifNullThen targetConfig ""}/lib" - mkdir -p "''${!outputLib}/${ifNullThen targetConfig ""}/lib" + mkdir -p "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}/lib" '' + # Make `lib64` symlinks to `lib`. lib.optionalString (!enableMultilib && stdenv.hostPlatform.is64bit && !stdenv.hostPlatform.isMips64n32) '' ln -s lib "$out/${ifNullThen targetConfig ""}/lib64" - ln -s lib "''${!outputLib}/${ifNullThen targetConfig ""}/lib64" + ln -s lib "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}/lib64" '' + # On mips platforms, gcc follows the IRIX naming convention: # @@ -209,32 +209,32 @@ in { # Make `lib32` symlinks to `lib`. lib.optionalString (!enableMultilib && stdenv.targetPlatform.isMips64n32) '' ln -s lib "$out/${ifNullThen targetConfig ""}/lib32" - ln -s lib "''${!outputLib}/${ifNullThen targetConfig ""}/lib32" + ln -s lib "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}/lib32" ''; postInstall = '' # Move runtime libraries to lib output. - moveToOutput "${targetConfigSlash}lib/lib*.so*" "''${!outputLib}" - moveToOutput "${targetConfigSlash}lib/lib*.la" "''${!outputLib}" - moveToOutput "${targetConfigSlash}lib/lib*.dylib" "''${!outputLib}" - moveToOutput "${targetConfigSlash}lib/lib*.dll.a" "''${!outputLib}" - moveToOutput "share/gcc-*/python" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.so*" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib/lib*.la" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib/lib*.dylib" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib/lib*.dll.a" "${builtins.placeholder "lib"}" + moveToOutput "share/gcc-*/python" "${builtins.placeholder "lib"}" if [ -z "$enableShared" ]; then - moveToOutput "${targetConfigSlash}lib/lib*.a" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib/lib*.a" "${builtins.placeholder "lib"}" fi - for i in "''${!outputLib}/${ifNullThen targetConfig ""}"/lib/*.{la,py}; do - substituteInPlace "$i" --replace "$out" "''${!outputLib}" + for i in "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}"/lib/*.{la,py}; do + substituteInPlace "$i" --replace "$out" "${builtins.placeholder "lib"}" done if [ -n "$enableMultilib" ]; then - moveToOutput "${targetConfigSlash}lib64/lib*.so*" "''${!outputLib}" - moveToOutput "${targetConfigSlash}lib64/lib*.la" "''${!outputLib}" - moveToOutput "${targetConfigSlash}lib64/lib*.dylib" "''${!outputLib}" + moveToOutput "${targetConfigSlash}lib64/lib*.so*" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib64/lib*.la" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib64/lib*.dylib" "${builtins.placeholder "lib"}" - for i in "''${!outputLib}/${ifNullThen targetConfig ""}"/lib64/*.{la,py}; do - substituteInPlace "$i" --replace "$out" "''${!outputLib}" + for i in "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}"/lib64/*.{la,py}; do + substituteInPlace "$i" --replace "$out" "${builtins.placeholder "lib"}" done fi @@ -247,10 +247,10 @@ in { rm -rf $out/bin/gccbug if type "install_name_tool"; then - for i in "''${!outputLib}"/lib/*.*.dylib "''${!outputLib}"/lib/*.so.[0-9]; do + for i in "${builtins.placeholder "lib"}"/lib/*.*.dylib "${builtins.placeholder "lib"}"/lib/*.so.[0-9]; do install_name_tool -id "$i" "$i" || true for old_path in $(otool -L "$i" | grep "$out" | awk '{print $1}'); do - new_path=`echo "$old_path" | sed "s,$out,''${!outputLib},"` + new_path=`echo "$old_path" | sed "s,$out,${builtins.placeholder "lib"},"` install_name_tool -change "$old_path" "$new_path" "$i" || true done done From cb4906c273010cb8fa1a9ba7801ddd945eb908df Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Fri, 16 Jun 2023 01:58:35 -0700 Subject: [PATCH 3/9] gcc: use boolToString instead of bash if-then-else --- .../development/compilers/gcc/common/builder.nix | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index 45bf3ddd2081a..e8778749e212c 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -140,17 +140,11 @@ in { ) fi - if test "$withoutTargetLibc" == 1; then - # We don't want the gcc build to assume there will be a libc providing - # limits.h in this stage - makeFlagsArray+=( - 'LIMITS_H_TEST=false' - ) - else - makeFlagsArray+=( - 'LIMITS_H_TEST=true' - ) - fi + # We don't want the gcc build to assume there will be a libc providing + # limits.h in this stage + makeFlagsArray+=( + 'LIMITS_H_TEST=${lib.boolToString (!finalAttrs.withoutTargetLibc)}' + ) fi eval "$oldOpts" From f84029dba604b16821d1e239e593289ae5044eac Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Thu, 29 Jun 2023 11:47:15 -0700 Subject: [PATCH 4/9] gcc: convert `-n $newlibSrc` from bash conditional to Nix conditional --- pkgs/development/compilers/gcc/common/builder.nix | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index e8778749e212c..e1ac36b2b3fb6 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -151,13 +151,13 @@ in { ''; preConfigure = (originalAttrs.preConfigure or "") + '' - if test -n "$newlibSrc"; then - tar xvf "$newlibSrc" -C .. - ln -s ../newlib-*/newlib newlib - # Patch to get armvt5el working: - sed -i -e 's/ arm)/ arm*)/' newlib/configure.host - fi + '' + lib.optionalString (finalAttrs.newlibSrc or false) '' + tar xvf "$newlibSrc" -C .. + ln -s ../newlib-*/newlib newlib + # Patch to get armvt5el working: + sed -i -e 's/ arm)/ arm*)/' newlib/configure.host + '' + '' # Bug - they packaged zlib if test -d "zlib"; then # This breaks the build without-headers, which should build only From 6340043e0d7c4cea93bb83d250565253301e50e6 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Thu, 29 Jun 2023 11:47:38 -0700 Subject: [PATCH 5/9] gcc: move two comments from bash code to Nix code --- pkgs/development/compilers/gcc/common/builder.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index e1ac36b2b3fb6..59ce51061fe49 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -179,9 +179,9 @@ in { configureScript=../$sourceRoot/configure ''; + # Avoid store paths when embedding ./configure flags into gcc. + # Mangled arguments are still useful when reporting bugs upstream. postConfigure = '' - # Avoid store paths when embedding ./configure flags into gcc. - # Mangled arguments are still useful when reporting bugs upstream. sed -e "/TOPLEVEL_CONFIGURE_ARGUMENTS=/ s|$NIX_STORE/[a-z0-9]\{32\}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" -i Makefile ''; @@ -206,8 +206,8 @@ in { ln -s lib "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}/lib32" ''; + # Move runtime libraries to lib output. postInstall = '' - # Move runtime libraries to lib output. moveToOutput "${targetConfigSlash}lib/lib*.so*" "${builtins.placeholder "lib"}" moveToOutput "${targetConfigSlash}lib/lib*.la" "${builtins.placeholder "lib"}" moveToOutput "${targetConfigSlash}lib/lib*.dylib" "${builtins.placeholder "lib"}" From 1bdb79382e92c0a5a67dba70af186af7e5aac5be Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Thu, 29 Jun 2023 11:50:34 -0700 Subject: [PATCH 6/9] gcc: convert bash `-z "$enableShared"` to Nix `!finalAttrs.enableShared` --- pkgs/development/compilers/gcc/common/builder.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index 59ce51061fe49..57d5d4e7671ea 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -214,9 +214,9 @@ in { moveToOutput "${targetConfigSlash}lib/lib*.dll.a" "${builtins.placeholder "lib"}" moveToOutput "share/gcc-*/python" "${builtins.placeholder "lib"}" - if [ -z "$enableShared" ]; then - moveToOutput "${targetConfigSlash}lib/lib*.a" "${builtins.placeholder "lib"}" - fi + '' + lib.optionalString (!finalAttrs.enableShared) '' + moveToOutput "${targetConfigSlash}lib/lib*.a" "${builtins.placeholder "lib"}" + '' + '' for i in "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}"/lib/*.{la,py}; do substituteInPlace "$i" --replace "$out" "${builtins.placeholder "lib"}" From e9fcfe9ff59fef41b3fafb04b494816c71c58b2b Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Thu, 29 Jun 2023 11:53:25 -0700 Subject: [PATCH 7/9] gcc: convert `test -n "$crossMingw" -a -n "$crossStageStatic"` from bash to Nix --- pkgs/development/compilers/gcc/common/builder.nix | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index 57d5d4e7671ea..f262bc12e8683 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -166,13 +166,13 @@ in { rm -Rf zlib fi - if test -n "$crossMingw" -a -n "$withoutTargetLibc"; then - mkdir -p ../mingw - # --with-build-sysroot expects that: - cp -R $libcCross/include ../mingw - configureFlags="$configureFlags --with-build-sysroot=`pwd`/.." - fi + '' + lib.optionalString (finalAttrs.crossMingw && finalAttrs.withoutTargetLibc) '' + mkdir -p ../mingw + # --with-build-sysroot expects that: + cp -R $libcCross/include ../mingw + configureFlags="$configureFlags --with-build-sysroot=`pwd`/.." + '' + '' # Perform the build in a different directory. mkdir ../build cd ../build From 90763852f154f1529b0d46959f7dd4e07991fb0b Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Thu, 29 Jun 2023 11:56:50 -0700 Subject: [PATCH 8/9] gcc: convert `-n "$enableMultilib"` conditional from bash to Nix --- .../development/compilers/gcc/common/builder.nix | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index f262bc12e8683..613a0acd4f860 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -222,15 +222,15 @@ in { substituteInPlace "$i" --replace "$out" "${builtins.placeholder "lib"}" done - if [ -n "$enableMultilib" ]; then - moveToOutput "${targetConfigSlash}lib64/lib*.so*" "${builtins.placeholder "lib"}" - moveToOutput "${targetConfigSlash}lib64/lib*.la" "${builtins.placeholder "lib"}" - moveToOutput "${targetConfigSlash}lib64/lib*.dylib" "${builtins.placeholder "lib"}" + '' + lib.optionalString (finalAttrs.enableMultilib) '' + moveToOutput "${targetConfigSlash}lib64/lib*.so*" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib64/lib*.la" "${builtins.placeholder "lib"}" + moveToOutput "${targetConfigSlash}lib64/lib*.dylib" "${builtins.placeholder "lib"}" - for i in "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}"/lib64/*.{la,py}; do - substituteInPlace "$i" --replace "$out" "${builtins.placeholder "lib"}" - done - fi + for i in "${builtins.placeholder "lib"}/${ifNullThen targetConfig ""}"/lib64/*.{la,py}; do + substituteInPlace "$i" --replace "$out" "${builtins.placeholder "lib"}" + done + '' + '' # Remove `fixincl' to prevent a retained dependency on the # previous gcc. From 4bea3fb0ec8b2da21333fb7dc6d8ae378d2ca807 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Fri, 7 Jul 2023 16:25:24 -0700 Subject: [PATCH 9/9] gcc: convert `if staticCompiler` conditional from bash to Nix --- pkgs/development/compilers/gcc/common/builder.nix | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/builder.nix b/pkgs/development/compilers/gcc/common/builder.nix index 613a0acd4f860..7150cb47b5a69 100644 --- a/pkgs/development/compilers/gcc/common/builder.nix +++ b/pkgs/development/compilers/gcc/common/builder.nix @@ -1,6 +1,7 @@ { lib , stdenv , enableMultilib +, staticCompiler }: originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // @@ -16,11 +17,7 @@ in { export NIX_FIXINC_DUMMY="$NIX_BUILD_TOP/dummy" mkdir "$NIX_FIXINC_DUMMY" - if test "$staticCompiler" = "1"; then - EXTRA_LDFLAGS="-static" - else - EXTRA_LDFLAGS="-Wl,-rpath,${builtins.placeholder "lib"}/lib" - fi + EXTRA_LDFLAGS="${if staticCompiler then "-static" else "-Wl,-rpath,${builtins.placeholder "lib"}/lib"}" # GCC interprets empty paths as ".", which we don't want. if test -z "''${CPATH-}"; then unset CPATH; fi