mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[cmake] rework LLVM_LINK_LLVM_DYLIB option handling
Summary: This diff attempts to address the concerns raised in http://reviews.llvm.org/D12488. We introduce a new USE_SHARED option to llvm_config, which, if set, causes the target to be linked against libLLVM. add_llvm_utility now uniformly disables linking against libLLVM. These utilities are not intended for distribution, and this keeps the option handling more centralised. llvm-shlib is now processes before any other "tools" subdirectories, ensuring the libLLVM target is defined before its dependents. One main difference from what was requested: llvm_config does not prune LLVM_DYLIB_COMPONENTS from the components passed into explicit_llvm_config. This is because the "all" component does something special, adding additional libraries (namely libLTO). Adding the component libraries after libLLVM should not be a problem, as symbols will be resolved in libLLVM first. Finally, I'm not really happy with the DISABLE_LLVM_LINK_LLVM option, but I'm not sure of a better way to get the following: - link all tools and shared libraries to libLLVM if LLVM_LINK_LLVM_DYLIB is set - some way of explicitly *not* doing so for utilities and libLLVM itself Suggestions for improvement here are particularly welcome. Reviewers: beanz Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D12590 llvm-svn: 246918
This commit is contained in:
parent
10cdbfe119
commit
fe6b559032
@ -347,6 +347,13 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
|
||||
option (LLVM_BUILD_EXTERNAL_COMPILER_RT
|
||||
"Build compiler-rt as an external project." OFF)
|
||||
|
||||
# You can configure which libraries from LLVM you want to include in the
|
||||
# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
|
||||
# list of LLVM components. All component names handled by llvm-config are valid.
|
||||
if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
|
||||
set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
|
||||
"Semicolon-separated list of components to include in libLLVM, or \"all\".")
|
||||
endif()
|
||||
option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
|
||||
option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_LINK_LLVM_DYLIB})
|
||||
option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" ${LLVM_LINK_LLVM_DYLIB})
|
||||
|
@ -610,13 +610,13 @@ macro(add_llvm_executable name)
|
||||
add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
|
||||
endif(LLVM_EXPORTED_SYMBOL_FILE)
|
||||
|
||||
if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
|
||||
set(USE_SHARED USE_SHARED)
|
||||
endif()
|
||||
|
||||
set(EXCLUDE_FROM_ALL OFF)
|
||||
set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
|
||||
if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
|
||||
target_link_libraries(${name} LLVM)
|
||||
else()
|
||||
llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
|
||||
endif()
|
||||
llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
|
||||
if( LLVM_COMMON_DEPENDS )
|
||||
add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
|
||||
endif( LLVM_COMMON_DEPENDS )
|
||||
@ -677,7 +677,7 @@ endmacro(add_llvm_example name)
|
||||
|
||||
|
||||
macro(add_llvm_utility name)
|
||||
add_llvm_executable(${name} ${ARGN})
|
||||
add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
|
||||
set_target_properties(${name} PROPERTIES FOLDER "Utils")
|
||||
if( LLVM_INSTALL_UTILS )
|
||||
install (TARGETS ${name}
|
||||
|
@ -31,7 +31,23 @@ endfunction(is_llvm_target_library)
|
||||
|
||||
|
||||
macro(llvm_config executable)
|
||||
explicit_llvm_config(${executable} ${ARGN})
|
||||
cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN})
|
||||
set(link_components ${ARG_UNPARSED_ARGUMENTS})
|
||||
|
||||
if(USE_SHARED)
|
||||
# If USE_SHARED is specified, then we link against libLLVM,
|
||||
# but also against the component libraries below. This is
|
||||
# done in case libLLVM does not contain all of the components
|
||||
# the target requires.
|
||||
#
|
||||
# TODO strip LLVM_DYLIB_COMPONENTS out of link_components.
|
||||
# To do this, we need special handling for "all", since that
|
||||
# may imply linking to libraries that are not included in
|
||||
# libLLVM.
|
||||
target_link_libraries(${executable} LLVM)
|
||||
endif()
|
||||
|
||||
explicit_llvm_config(${executable} ${link_components})
|
||||
endmacro(llvm_config)
|
||||
|
||||
|
||||
|
@ -79,13 +79,7 @@ macro(add_tablegen target project)
|
||||
set(LLVM_ENABLE_OBJLIB ON)
|
||||
endif()
|
||||
|
||||
add_llvm_utility(
|
||||
${target} ${ARGN}
|
||||
# libLLVM does not include the TableGen
|
||||
# components, so we cannot link any tblgen
|
||||
# utilities against it.
|
||||
DISABLE_LLVM_LINK_LLVM_DYLIB)
|
||||
|
||||
add_llvm_utility(${target} ${ARGN})
|
||||
set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS})
|
||||
|
||||
set(${project}_TABLEGEN "${target}" CACHE
|
||||
|
@ -2,53 +2,6 @@
|
||||
# library is enabled by setting LLVM_BUILD_LLVM_DYLIB=yes on the CMake
|
||||
# commandline. By default the shared library only exports the LLVM C API.
|
||||
|
||||
if(LLVM_LINK_LLVM_DYLIB)
|
||||
if(DEFINED LLVM_DYLIB_COMPONENTS)
|
||||
# To avoid inscrutable link errors, just disallow setting
|
||||
# LLVM_DYLIB_COMPONENTS when we're intending to link tools
|
||||
# and shared libraries with the dylib.
|
||||
message(FATAL_ERROR "LLVM_DYLIB_COMPONENTS must not be set when LLVM_LINK_LLVM_DYLIB is ON")
|
||||
endif()
|
||||
if(NOT LLVM_DYLIB_EXPORT_ALL)
|
||||
message(FATAL_ERROR "LLVM_DYLIB_EXPORT_ALL must be ON when LLVM_LINK_LLVM_DYLIB is ON")
|
||||
endif()
|
||||
set(LLVM_DYLIB_COMPONENTS all)
|
||||
endif()
|
||||
|
||||
# If LLVM_LINK_LLVM_DYLIB is not OFF, you can configure which libraries from
|
||||
# LLVM you want to include in the shared library by setting
|
||||
# LLVM_DYLIB_COMPONENTS to a semi-colon delimited list of LLVM components.
|
||||
# All component names handled by llvm-config are valid.
|
||||
if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
|
||||
set(LLVM_DYLIB_COMPONENTS
|
||||
${LLVM_TARGETS_TO_BUILD}
|
||||
Analysis
|
||||
BitReader
|
||||
BitWriter
|
||||
CodeGen
|
||||
Core
|
||||
DebugInfoDWARF
|
||||
DebugInfoPDB
|
||||
ExecutionEngine
|
||||
IPO
|
||||
IRReader
|
||||
InstCombine
|
||||
Instrumentation
|
||||
Interpreter
|
||||
Linker
|
||||
MCDisassembler
|
||||
MCJIT
|
||||
ObjCARCOpts
|
||||
Object
|
||||
ScalarOpts
|
||||
Support
|
||||
Target
|
||||
TransformUtils
|
||||
Vectorize
|
||||
native
|
||||
)
|
||||
endif()
|
||||
|
||||
add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" )
|
||||
|
||||
set(SOURCES
|
||||
@ -58,6 +11,10 @@ set(SOURCES
|
||||
llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
|
||||
|
||||
if(LLVM_LINK_LLVM_DYLIB)
|
||||
if(NOT LLVM_DYLIB_EXPORT_ALL)
|
||||
message(FATAL_ERROR "LLVM_DYLIB_EXPORT_ALL must be ON when LLVM_LINK_LLVM_DYLIB is ON")
|
||||
endif()
|
||||
|
||||
# libLLVM.so should not have any dependencies on any other LLVM
|
||||
# shared libraries. When using the "all" pseudo-component,
|
||||
# LLVM_AVAILABLE_LIBS is added to the dependencies, which may
|
||||
|
Loading…
x
Reference in New Issue
Block a user