[libc++] Fix eager generator expression in DefineLinkerScript

As explained in https://gitlab.kitware.com/cmake/cmake/-/issues/21045,
both branches of an $<IF> generator expression are evaluated eagerly
by CMake. As a result, if the non-selected branch contains an invalid
generator expression (such as getting the OUTPUT_NAME property of a
non-existent target), a hard error will occur.

This failed builds using the cxxrt ABI library, which doesn't create
a CMake target currently.
This commit is contained in:
Louis Dionne 2020-07-31 11:18:01 -04:00
parent cfb955ac37
commit d275da17e4
1 changed files with 7 additions and 1 deletions

View File

@ -34,7 +34,13 @@ function(define_linker_script target)
if ("${lib}" STREQUAL "cxx-headers")
continue()
endif()
set(libname "$<IF:$<TARGET_EXISTS:${lib}>,$<TARGET_PROPERTY:${lib},OUTPUT_NAME>,${lib}>")
# If ${lib} is not a target, we use a dummy target which we know will
# have an OUTPUT_NAME property so that CMake doesn't fail when evaluating
# the non-selected branch of the `IF`. It doesn't matter what it evaluates
# to because it's not selected, but it must not cause an error.
# See https://gitlab.kitware.com/cmake/cmake/-/issues/21045.
set(output_name_tgt "$<IF:$<TARGET_EXISTS:${lib}>,${lib},${target}>")
set(libname "$<IF:$<TARGET_EXISTS:${lib}>,$<TARGET_PROPERTY:${output_name_tgt},OUTPUT_NAME>,${lib}>")
list(APPEND link_libraries "${CMAKE_LINK_LIBRARY_FLAG}${libname}")
endforeach()
endif()