From 3c00ca03a251693e58eb4e3c247ee1f640215783 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 26 Apr 2020 16:31:49 -0400 Subject: [PATCH 1/3] meson: Don't set CC and CXX I've since convinced upstream to not use such vars for the build platform during cross. Finally! --- pkgs/development/tools/build-managers/meson/default.nix | 2 -- pkgs/development/tools/build-managers/meson/setup-hook.sh | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pkgs/development/tools/build-managers/meson/default.nix b/pkgs/development/tools/build-managers/meson/default.nix index 15b0a5ffcd0..977ffe837ec 100644 --- a/pkgs/development/tools/build-managers/meson/default.nix +++ b/pkgs/development/tools/build-managers/meson/default.nix @@ -90,8 +90,6 @@ python3Packages.buildPythonApplication rec { # checkInputs = [ ninja pkgconfig ]; # checkPhase = "python ./run_project_tests.py"; - inherit (stdenv) cc; - isCross = stdenv.targetPlatform != stdenv.hostPlatform; meta = with lib; { diff --git a/pkgs/development/tools/build-managers/meson/setup-hook.sh b/pkgs/development/tools/build-managers/meson/setup-hook.sh index 8d76ecdaf32..aef18e65ea1 100644 --- a/pkgs/development/tools/build-managers/meson/setup-hook.sh +++ b/pkgs/development/tools/build-managers/meson/setup-hook.sh @@ -25,7 +25,7 @@ mesonConfigurePhase() { echo "meson flags: $mesonFlags ${mesonFlagsArray[@]}" - CC=@cc@/bin/cc CXX=@cc@/bin/c++ meson build $mesonFlags "${mesonFlagsArray[@]}" + meson build $mesonFlags "${mesonFlagsArray[@]}" cd build if ! [[ -v enableParallelBuilding ]]; then From 128b93e06142914a88c91f3c9f03ce52f6cb569e Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 26 Apr 2020 16:32:56 -0400 Subject: [PATCH 2/3] meson: Patch to ingest env vars like autoconf See comment in code and the PR it references, https://github.com/mesonbuild/meson/pull/6827, for details. We can remove entries from the cross file because they will be gotten from env vars now. --- .../tools/build-managers/meson/default.nix | 11 +++++------ .../build-managers/meson/more-env-vars.patch | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 pkgs/development/tools/build-managers/meson/more-env-vars.patch diff --git a/pkgs/development/tools/build-managers/meson/default.nix b/pkgs/development/tools/build-managers/meson/default.nix index 977ffe837ec..3fb435c5c2b 100644 --- a/pkgs/development/tools/build-managers/meson/default.nix +++ b/pkgs/development/tools/build-managers/meson/default.nix @@ -45,6 +45,11 @@ python3Packages.buildPythonApplication rec { # We remove the check so multiple outputs can work sanely. ./allow-dirs-outside-of-prefix.patch + # Meson is currently inspecting fewer variables than autoconf does, which + # makes it harder for us to use setup hooks, etc. Taken from + # https://github.com/mesonbuild/meson/pull/6827 + ./more-env-vars.patch + # Unlike libtool, vanilla Meson does not pass any information # about the path library will be installed to to g-ir-scanner, # breaking the GIR when path other than ${!outputLib}/lib is used. @@ -67,13 +72,7 @@ python3Packages.buildPythonApplication rec { crossFile = writeTextDir "cross-file.conf" '' [binaries] - c = '${targetPackages.stdenv.cc.targetPrefix}cc' - cpp = '${targetPackages.stdenv.cc.targetPrefix}c++' - ar = '${targetPackages.stdenv.cc.bintools.targetPrefix}ar' - strip = '${targetPackages.stdenv.cc.bintools.targetPrefix}strip' pkgconfig = 'pkg-config' - ld = '${targetPackages.stdenv.cc.targetPrefix}ld' - objcopy = '${targetPackages.stdenv.cc.targetPrefix}objcopy' [properties] needs_exe_wrapper = true diff --git a/pkgs/development/tools/build-managers/meson/more-env-vars.patch b/pkgs/development/tools/build-managers/meson/more-env-vars.patch new file mode 100644 index 00000000000..a8f860f03cc --- /dev/null +++ b/pkgs/development/tools/build-managers/meson/more-env-vars.patch @@ -0,0 +1,16 @@ +diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py +index ac13a710..e0d07c51 100644 +--- a/mesonbuild/envconfig.py ++++ b/mesonbuild/envconfig.py +@@ -119,9 +119,9 @@ def get_env_var_pair(for_machine: MachineChoice, + # compiling we fall back on the unprefixed host version. This + # allows native builds to never need to worry about the 'BUILD_*' + # ones. +- ([var_name + '_FOR_BUILD'] if is_cross else [var_name]), ++ [var_name + '_FOR_BUILD'] + ([] if is_cross else [var_name]), + # Always just the unprefixed host verions +- ([] if is_cross else [var_name]), ++ [var_name], + )[for_machine] + for var in candidates: + value = os.environ.get(var) From 8245230753d260b61b928fad7e00323f38ca450f Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 26 Apr 2020 16:47:27 -0400 Subject: [PATCH 3/3] meson: Make target-agnostic The cross file is added in the `mkDerivation`. It isn't nice putting build tool-specific stuff here, but our current architecture gives us little alternative. --- .../tools/build-managers/meson/default.nix | 28 ------------------ .../tools/build-managers/meson/setup-hook.sh | 5 ---- pkgs/stdenv/generic/make-derivation.nix | 29 +++++++++++++++++++ 3 files changed, 29 insertions(+), 33 deletions(-) diff --git a/pkgs/development/tools/build-managers/meson/default.nix b/pkgs/development/tools/build-managers/meson/default.nix index 3fb435c5c2b..3809d19e7d0 100644 --- a/pkgs/development/tools/build-managers/meson/default.nix +++ b/pkgs/development/tools/build-managers/meson/default.nix @@ -3,20 +3,8 @@ , stdenv , writeTextDir , substituteAll -, targetPackages }: -let - # See https://mesonbuild.com/Reference-tables.html#cpu-families - cpuFamilies = { - aarch64 = "aarch64"; - armv5tel = "arm"; - armv6l = "arm"; - armv7l = "arm"; - i686 = "x86"; - x86_64 = "x86_64"; - }; -in python3Packages.buildPythonApplication rec { pname = "meson"; version = "0.54.0"; @@ -70,27 +58,11 @@ python3Packages.buildPythonApplication rec { setupHook = ./setup-hook.sh; - crossFile = writeTextDir "cross-file.conf" '' - [binaries] - pkgconfig = 'pkg-config' - - [properties] - needs_exe_wrapper = true - - [host_machine] - system = '${targetPackages.stdenv.targetPlatform.parsed.kernel.name}' - cpu_family = '${cpuFamilies.${targetPackages.stdenv.targetPlatform.parsed.cpu.name}}' - cpu = '${targetPackages.stdenv.targetPlatform.parsed.cpu.name}' - endian = ${if targetPackages.stdenv.targetPlatform.isLittleEndian then "'little'" else "'big'"} - ''; - # 0.45 update enabled tests but they are failing doCheck = false; # checkInputs = [ ninja pkgconfig ]; # checkPhase = "python ./run_project_tests.py"; - isCross = stdenv.targetPlatform != stdenv.hostPlatform; - meta = with lib; { homepage = "https://mesonbuild.com"; description = "SCons-like build system that use python as a front-end language and Ninja as a building backend"; diff --git a/pkgs/development/tools/build-managers/meson/setup-hook.sh b/pkgs/development/tools/build-managers/meson/setup-hook.sh index aef18e65ea1..3d946fcffd5 100644 --- a/pkgs/development/tools/build-managers/meson/setup-hook.sh +++ b/pkgs/development/tools/build-managers/meson/setup-hook.sh @@ -5,11 +5,6 @@ mesonConfigurePhase() { mesonFlags="--prefix=$prefix $mesonFlags" fi - # Build release by default. - if [ -n "@isCross@" ]; then - crossMesonFlags="--cross-file=@crossFile@/cross-file.conf" - fi - # See multiple-outputs.sh and meson’s coredata.py mesonFlags="\ --libdir=${!outputLib}/lib --libexecdir=${!outputLib}/libexec \ diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix index a11b280b047..e6363ce42c0 100644 --- a/pkgs/stdenv/generic/make-derivation.nix +++ b/pkgs/stdenv/generic/make-derivation.nix @@ -49,6 +49,7 @@ in rec { # Configure Phase , configureFlags ? [] , cmakeFlags ? [] + , mesonFlags ? [] , # Target is not included by default because most programs don't care. # Including it then would cause needless mass rebuilds. # @@ -252,6 +253,34 @@ in rec { ++ lib.optional (stdenv.buildPlatform.uname.system != null) "-DCMAKE_HOST_SYSTEM_NAME=${stdenv.buildPlatform.uname.system}" ++ lib.optional (stdenv.buildPlatform.uname.processor != null) "-DCMAKE_HOST_SYSTEM_PROCESSOR=${stdenv.buildPlatform.uname.processor}" ++ lib.optional (stdenv.buildPlatform.uname.release != null) "-DCMAKE_HOST_SYSTEM_VERSION=${stdenv.buildPlatform.uname.release}"; + + mesonFlags = if mesonFlags == null then null else let + # See https://mesonbuild.com/Reference-tables.html#cpu-families + cpuFamilies = { + aarch64 = "aarch64"; + armv5tel = "arm"; + armv6l = "arm"; + armv7l = "arm"; + i686 = "x86"; + x86_64 = "x86_64"; + }; + crossFile = builtins.toFile "cross-file.conf" ('' + [properties] + needs_exe_wrapper = true + + [host_machine] + system = '${stdenv.targetPlatform.parsed.kernel.name}' + cpu_family = '${cpuFamilies.${stdenv.targetPlatform.parsed.cpu.name}}' + cpu = '${stdenv.targetPlatform.parsed.cpu.name}' + endian = ${if stdenv.targetPlatform.isLittleEndian then "'little'" else "'big'"} + '' + # TODO should have target prefix too, issue #86077 + + '' + + [binaries] + pkgconfig = 'pkg-config' + ''); + in [ "--cross-file=${crossFile}" ] ++ mesonFlags; } // lib.optionalAttrs (attrs.enableParallelBuilding or false) { enableParallelChecking = attrs.enableParallelChecking or true; } // lib.optionalAttrs (hardeningDisable != [] || hardeningEnable != []) {