CMake: Disable ENABLE_EXPORTS for executables with MSVC

The MSVC linker won't produce a .lib file for an executable that doesn't
export anything, and LLVM doesn't maintain dllexport annotations or .def
files listing all C++ symbols. It also doesn't support exporting all
symbols, like binutils ld.

CMake 3.2 changed the Ninja generator to list both the .exe and .lib
files as outputs of executable build targets. Ninja would always re-link
executables with ENABLE_EXPORTS because the .lib output file was not
present, and therefore the target was out of date.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232662 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Kleckner 2015-03-18 20:09:13 +00:00
parent 325aa050d5
commit 85ab1e7fe7
8 changed files with 13 additions and 7 deletions

View File

@ -557,7 +557,7 @@ if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
# Make sure we don't get -rdynamic in every binary. For those that need it, # Make sure we don't get -rdynamic in every binary. For those that need it,
# use set_target_properties(target PROPERTIES ENABLE_EXPORTS 1) # use export_executable_symbols(target).
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
include(AddLLVM) include(AddLLVM)

View File

@ -490,6 +490,12 @@ macro(add_llvm_executable name)
endif( LLVM_COMMON_DEPENDS ) endif( LLVM_COMMON_DEPENDS )
endmacro(add_llvm_executable name) endmacro(add_llvm_executable name)
function(export_executable_symbols target)
if (NOT MSVC) # MSVC's linker doesn't support exporting all symbols.
set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
endif()
endfunction()
set (LLVM_TOOLCHAIN_TOOLS set (LLVM_TOOLCHAIN_TOOLS
llvm-ar llvm-ar

View File

@ -15,4 +15,4 @@ add_llvm_example(ExceptionDemo
ExceptionDemo.cpp ExceptionDemo.cpp
) )
set_target_properties(ExceptionDemo PROPERTIES ENABLE_EXPORTS 1) export_executable_symbols(ExceptionDemo)

View File

@ -31,7 +31,7 @@ add_llvm_tool(bugpoint
ToolRunner.cpp ToolRunner.cpp
bugpoint.cpp bugpoint.cpp
) )
set_target_properties(bugpoint PROPERTIES ENABLE_EXPORTS 1) export_executable_symbols(bugpoint)
if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS) if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
target_link_libraries(bugpoint Polly) target_link_libraries(bugpoint Polly)

View File

@ -17,4 +17,4 @@ set(LLVM_NO_DEAD_STRIP 1)
add_llvm_tool(llc add_llvm_tool(llc
llc.cpp llc.cpp
) )
set_target_properties(llc PROPERTIES ENABLE_EXPORTS 1) export_executable_symbols(llc)

View File

@ -39,4 +39,4 @@ add_llvm_tool(lli
RemoteTarget.cpp RemoteTarget.cpp
RemoteTargetExternal.cpp RemoteTargetExternal.cpp
) )
set_target_properties(lli PROPERTIES ENABLE_EXPORTS 1) export_executable_symbols(llvm-stress)

View File

@ -7,4 +7,4 @@ set(LLVM_LINK_COMPONENTS
add_llvm_tool(llvm-stress add_llvm_tool(llvm-stress
llvm-stress.cpp llvm-stress.cpp
) )
set_target_properties(llvm-stress PROPERTIES ENABLE_EXPORTS 1) export_executable_symbols(llvm-stress)

View File

@ -31,7 +31,7 @@ add_llvm_tool(opt
PrintSCC.cpp PrintSCC.cpp
opt.cpp opt.cpp
) )
set_target_properties(opt PROPERTIES ENABLE_EXPORTS 1) export_executable_symbols(opt)
if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS) if(WITH_POLLY AND LINK_POLLY_INTO_TOOLS)
target_link_libraries(opt Polly) target_link_libraries(opt Polly)