LLVM Runtimes: Multilib support and variable overrides

Hi Petr, I’ve added you to this question directly as it seems you’re the one that last touched it.

I’m currently having trouble working with llvm/runtimes with regards to LLVM_RUNTIME_MULTILIBS where I have some pseudo-cmake in my cache that looks like:

foreach (target in ${RUNTIME_TARGETS})

set(RUNTIMES_${target}_LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL “”)

set(RUNTIMES_${target}+except_LIBCXX_ENABLE_EXCEPTIONS ON CACHE BOOL “”)

endforeach()

set(LLVM_RUNTIME_MULTILIBS “except” CACHE STRING “”)

set(LLVM_RUNTIME_MULTILIB_except_TARGETS “${RUNTIME_TARGETS}” CACHE STRING “”)

set(LLVM_RUNTIME_TARGETS “${RUNTIME_TARGETS}” CACHE STRING “”)

I’m finding that the ‘+except’ case has LIBCXX_ENABLE_EXCEPTIONS OFF. I’ve tracked it down to how variables are passed to the subproject:

In llvm/runtimes/CMakeLists.txt, there’s a loop:

get_cmake_property(variableNames VARIABLES)

foreach(variableName ${variableNames})

string(FIND “${variableName}” “RUNTIMES_${name}_” out)

if("${out}" EQUAL 0)

string(REPLACE “RUNTIMES_${name}_” “” new_name ${variableName})

list(APPEND ${name}_extra_args “-D${new_name}=${${variableName}}”)

endif()

string(FIND “${variableName}” “RUNTIMES_${target}_” out)

if("${out}" EQUAL 0)

string(REPLACE “RUNTIMES_${target}_” “” new_name ${variableName})

list(APPEND ${name}_extra_args “-D${new_name}=${${variableName}}”)

endif()

endforeach()

This loop preferences variable order in the cmake cache. In my case, the RUNTIMES_${target}LIBCXX_ENABLE_EXCEPTIONS variables all appear in the cache after the RUNTIMES${target}+except_LIBCXX_ENABLE_EXCEPTIONS variables, and the former takes precedence. Is this expected behavior and I’m doing something incorrectly, or should this loop preference specific overrides (+except) over less specific overrides?

Regards,

JB

Code Generation

Texas Instruments