diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
commit | d8e91e46262bc44006913e6796843909f1ac7bcd (patch) | |
tree | 7d0c143d9b38190e0fa0180805389da22cd834c5 /cmake | |
parent | b7eb8e35e481a74962664b63dfb09483b200209a (diff) | |
download | src-d8e91e46262bc44006913e6796843909f1ac7bcd.tar.gz src-d8e91e46262bc44006913e6796843909f1ac7bcd.zip |
Notes
Diffstat (limited to 'cmake')
-rwxr-xr-x | cmake/config-ix.cmake | 8 | ||||
-rwxr-xr-x | cmake/modules/AddLLVM.cmake | 199 | ||||
-rw-r--r-- | cmake/modules/CMakeLists.txt | 2 | ||||
-rw-r--r-- | cmake/modules/GetHostTriple.cmake | 8 | ||||
-rw-r--r-- | cmake/modules/HandleLLVMOptions.cmake | 36 | ||||
-rwxr-xr-x | cmake/modules/LLVM-Config.cmake | 4 | ||||
-rw-r--r-- | cmake/modules/LLVMConfig.cmake.in | 1 | ||||
-rw-r--r-- | cmake/modules/LLVMExternalProjectUtils.cmake | 29 | ||||
-rw-r--r-- | cmake/modules/LLVMProcessSources.cmake | 17 | ||||
-rw-r--r-- | cmake/modules/TableGen.cmake | 26 | ||||
-rw-r--r-- | cmake/platforms/WinMsvc.cmake | 24 |
11 files changed, 228 insertions, 126 deletions
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index 18977d9950ff..900c35ee4f0c 100755 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -7,6 +7,7 @@ include(CheckIncludeFile) include(CheckLibraryExists) include(CheckSymbolExists) include(CheckFunctionExists) +include(CheckStructHasMember) include(CheckCCompilerFlag) include(CheckCompilerVersion) @@ -128,7 +129,7 @@ if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*") endif() if(LLVM_ENABLE_TERMINFO) set(HAVE_TERMINFO 0) - foreach(library tinfo terminfo curses ncurses ncursesw) + foreach(library terminfo tinfo curses ncurses ncursesw) string(TOUPPER ${library} library_suffix) check_library_exists(${library} setupterm "" HAVE_TERMINFO_${library_suffix}) if(HAVE_TERMINFO_${library_suffix}) @@ -248,6 +249,11 @@ if( HAVE_DLFCN_H ) endif() endif() +CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) +CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec + "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) + check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC) if( LLVM_USING_GLIBC ) add_definitions( -D_GNU_SOURCE ) diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index ce2057f803c8..4dbc0ddaf4f0 100755 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -73,7 +73,7 @@ function(add_llvm_symbol_exports target_name export_file) VERBATIM COMMENT "Creating export file for ${target_name}") set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") + LINK_FLAGS " -Wl,-exported_symbols_list,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX") set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-bE:${export_file}") @@ -93,10 +93,10 @@ function(add_llvm_symbol_exports target_name export_file) COMMENT "Creating export file for ${target_name}") if (${LLVM_LINKER_IS_SOLARISLD}) set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") + LINK_FLAGS " -Wl,-M,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") else() set_property(TARGET ${target_name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") + LINK_FLAGS " -Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") endif() else() set(native_export_file "${target_name}.def") @@ -372,12 +372,14 @@ endfunction(set_windows_version_resource_properties) # May specify header files for IDE generators. # SONAME # Should set SONAME link flags and create symlinks +# NO_INSTALL_RPATH +# Suppress default RPATH settings in shared libraries. # PLUGIN_TOOL # The tool (i.e. cmake target) that this plugin will link against # ) function(llvm_add_library name) cmake_parse_arguments(ARG - "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME" + "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH" "OUTPUT_NAME;PLUGIN_TOOL" "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" ${ARGN}) @@ -448,17 +450,19 @@ function(llvm_add_library name) if(ARG_MODULE) add_library(${name} MODULE ${ALL_FILES}) - llvm_setup_rpath(${name}) elseif(ARG_SHARED) add_windows_version_resource_file(ALL_FILES ${ALL_FILES}) add_library(${name} SHARED ${ALL_FILES}) - - llvm_setup_rpath(${name}) - else() add_library(${name} STATIC ${ALL_FILES}) endif() + if(NOT ARG_NO_INSTALL_RPATH) + if(ARG_MODULE OR ARG_SHARED) + llvm_setup_rpath(${name}) + endif() + endif() + setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS}) if(DEFINED windows_resource_file) @@ -499,7 +503,7 @@ function(llvm_add_library name) set_target_properties(${name} PROPERTIES # Since 4.0.0, the ABI version is indicated by the major version - SOVERSION ${LLVM_VERSION_MAJOR} + SOVERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX} VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}) endif() endif() @@ -612,11 +616,13 @@ endfunction() macro(add_llvm_library name) cmake_parse_arguments(ARG - "SHARED;BUILDTREE_ONLY" + "SHARED;BUILDTREE_ONLY;MODULE" "" "" ${ARGN}) - if( BUILD_SHARED_LIBS OR ARG_SHARED ) + if(ARG_MODULE) + llvm_add_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS}) + elseif( BUILD_SHARED_LIBS OR ARG_SHARED ) llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS}) else() llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS}) @@ -625,19 +631,23 @@ macro(add_llvm_library name) # Libraries that are meant to only be exposed via the build tree only are # never installed and are only exported as a target in the special build tree # config file. - if (NOT ARG_BUILDTREE_ONLY) + if (NOT ARG_BUILDTREE_ONLY AND NOT ARG_MODULE) set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} ) endif() - if( EXCLUDE_FROM_ALL ) + if (ARG_MODULE AND NOT TARGET ${name}) + # Add empty "phony" target + add_custom_target(${name}) + elseif( EXCLUDE_FROM_ALL ) set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) elseif(ARG_BUILDTREE_ONLY) set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name}) else() if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO" OR + ${name} STREQUAL "OptRemarks" OR (LLVM_LINK_LLVM_DYLIB AND ${name} STREQUAL "LLVM")) set(install_dir lib${LLVM_LIBDIR_SUFFIX}) - if(ARG_SHARED OR BUILD_SHARED_LIBS) + if(ARG_MODULE OR ARG_SHARED OR BUILD_SHARED_LIBS) if(WIN32 OR CYGWIN OR MINGW) set(install_type RUNTIME) set(install_dir bin) @@ -648,6 +658,10 @@ macro(add_llvm_library name) set(install_type ARCHIVE) endif() + if (ARG_MODULE) + set(install_type LIBRARY) + endif() + if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR NOT LLVM_DISTRIBUTION_COMPONENTS) set(export_to_llvmexports EXPORT LLVMExports) @@ -659,7 +673,7 @@ macro(add_llvm_library name) ${install_type} DESTINATION ${install_dir} COMPONENT ${name}) - if (NOT CMAKE_CONFIGURATION_TYPES) + if (NOT LLVM_ENABLE_IDE) add_llvm_install_targets(install-${name} DEPENDS ${name} COMPONENT ${name}) @@ -667,47 +681,20 @@ macro(add_llvm_library name) endif() set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) endif() - set_target_properties(${name} PROPERTIES FOLDER "Libraries") -endmacro(add_llvm_library name) - -macro(add_llvm_loadable_module name) - llvm_add_library(${name} MODULE ${ARGN}) - if(NOT TARGET ${name}) - # Add empty "phony" target - add_custom_target(${name}) + if (ARG_MODULE) + set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") else() - if( EXCLUDE_FROM_ALL ) - set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) - else() - if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) - if(WIN32 OR CYGWIN) - # DLL platform - set(dlldir "bin") - else() - set(dlldir "lib${LLVM_LIBDIR_SUFFIX}") - endif() - - if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR - NOT LLVM_DISTRIBUTION_COMPONENTS) - set(export_to_llvmexports EXPORT LLVMExports) - set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True) - endif() - - install(TARGETS ${name} - ${export_to_llvmexports} - LIBRARY DESTINATION ${dlldir} - ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) - endif() - set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) - endif() + set_target_properties(${name} PROPERTIES FOLDER "Libraries") endif() - - set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") -endmacro(add_llvm_loadable_module name) - +endmacro(add_llvm_library name) macro(add_llvm_executable name) - cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH" "" "DEPENDS" ${ARGN}) + cmake_parse_arguments(ARG + "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH" + "ENTITLEMENTS" + "DEPENDS" + ${ARGN}) + llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ) list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS}) @@ -786,7 +773,7 @@ macro(add_llvm_executable name) target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB}) endif() - llvm_codesign(${name}) + llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS}) endmacro(add_llvm_executable name) function(export_executable_symbols target) @@ -890,7 +877,7 @@ macro(add_llvm_tool name) RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR} COMPONENT ${name}) - if (NOT CMAKE_CONFIGURATION_TYPES) + if (NOT LLVM_ENABLE_IDE) add_llvm_install_targets(install-${name} DEPENDS ${name} COMPONENT ${name}) @@ -928,11 +915,14 @@ macro(add_llvm_utility name) install (TARGETS ${name} RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR} COMPONENT ${name}) - if (NOT CMAKE_CONFIGURATION_TYPES) + if (NOT LLVM_ENABLE_IDE) add_llvm_install_targets(install-${name} DEPENDS ${name} COMPONENT ${name}) endif() + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) + elseif( LLVM_BUILD_UTILS ) + set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name}) endif() endmacro(add_llvm_utility name) @@ -972,47 +962,50 @@ endfunction(canonicalize_tool_name) # Custom add_subdirectory wrapper # Takes in a project name (i.e. LLVM), the subdirectory name, and an optional # path if it differs from the name. -macro(add_llvm_subdirectory project type name) +function(add_llvm_subdirectory project type name) set(add_llvm_external_dir "${ARGN}") if("${add_llvm_external_dir}" STREQUAL "") set(add_llvm_external_dir ${name}) endif() canonicalize_tool_name(${name} nameUPPER) + set(canonical_full_name ${project}_${type}_${nameUPPER}) + get_property(already_processed GLOBAL PROPERTY ${canonical_full_name}_PROCESSED) + if(already_processed) + return() + endif() + set_property(GLOBAL PROPERTY ${canonical_full_name}_PROCESSED YES) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt) # Treat it as in-tree subproject. - option(${project}_${type}_${nameUPPER}_BUILD + option(${canonical_full_name}_BUILD "Whether to build ${name} as part of ${project}" On) mark_as_advanced(${project}_${type}_${name}_BUILD) - if(${project}_${type}_${nameUPPER}_BUILD) + if(${canonical_full_name}_BUILD) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir}) - # Don't process it in add_llvm_implicit_projects(). - set(${project}_${type}_${nameUPPER}_BUILD OFF) endif() else() set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" CACHE PATH "Path to ${name} source directory") - set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT ON) + set(${canonical_full_name}_BUILD_DEFAULT ON) if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}) - set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT OFF) + set(${canonical_full_name}_BUILD_DEFAULT OFF) endif() if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF") - set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT OFF) + set(${canonical_full_name}_BUILD_DEFAULT OFF) endif() - option(${project}_${type}_${nameUPPER}_BUILD + option(${canonical_full_name}_BUILD "Whether to build ${name} as part of LLVM" - ${${project}_${type}_${nameUPPER}_BUILD_DEFAULT}) - if (${project}_${type}_${nameUPPER}_BUILD) + ${${canonical_full_name}_BUILD_DEFAULT}) + if (${canonical_full_name}_BUILD) if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}) add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir}) elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "") message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}") endif() - # FIXME: It'd be redundant. - set(${project}_${type}_${nameUPPER}_BUILD Off) endif() endif() -endmacro() +endfunction() # Add external project that may want to be built as part of llvm such as Clang, # lld, and Polly. This adds two options. One for the source directory of the @@ -1084,7 +1077,7 @@ function(add_unittest test_suite test_name) # Our current version of gtest does not properly recognize C++11 support # with MSVC, so it falls back to tr1 / experimental classes. Since LLVM # itself requires C++11, we can safely force it on unconditionally so that - # we don't have to fight with the buggy gtest check. + # we don't have to fight with the buggy gtest check. add_definitions(-DGTEST_LANG_CXX11=1) add_definitions(-DGTEST_HAS_TR1_TUPLE=0) @@ -1120,6 +1113,30 @@ function(add_unittest test_suite test_name) endif () endfunction() +# Use for test binaries that call llvm::getInputFileDirectory(). Use of this +# is discouraged. +function(add_unittest_with_input_files test_suite test_name) + set(LLVM_UNITTEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + configure_file( + ${LLVM_MAIN_SRC_DIR}/unittests/unittest.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/llvm.srcdir.txt) + + add_unittest(${test_suite} ${test_name} ${ARGN}) +endfunction() + +# Generic support for adding a benchmark. +function(add_benchmark benchmark_name) + if( NOT LLVM_BUILD_BENCHMARKS ) + set(EXCLUDE_FROM_ALL ON) + endif() + + add_llvm_executable(${benchmark_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN}) + set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) + set_output_directory(${benchmark_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir}) + set_property(TARGET ${benchmark_name} PROPERTY FOLDER "Utils") + target_link_libraries(${benchmark_name} PRIVATE benchmark) +endfunction() + function(llvm_add_go_executable binary pkgpath) cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN}) @@ -1243,10 +1260,6 @@ function(configure_lit_site_cfg site_in site_out) set(TARGET_TRIPLE "\"+config.target_triple+\"") endif() - string(CONCAT LIT_SITE_CFG_IN_FOOTER - "import lit.llvm\n" - "lit.llvm.initialize(lit_config, config)\n") - configure_file(${site_in} ${site_out} @ONLY) if (EXISTS "${ARG_MAIN_CONFIG}") set(PYTHON_STATEMENT "map_config('${ARG_MAIN_CONFIG}', '${site_out}')") @@ -1347,6 +1360,7 @@ function(add_lit_target target comment) 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() @@ -1378,7 +1392,7 @@ function(add_lit_testsuite target comment) endfunction() function(add_lit_testsuites project directory) - if (NOT CMAKE_CONFIGURATION_TYPES) + if (NOT LLVM_ENABLE_IDE) cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN}) # Search recursively for test directories by assuming anything not @@ -1437,7 +1451,7 @@ function(llvm_install_library_symlink name dest type) CODE "install_symlink(${full_name} ${full_dest} ${output_dir})" COMPONENT ${component}) - if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE) + if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) add_llvm_install_targets(install-${name} DEPENDS ${name} ${dest} install-${dest} COMPONENT ${name}) @@ -1470,7 +1484,7 @@ function(llvm_install_symlink name dest) CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})" COMPONENT ${component}) - if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE) + if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) add_llvm_install_targets(install-${name} DEPENDS ${name} ${dest} install-${dest} COMPONENT ${name}) @@ -1566,7 +1580,14 @@ function(llvm_externalize_debuginfo name) endif() set(strip_command COMMAND ${CMAKE_STRIP} -Sxl $<TARGET_FILE:${name}>) else() - set(strip_command COMMAND ${CMAKE_STRIP} -gx $<TARGET_FILE:${name}>) + set(strip_command COMMAND ${CMAKE_STRIP} -g -x $<TARGET_FILE:${name}>) + endif() + endif() + + if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR) + if(APPLE) + set(output_name "$<TARGET_FILE_NAME:${name}>.dSYM") + set(output_path "-o=${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}") endif() endif() @@ -1582,7 +1603,7 @@ function(llvm_externalize_debuginfo name) set(CMAKE_DSYMUTIL xcrun dsymutil) endif() add_custom_command(TARGET ${name} POST_BUILD - COMMAND ${CMAKE_DSYMUTIL} $<TARGET_FILE:${name}> + COMMAND ${CMAKE_DSYMUTIL} ${output_path} $<TARGET_FILE:${name}> ${strip_command} ) else() @@ -1594,12 +1615,24 @@ function(llvm_externalize_debuginfo name) endif() endfunction() +# Usage: llvm_codesign(name [ENTITLEMENTS file]) function(llvm_codesign name) + cmake_parse_arguments(ARG "" "ENTITLEMENTS" "" ${ARGN}) + if(NOT LLVM_CODESIGNING_IDENTITY) return() endif() - if(APPLE) + if(CMAKE_GENERATOR STREQUAL "Xcode") + set_target_properties(${name} PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${LLVM_CODESIGNING_IDENTITY} + ) + if(DEFINED ARG_ENTITLEMENTS) + set_target_properties(${name} PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${ARG_ENTITLEMENTS} + ) + endif() + elseif(APPLE) if(NOT CMAKE_CODESIGN) set(CMAKE_CODESIGN xcrun codesign) endif() @@ -1610,12 +1643,16 @@ function(llvm_codesign name) OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE ) endif() + if(DEFINED ARG_ENTITLEMENTS) + set(pass_entitlements --entitlements ${ARG_ENTITLEMENTS}) + endif() + add_custom_command( TARGET ${name} POST_BUILD COMMAND ${CMAKE_COMMAND} -E env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE} ${CMAKE_CODESIGN} -s ${LLVM_CODESIGNING_IDENTITY} - $<TARGET_FILE:${name}> + ${pass_entitlements} $<TARGET_FILE:${name}> ) endif() endfunction() diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 6c316a2f04fb..f5cc0006fa06 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -132,7 +132,7 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) PATTERN LLVM-Config.cmake EXCLUDE PATTERN GetHostTriple.cmake EXCLUDE) - if (NOT CMAKE_CONFIGURATION_TYPES) + if (NOT LLVM_ENABLE_IDE) # Add a dummy target so this can be used with LLVM_DISTRIBUTION_COMPONENTS add_custom_target(cmake-exports) add_llvm_install_targets(install-cmake-exports diff --git a/cmake/modules/GetHostTriple.cmake b/cmake/modules/GetHostTriple.cmake index 019188a59cc6..7b842450b726 100644 --- a/cmake/modules/GetHostTriple.cmake +++ b/cmake/modules/GetHostTriple.cmake @@ -4,15 +4,15 @@ function( get_host_triple var ) if( MSVC ) if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) - set( value "x86_64-pc-win32" ) + set( value "x86_64-pc-windows-msvc" ) else() - set( value "i686-pc-win32" ) + set( value "i686-pc-windows-msvc" ) endif() elseif( MINGW AND NOT MSYS ) if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) - set( value "x86_64-w64-mingw32" ) + set( value "x86_64-w64-windows-gnu" ) else() - set( value "i686-pc-mingw32" ) + set( value "i686-pc-windows-gnu" ) endif() else( MSVC ) set(config_guess ${LLVM_MAIN_SRC_DIR}/cmake/config.guess) diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake index 5fd318f00917..49db3088bbc4 100644 --- a/cmake/modules/HandleLLVMOptions.cmake +++ b/cmake/modules/HandleLLVMOptions.cmake @@ -11,7 +11,7 @@ include(HandleLLVMStdlib) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) -if(CMAKE_LINKER MATCHES "lld-link.exe" OR (WIN32 AND LLVM_USE_LINKER STREQUAL "lld")) +if(CMAKE_LINKER MATCHES "lld-link\.exe" OR (WIN32 AND LLVM_USE_LINKER STREQUAL "lld") OR LLVM_ENABLE_LLD) set(LINKER_IS_LLD_LINK TRUE) else() set(LINKER_IS_LLD_LINK FALSE) @@ -23,7 +23,7 @@ string(TOUPPER "${LLVM_ENABLE_LTO}" uppercase_LLVM_ENABLE_LTO) # Ninja Job Pool support # The following only works with the Ninja generator in CMake >= 3.0. set(LLVM_PARALLEL_COMPILE_JOBS "" CACHE STRING - "Define the maximum number of concurrent compilation jobs.") + "Define the maximum number of concurrent compilation jobs (Ninja only).") if(LLVM_PARALLEL_COMPILE_JOBS) if(NOT CMAKE_MAKE_PROGRAM MATCHES "ninja") message(WARNING "Job pooling is only available with Ninja generators.") @@ -34,7 +34,7 @@ if(LLVM_PARALLEL_COMPILE_JOBS) endif() set(LLVM_PARALLEL_LINK_JOBS "" CACHE STRING - "Define the maximum number of concurrent link jobs.") + "Define the maximum number of concurrent link jobs (Ninja only).") if(CMAKE_MAKE_PROGRAM MATCHES "ninja") if(NOT LLVM_PARALLEL_LINK_JOBS AND uppercase_LLVM_ENABLE_LTO STREQUAL "THIN") message(STATUS "ThinLTO provides its own parallel linking - limiting parallel link jobs to 2.") @@ -138,7 +138,8 @@ endif() # build might work on ELF but fail on MachO/COFF. if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN OR ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR - ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND + ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD" OR + ${CMAKE_SYSTEM_NAME} MATCHES "DragonFly") AND NOT LLVM_USE_SANITIZER) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs") endif() @@ -149,6 +150,7 @@ endif() # is unloaded. if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,nodelete") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,nodelete") endif() @@ -223,6 +225,10 @@ if(NOT WIN32 AND NOT CYGWIN) append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility-inlines-hidden" CMAKE_CXX_FLAGS) endif() +if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MINGW) + add_definitions( -D_FILE_OFFSET_BITS=64 ) +endif() + if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 ) # TODO: support other platforms and toolchains. if( LLVM_BUILD_32_BITS ) @@ -507,6 +513,10 @@ if (MSVC) # Update 1. Re-evaluate the usefulness of this diagnostic with Update 2. -wd4592 # Suppress ''var': symbol will be dynamically initialized (implementation limitation) -wd4319 # Suppress ''operator' : zero extending 'type' to 'type' of greater size' + # C4709 is disabled because of a bug with Visual Studio 2017 as of + # v15.8.8. Re-evaluate the usefulness of this diagnostic when the bug + # is fixed. + -wd4709 # Suppress comma operator within array index expression # Ideally, we'd like this warning to be enabled, but MSVC 2013 doesn't # support the 'aligned' attribute in the way that clang sources requires (for @@ -575,6 +585,7 @@ if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL)) append("-Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() + add_flag_if_supported("-Wimplicit-fallthrough" IMPLICIT_FALLTHROUGH_FLAG) add_flag_if_supported("-Wcovered-switch-default" COVERED_SWITCH_DEFAULT_FLAG) append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS) append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS) @@ -584,6 +595,10 @@ if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL)) check_cxx_compiler_flag("-Wclass-memaccess" CXX_SUPPORTS_CLASS_MEMACCESS_FLAG) append_if(CXX_SUPPORTS_CLASS_MEMACCESS_FLAG "-Wno-class-memaccess" CMAKE_CXX_FLAGS) + # The LLVM libraries have no stable C++ API, so -Wnoexcept-type is not useful. + check_cxx_compiler_flag("-Wnoexcept-type" CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG) + append_if(CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG "-Wno-noexcept-type" CMAKE_CXX_FLAGS) + # Check if -Wnon-virtual-dtor warns even though the class is marked final. # If it does, don't add it. So it won't be added on clang 3.4 and older. # This also catches cases when -Wnon-virtual-dtor isn't supported by @@ -863,12 +878,19 @@ else() set(LLVM_ENABLE_PLUGINS ON) endif() +# By default we should enable LLVM_ENABLE_IDE only for multi-configuration +# generators. This option disables optional build system features that make IDEs +# less usable. set(LLVM_ENABLE_IDE_default OFF) -if (XCODE OR MSVC_IDE OR CMAKE_EXTRA_GENERATOR) +if (CMAKE_CONFIGURATION_TYPES) set(LLVM_ENABLE_IDE_default ON) endif() -option(LLVM_ENABLE_IDE "Generate targets and process sources for use with an IDE" - ${LLVM_ENABLE_IDE_default}) +option(LLVM_ENABLE_IDE + "Disable optional build system features that cause problems for IDE generators" + ${LLVM_ENABLE_IDE_default}) +if (CMAKE_CONFIGURATION_TYPES AND NOT LLVM_ENABLE_IDE) + message(WARNING "Disabling LLVM_ENABLE_IDE on multi-configuration generators is not recommended.") +endif() function(get_compile_definitions) get_directory_property(top_dir_definitions DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS) diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake index 8eabddc73775..474a874a4426 100755 --- a/cmake/modules/LLVM-Config.cmake +++ b/cmake/modules/LLVM-Config.cmake @@ -302,7 +302,9 @@ function(llvm_expand_dependencies out_libs) expand_topologically(${lib} "${required_libs}" "${visited_libs}") endforeach() - list(REVERSE required_libs) + if(required_libs) + list(REVERSE required_libs) + endif() set(${out_libs} ${required_libs} PARENT_SCOPE) endfunction() diff --git a/cmake/modules/LLVMConfig.cmake.in b/cmake/modules/LLVMConfig.cmake.in index 8b4c22a30314..7ca06381d90f 100644 --- a/cmake/modules/LLVMConfig.cmake.in +++ b/cmake/modules/LLVMConfig.cmake.in @@ -5,6 +5,7 @@ set(LLVM_VERSION_MAJOR @LLVM_VERSION_MAJOR@) set(LLVM_VERSION_MINOR @LLVM_VERSION_MINOR@) set(LLVM_VERSION_PATCH @LLVM_VERSION_PATCH@) +set(LLVM_VERSION_SUFFIX @LLVM_VERSION_SUFFIX@) set(LLVM_PACKAGE_VERSION @PACKAGE_VERSION@) set(LLVM_BUILD_TYPE @CMAKE_BUILD_TYPE@) diff --git a/cmake/modules/LLVMExternalProjectUtils.cmake b/cmake/modules/LLVMExternalProjectUtils.cmake index f736c3947843..4d26a30f97be 100644 --- a/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/cmake/modules/LLVMExternalProjectUtils.cmake @@ -162,8 +162,35 @@ function(llvm_ExternalProject_Add name source_dir) -DCMAKE_OBJDUMP=${CMAKE_OBJDUMP} -DCMAKE_STRIP=${CMAKE_STRIP}) set(llvm_config_path ${LLVM_CONFIG_PATH}) + + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION + ${PACKAGE_VERSION}) + set(resource_dir "${LLVM_LIBRARY_DIR}/clang/${CLANG_VERSION}") + set(flag_types ASM C CXX MODULE_LINKER SHARED_LINKER EXE_LINKER) + foreach(type ${flag_types}) + set(${type}_flag -DCMAKE_${type}_FLAGS=-resource-dir=${resource_dir}) + endforeach() + string(REPLACE ";" "|" flag_string "${flag_types}") + foreach(arg ${ARG_CMAKE_ARGS}) + if(arg MATCHES "^-DCMAKE_(${flag_string})_FLAGS") + foreach(type ${flag_types}) + if(arg MATCHES "^-DCMAKE_${type}_FLAGS") + string(REGEX REPLACE "^-DCMAKE_${type}_FLAGS=(.*)$" "\\1" flag_value "${arg}") + set(${type}_flag "${${type}_flag} ${flag_value}") + endif() + endforeach() + else() + list(APPEND cmake_args ${arg}) + endif() + endforeach() + foreach(type ${flag_types}) + list(APPEND cmake_args ${${type}_flag}) + endforeach() + endif() else() set(llvm_config_path "$<TARGET_FILE:llvm-config>") + set(cmake_args ${ARG_CMAKE_ARGS}) endif() ExternalProject_Add(${name} @@ -187,7 +214,7 @@ function(llvm_ExternalProject_Add name source_dir) -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} -DCMAKE_EXPORT_COMPILE_COMMANDS=1 - ${ARG_CMAKE_ARGS} + ${cmake_args} ${PASSTHROUGH_VARIABLES} INSTALL_COMMAND "" STEP_TARGETS configure build diff --git a/cmake/modules/LLVMProcessSources.cmake b/cmake/modules/LLVMProcessSources.cmake index f65f31d797cf..7cbd2863500c 100644 --- a/cmake/modules/LLVMProcessSources.cmake +++ b/cmake/modules/LLVMProcessSources.cmake @@ -52,16 +52,15 @@ function(llvm_process_sources OUT_VAR) cmake_parse_arguments(ARG "" "" "ADDITIONAL_HEADERS;ADDITIONAL_HEADER_DIRS" ${ARGN}) set(sources ${ARG_UNPARSED_ARGUMENTS}) llvm_check_source_file_list( ${sources} ) - if( LLVM_ENABLE_IDE ) - # This adds .td and .h files to the Visual Studio solution: - add_td_sources(sources) - find_all_header_files(hdrs "${ARG_ADDITIONAL_HEADER_DIRS}") - if (hdrs) - set_source_files_properties(${hdrs} PROPERTIES HEADER_FILE_ONLY ON) - endif() - set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON) - list(APPEND sources ${ARG_ADDITIONAL_HEADERS} ${hdrs}) + + # This adds .td and .h files to the Visual Studio solution: + add_td_sources(sources) + find_all_header_files(hdrs "${ARG_ADDITIONAL_HEADER_DIRS}") + if (hdrs) + set_source_files_properties(${hdrs} PROPERTIES HEADER_FILE_ONLY ON) endif() + set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON) + list(APPEND sources ${ARG_ADDITIONAL_HEADERS} ${hdrs}) set( ${OUT_VAR} ${sources} PARENT_SCOPE ) endfunction(llvm_process_sources) diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake index d1afcb42f9de..3c84ae78a349 100644 --- a/cmake/modules/TableGen.cmake +++ b/cmake/modules/TableGen.cmake @@ -25,7 +25,7 @@ function(tablegen project ofn) file(RELATIVE_PATH ofn_rel ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${ofn}) set(additional_cmdline - -o ${ofn_rel}.tmp + -o ${ofn_rel} -d ${ofn_rel}.d WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.d @@ -36,7 +36,7 @@ function(tablegen project ofn) file(GLOB local_tds "*.td") file(GLOB_RECURSE global_tds "${LLVM_MAIN_INCLUDE_DIR}/llvm/*.td") set(additional_cmdline - -o ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp + -o ${CMAKE_CURRENT_BINARY_DIR}/${ofn} ) endif() @@ -69,8 +69,7 @@ function(tablegen project ofn) # dependency twice in the result file when # ("${${project}_TABLEGEN_TARGET}" STREQUAL "${${project}_TABLEGEN_EXE}") # but lets us having smaller and cleaner code here. - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp - # Generate tablegen output in a temporary file. + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn} COMMAND ${${project}_TABLEGEN_EXE} ${ARGN} -I ${CMAKE_CURRENT_SOURCE_DIR} ${LLVM_TABLEGEN_FLAGS} ${LLVM_TARGET_DEFINITIONS_ABSOLUTE} @@ -83,20 +82,9 @@ function(tablegen project ofn) ${LLVM_TARGET_DEFINITIONS_ABSOLUTE} COMMENT "Building ${ofn}..." ) - add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn} - # Only update the real output file if there are any differences. - # This prevents recompilation of all the files depending on it if there - # aren't any. - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp - ${CMAKE_CURRENT_BINARY_DIR}/${ofn} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp - COMMENT "Updating ${ofn}..." - ) # `make clean' must remove all those generated files: - set_property(DIRECTORY APPEND - PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${ofn}.tmp ${ofn}) + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${ofn}) set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn} PARENT_SCOPE) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${ofn} PROPERTIES @@ -158,6 +146,12 @@ macro(add_tablegen target project) llvm_ExternalProject_BuildCmd(tblgen_build_cmd ${target} ${LLVM_NATIVE_BUILD} CONFIGURATION Release) + # Create an artificial dependency between tablegen projects, because they + # compile the same dependencies, thus using the same build folders. + # FIXME: A proper fix requires sequentially chaining tablegens. + if (NOT ${project} STREQUAL LLVM AND TARGET ${project}-tablegen-host) + add_dependencies(${project}-tablegen-host LLVM-tablegen-host) + endif() add_custom_command(OUTPUT ${${project}_TABLEGEN_EXE} COMMAND ${tblgen_build_cmd} DEPENDS CONFIGURE_LLVM_NATIVE ${target} diff --git a/cmake/platforms/WinMsvc.cmake b/cmake/platforms/WinMsvc.cmake index a736a4578722..f625d0e3c052 100644 --- a/cmake/platforms/WinMsvc.cmake +++ b/cmake/platforms/WinMsvc.cmake @@ -136,11 +136,25 @@ function(generate_winsdk_lib_symlinks winsdk_um_lib_dir output_dir) execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${output_dir}") file(GLOB libraries RELATIVE "${winsdk_um_lib_dir}" "${winsdk_um_lib_dir}/*") foreach(library ${libraries}) - string(TOLOWER "${library}" symlink_name) - execute_process(COMMAND "${CMAKE_COMMAND}" - -E create_symlink - "${winsdk_um_lib_dir}/${library}" - "${output_dir}/${symlink_name}") + string(TOLOWER "${library}" all_lowercase_symlink_name) + if(NOT library STREQUAL all_lowercase_symlink_name) + execute_process(COMMAND "${CMAKE_COMMAND}" + -E create_symlink + "${winsdk_um_lib_dir}/${library}" + "${output_dir}/${all_lowercase_symlink_name}") + endif() + + get_filename_component(name_we "${library}" NAME_WE) + get_filename_component(ext "${library}" EXT) + string(TOLOWER "${ext}" lowercase_ext) + set(lowercase_ext_symlink_name "${name_we}${lowercase_ext}") + if(NOT library STREQUAL lowercase_ext_symlink_name AND + NOT all_lowercase_symlink_name STREQUAL lowercase_ext_symlink_name) + execute_process(COMMAND "${CMAKE_COMMAND}" + -E create_symlink + "${winsdk_um_lib_dir}/${library}" + "${output_dir}/${lowercase_ext_symlink_name}") + endif() endforeach() endfunction() |