Skip to content

Commit d1ea8cc

Browse files
authored
cmake: put CMAKE_SYSTEM_{NAME,PROCESSOR} into toolchain file (#1365)
1 parent 3a70fdf commit d1ea8cc

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

foreign_cc/cmake.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ load(
148148
load("//foreign_cc/private:transitions.bzl", "foreign_cc_rule_variant")
149149
load(
150150
"//foreign_cc/private/framework:platform.bzl",
151+
"arch_name",
151152
"os_name",
152153
"target_arch_name",
153154
"target_os_name",
@@ -259,6 +260,7 @@ def _create_configure_script(configureParameters):
259260
target_os = target_os_name(ctx),
260261
target_arch = target_arch_name(ctx),
261262
host_os = os_name(ctx),
263+
host_arch = arch_name(ctx),
262264
generator = attrs.generator,
263265
cmake_path = attrs.cmake_path,
264266
tools = tools,

foreign_cc/private/cmake_script.bzl

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def create_cmake_script(
4545
target_os,
4646
target_arch,
4747
host_os,
48+
host_arch,
4849
generator,
4950
cmake_path,
5051
tools,
@@ -68,6 +69,7 @@ def create_cmake_script(
6869
target_os: The target OS for the build
6970
target_arch: The target arch for the build
7071
host_os: The execution OS for the build
72+
host_arch: The execution arch for the build
7173
generator: The generator target for cmake to use
7274
cmake_path: The path to the cmake executable
7375
tools: cc_toolchain tools (CxxToolsInfo)
@@ -93,6 +95,23 @@ def create_cmake_script(
9395
toolchain_dict = _fill_crossfile_from_toolchain(workspace_name, tools, flags, target_os)
9496
params = None
9597

98+
# Avoid CMake passing the wrong linker flags when cross compiling
99+
# by setting CMAKE_SYSTEM_NAME and CMAKE_SYSTEM_PROCESSOR,
100+
# see https://github.com/bazel-contrib/rules_foreign_cc/issues/289,
101+
# and https://github.com/bazel-contrib/rules_foreign_cc/pull/1062
102+
# note: these parameters must be set in the toolchain file, not just in the
103+
# cache, and CMAKE_SYSTEM_PROCESSOR is ignored unless CMAKE_SYSTEM_NAME is
104+
# also set.
105+
if target_os == "unknown":
106+
# buildifier: disable=print
107+
print("target_os is unknown, please update foreign_cc/private/framework/platform.bzl and foreign_cc/private/cmake_script.bzl; triggered by", current_label)
108+
elif target_arch == "unknown":
109+
# buildifier: disable=print
110+
print("target_arch is unknown, please update foreign_cc/private/framework/platform.bzl and foreign_cc/private/cmake_script.bzl; triggered by", current_label)
111+
elif target_os != host_os or target_arch != host_arch:
112+
toolchain_dict.update(_TARGET_OS_PARAMS.get(target_os, {}))
113+
toolchain_dict.update(_TARGET_ARCH_PARAMS.get(target_arch, {}))
114+
96115
keys_with_empty_values_in_user_cache = [key for key in user_cache if user_cache.get(key) == ""]
97116

98117
if no_toolchain_file:
@@ -123,17 +142,6 @@ def create_cmake_script(
123142
if not params.cache.get("CMAKE_RANLIB"):
124143
params.cache.update({"CMAKE_RANLIB": ""})
125144

126-
# Avoid CMake passing the wrong linker flags when cross compiling
127-
# by setting CMAKE_SYSTEM_NAME and CMAKE_SYSTEM_PROCESSOR,
128-
# see https://github.com/bazel-contrib/rules_foreign_cc/issues/289,
129-
# and https://github.com/bazel-contrib/rules_foreign_cc/pull/1062
130-
if target_os == "unknown":
131-
# buildifier: disable=print
132-
print("target_os is unknown, please update foreign_cc/private/framework/platform.bzl and foreign_cc/private/cmake_script.bzl; triggered by", current_label)
133-
elif target_os != host_os:
134-
params.cache.update(_TARGET_OS_PARAMS.get(target_os, {}))
135-
params.cache.update(_TARGET_ARCH_PARAMS.get(target_arch, {}))
136-
137145
set_env_vars = [
138146
"export {}=\"{}\"".format(key, _escape_dquote_bash(params.env[key]))
139147
for key in params.env
@@ -194,6 +202,7 @@ _CMAKE_ENV_VARS_FOR_CROSSTOOL = {
194202
}
195203

196204
_CMAKE_CACHE_ENTRIES_CROSSTOOL = {
205+
"ANDROID": struct(value = "ANDROID", replace = False),
197206
"CMAKE_AR": struct(value = "CMAKE_AR", replace = True),
198207
"CMAKE_ASM_FLAGS": struct(value = "CMAKE_ASM_FLAGS_INIT", replace = False),
199208
"CMAKE_CXX_ARCHIVE_CREATE": struct(value = "CMAKE_CXX_ARCHIVE_CREATE", replace = False),
@@ -206,6 +215,8 @@ _CMAKE_CACHE_ENTRIES_CROSSTOOL = {
206215
"CMAKE_RANLIB": struct(value = "CMAKE_RANLIB", replace = True),
207216
"CMAKE_SHARED_LINKER_FLAGS": struct(value = "CMAKE_SHARED_LINKER_FLAGS_INIT", replace = False),
208217
"CMAKE_STATIC_LINKER_FLAGS": struct(value = "CMAKE_STATIC_LINKER_FLAGS_INIT", replace = False),
218+
"CMAKE_SYSTEM_NAME": struct(value = "CMAKE_SYSTEM_NAME", replace = False),
219+
"CMAKE_SYSTEM_PROCESSOR": struct(value = "CMAKE_SYSTEM_PROCESSOR", replace = False),
209220
}
210221

211222
def _create_crosstool_file_text(toolchain_dict, user_cache, user_env):

test/cmake_text_tests.bzl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ def _merge_flag_values_no_toolchain_file_test(ctx):
256256
"unknown",
257257
"unknown",
258258
"unknown",
259+
"unknown",
259260
"Unix Makefiles",
260261
"cmake",
261262
tools,
@@ -309,6 +310,7 @@ def _create_min_cmake_script_no_toolchain_file_test(ctx):
309310
"unknown",
310311
"unknown",
311312
"unknown",
313+
"unknown",
312314
"Ninja",
313315
"cmake",
314316
tools,
@@ -369,6 +371,7 @@ def _create_min_cmake_script_wipe_toolchain_test(ctx):
369371
"unknown",
370372
"unknown",
371373
"unknown",
374+
"unknown",
372375
"Ninja",
373376
"cmake",
374377
tools,
@@ -422,6 +425,7 @@ def _create_min_cmake_script_toolchain_file_test(ctx):
422425
"unknown",
423426
"unknown",
424427
"unknown",
428+
"unknown",
425429
"Ninja",
426430
"cmake",
427431
tools,
@@ -505,6 +509,7 @@ def _create_cmake_script_no_toolchain_file_test(ctx):
505509
"unknown",
506510
"unknown",
507511
"unknown",
512+
"unknown",
508513
"Ninja",
509514
"cmake",
510515
tools,
@@ -573,6 +578,7 @@ def _create_cmake_script_android_test(ctx):
573578
"android",
574579
"x86_64",
575580
"unknown",
581+
"unknown",
576582
"Ninja",
577583
"cmake",
578584
tools,
@@ -592,7 +598,7 @@ export CXXFLAGS="--quoted=\\\"abc def\\\" --sysroot=/abc/sysroot --gcc_toolchain
592598
export ASMFLAGS="assemble assemble-user"
593599
export CUSTOM_ENV="YES"
594600
##enable_tracing##
595-
cmake -DCMAKE_AR="/cxx_linker_static" -DCMAKE_CXX_LINK_EXECUTABLE="became" -DCMAKE_SHARED_LINKER_FLAGS="shared1 shared2" -DCMAKE_MODULE_LINKER_FLAGS="shared1 shared2" -DCMAKE_EXE_LINKER_FLAGS="executable" -DCMAKE_BUILD_TYPE="user_type" -DCUSTOM_CACHE="YES" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" -DANDROID="YES" -DCMAKE_SYSTEM_NAME="Linux" -DCMAKE_SYSTEM_PROCESSOR="x86_64" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
601+
cmake -DCMAKE_AR="/cxx_linker_static" -DCMAKE_CXX_LINK_EXECUTABLE="became" -DCMAKE_SHARED_LINKER_FLAGS="shared1 shared2" -DCMAKE_MODULE_LINKER_FLAGS="shared1 shared2" -DCMAKE_EXE_LINKER_FLAGS="executable" -DANDROID="YES" -DCMAKE_SYSTEM_NAME="Linux" -DCMAKE_SYSTEM_PROCESSOR="x86_64" -DCMAKE_BUILD_TYPE="user_type" -DCUSTOM_CACHE="YES" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
596602
##disable_tracing##
597603
"""
598604
asserts.equals(env, expected.splitlines(), script)
@@ -641,6 +647,7 @@ def _create_cmake_script_linux_test(ctx):
641647
"linux",
642648
"aarch64",
643649
"unknown",
650+
"unknown",
644651
"Ninja",
645652
"cmake",
646653
tools,
@@ -660,7 +667,7 @@ export CXXFLAGS="--quoted=\\\"abc def\\\" --sysroot=/abc/sysroot --gcc_toolchain
660667
export ASMFLAGS="assemble assemble-user"
661668
export CUSTOM_ENV="YES"
662669
##enable_tracing##
663-
cmake -DCMAKE_AR="/cxx_linker_static" -DCMAKE_CXX_LINK_EXECUTABLE="became" -DCMAKE_SHARED_LINKER_FLAGS="shared1 shared2" -DCMAKE_MODULE_LINKER_FLAGS="shared1 shared2" -DCMAKE_EXE_LINKER_FLAGS="executable" -DCMAKE_BUILD_TYPE="user_type" -DCUSTOM_CACHE="YES" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" -DCMAKE_SYSTEM_NAME="Linux" -DCMAKE_SYSTEM_PROCESSOR="aarch64" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
670+
cmake -DCMAKE_AR="/cxx_linker_static" -DCMAKE_CXX_LINK_EXECUTABLE="became" -DCMAKE_SHARED_LINKER_FLAGS="shared1 shared2" -DCMAKE_MODULE_LINKER_FLAGS="shared1 shared2" -DCMAKE_EXE_LINKER_FLAGS="executable" -DCMAKE_SYSTEM_NAME="Linux" -DCMAKE_SYSTEM_PROCESSOR="aarch64" -DCMAKE_BUILD_TYPE="user_type" -DCUSTOM_CACHE="YES" -DCMAKE_INSTALL_PREFIX="test_rule" -DCMAKE_PREFIX_PATH="$$EXT_BUILD_DEPS$$" -DCMAKE_RANLIB="" --debug-output -Wdev -G 'Ninja' $$EXT_BUILD_ROOT$$/external/test_rule
664671
##disable_tracing##
665672
"""
666673
asserts.equals(env, expected.splitlines(), script)
@@ -708,6 +715,7 @@ def _create_cmake_script_toolchain_file_test(ctx):
708715
"unknown",
709716
"unknown",
710717
"unknown",
718+
"unknown",
711719
"Ninja",
712720
"cmake",
713721
tools,

0 commit comments

Comments
 (0)