Skip to content

Commit 09d4dbc

Browse files
committed
[llvm-driver] Generate symlinks instead of executables for tools
When LLVM_TOOL_LLVM_DRIVER_BUILD is On, create symlinks to llvm instead of creating the executables. Currently this only works for install and not install-distribution, the work for the later will be split up into a second patch. Differential Revision: https://reviews.llvm.org/D127800
1 parent f0dd12e commit 09d4dbc

File tree

4 files changed

+102
-52
lines changed

4 files changed

+102
-52
lines changed

clang/cmake/modules/AddClang.cmake

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -149,43 +149,60 @@ macro(add_clang_executable name)
149149
endmacro(add_clang_executable)
150150

151151
macro(add_clang_tool name)
152+
cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN})
152153
if (NOT CLANG_BUILD_TOOLS)
153154
set(EXCLUDE_FROM_ALL ON)
154155
endif()
155-
156-
add_clang_executable(${name} ${ARGN})
157-
add_dependencies(${name} clang-resource-headers)
158-
159-
if (CLANG_BUILD_TOOLS)
160-
get_target_export_arg(${name} Clang export_to_clangtargets)
161-
install(TARGETS ${name}
162-
${export_to_clangtargets}
163-
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
164-
COMPONENT ${name})
165-
166-
if(NOT LLVM_ENABLE_IDE)
167-
add_llvm_install_targets(install-${name}
168-
DEPENDS ${name}
169-
COMPONENT ${name})
156+
if(ARG_GENERATE_DRIVER AND LLVM_TOOL_LLVM_DRIVER_BUILD)
157+
set(get_obj_args ${ARGN})
158+
list(FILTER get_obj_args EXCLUDE REGEX "^SUPPORT_PLUGINS$")
159+
generate_llvm_objects(${name} ${get_obj_args})
160+
add_custom_target(${name} DEPENDS llvm-driver clang-resource-headers)
161+
else()
162+
add_clang_executable(${name} ${ARGN})
163+
add_dependencies(${name} clang-resource-headers)
164+
165+
if (CLANG_BUILD_TOOLS)
166+
get_target_export_arg(${name} Clang export_to_clangtargets)
167+
install(TARGETS ${name}
168+
${export_to_clangtargets}
169+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
170+
COMPONENT ${name})
171+
172+
if(NOT LLVM_ENABLE_IDE)
173+
add_llvm_install_targets(install-${name}
174+
DEPENDS ${name}
175+
COMPONENT ${name})
176+
endif()
177+
set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
170178
endif()
171-
set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})
172179
endif()
173180
endmacro()
174181

175182
macro(add_clang_symlink name dest)
176-
add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE)
177-
# Always generate install targets
178-
llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE)
183+
get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
184+
if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${dest} IN_LIST LLVM_DRIVER_TOOLS)
185+
set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_SYMLINKS ${name})
186+
else()
187+
add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE)
188+
# Always generate install targets
189+
llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE)
190+
endif()
179191
endmacro()
180192

181193
function(clang_target_link_libraries target type)
194+
if (TARGET obj.${target})
195+
target_link_libraries(obj.${target} ${ARGN})
196+
endif()
197+
198+
get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
199+
if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${target} IN_LIST LLVM_DRIVER_TOOLS)
200+
set(target llvm-driver)
201+
endif()
202+
182203
if (CLANG_LINK_CLANG_DYLIB)
183204
target_link_libraries(${target} ${type} clang-cpp)
184205
else()
185206
target_link_libraries(${target} ${type} ${ARGN})
186207
endif()
187-
if (TARGET obj.${target})
188-
target_link_libraries(obj.${target} ${ARGN})
189-
endif()
190-
191208
endfunction()

llvm/cmake/modules/AddLLVM.cmake

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -863,12 +863,8 @@ macro(add_llvm_library name)
863863
endif()
864864
endmacro(add_llvm_library name)
865865

866-
macro(add_llvm_executable name)
867-
cmake_parse_arguments(ARG
868-
"DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS;GENERATE_DRIVER"
869-
"ENTITLEMENTS;BUNDLE_PATH"
870-
"DEPENDS"
871-
${ARGN})
866+
macro(generate_llvm_objects name)
867+
cmake_parse_arguments(ARG "GENERATE_DRIVER" "" "DEPENDS" ${ARGN})
872868

873869
llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
874870

@@ -911,7 +907,15 @@ macro(add_llvm_executable name)
911907
target_link_libraries(${obj_name} ${LLVM_PTHREAD_LIB})
912908
llvm_config(${obj_name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
913909
endif()
910+
endmacro()
914911

912+
macro(add_llvm_executable name)
913+
cmake_parse_arguments(ARG
914+
"DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS"
915+
"ENTITLEMENTS;BUNDLE_PATH"
916+
""
917+
${ARGN})
918+
generate_llvm_objects(${name} ${ARG_UNPARSED_ARGUMENTS})
915919
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
916920

917921
if(XCODE)
@@ -1276,30 +1280,36 @@ if(NOT LLVM_TOOLCHAIN_TOOLS)
12761280
endif()
12771281

12781282
macro(add_llvm_tool name)
1283+
cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN})
12791284
if( NOT LLVM_BUILD_TOOLS )
12801285
set(EXCLUDE_FROM_ALL ON)
12811286
endif()
1282-
add_llvm_executable(${name} ${ARGN})
1283-
1284-
if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1285-
if( LLVM_BUILD_TOOLS )
1286-
get_target_export_arg(${name} LLVM export_to_llvmexports)
1287-
install(TARGETS ${name}
1288-
${export_to_llvmexports}
1289-
RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
1290-
COMPONENT ${name})
1291-
1292-
if (NOT LLVM_ENABLE_IDE)
1293-
add_llvm_install_targets(install-${name}
1294-
DEPENDS ${name}
1295-
COMPONENT ${name})
1287+
if(ARG_GENERATE_DRIVER AND LLVM_TOOL_LLVM_DRIVER_BUILD)
1288+
generate_llvm_objects(${name} ${ARGN})
1289+
add_custom_target(${name} DEPENDS llvm-driver)
1290+
else()
1291+
add_llvm_executable(${name} ${ARGN})
1292+
1293+
if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1294+
if( LLVM_BUILD_TOOLS )
1295+
get_target_export_arg(${name} LLVM export_to_llvmexports)
1296+
install(TARGETS ${name}
1297+
${export_to_llvmexports}
1298+
RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
1299+
COMPONENT ${name})
1300+
1301+
if (NOT LLVM_ENABLE_IDE)
1302+
add_llvm_install_targets(install-${name}
1303+
DEPENDS ${name}
1304+
COMPONENT ${name})
1305+
endif()
12961306
endif()
12971307
endif()
1308+
if( LLVM_BUILD_TOOLS )
1309+
set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
1310+
endif()
1311+
set_target_properties(${name} PROPERTIES FOLDER "Tools")
12981312
endif()
1299-
if( LLVM_BUILD_TOOLS )
1300-
set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
1301-
endif()
1302-
set_target_properties(${name} PROPERTIES FOLDER "Tools")
13031313
endmacro(add_llvm_tool name)
13041314

13051315

@@ -2000,6 +2010,11 @@ function(llvm_install_library_symlink name dest type)
20002010
endfunction()
20012011

20022012
function(llvm_install_symlink name dest)
2013+
get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
2014+
if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${dest} IN_LIST LLVM_DRIVER_TOOLS)
2015+
set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_SYMLINKS ${name})
2016+
return()
2017+
endif()
20032018
cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
20042019
foreach(path ${CMAKE_MODULE_PATH})
20052020
if(EXISTS ${path}/LLVMInstallSymlink.cmake)
@@ -2020,6 +2035,9 @@ function(llvm_install_symlink name dest)
20202035

20212036
set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX})
20222037
set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX})
2038+
if (${dest} STREQUAL "llvm-driver")
2039+
set(full_dest llvm${CMAKE_EXECUTABLE_SUFFIX})
2040+
endif()
20232041

20242042
install(SCRIPT ${INSTALL_SYMLINK}
20252043
CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})"

llvm/tools/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ if(CYGWIN OR NOT LLVM_ENABLE_PIC)
2121
set(LLVM_TOOL_LTO_BUILD Off)
2222
endif()
2323

24+
if (LLVM_TOOL_LLVM_DRIVER_BUILD)
25+
add_llvm_tool(llvm-driver)
26+
endif()
27+
2428
# Add LTO, llvm-ar, llvm-config, and llvm-profdata before clang, ExternalProject
2529
# requires targets specified in DEPENDS to exist before the call to
2630
# ExternalProject_Add.
@@ -58,4 +62,8 @@ if (LLVM_TOOL_LLVM_DRIVER_BUILD)
5862
# This is explicitly added at the end _after_ all tool projects so that it can
5963
# scrape up tools from other projects into itself.
6064
add_subdirectory(llvm-driver)
65+
# This must be here otherwise CMake complains in add_llvm_tool_symlink that
66+
# it can't add_custom_command that happens after llvm-driver is built because
67+
# llvm-driver was not created in that directory.
68+
generate_driver_tool_targets()
6169
endif()

llvm/tools/llvm-driver/CMakeLists.txt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ file(WRITE
1515
"${CMAKE_CURRENT_BINARY_DIR}/LLVMDriverTools.def"
1616
"${def_decl}${LLVM_EXTRA_DRIVER_ENTRIES}#undef LLVM_DRIVER_TOOL\n")
1717

18-
include_directories(${CMAKE_CURRENT_BINARY_DIR})
19-
20-
add_llvm_tool(llvm-driver
21-
llvm-driver.cpp
22-
)
18+
target_include_directories(llvm-driver PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
19+
target_sources(llvm-driver PRIVATE llvm-driver.cpp)
2320

2421
set_target_properties(llvm-driver PROPERTIES OUTPUT_NAME llvm)
2522

@@ -29,3 +26,13 @@ if(APPLE)
2926
# dsymutil uses some CoreFoundation stuff on Darwin...
3027
target_link_libraries(llvm-driver PRIVATE "-framework CoreFoundation")
3128
endif(APPLE)
29+
30+
macro(generate_driver_tool_targets)
31+
get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
32+
get_property(LLVM_DRIVER_TOOL_SYMLINKS GLOBAL PROPERTY LLVM_DRIVER_TOOL_SYMLINKS)
33+
foreach(name IN LISTS LLVM_DRIVER_TOOLS LLVM_DRIVER_TOOL_SYMLINKS)
34+
add_llvm_tool_symlink(${name} llvm-driver ALWAYS_GENERATE)
35+
# Always generate install targets
36+
llvm_install_symlink(${name} llvm-driver ALWAYS_GENERATE)
37+
endforeach()
38+
endmacro()

0 commit comments

Comments
 (0)