Index: clang/cmake/modules/AddClang.cmake =================================================================== --- clang/cmake/modules/AddClang.cmake +++ clang/cmake/modules/AddClang.cmake @@ -182,7 +182,7 @@ macro(add_clang_symlink name dest) get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${dest} IN_LIST LLVM_DRIVER_TOOLS) - set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_SYMLINKS ${name}) + set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${dest} ${name}) else() llvm_add_tool_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE) # Always generate install targets Index: llvm/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/cmake/modules/AddLLVM.cmake +++ llvm/cmake/modules/AddLLVM.cmake @@ -905,6 +905,7 @@ set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_OBJLIBS "${obj_name}") set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOLS ${name}) + set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${name} ${name}) target_link_libraries(${obj_name} ${LLVM_PTHREAD_LIB}) llvm_config(${obj_name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} ) endif() @@ -2044,8 +2045,9 @@ set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX}) set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) - if (${dest} STREQUAL "llvm-driver") - set(full_dest llvm${CMAKE_EXECUTABLE_SUFFIX}) + if (${dest} MATCHES "llvm-driver.*") + string(REPLACE "-driver" "" normalized_dest ${dest}) + set(full_dest ${normalized_dest}${CMAKE_EXECUTABLE_SUFFIX}) endif() set(output_dir "${${project}_TOOLS_INSTALL_DIR}") @@ -2068,11 +2070,7 @@ get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) if (${target} IN_LIST LLVM_DRIVER_TOOLS) - string(REPLACE "-" "_" tool_entry ${target}) - string(REPLACE "-" "_" key ${link_name}) - string(REPLACE "llvm-" "" tool_name ${link_name}) - set_property(GLOBAL APPEND_STRING PROPERTY - LLVM_EXTRA_DRIVER_ENTRIES "LLVM_DRIVER_TOOL(\"${tool_name}\", ${tool_entry})\n") + set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${target} ${link_name}) endif() set(dest_binary "$") Index: llvm/cmake/modules/LLVMDistributionSupport.cmake =================================================================== --- llvm/cmake/modules/LLVMDistributionSupport.cmake +++ llvm/cmake/modules/LLVMDistributionSupport.cmake @@ -260,25 +260,38 @@ add_custom_target(install-${distribution_target}-stripped) foreach(target ${distribution_components}) + get_property(driver_target GLOBAL PROPERTY LLVM_DRIVER_${target}_TARGET) if(TARGET ${target}) add_dependencies(${distribution_target} ${target}) else() - message(SEND_ERROR "Specified distribution component '${target}' doesn't have a target") + if (TARGET ${driver_target}) + add_dependencies(${distribution_target} ${driver_target}) + else() + message(SEND_ERROR "Specified distribution component '${target}' doesn't have a target") + endif() endif() if(TARGET install-${target}) add_dependencies(install-${distribution_target} install-${target}) else() - message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install target") + if (TARGET ${driver_target}) + add_dependencies(install-${distribution_target} install-${driver_target}) + else() + message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install target") + endif() endif() if(TARGET install-${target}-stripped) add_dependencies(install-${distribution_target}-stripped install-${target}-stripped) else() - message(SEND_ERROR - "Specified distribution component '${target}' doesn't have an install-stripped target." - " Its installation target creation should be changed to use add_llvm_install_targets," - " or you should manually create the 'install-${target}-stripped' target.") + if (TARGET ${driver_target}) + add_dependencies(install-${distribution_target}-stripped install-${driver_target}-stripped) + else() + message(SEND_ERROR + "Specified distribution component '${target}' doesn't have an install-stripped target." + " Its installation target creation should be changed to use add_llvm_install_targets," + " or you should manually create the 'install-${target}-stripped' target.") + endif() endif() endforeach() endforeach() Index: llvm/tools/CMakeLists.txt =================================================================== --- llvm/tools/CMakeLists.txt +++ llvm/tools/CMakeLists.txt @@ -23,6 +23,7 @@ if (LLVM_TOOL_LLVM_DRIVER_BUILD) add_llvm_tool(llvm-driver) + add_llvm_tool(llvm-driver-distribution) endif() # Add LTO, llvm-ar, llvm-config, and llvm-profdata before clang, ExternalProject Index: llvm/tools/llvm-driver/CMakeLists.txt =================================================================== --- llvm/tools/llvm-driver/CMakeLists.txt +++ llvm/tools/llvm-driver/CMakeLists.txt @@ -1,38 +1,73 @@ get_property(LLVM_COMMON_DEPENDS GLOBAL PROPERTY LLVM_DRIVER_DEPS) get_property(LLVM_DRIVER_OBJLIBS GLOBAL PROPERTY LLVM_DRIVER_OBJLIBS) -get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) +macro(create_llvm_driver name included_tools) + if ("${name}" STREQUAL "") + set(suffix "") + else() + set(suffix -${name}) + endif() + + set(def_decl "") + foreach(tool ${included_tools}) + get_property(tool_aliases GLOBAL PROPERTY LLVM_DRIVER_TOOL_ALIASES_${tool}) + string(REPLACE "-" "_" tool_entry ${tool}) + foreach(alias ${tool_aliases}) + string(REPLACE "llvm-" "" tool_name ${alias}) + set(def_decl "${def_decl}LLVM_DRIVER_TOOL(\"${tool_name}\", ${tool_entry})\n") + set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_${name}_TARGETS ${alias}) + endforeach() + endforeach() -foreach(tool ${LLVM_DRIVER_TOOLS}) - string(REPLACE "-" "_" tool_entry ${tool}) - string(REPLACE "llvm-" "" tool ${tool}) - set(def_decl "${def_decl}LLVM_DRIVER_TOOL(\"${tool}\", ${tool_entry})\n") -endforeach() + file(WRITE + "${CMAKE_CURRENT_BINARY_DIR}/${name}/LLVMDriverTools.def" + "${def_decl}#undef LLVM_DRIVER_TOOL\n") -get_property(LLVM_EXTRA_DRIVER_ENTRIES GLOBAL PROPERTY LLVM_EXTRA_DRIVER_ENTRIES) + target_include_directories(llvm-driver${suffix} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${name}) + target_sources(llvm-driver${suffix} PRIVATE llvm-driver.cpp) -file(WRITE - "${CMAKE_CURRENT_BINARY_DIR}/LLVMDriverTools.def" - "${def_decl}${LLVM_EXTRA_DRIVER_ENTRIES}#undef LLVM_DRIVER_TOOL\n") + set_target_properties(llvm-driver${suffix} PROPERTIES OUTPUT_NAME llvm${suffix}) -target_include_directories(llvm-driver PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -target_sources(llvm-driver PRIVATE llvm-driver.cpp) + set(deps "") + foreach(objlib ${LLVM_DRIVER_OBJLIBS}) + foreach(tool ${included_tools}) + if (${objlib} STREQUAL "obj.${tool}") + list(APPEND deps ${objlib}) + endif() + endforeach() + endforeach() + target_link_libraries(llvm-driver${suffix} PUBLIC ${deps}) + + if(APPLE) + # dsymutil uses some CoreFoundation stuff on Darwin... + target_link_libraries(llvm-driver${suffix} PRIVATE "-framework CoreFoundation") + endif(APPLE) -set_target_properties(llvm-driver PROPERTIES OUTPUT_NAME llvm) + foreach(tool ${included_tools}) + set_property(GLOBAL PROPERTY LLVM_DRIVER_${tool}_TARGET llvm-driver${suffix}) + endforeach() +endmacro() -target_link_libraries(llvm-driver PUBLIC ${LLVM_DRIVER_OBJLIBS}) +get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) +create_llvm_driver("" "${LLVM_DRIVER_TOOLS}") -if(APPLE) - # dsymutil uses some CoreFoundation stuff on Darwin... - target_link_libraries(llvm-driver PRIVATE "-framework CoreFoundation") -endif(APPLE) +if (LLVM_DISTRIBUTION_COMPONENTS) + create_llvm_driver(distribution "${LLVM_DISTRIBUTION_COMPONENTS}") +endif() macro(generate_driver_tool_targets) - get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) - get_property(LLVM_DRIVER_TOOL_SYMLINKS GLOBAL PROPERTY LLVM_DRIVER_TOOL_SYMLINKS) - foreach(name IN LISTS LLVM_DRIVER_TOOLS LLVM_DRIVER_TOOL_SYMLINKS) - add_llvm_tool_symlink(${name} llvm-driver ALWAYS_GENERATE) - # Always generate install targets - llvm_install_symlink(LLVM ${name} llvm-driver ALWAYS_GENERATE) + foreach(driver_name "" distribution) + if ("${driver_name}" STREQUAL "") + set(suffix "") + else() + set(suffix -${driver_name}) + endif() + + get_property(targets GLOBAL PROPERTY LLVM_DRIVER_${driver_name}_TARGETS) + foreach(target ${targets}) + add_llvm_tool_symlink("${target}" llvm-driver${suffix} ALWAYS_GENERATE) + # Always generate install targets + llvm_install_symlink(LLVM "${target}" llvm-driver${suffix} ALWAYS_GENERATE) + endforeach() endforeach() endmacro()