aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2019-01-19 10:01:25 +0000
committerDimitry Andric <dim@FreeBSD.org>2019-01-19 10:01:25 +0000
commitd8e91e46262bc44006913e6796843909f1ac7bcd (patch)
tree7d0c143d9b38190e0fa0180805389da22cd834c5 /cmake
parentb7eb8e35e481a74962664b63dfb09483b200209a (diff)
downloadsrc-d8e91e46262bc44006913e6796843909f1ac7bcd.tar.gz
src-d8e91e46262bc44006913e6796843909f1ac7bcd.zip
Notes
Diffstat (limited to 'cmake')
-rwxr-xr-xcmake/config-ix.cmake8
-rwxr-xr-xcmake/modules/AddLLVM.cmake199
-rw-r--r--cmake/modules/CMakeLists.txt2
-rw-r--r--cmake/modules/GetHostTriple.cmake8
-rw-r--r--cmake/modules/HandleLLVMOptions.cmake36
-rwxr-xr-xcmake/modules/LLVM-Config.cmake4
-rw-r--r--cmake/modules/LLVMConfig.cmake.in1
-rw-r--r--cmake/modules/LLVMExternalProjectUtils.cmake29
-rw-r--r--cmake/modules/LLVMProcessSources.cmake17
-rw-r--r--cmake/modules/TableGen.cmake26
-rw-r--r--cmake/platforms/WinMsvc.cmake24
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()