From a826b49c97bcc9d8365b5d18aeec8087116d195d Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Mon, 13 Jan 2020 17:46:11 +0100 Subject: [PATCH 1/5] stdenv: make darwin builds reproducable Fixes #21629 Passing these extra linker flags removes both the semi-random uuid included in most binaries as well as making the sdk version consistent instead of based on the current os version. Load command 8 cmd LC_UUID cmdsize 24 uuid 70FAF921-5DC8-371C-B814-4F121FADFDF4 Load command 9 cmd LC_VERSION_MIN_MACOSX cmdsize 16 version 10.12 sdk 10.13 The -macosx_version_min flag isn't strictly necessary since that's already handled by MACOSX_DEPLOYMENT_TARGET. --- pkgs/stdenv/darwin/default.nix | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index f73fca48b7a..207502285b2 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -28,15 +28,20 @@ let ]; in rec { commonPreHook = '' - export NIX_ENFORCE_PURITY="''${NIX_ENFORCE_PURITY-1}" - export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}" + export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1} + export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1} export NIX_IGNORE_LD_THROUGH_GCC=1 - stripAllFlags=" " # the Darwin "strip" command doesn't know "-s" - export MACOSX_DEPLOYMENT_TARGET=10.12 - export SDKROOT= export CMAKE_OSX_ARCHITECTURES=x86_64 + export SDKROOT= + + # Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID. + export MACOSX_DEPLOYMENT_TARGET=10.12 + export NIX_LDFLAGS+=" -macosx_version_min 10.12 -sdk_version 10.12 -no_uuid" + # Workaround for https://openradar.appspot.com/22671534 on 10.11. export gl_cv_func_getcwd_abort_bug=no + + stripAllFlags=" " # the Darwin "strip" command doesn't know "-s" ''; bootstrapTools = derivation { From 6567823996e216e8bdfd4fbdb4ad3ed92572dbe7 Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Mon, 13 Jan 2020 17:56:02 +0100 Subject: [PATCH 2/5] stdenv: introduce appleSdkVersion and macosVersionMin --- pkgs/os-specific/darwin/apple-sdk/default.nix | 7 ++++++- pkgs/stdenv/darwin/default.nix | 16 +++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/pkgs/os-specific/darwin/apple-sdk/default.nix b/pkgs/os-specific/darwin/apple-sdk/default.nix index 9890d385259..89c13d0b92d 100644 --- a/pkgs/os-specific/darwin/apple-sdk/default.nix +++ b/pkgs/os-specific/darwin/apple-sdk/default.nix @@ -1,10 +1,15 @@ { stdenv, fetchurl, xar, cpio, pkgs, python3, pbzx, lib }: +let version = "10.12"; in + +# Ensure appleSdkVersion is up to date. +assert stdenv.isDarwin -> stdenv.appleSdkVersion == version; + let # sadly needs to be exported because security_tool needs it sdk = stdenv.mkDerivation rec { - version = "10.12"; pname = "MacOS_SDK"; + inherit version; # This URL comes from https://swscan.apple.com/content/catalogs/others/index-10.12.merged-1.sucatalog, which we found by: # 1. Google: site:swscan.apple.com and look for a name that seems appropriate for your version diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 207502285b2..7a9c20fd6a7 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -1,6 +1,9 @@ { lib , localSystem, crossSystem, config, overlays, crossOverlays ? [] - +# The version of darwin.apple_sdk used for sources provided by apple. +, appleSdkVersion ? "10.12" +# Minimum required macOS version, used both for compatibility as well as reproducability. +, macosVersionMin ? "10.12" # Allow passing in bootstrap files directly so we can test the stdenv bootstrap process when changing the bootstrap tools , bootstrapFiles ? let fetch = { file, sha256, executable ? true }: import { @@ -35,8 +38,8 @@ in rec { export SDKROOT= # Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID. - export MACOSX_DEPLOYMENT_TARGET=10.12 - export NIX_LDFLAGS+=" -macosx_version_min 10.12 -sdk_version 10.12 -no_uuid" + export MACOSX_DEPLOYMENT_TARGET=${macosVersionMin} + export NIX_LDFLAGS+=" -macosx_version_min ${macosVersionMin} -sdk_version ${appleSdkVersion} -no_uuid" # Workaround for https://openradar.appspot.com/22671534 on 10.11. export gl_cv_func_getcwd_abort_bug=no @@ -135,8 +138,7 @@ in rec { __extraImpureHostDeps = commonImpureHostDeps; extraAttrs = { - inherit platform; - parent = last; + inherit macosVersionMin appleSdkVersion platform; }; overrides = self: super: (overrides self super) // { fetchurl = thisStdenv.fetchurlBoot; }; }; @@ -405,9 +407,9 @@ in rec { extraBuildInputs = [ pkgs.darwin.CF ]; extraAttrs = { - inherit platform bootstrapTools; - libc = pkgs.darwin.Libsystem; + libc = pkgs.darwin.Libsystem; shellPackage = pkgs.bash; + inherit macosVersionMin appleSdkVersion platform bootstrapTools; }; allowedRequisites = (with pkgs; [ From 9b579843d4069839219d9c16c56695a09749b655 Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Mon, 13 Jan 2020 18:05:52 +0100 Subject: [PATCH 3/5] treewide: use stdenv.macosVersionMin --- pkgs/development/tools/misc/ccls/default.nix | 2 +- pkgs/development/tools/misc/cquery/default.nix | 2 +- pkgs/servers/sql/mysql/8.0.x.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/development/tools/misc/ccls/default.nix b/pkgs/development/tools/misc/ccls/default.nix index 8748cdf52b4..c3a0e57bd7f 100644 --- a/pkgs/development/tools/misc/ccls/default.nix +++ b/pkgs/development/tools/misc/ccls/default.nix @@ -17,7 +17,7 @@ stdenv.mkDerivation rec { cmakeFlags = [ "-DCCLS_VERSION=${version}" - "-DCMAKE_OSX_DEPLOYMENT_TARGET=10.12" + "-DCMAKE_OSX_DEPLOYMENT_TARGET=${stdenv.macosVersionMin or ""}" ]; preConfigure = '' diff --git a/pkgs/development/tools/misc/cquery/default.nix b/pkgs/development/tools/misc/cquery/default.nix index c43509a4f43..ccb4dd5b15a 100644 --- a/pkgs/development/tools/misc/cquery/default.nix +++ b/pkgs/development/tools/misc/cquery/default.nix @@ -26,7 +26,7 @@ stdenv.mkDerivation { cmakeFlags = [ "-DSYSTEM_CLANG=ON" "-DCLANG_CXX=ON" - "-DCMAKE_OSX_DEPLOYMENT_TARGET=10.12" + "-DCMAKE_OSX_DEPLOYMENT_TARGET=${stdenv.macosVersionMin or ""}" ]; shell = runtimeShell; diff --git a/pkgs/servers/sql/mysql/8.0.x.nix b/pkgs/servers/sql/mysql/8.0.x.nix index fcb64550d6f..64b4417ea60 100644 --- a/pkgs/servers/sql/mysql/8.0.x.nix +++ b/pkgs/servers/sql/mysql/8.0.x.nix @@ -31,7 +31,7 @@ self = stdenv.mkDerivation rec { outputs = [ "out" "static" ]; cmakeFlags = [ - "-DCMAKE_OSX_DEPLOYMENT_TARGET=10.12" # For std::shared_timed_mutex. + "-DCMAKE_OSX_DEPLOYMENT_TARGET=${stdenv.macosVersionMin or ""}" # For std::shared_timed_mutex. "-DCMAKE_SKIP_BUILD_RPATH=OFF" # To run libmysql/libmysql_api_test during build. "-DFORCE_UNSUPPORTED_COMPILER=1" # To configure on Darwin. "-DWITH_ROUTER=OFF" # It may be packaged separately. From b984c227d28c0af7b1afaace0c2ad107d94757f6 Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Tue, 14 Jan 2020 12:10:32 +0100 Subject: [PATCH 4/5] cmake: remove CMAKE_OSX_DEPLOYMENT_TARGET overrides We _do_ want minimum versions in our packages. --- pkgs/development/tools/build-managers/cmake/setup-hook.sh | 4 ---- pkgs/development/tools/misc/ccls/default.nix | 5 +---- pkgs/development/tools/misc/cquery/default.nix | 1 - pkgs/servers/sql/mysql/8.0.x.nix | 1 - 4 files changed, 1 insertion(+), 10 deletions(-) diff --git a/pkgs/development/tools/build-managers/cmake/setup-hook.sh b/pkgs/development/tools/build-managers/cmake/setup-hook.sh index 6f3d33bcaa7..5479067d637 100755 --- a/pkgs/development/tools/build-managers/cmake/setup-hook.sh +++ b/pkgs/development/tools/build-managers/cmake/setup-hook.sh @@ -53,10 +53,6 @@ cmakeConfigurePhase() { # we never want to use the global macOS SDK cmakeFlags="-DCMAKE_OSX_SYSROOT= $cmakeFlags" - # disable OSX deployment target - # we don't want our binaries to have a "minimum" OSX version - cmakeFlags="-DCMAKE_OSX_DEPLOYMENT_TARGET= $cmakeFlags" - # correctly detect our clang compiler cmakeFlags="-DCMAKE_POLICY_DEFAULT_CMP0025=NEW $cmakeFlags" diff --git a/pkgs/development/tools/misc/ccls/default.nix b/pkgs/development/tools/misc/ccls/default.nix index c3a0e57bd7f..f442c16e351 100644 --- a/pkgs/development/tools/misc/ccls/default.nix +++ b/pkgs/development/tools/misc/ccls/default.nix @@ -15,10 +15,7 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ cmake ]; buildInputs = with llvmPackages; [ clang-unwrapped llvm rapidjson ]; - cmakeFlags = [ - "-DCCLS_VERSION=${version}" - "-DCMAKE_OSX_DEPLOYMENT_TARGET=${stdenv.macosVersionMin or ""}" - ]; + cmakeFlags = [ "-DCCLS_VERSION=${version}" ]; preConfigure = '' cmakeFlagsArray+=(-DCMAKE_CXX_FLAGS="-fvisibility=hidden -fno-rtti") diff --git a/pkgs/development/tools/misc/cquery/default.nix b/pkgs/development/tools/misc/cquery/default.nix index ccb4dd5b15a..87b3cbb7121 100644 --- a/pkgs/development/tools/misc/cquery/default.nix +++ b/pkgs/development/tools/misc/cquery/default.nix @@ -26,7 +26,6 @@ stdenv.mkDerivation { cmakeFlags = [ "-DSYSTEM_CLANG=ON" "-DCLANG_CXX=ON" - "-DCMAKE_OSX_DEPLOYMENT_TARGET=${stdenv.macosVersionMin or ""}" ]; shell = runtimeShell; diff --git a/pkgs/servers/sql/mysql/8.0.x.nix b/pkgs/servers/sql/mysql/8.0.x.nix index 64b4417ea60..3c1d1f6645c 100644 --- a/pkgs/servers/sql/mysql/8.0.x.nix +++ b/pkgs/servers/sql/mysql/8.0.x.nix @@ -31,7 +31,6 @@ self = stdenv.mkDerivation rec { outputs = [ "out" "static" ]; cmakeFlags = [ - "-DCMAKE_OSX_DEPLOYMENT_TARGET=${stdenv.macosVersionMin or ""}" # For std::shared_timed_mutex. "-DCMAKE_SKIP_BUILD_RPATH=OFF" # To run libmysql/libmysql_api_test during build. "-DFORCE_UNSUPPORTED_COMPILER=1" # To configure on Darwin. "-DWITH_ROUTER=OFF" # It may be packaged separately. From 68513e40711cd942144a1da9c9e434b378c2c762 Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Tue, 14 Jan 2020 12:43:54 +0100 Subject: [PATCH 5/5] cmake: move CMAKE_OSX_ARCHITECTURES out of the stdenv This was initially introduced in 92188d9d1751892ddbf8913da73dfc150d18fadb, not clear how relevant this still is but i686 isn't supported anymore so disable it explicitly. --- pkgs/development/tools/build-managers/cmake/setup-hook.sh | 3 +++ pkgs/stdenv/darwin/default.nix | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/development/tools/build-managers/cmake/setup-hook.sh b/pkgs/development/tools/build-managers/cmake/setup-hook.sh index 5479067d637..87bbefa6bbf 100755 --- a/pkgs/development/tools/build-managers/cmake/setup-hook.sh +++ b/pkgs/development/tools/build-managers/cmake/setup-hook.sh @@ -50,6 +50,9 @@ cmakeConfigurePhase() { # because we usually do not package the framework cmakeFlags="-DCMAKE_FIND_FRAMEWORK=last $cmakeFlags" + # on macOS i686 was only relevant for 10.5 or earlier. + cmakeFlags="-DCMAKE_OSX_ARCHITECTURES=x86_64 $cmakeFlags" + # we never want to use the global macOS SDK cmakeFlags="-DCMAKE_OSX_SYSROOT= $cmakeFlags" diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 7a9c20fd6a7..4f91d18a376 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -34,7 +34,6 @@ in rec { export NIX_ENFORCE_NO_NATIVE=''${NIX_ENFORCE_NO_NATIVE-1} export NIX_ENFORCE_PURITY=''${NIX_ENFORCE_PURITY-1} export NIX_IGNORE_LD_THROUGH_GCC=1 - export CMAKE_OSX_ARCHITECTURES=x86_64 export SDKROOT= # Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID.