Index: cmake/modules/AddLLVM.cmake =================================================================== --- cmake/modules/AddLLVM.cmake +++ cmake/modules/AddLLVM.cmake @@ -1211,18 +1211,38 @@ endif() endforeach() + # If target is a versioned executable, reconstruct the version symlink + # on the target symlink as well. + set(symlink_version) + if(TARGET ${dest}) + get_property(symlink_version TARGET ${dest} PROPERTY VERSION) + endif() + if(ARG_ALWAYS_GENERATE) set(component ${dest}) else() set(component ${name}) endif() - set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX}) - set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) + if(NOT DEFINED symlink_version) + set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX}) + set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) + else() + set(full_name ${name}-${symlink_version}${CMAKE_EXECUTABLE_SUFFIX}) + set(full_dest ${dest}-${symlink_version}${CMAKE_EXECUTABLE_SUFFIX}) + set(nonver_name ${name}${CMAKE_EXECUTABLE_SUFFIX}) + endif() + # sym[-X.Y] -> dest[-X.Y] install(SCRIPT ${INSTALL_SYMLINK} CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})" COMPONENT ${component}) + if(DEFINED symlink_version) + # sym -> sym-X.Y + install(SCRIPT ${INSTALL_SYMLINK} + CODE "install_symlink(${nonver_name} ${full_name} ${LLVM_TOOLS_INSTALL_DIR})" + COMPONENT ${component}) + endif() if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE) add_custom_target(install-${name} @@ -1235,16 +1255,37 @@ function(add_llvm_tool_symlink name dest) cmake_parse_arguments(ARG "ALWAYS_GENERATE" "" "" ${ARGN}) + + # If target is a versioned executable, reconstruct the version symlink + # on the target symlink as well. + set(symlink_version) + if(TARGET ${dest}) + get_property(symlink_version TARGET ${dest} PROPERTY VERSION) + endif() + + set(output_path "${LLVM_RUNTIME_OUTPUT_INTDIR}/${name}${CMAKE_EXECUTABLE_SUFFIX}") + if(DEFINED symlink_version) + set(output_ver_path "${LLVM_RUNTIME_OUTPUT_INTDIR}/${name}-${symlink_version}${CMAKE_EXECUTABLE_SUFFIX}") + endif() + if(UNIX) set(LLVM_LINK_OR_COPY create_symlink) - set(dest_binary "${dest}${CMAKE_EXECUTABLE_SUFFIX}") + if(NOT DEFINED symlink_version) + set(dest_binary "${dest}${CMAKE_EXECUTABLE_SUFFIX}") + else() + set(dest_ver_binary "${dest}-${symlink_version}${CMAKE_EXECUTABLE_SUFFIX}") + set(dest_ver_output "${name}-${symlink_version}${CMAKE_EXECUTABLE_SUFFIX}") + endif() else() set(LLVM_LINK_OR_COPY copy) - set(dest_binary "${LLVM_RUNTIME_OUTPUT_INTDIR}/${dest}${CMAKE_EXECUTABLE_SUFFIX}") + if(NOT DEFINED symlink_version) + set(dest_binary "${LLVM_RUNTIME_OUTPUT_INTDIR}/${dest}${CMAKE_EXECUTABLE_SUFFIX}") + else() + set(dest_ver_binary "${LLVM_RUNTIME_OUTPUT_INTDIR}/${dest}-${symlink_version}${CMAKE_EXECUTABLE_SUFFIX}") + set(dest_ver_output "${output_ver_path}") + endif() endif() - set(output_path "${LLVM_RUNTIME_OUTPUT_INTDIR}/${name}${CMAKE_EXECUTABLE_SUFFIX}") - set(target_name ${name}) if(TARGET ${name}) set(target_name ${name}-link) @@ -1254,13 +1295,32 @@ if(ARG_ALWAYS_GENERATE) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${dest_binary}) - add_custom_command(TARGET ${dest} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}") + if(NOT DEFINED symlink_version) + # sym -> dest + add_custom_command(TARGET ${dest} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}") + else() + # sym -> sym-X.Y -> dest-X.Y + add_custom_command(TARGET ${dest} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_ver_binary}" "${output_ver_path}" + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_ver_output}" "${output_path}") + endif() else() - add_custom_command(OUTPUT ${output_path} - COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}" - DEPENDS ${dest}) - add_custom_target(${target_name} ALL DEPENDS ${output_path}) + if(NOT DEFINED symlink_version) + # sym -> dest + add_custom_command(OUTPUT ${output_path} + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}" + DEPENDS ${dest}) + else() + # sym -> sym-X.Y -> dest-X.Y + add_custom_command(OUTPUT ${output_ver_path} + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_ver_binary}" "${output_ver_path}" + DEPENDS ${dest}) + add_custom_command(OUTPUT ${output_path} + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_ver_output}" "${output_path}" + DEPENDS ${output_ver_path}) + endif() + add_custom_target(${target_name} ALL DEPENDS ${output_path} ${output_ver_path}) set_target_properties(${target_name} PROPERTIES FOLDER Tools) # Make sure both the link and target are toolchain tools