Skip to content

Commit 62c7891

Browse files
authored
[CMake] Fix some breakages when using ninja multi config (llvm#65451)
When using multi-config generator to build `libLLVM.so` like `cmake -G 'Ninja Multi-Config' -Sllvm -B/tmp/out/ninja-multi -DCMAKE_CONFIGURATION_TYPES='Debug;Release' -DLLVM_LINK_LLVM_DYLIB=on -DLLVM_TARGETS_TO_BUILD=host && cmake --build /tmp/out/ninja-multi --config Debug`, `lld` complains `error: cannot find version script /tmp/out/ninja-multi/Debug/lib/tools/llvm-shlib/simple_version_script.map`. This patch adds multi-config compatibility when configuring `simple_version_script.map`. Fixes llvm#63800. When using multi-config generator, clang's headers is not copied to proper directories, which is fixed as well.
1 parent 30f44c9 commit 62c7891

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

clang/lib/Headers/CMakeLists.txt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -395,12 +395,25 @@ set(riscv_generated_files)
395395

396396
function(copy_header_to_output_dir src_dir file)
397397
set(src ${src_dir}/${file})
398-
set(dst ${output_dir}/${file})
399-
add_custom_command(OUTPUT ${dst}
400-
DEPENDS ${src}
401-
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
402-
COMMENT "Copying clang's ${file}...")
403-
list(APPEND out_files ${dst})
398+
if("${CMAKE_CFG_INTDIR}" STREQUAL ".")
399+
set(dst ${output_dir}/${file})
400+
add_custom_command(OUTPUT ${dst}
401+
DEPENDS ${src}
402+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
403+
COMMENT "Copying clang's ${file}...")
404+
list(APPEND out_files ${dst})
405+
else()
406+
foreach(BUILD_MODE ${CMAKE_CONFIGURATION_TYPES})
407+
# Replace the special string with a per config directory.
408+
string(REPLACE ${CMAKE_CFG_INTDIR} ${BUILD_MODE} per_conf_output_dir ${output_dir})
409+
set(dst ${per_conf_output_dir}/${file})
410+
add_custom_command(OUTPUT ${dst}
411+
DEPENDS ${src}
412+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
413+
COMMENT "Copying clang's ${file}...")
414+
list(APPEND out_files ${dst})
415+
endforeach()
416+
endif()
404417
set(out_files ${out_files} PARENT_SCOPE)
405418
endfunction(copy_header_to_output_dir)
406419

llvm/tools/llvm-shlib/CMakeLists.txt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,19 @@ if(LLVM_BUILD_LLVM_DYLIB)
4545
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
4646
set(LIB_NAMES -Wl,-all_load ${LIB_NAMES})
4747
else()
48-
configure_file(
49-
${CMAKE_CURRENT_SOURCE_DIR}/simple_version_script.map.in
50-
${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map)
51-
48+
if("${CMAKE_CFG_INTDIR}" STREQUAL ".")
49+
configure_file(
50+
${CMAKE_CURRENT_SOURCE_DIR}/simple_version_script.map.in
51+
${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map)
52+
else()
53+
foreach(BUILD_MODE ${CMAKE_CONFIGURATION_TYPES})
54+
# Replace the special string with a per config directory.
55+
string(REPLACE ${CMAKE_CFG_INTDIR} ${BUILD_MODE} PER_CONF_LIBRARY_DIR ${LLVM_LIBRARY_DIR})
56+
configure_file(
57+
${CMAKE_CURRENT_SOURCE_DIR}/simple_version_script.map.in
58+
${PER_CONF_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map)
59+
endforeach()
60+
endif()
5261
if(MSVC)
5362
target_link_directories(LLVM PRIVATE ${LLVM_LIBRARY_DIR})
5463
foreach(library ${LIB_NAMES})
@@ -156,7 +165,10 @@ if(LLVM_BUILD_LLVM_C_DYLIB AND MSVC)
156165
# Need to separate lib names with newlines.
157166
string(REPLACE ";" "\n" FILE_CONTENT "${FULL_LIB_NAMES}")
158167

159-
if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".")
168+
if("${CMAKE_CFG_INTDIR}" STREQUAL ".")
169+
# Write out the full lib names into file to be read by the python script.
170+
file(WRITE ${LIBSFILE} "${FILE_CONTENT}")
171+
else()
160172
foreach(BUILD_MODE ${CMAKE_CONFIGURATION_TYPES})
161173
# Replace the special string with a per config directory.
162174
string(REPLACE ${CMAKE_CFG_INTDIR} ${BUILD_MODE} PER_CONF_CONTENT "${FILE_CONTENT}")
@@ -166,9 +178,6 @@ if(LLVM_BUILD_LLVM_C_DYLIB AND MSVC)
166178
# ${CMAKE_CFG_INTDIR} correctly and select the right one.
167179
file(WRITE ${LLVM_BINARY_DIR}/${BUILD_MODE}/libllvm-c.args "${PER_CONF_CONTENT}")
168180
endforeach()
169-
else()
170-
# Write out the full lib names into file to be read by the python script.
171-
file(WRITE ${LIBSFILE} "${FILE_CONTENT}")
172181
endif()
173182

174183
# Generate the exports file dynamically.

0 commit comments

Comments
 (0)