X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=cmake%2Fmodules%2FAddLLVM.cmake;h=b3fccb0d327e219213c3e417bb74905f971a9e2c;hp=2ef73fb8e5d9bc79fb834ce4282cb66750a99ab9;hb=e59dcc804fa525212b27d4790ac3d001bac71c04;hpb=a9ce03858d657f4bab5cae242cfba7cfc1c144de diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index 2ef73fb8e5d..b3fccb0d327 100644 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -10,7 +10,7 @@ function(llvm_update_compile_flags name) # LLVM_REQUIRES_EH is an internal flag that individual # targets can use to force EH - if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH) + if((LLVM_REQUIRES_EH OR LLVM_ENABLE_EH) AND NOT CLANG_CL) if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI)) message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}") set(LLVM_REQUIRES_RTTI ON) @@ -22,6 +22,10 @@ function(llvm_update_compile_flags name) list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0) list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-") endif() + if (CLANG_CL) + # FIXME: Remove this once clang-cl supports SEH + list(APPEND LLVM_COMPILE_DEFINITIONS "GTEST_HAS_SEH=0") + endif() endif() # LLVM_REQUIRES_RTTI is an internal flag that individual @@ -142,26 +146,50 @@ function(add_llvm_symbol_exports target_name export_file) set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE) endfunction(add_llvm_symbol_exports) -function(add_link_opts target_name) - # Pass -O3 to the linker. This enabled different optimizations on different - # linkers. - if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32)) - set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-O3") +if(NOT WIN32 AND NOT APPLE) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -Wl,--version + OUTPUT_VARIABLE stdout + ERROR_QUIET + ) + if("${stdout}" MATCHES "GNU gold") + set(LLVM_LINKER_IS_GOLD ON) endif() +endif() + +function(add_link_opts target_name) + # Don't use linker optimizations in debug builds since it slows down the + # linker in a context where the optimizations are not important. + if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") - if(NOT LLVM_NO_DEAD_STRIP) - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - # ld64's implementation of -dead_strip breaks tools that use plugins. + # Pass -O3 to the linker. This enabled different optimizations on different + # linkers. + if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32)) set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-dead_strip") - elseif(NOT WIN32) - # Object files are compiled with -ffunction-data-sections. - # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks - # tools that use plugins. Always pass --gc-sections once we require - # a newer linker. + LINK_FLAGS " -Wl,-O3") + endif() + + if(LLVM_LINKER_IS_GOLD) + # With gold gc-sections is always safe. set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--gc-sections") + # Note that there is a bug with -Wl,--icf=safe so it is not safe + # to enable. See https://sourceware.org/bugzilla/show_bug.cgi?id=17704. + endif() + + if(NOT LLVM_NO_DEAD_STRIP) + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + # ld64's implementation of -dead_strip breaks tools that use plugins. + set_property(TARGET ${target_name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-dead_strip") + elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD) + # Object files are compiled with -ffunction-data-sections. + # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks + # tools that use plugins. Always pass --gc-sections once we require + # a newer linker. + set_property(TARGET ${target_name} APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,--gc-sections") + endif() endif() endif() endfunction(add_link_opts) @@ -315,11 +343,11 @@ function(llvm_add_library name) PREFIX "" ) endif() - if (MSVC) - set_target_properties(${name} - PROPERTIES - IMPORT_SUFFIX ".imp") - endif () + + set_target_properties(${name} + PROPERTIES + SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} + VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) endif() if(ARG_MODULE OR ARG_SHARED) @@ -379,6 +407,11 @@ function(llvm_add_library name) endfunction() macro(add_llvm_library name) + cmake_parse_arguments(ARG + "SHARED" + "" + "" + ${ARGN}) if( BUILD_SHARED_LIBS ) llvm_add_library(${name} SHARED ${ARGN}) else() @@ -390,11 +423,28 @@ macro(add_llvm_library name) set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) else() if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO") + if(ARG_SHARED OR BUILD_SHARED_LIBS) + if(WIN32 OR CYGWIN) + set(install_type RUNTIME) + else() + set(install_type LIBRARY) + endif() + else() + set(install_type ARCHIVE) + endif() + install(TARGETS ${name} - EXPORT LLVMExports - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} - ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) + EXPORT LLVMExports + ${install_type} DESTINATION lib${LLVM_LIBDIR_SUFFIX} + COMPONENT ${name}) + + if (NOT CMAKE_CONFIGURATION_TYPES) + add_custom_target(install-${name} + DEPENDS ${name} + COMMAND "${CMAKE_COMMAND}" + -DCMAKE_INSTALL_COMPONENT=${name} + -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") + endif() endif() set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) endif() @@ -458,6 +508,12 @@ macro(add_llvm_executable name) endif( LLVM_COMMON_DEPENDS ) 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 llvm-ar @@ -475,7 +531,16 @@ macro(add_llvm_tool name) if( LLVM_BUILD_TOOLS ) install(TARGETS ${name} EXPORT LLVMExports - RUNTIME DESTINATION bin) + RUNTIME DESTINATION bin + COMPONENT ${name}) + + if (NOT CMAKE_CONFIGURATION_TYPES) + add_custom_target(install-${name} + DEPENDS ${name} + COMMAND "${CMAKE_COMMAND}" + -DCMAKE_INSTALL_COMPONENT=${name} + -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") + endif() endif() endif() if( LLVM_BUILD_TOOLS ) @@ -500,6 +565,18 @@ endmacro(add_llvm_example name) macro(add_llvm_utility name) add_llvm_executable(${name} ${ARGN}) set_target_properties(${name} PROPERTIES FOLDER "Utils") + if( LLVM_INSTALL_UTILS ) + install (TARGETS ${name} + RUNTIME DESTINATION bin + COMPONENT ${name}) + if (NOT CMAKE_CONFIGURATION_TYPES) + add_custom_target(install-${name} + DEPENDS ${name} + COMMAND "${CMAKE_COMMAND}" + -DCMAKE_INSTALL_COMPONENT=${name} + -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") + endif() + endif() endmacro(add_llvm_utility name) @@ -570,12 +647,6 @@ function(add_unittest test_suite test_name) set(EXCLUDE_FROM_ALL ON) endif() - # Visual Studio 2012 only supports up to 8 template parameters in - # std::tr1::tuple by default, but gtest requires 10 - if (MSVC AND MSVC_VERSION EQUAL 1700) - list(APPEND LLVM_COMPILE_DEFINITIONS _VARIADIC_MAX=10) - endif () - include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) if (NOT LLVM_ENABLE_THREADS) list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0) @@ -612,9 +683,14 @@ function(llvm_add_go_executable binary pkgpath) set(binpath ${CMAKE_BINARY_DIR}/bin/${binary}${CMAKE_EXECUTABLE_SUFFIX}) set(cc "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}") set(cxx "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}") + set(cppflags "") + get_property(include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES) + foreach(d ${include_dirs}) + set(cppflags "${cppflags} -I${d}") + endforeach(d) set(ldflags "${CMAKE_EXE_LINKER_FLAGS}") add_custom_command(OUTPUT ${binpath} - COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "cc=${cc}" "cxx=${cxx}" "ldflags=${ldflags}" + COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath} DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX} ${llvmlibs} ${ARG_DEPENDS} @@ -700,18 +776,20 @@ function(add_lit_target target comment) foreach(param ${ARG_PARAMS}) list(APPEND LIT_COMMAND --param ${param}) endforeach() - if( ARG_DEPENDS ) + if (ARG_DEFAULT_ARGS) add_custom_target(${target} COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS} COMMENT "${comment}" ${cmake_3_2_USES_TERMINAL} ) - add_dependencies(${target} ${ARG_DEPENDS}) else() add_custom_target(${target} COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.") message(STATUS "${target} does nothing.") endif() + if (ARG_DEPENDS) + add_dependencies(${target} ${ARG_DEPENDS}) + endif() # Tests should be excluded from "Build Solution". set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) @@ -738,3 +816,30 @@ function(add_lit_testsuite target comment) ARGS ${ARG_ARGS} ) endfunction() + +function(add_lit_testsuites project directory) + if (NOT CMAKE_CONFIGURATION_TYPES) + parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) + file(GLOB_RECURSE litCfg ${directory}/lit*.cfg) + set(lit_suites) + foreach(f ${litCfg}) + get_filename_component(dir ${f} DIRECTORY) + set(lit_suites ${lit_suites} ${dir}) + endforeach() + list(REMOVE_DUPLICATES lit_suites) + foreach(dir ${lit_suites}) + string(REPLACE ${directory} "" name_slash ${dir}) + if (name_slash) + string(REPLACE "/" "-" name_slash ${name_slash}) + string(REPLACE "\\" "-" name_dashes ${name_slash}) + string(TOLOWER "${project}${name_dashes}" name_var) + add_lit_target("check-${name_var}" "Running lit suite ${dir}" + ${dir} + PARAMS ${ARG_PARAMS} + DEPENDS ${ARG_DEPENDS} + ARGS ${ARG_ARGS} + ) + endif() + endforeach() + endif() +endfunction()