diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt index c44795536af5..ed96a593329a 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -717,6 +717,76 @@ if(build_runtimes) EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args}) endforeach() endforeach() + + # Generate a default multilib.yaml for each runtime target that has one. + if(LLVM_RUNTIME_MULTILIBS) + set(_multilib_yaml_outputs) + foreach(name ${LLVM_RUNTIME_TARGETS}) + set(_multilibs_for_target) + foreach(multilib ${LLVM_RUNTIME_MULTILIBS}) + if("${name}" IN_LIST LLVM_RUNTIME_MULTILIB_${multilib}_TARGETS) + list(APPEND _multilibs_for_target "${multilib}") + endif() + endforeach() + + # Generate the file into a temporary. We only copy this if the user has + # not provided one either in the build tree or the install directory. + if(_multilibs_for_target) + set(_yaml [=[ +MultilibVersion: 1.0 + +Variants: +- Dir: . + Flags: [] +]=]) + set(_flag_values "") + foreach(multilib ${_multilibs_for_target}) + string(APPEND _yaml "\ +- Dir: ${multilib} + Flags: [-fmultilib-flag=${multilib}] +") + string(APPEND _flag_values "\ + - Name: ${multilib} +") + endforeach() + string(APPEND _yaml " +Mappings: [] + +Flags: +- Name: multilib + Values: + - Name: none +${_flag_values}\ + Default: none +") + + set(_staged_dir "${CMAKE_CURRENT_BINARY_DIR}/multilib-yaml/${name}") + set(_staged "${_staged_dir}/multilib.yaml") + set(_dest "${LLVM_LIBRARY_DIR}/${name}/multilib.yaml") + file(GENERATE OUTPUT "${_staged}" CONTENT "${_yaml}") + + # Omitting DEPENDS so the command only runs when OUTPUT is absent. + add_custom_command( + OUTPUT "${_dest}" + COMMAND "${CMAKE_COMMAND}" -E copy "${_staged}" "${_dest}" + COMMENT "Generating default multilib.yaml for ${name}") + list(APPEND _multilib_yaml_outputs "${_dest}") + + install(CODE " + set(_inst \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib/${name}/multilib.yaml\") + if(NOT EXISTS \"\${_inst}\") + file(INSTALL \"${_staged}\" + DESTINATION \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib/${name}\") + endif() + ") + endif() + endforeach() + + if(_multilib_yaml_outputs) + add_custom_target(runtimes-multilib-yaml ALL DEPENDS ${_multilib_yaml_outputs}) + set_target_properties(runtimes-multilib-yaml PROPERTIES FOLDER "Runtimes") + endif() + endif() endif() if(NOT LLVM_BUILD_INSTRUMENTED AND CLANG_ENABLE_BOOTSTRAP)