forked from lix-project/lix
meson: fix cross compilation
This should fix cross compilation in the base case, but this is
difficult to test as cross compilation is broken in many different
places right now. This should bring Meson back up to cross parity with
the Make buildsystem though.
Change-Id: If09be8142d1fc975a82b994143ff35be1297dad8
This commit is contained in:
parent
111db8b38f
commit
05e3b1d39e
42
meson.build
42
meson.build
|
@ -85,8 +85,8 @@ endif
|
||||||
enable_docs = get_option('enable-docs')
|
enable_docs = get_option('enable-docs')
|
||||||
enable_internal_api_docs = get_option('internal-api-docs')
|
enable_internal_api_docs = get_option('internal-api-docs')
|
||||||
|
|
||||||
doxygen = find_program('doxygen', required : enable_internal_api_docs)
|
doxygen = find_program('doxygen', required : enable_internal_api_docs, native : true)
|
||||||
bash = find_program('bash')
|
bash = find_program('bash', native : true)
|
||||||
|
|
||||||
rapidcheck_meson = dependency('rapidcheck', required : enable_internal_api_docs)
|
rapidcheck_meson = dependency('rapidcheck', required : enable_internal_api_docs)
|
||||||
|
|
||||||
|
@ -114,6 +114,25 @@ endif
|
||||||
|
|
||||||
cxx = meson.get_compiler('cpp')
|
cxx = meson.get_compiler('cpp')
|
||||||
|
|
||||||
|
# Translate some historical and Mesony CPU names to Lixy CPU names.
|
||||||
|
# FIXME(Qyriad): the 32-bit x86 code is not tested right now, because cross compilation for Lix
|
||||||
|
# to those architectures is currently broken for other reasons, namely:
|
||||||
|
# - nixos-23.11's x86_64-linux -> i686-linux glibc does not build (also applies to cppnix)
|
||||||
|
# - nixpkgs-unstable (as of 2024/04)'s boehmgc is not compatible with our patches
|
||||||
|
# It's also broken in cppnix, though.
|
||||||
|
host_cpu = host_machine.cpu_family()
|
||||||
|
if host_cpu in ['x86', 'i686', 'i386']
|
||||||
|
# Meson considers 32-bit x86 CPUs to be "x86", and does not consider 64-bit
|
||||||
|
# x86 CPUs to be "x86" (instead using "x86_64", which needs no translation).
|
||||||
|
host_cpu = 'i686'
|
||||||
|
elif host_cpu == 'amd64'
|
||||||
|
# This should not be needed under normal circumstances, but someone could pass a --cross-file
|
||||||
|
# that sets the cpu_family to this.
|
||||||
|
host_cpu = 'x86_64'
|
||||||
|
elif host_cpu in ['armv6', 'armv7']
|
||||||
|
host_cpu += 'l'
|
||||||
|
endif
|
||||||
|
|
||||||
host_system = host_machine.cpu_family() + '-' + host_machine.system()
|
host_system = host_machine.cpu_family() + '-' + host_machine.system()
|
||||||
message('canonical Nix system name:', host_system)
|
message('canonical Nix system name:', host_system)
|
||||||
|
|
||||||
|
@ -181,6 +200,7 @@ openssl = dependency('libcrypto', 'openssl', required : true)
|
||||||
deps += openssl
|
deps += openssl
|
||||||
|
|
||||||
aws_sdk = dependency('aws-cpp-sdk-core', required : false)
|
aws_sdk = dependency('aws-cpp-sdk-core', required : false)
|
||||||
|
aws_sdk_transfer = dependency('aws-cpp-sdk-transfer', required : aws_sdk.found())
|
||||||
if aws_sdk.found()
|
if aws_sdk.found()
|
||||||
# The AWS pkg-config adds -std=c++11.
|
# The AWS pkg-config adds -std=c++11.
|
||||||
# https://github.com/aws/aws-sdk-cpp/issues/2673
|
# https://github.com/aws/aws-sdk-cpp/issues/2673
|
||||||
|
@ -198,7 +218,7 @@ if aws_sdk.found()
|
||||||
'AWS_VERSION_MINOR': s[1].to_int(),
|
'AWS_VERSION_MINOR': s[1].to_int(),
|
||||||
'AWS_VERSION_PATCH': s[2].to_int(),
|
'AWS_VERSION_PATCH': s[2].to_int(),
|
||||||
}
|
}
|
||||||
aws_sdk_transfer = dependency('aws-cpp-sdk-transfer', required : true).partial_dependency(
|
aws_sdk_transfer = aws_sdk_transfer.partial_dependency(
|
||||||
compile_args : false,
|
compile_args : false,
|
||||||
includes : true,
|
includes : true,
|
||||||
link_args : true,
|
link_args : true,
|
||||||
|
@ -255,7 +275,7 @@ gtest = [
|
||||||
]
|
]
|
||||||
deps += gtest
|
deps += gtest
|
||||||
|
|
||||||
toml11 = dependency('toml11', version : '>=3.7.0', required : true)
|
toml11 = dependency('toml11', version : '>=3.7.0', required : true, method : 'cmake')
|
||||||
deps += toml11
|
deps += toml11
|
||||||
|
|
||||||
nlohmann_json = dependency('nlohmann_json', required : true)
|
nlohmann_json = dependency('nlohmann_json', required : true)
|
||||||
|
@ -272,17 +292,17 @@ deps += lix_doc
|
||||||
#
|
#
|
||||||
# Build-time tools
|
# Build-time tools
|
||||||
#
|
#
|
||||||
coreutils = find_program('coreutils')
|
coreutils = find_program('coreutils', native : true)
|
||||||
dot = find_program('dot', required : false)
|
dot = find_program('dot', required : false, native : true)
|
||||||
pymod = import('python')
|
pymod = import('python')
|
||||||
python = pymod.find_installation('python3')
|
python = pymod.find_installation('python3')
|
||||||
|
|
||||||
if enable_docs
|
if enable_docs
|
||||||
mdbook = find_program('mdbook')
|
mdbook = find_program('mdbook', native : true)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Used to workaround https://github.com/mesonbuild/meson/issues/2320 in src/nix/meson.build.
|
# Used to workaround https://github.com/mesonbuild/meson/issues/2320 in src/nix/meson.build.
|
||||||
installcmd = find_program('install')
|
installcmd = find_program('install', native : true)
|
||||||
|
|
||||||
enable_embedded_sandbox_shell = get_option('enable-embedded-sandbox-shell')
|
enable_embedded_sandbox_shell = get_option('enable-embedded-sandbox-shell')
|
||||||
if enable_embedded_sandbox_shell
|
if enable_embedded_sandbox_shell
|
||||||
|
@ -307,9 +327,9 @@ endif
|
||||||
# FIXME(Qyriad): the autoconf system checks that busybox has the "standalone" feature, indicating
|
# FIXME(Qyriad): the autoconf system checks that busybox has the "standalone" feature, indicating
|
||||||
# that busybox sh won't run busybox applets as builtins (which would break our sandbox).
|
# that busybox sh won't run busybox applets as builtins (which would break our sandbox).
|
||||||
|
|
||||||
lsof = find_program('lsof')
|
lsof = find_program('lsof', native : true)
|
||||||
bison = find_program('bison')
|
bison = find_program('bison', native : true)
|
||||||
flex = find_program('flex')
|
flex = find_program('flex', native : true)
|
||||||
|
|
||||||
# This is how Nix does generated headers...
|
# This is how Nix does generated headers...
|
||||||
# other instances of header generation use a very similar command.
|
# other instances of header generation use a very similar command.
|
||||||
|
|
52
package.nix
52
package.nix
|
@ -100,6 +100,43 @@ let
|
||||||
|
|
||||||
testConfigureFlags = [ "RAPIDCHECK_HEADERS=${lib.getDev rapidcheck}/extras/gtest/include" ];
|
testConfigureFlags = [ "RAPIDCHECK_HEADERS=${lib.getDev rapidcheck}/extras/gtest/include" ];
|
||||||
|
|
||||||
|
# Reimplementation of Nixpkgs' Meson cross file, with some additions to make
|
||||||
|
# it actually work.
|
||||||
|
mesonCrossFile =
|
||||||
|
let
|
||||||
|
cpuFamily =
|
||||||
|
platform:
|
||||||
|
with platform;
|
||||||
|
if isAarch32 then
|
||||||
|
"arm"
|
||||||
|
else if isx86_32 then
|
||||||
|
"x86"
|
||||||
|
else
|
||||||
|
platform.uname.processor;
|
||||||
|
in
|
||||||
|
builtins.toFile "lix-cross-file.conf" ''
|
||||||
|
[properties]
|
||||||
|
bindgen_clang_arguments = ['-target', '${stdenv.targetPlatform.config}']
|
||||||
|
# Meson is convinced that if !buildPlatform.canExecute hostPlatform then we cannot
|
||||||
|
# build anything at all, which is not at all correct. If we can't execute the host
|
||||||
|
# platform, we'll just disable tests and doc gen.
|
||||||
|
needs_exe_wrapper = false
|
||||||
|
|
||||||
|
[host_machine]
|
||||||
|
system = '${stdenv.targetPlatform.parsed.kernel.name}'
|
||||||
|
cpu_family = '${cpuFamily stdenv.targetPlatform}'
|
||||||
|
cpu = '${stdenv.targetPlatform.parsed.cpu.name}'
|
||||||
|
endian = ${if stdenv.targetPlatform.isLittleEndian then "'little'" else "'big'"}
|
||||||
|
|
||||||
|
[binaries]
|
||||||
|
llvm-config = 'llvm-config-native'
|
||||||
|
rust = ['rustc', '--target', '${stdenv.targetPlatform.rust.rustcTargetSpec}']
|
||||||
|
# Meson refuses to consider any CMake binary during cross compilation if it's
|
||||||
|
# not explicitly specified here, in the cross file.
|
||||||
|
# https://github.com/mesonbuild/meson/blob/0ed78cf6fa6d87c0738f67ae43525e661b50a8a2/mesonbuild/cmake/executor.py#L72
|
||||||
|
cmake = 'cmake'
|
||||||
|
'';
|
||||||
|
|
||||||
# The internal API docs need these for the build, but if we're not building
|
# The internal API docs need these for the build, but if we're not building
|
||||||
# Nix itself, then these don't need to be propagated.
|
# Nix itself, then these don't need to be propagated.
|
||||||
maybePropagatedInputs = [
|
maybePropagatedInputs = [
|
||||||
|
@ -184,10 +221,15 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
]
|
]
|
||||||
++ lib.optional stdenv.hostPlatform.isStatic "-Denable-embedded-sandbox-shell=true"
|
++ lib.optional stdenv.hostPlatform.isStatic "-Denable-embedded-sandbox-shell=true"
|
||||||
++ lib.optional (finalAttrs.dontBuild) "-Denable-build=false"
|
++ lib.optional (finalAttrs.dontBuild) "-Denable-build=false"
|
||||||
# mesonConfigurePhase automatically passes -Dauto_features=enabled,
|
++ [
|
||||||
# so we must explicitly enable or disable features that we are not passing
|
# mesonConfigurePhase automatically passes -Dauto_features=enabled,
|
||||||
# dependencies for.
|
# so we must explicitly enable or disable features that we are not passing
|
||||||
++ lib.singleton (lib.mesonEnable "internal-api-docs" internalApiDocs);
|
# dependencies for.
|
||||||
|
(lib.mesonEnable "internal-api-docs" internalApiDocs)
|
||||||
|
(lib.mesonBool "enable-tests" finalAttrs.doCheck)
|
||||||
|
(lib.mesonBool "enable-docs" canRunInstalled)
|
||||||
|
]
|
||||||
|
++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "--cross-file=${mesonCrossFile}";
|
||||||
|
|
||||||
# We only include CMake so that Meson can locate toml11, which only ships CMake dependency metadata.
|
# We only include CMake so that Meson can locate toml11, which only ships CMake dependency metadata.
|
||||||
dontUseCmakeConfigure = true;
|
dontUseCmakeConfigure = true;
|
||||||
|
@ -315,7 +357,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
|
|
||||||
makeFlags = "profiledir=$(out)/etc/profile.d PRECOMPILE_HEADERS=1";
|
makeFlags = "profiledir=$(out)/etc/profile.d PRECOMPILE_HEADERS=1";
|
||||||
|
|
||||||
doCheck = true;
|
doCheck = canRunInstalled;
|
||||||
|
|
||||||
mesonCheckFlags = lib.optionals (buildWithMeson || forDevShell) [ "--suite=check" ];
|
mesonCheckFlags = lib.optionals (buildWithMeson || forDevShell) [ "--suite=check" ];
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ foreach header : [ 'schema.sql', 'ca-specific-schema.sql' ]
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
if enable_embedded_sandbox_shell
|
if enable_embedded_sandbox_shell
|
||||||
hexdump = find_program('hexdump', required : true)
|
hexdump = find_program('hexdump', required : true, native : true)
|
||||||
embedded_sandbox_shell_gen = custom_target(
|
embedded_sandbox_shell_gen = custom_target(
|
||||||
'embedded-sandbox-shell.gen.hh',
|
'embedded-sandbox-shell.gen.hh',
|
||||||
command : [
|
command : [
|
||||||
|
|
Loading…
Reference in a new issue