Skip to content

Commit 0d84650

Browse files
jsun-splunkjsharpe
andauthored
fix: CMAKE_MODULE_LINKER_FLAGS_INIT breaks macos builds (#1344)
Co-authored-by: James Sharpe <james.sharpe@zenotech.com>
1 parent 1ba5159 commit 0d84650

File tree

2 files changed

+48
-30
lines changed

2 files changed

+48
-30
lines changed

foreign_cc/private/cmake_script.bzl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def create_cmake_script(
9090

9191
merged_prefix_path = _merge_prefix_path(user_cache, include_dirs, ext_build_dirs)
9292

93-
toolchain_dict = _fill_crossfile_from_toolchain(workspace_name, tools, flags)
93+
toolchain_dict = _fill_crossfile_from_toolchain(workspace_name, tools, flags, target_os)
9494
params = None
9595

9696
keys_with_empty_values_in_user_cache = [key for key in user_cache if user_cache.get(key) == ""]
@@ -307,7 +307,7 @@ def _move_dict_values(target, source, descriptor_map):
307307
else:
308308
target[existing.value] = target[existing.value] + " " + value
309309

310-
def _fill_crossfile_from_toolchain(workspace_name, tools, flags):
310+
def _fill_crossfile_from_toolchain(workspace_name, tools, flags, target_os):
311311
dict = {}
312312

313313
_sysroot = _find_in_cc_or_cxx(flags, "sysroot")
@@ -360,7 +360,17 @@ def _fill_crossfile_from_toolchain(workspace_name, tools, flags):
360360
# lines += [_set_list(ctx, "CMAKE_STATIC_LINKER_FLAGS_INIT", flags.cxx_linker_static)]
361361
if flags.cxx_linker_shared:
362362
dict["CMAKE_SHARED_LINKER_FLAGS_INIT"] = _join_flags_list(workspace_name, flags.cxx_linker_shared)
363-
dict["CMAKE_MODULE_LINKER_FLAGS_INIT"] = _join_flags_list(workspace_name, flags.cxx_linker_shared)
363+
364+
# cxx_linker_shared will contain '-shared' or '-dynamiclib' on macos. This flag conflicts with "-bundle"
365+
# that is set by CMAKE based on platform. e.g.
366+
# https://gitlab.kitware.com/cmake/cmake/-/blob/master/Modules/Platform/Apple-Intel.cmake#L11
367+
# Therefore, for modules aka bundles we want to remove these flags.
368+
module_linker_flags = []
369+
if target_os == "macos":
370+
module_linker_flags = [flag for flag in flags.cxx_linker_shared if flag not in ["-shared", "-dynamiclib"]]
371+
else:
372+
module_linker_flags = flags.cxx_linker_shared
373+
dict["CMAKE_MODULE_LINKER_FLAGS_INIT"] = _join_flags_list(workspace_name, module_linker_flags)
364374
if flags.cxx_linker_executable:
365375
dict["CMAKE_EXE_LINKER_FLAGS_INIT"] = _join_flags_list(workspace_name, flags.cxx_linker_executable)
366376

test/cmake_text_tests.bzl

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -80,36 +80,44 @@ def _fill_crossfile_from_toolchain_test(ctx):
8080
cxx_linker_static = "/cxx_linker_static",
8181
cxx_linker_executable = "ws/cxx_linker_executable",
8282
)
83-
flags = CxxFlagsInfo(
84-
cc = ["-cc-flag", "-gcc_toolchain", "cc-toolchain"],
85-
cxx = ["--quoted=\"abc def\"", "--sysroot=/abc/sysroot", "--gcc_toolchain", "cxx-toolchain"],
86-
cxx_linker_shared = ["shared1", "shared2"],
87-
cxx_linker_static = ["static"],
88-
cxx_linker_executable = ["executable"],
89-
assemble = ["assemble"],
90-
)
9183

92-
res = export_for_test.fill_crossfile_from_toolchain("ws", tools, flags)
93-
94-
expected = {
95-
"CMAKE_AR": "/cxx_linker_static",
96-
"CMAKE_ASM_FLAGS_INIT": "assemble",
97-
"CMAKE_CXX_COMPILER": "$${EXT_BUILD_ROOT//\\\\//}$$/external/cxx-value",
98-
"CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN": "cxx-toolchain",
99-
# Quoted args are escaped when crossfile is written to a script in create_cmake_script
100-
"CMAKE_CXX_FLAGS_INIT": "--quoted=\"abc def\" --sysroot=/abc/sysroot --gcc_toolchain cxx-toolchain",
101-
"CMAKE_CXX_LINK_EXECUTABLE": "$${EXT_BUILD_ROOT//\\\\//}$$/ws/cxx_linker_executable <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>",
102-
"CMAKE_C_COMPILER": "/some-cc-value",
103-
"CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN": "cc-toolchain",
104-
"CMAKE_C_FLAGS_INIT": "-cc-flag -gcc_toolchain cc-toolchain",
105-
"CMAKE_EXE_LINKER_FLAGS_INIT": "executable",
106-
"CMAKE_MODULE_LINKER_FLAGS_INIT": "shared1 shared2",
107-
"CMAKE_SHARED_LINKER_FLAGS_INIT": "shared1 shared2",
108-
"CMAKE_SYSROOT": "/abc/sysroot",
84+
cases = {
85+
# format: target_os: (input_flags, expected_flags)
86+
"macos": (["-shared", "-dynamiclib", "-bundle"], ["-bundle"]),
87+
"unknown": (["shared1", "shared2"], ["shared1", "shared2"]),
10988
}
11089

111-
for key in expected:
112-
asserts.equals(env, expected[key], res[key])
90+
for target_os, inputs in cases.items():
91+
flags = CxxFlagsInfo(
92+
cc = ["-cc-flag", "-gcc_toolchain", "cc-toolchain"],
93+
cxx = ["--quoted=\"abc def\"", "--sysroot=/abc/sysroot", "--gcc_toolchain", "cxx-toolchain"],
94+
cxx_linker_shared = inputs[0],
95+
cxx_linker_static = ["static"],
96+
cxx_linker_executable = ["executable"],
97+
assemble = ["assemble"],
98+
)
99+
100+
res = export_for_test.fill_crossfile_from_toolchain("ws", tools, flags, target_os)
101+
102+
expected = {
103+
"CMAKE_AR": "/cxx_linker_static",
104+
"CMAKE_ASM_FLAGS_INIT": "assemble",
105+
"CMAKE_CXX_COMPILER": "$${EXT_BUILD_ROOT//\\\\//}$$/external/cxx-value",
106+
"CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN": "cxx-toolchain",
107+
# Quoted args are escaped when crossfile is written to a script in create_cmake_script
108+
"CMAKE_CXX_FLAGS_INIT": "--quoted=\"abc def\" --sysroot=/abc/sysroot --gcc_toolchain cxx-toolchain",
109+
"CMAKE_CXX_LINK_EXECUTABLE": "$${EXT_BUILD_ROOT//\\\\//}$$/ws/cxx_linker_executable <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>",
110+
"CMAKE_C_COMPILER": "/some-cc-value",
111+
"CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN": "cc-toolchain",
112+
"CMAKE_C_FLAGS_INIT": "-cc-flag -gcc_toolchain cc-toolchain",
113+
"CMAKE_EXE_LINKER_FLAGS_INIT": "executable",
114+
"CMAKE_MODULE_LINKER_FLAGS_INIT": " ".join(inputs[1]),
115+
"CMAKE_SHARED_LINKER_FLAGS_INIT": " ".join(inputs[0]),
116+
"CMAKE_SYSROOT": "/abc/sysroot",
117+
}
118+
119+
for key in expected:
120+
asserts.equals(env, expected[key], res[key])
113121

114122
return unittest.end(env)
115123

0 commit comments

Comments
 (0)