aboutsummaryrefslogtreecommitdiff
path: root/cmake/modules
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-04-16 16:01:22 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-04-16 16:01:22 +0000
commit71d5a2540a98c81f5bcaeb48805e0e2881f530ef (patch)
tree5343938942df402b49ec7300a1c25a2d4ccd5821 /cmake/modules
parent31bbf64f3a4974a2d6c8b3b27ad2f519caf74057 (diff)
Diffstat (limited to 'cmake/modules')
-rwxr-xr-xcmake/modules/AddLLVM.cmake18
-rw-r--r--cmake/modules/AddSphinxTarget.cmake7
-rw-r--r--cmake/modules/HandleLLVMOptions.cmake426
-rwxr-xr-xcmake/modules/LLVM-Config.cmake84
-rw-r--r--cmake/modules/LLVMConfig.cmake.in5
-rw-r--r--cmake/modules/TableGen.cmake9
-rw-r--r--cmake/modules/VersionFromVCS.cmake72
7 files changed, 402 insertions, 219 deletions
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
index b3c7746c480a..7f7608cff33d 100755
--- a/cmake/modules/AddLLVM.cmake
+++ b/cmake/modules/AddLLVM.cmake
@@ -718,11 +718,11 @@ macro(add_llvm_executable name)
if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO)
llvm_externalize_debuginfo(${name})
endif()
- if (PTHREAD_LIB)
+ if (LLVM_PTHREAD_LIB)
# libpthreads overrides some standard library symbols, so main
# executable must be linked with it in order to provide consistent
# API for all shared libaries loaded by this executable.
- target_link_libraries(${name} ${PTHREAD_LIB})
+ target_link_libraries(${name} ${LLVM_PTHREAD_LIB})
endif()
endmacro(add_llvm_executable name)
@@ -1027,7 +1027,7 @@ function(add_unittest test_suite test_name)
# libpthreads overrides some standard library symbols, so main
# executable must be linked with it in order to provide consistent
# API for all shared libaries loaded by this executable.
- target_link_libraries(${test_name} gtest_main gtest ${PTHREAD_LIB})
+ target_link_libraries(${test_name} gtest_main gtest ${LLVM_PTHREAD_LIB})
add_dependencies(${test_suite} ${test_name})
get_target_property(test_suite_folder ${test_suite} FOLDER)
@@ -1387,7 +1387,11 @@ function(llvm_externalize_debuginfo name)
endif()
if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP)
- set(strip_command COMMAND xcrun strip -Sxl $<TARGET_FILE:${name}>)
+ if(APPLE)
+ set(strip_command COMMAND xcrun strip -Sxl $<TARGET_FILE:${name}>)
+ else()
+ set(strip_command COMMAND strip -gx $<TARGET_FILE:${name}>)
+ endif()
endif()
if(APPLE)
@@ -1403,7 +1407,11 @@ function(llvm_externalize_debuginfo name)
${strip_command}
)
else()
- message(FATAL_ERROR "LLVM_EXTERNALIZE_DEBUGINFO isn't implemented for non-darwin platforms!")
+ add_custom_command(TARGET ${name} POST_BUILD
+ COMMAND objcopy --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug
+ ${strip_command} -R .gnu_debuglink
+ COMMAND objcopy --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}>
+ )
endif()
endfunction()
diff --git a/cmake/modules/AddSphinxTarget.cmake b/cmake/modules/AddSphinxTarget.cmake
index 3456b536e80a..cfc7f38e9e77 100644
--- a/cmake/modules/AddSphinxTarget.cmake
+++ b/cmake/modules/AddSphinxTarget.cmake
@@ -48,10 +48,15 @@ function (add_sphinx_target builder project)
# Handle installation
if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
if (builder STREQUAL man)
+ if (CMAKE_INSTALL_MANDIR)
+ set(INSTALL_MANDIR ${CMAKE_INSTALL_MANDIR}/)
+ else()
+ set(INSTALL_MANDIR share/man/)
+ endif()
# FIXME: We might not ship all the tools that these man pages describe
install(DIRECTORY "${SPHINX_BUILD_DIR}/" # Slash indicates contents of
COMPONENT "${project}-sphinx-man"
- DESTINATION share/man/man1)
+ DESTINATION ${INSTALL_MANDIR}man1)
elseif (builder STREQUAL html)
string(TOUPPER "${project}" project_upper)
diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
index 1825b55ed54b..099d2ebcc437 100644
--- a/cmake/modules/HandleLLVMOptions.cmake
+++ b/cmake/modules/HandleLLVMOptions.cmake
@@ -8,12 +8,41 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
include(CheckCompilerVersion)
include(HandleLLVMStdlib)
-include(AddLLVMDefinitions)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
+if(CMAKE_LINKER MATCHES "lld-link.exe" OR (WIN32 AND LLVM_USE_LINKER STREQUAL "lld"))
+ set(LINKER_IS_LLD_LINK TRUE)
+else()
+ set(LINKER_IS_LLD_LINK FALSE)
+endif()
-if (CMAKE_LINKER MATCHES "lld-link.exe")
+# 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.")
+if(LLVM_PARALLEL_COMPILE_JOBS)
+ if(NOT CMAKE_MAKE_PROGRAM MATCHES "ninja")
+ message(WARNING "Job pooling is only available with Ninja generators.")
+ else()
+ set_property(GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool=${LLVM_PARALLEL_COMPILE_JOBS})
+ set(CMAKE_JOB_POOL_COMPILE compile_job_pool)
+ endif()
+endif()
+
+set(LLVM_PARALLEL_LINK_JOBS "" CACHE STRING
+ "Define the maximum number of concurrent link jobs.")
+if(LLVM_PARALLEL_LINK_JOBS)
+ if(NOT CMAKE_MAKE_PROGRAM MATCHES "ninja")
+ message(WARNING "Job pooling is only available with Ninja generators.")
+ else()
+ set_property(GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool=${LLVM_PARALLEL_LINK_JOBS})
+ set(CMAKE_JOB_POOL_LINK link_job_pool)
+ endif()
+endif()
+
+
+if (LINKER_IS_LLD_LINK)
# Pass /MANIFEST:NO so that CMake doesn't run mt.exe on our binaries. Adding
# manifests with mt.exe breaks LLD's symbol tables and takes as much time as
# the link. See PR24476.
@@ -147,9 +176,19 @@ function(add_flag_or_print_warning flag name)
endif()
endfunction()
-if(LLVM_ENABLE_LLD)
- check_cxx_compiler_flag("-fuse-ld=lld" CXX_SUPPORTS_LLD)
- append_if(CXX_SUPPORTS_LLD "-fuse-ld=lld"
+if( LLVM_ENABLE_LLD )
+ if ( LLVM_USE_LINKER )
+ message(FATAL_ERROR "LLVM_ENABLE_LLD and LLVM_USE_LINKER can't be set at the same time")
+ endif()
+ set(LLVM_USE_LINKER "lld")
+endif()
+
+if( LLVM_USE_LINKER )
+ check_cxx_compiler_flag("-fuse-ld=${LLVM_USE_LINKER}" CXX_SUPPORTS_CUSTOM_LINKER)
+ if ( NOT CXX_SUPPORTS_CUSTOM_LINKER )
+ message(FATAL_ERROR "Host compiler does not support '-fuse-ld=${LLVM_USE_LINKER}'")
+ endif()
+ append("-fuse-ld=${LLVM_USE_LINKER}"
CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
endif()
@@ -213,10 +252,10 @@ if( MSVC_IDE )
"Number of parallel compiler jobs. 0 means use all processors. Default is 0.")
if( NOT LLVM_COMPILER_JOBS STREQUAL "1" )
if( LLVM_COMPILER_JOBS STREQUAL "0" )
- add_llvm_definitions( /MP )
+ add_definitions( /MP )
else()
message(STATUS "Number of parallel compiler jobs set to " ${LLVM_COMPILER_JOBS})
- add_llvm_definitions( /MP${LLVM_COMPILER_JOBS} )
+ add_definitions( /MP${LLVM_COMPILER_JOBS} )
endif()
else()
message(STATUS "Parallel compilation disabled")
@@ -245,17 +284,17 @@ if( MSVC )
if( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0 )
# For MSVC 2013, disable iterator null pointer checking in debug mode,
# especially so std::equal(nullptr, nullptr, nullptr) will not assert.
- add_llvm_definitions("-D_DEBUG_POINTER_IMPL=")
+ add_definitions("-D_DEBUG_POINTER_IMPL=")
endif()
include(ChooseMSVCCRT)
if( MSVC11 )
- add_llvm_definitions(-D_VARIADIC_MAX=10)
+ add_definitions(-D_VARIADIC_MAX=10)
endif()
# Add definitions that make MSVC much less annoying.
- add_llvm_definitions(
+ add_definitions(
# For some reason MS wants to deprecate a bunch of standard functions...
-D_CRT_SECURE_NO_DEPRECATE
-D_CRT_SECURE_NO_WARNINGS
@@ -266,94 +305,15 @@ if( MSVC )
)
# Tell MSVC to use the Unicode version of the Win32 APIs instead of ANSI.
- add_llvm_definitions(
+ add_definitions(
-DUNICODE
-D_UNICODE
)
- set(msvc_warning_flags
- # Disabled warnings.
- -wd4141 # Suppress ''modifier' : used more than once' (because of __forceinline combined with inline)
- -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
- -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored'
- -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
- -wd4258 # Suppress ''var' : definition from the for loop is ignored; the definition from the enclosing scope is used'
- -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
- -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
- -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
- -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized'
- -wd4355 # Suppress ''this' : used in base member initializer list'
- -wd4456 # Suppress 'declaration of 'var' hides local variable'
- -wd4457 # Suppress 'declaration of 'var' hides function parameter'
- -wd4458 # Suppress 'declaration of 'var' hides class member'
- -wd4459 # Suppress 'declaration of 'var' hides global declaration'
- -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated'
- -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
- -wd4722 # Suppress 'function' : destructor never returns, potential memory leak
- -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)'
- -wd4100 # Suppress 'unreferenced formal parameter'
- -wd4127 # Suppress 'conditional expression is constant'
- -wd4512 # Suppress 'assignment operator could not be generated'
- -wd4505 # Suppress 'unreferenced local function has been removed'
- -wd4610 # Suppress '<class> can never be instantiated'
- -wd4510 # Suppress 'default constructor could not be generated'
- -wd4702 # Suppress 'unreachable code'
- -wd4245 # Suppress 'signed/unsigned mismatch'
- -wd4706 # Suppress 'assignment within conditional expression'
- -wd4310 # Suppress 'cast truncates constant value'
- -wd4701 # Suppress 'potentially uninitialized local variable'
- -wd4703 # Suppress 'potentially uninitialized local pointer variable'
- -wd4389 # Suppress 'signed/unsigned mismatch'
- -wd4611 # Suppress 'interaction between '_setjmp' and C++ object destruction is non-portable'
- -wd4805 # Suppress 'unsafe mix of type <type> and type <type> in operation'
- -wd4204 # Suppress 'nonstandard extension used : non-constant aggregate initializer'
- -wd4577 # Suppress 'noexcept used with no exception handling mode specified; termination on exception is not guaranteed'
- -wd4091 # Suppress 'typedef: ignored on left of '' when no variable is declared'
- # C4592 is disabled because of false positives in Visual Studio 2015
- # 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'
-
- # 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
- # any code that uses the LLVM_ALIGNAS macro), so this is must be disabled to
- # avoid unwanted alignment warnings.
- # When we switch to requiring a version of MSVC that supports the 'alignas'
- # specifier (MSVC 2015?) this warning can be re-enabled.
- -wd4324 # Suppress 'structure was padded due to __declspec(align())'
-
- # Promoted warnings.
- -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning.
-
- # Promoted warnings to errors.
- -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error.
- )
-
- # Enable warnings
- if (LLVM_ENABLE_WARNINGS)
- # Put /W4 in front of all the -we flags. cl.exe doesn't care, but for
- # clang-cl having /W4 after the -we flags will re-enable the warnings
- # disabled by -we.
- set(msvc_warning_flags "/W4 ${msvc_warning_flags}")
- # CMake appends /W3 by default, and having /W3 followed by /W4 will result in
- # cl : Command line warning D9025 : overriding '/W3' with '/W4'. Since this is
- # a command line warning and not a compiler warning, it cannot be suppressed except
- # by fixing the command line.
- string(REGEX REPLACE " /W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
- string(REGEX REPLACE " /W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-
- if (LLVM_ENABLE_PEDANTIC)
- # No MSVC equivalent available
- endif (LLVM_ENABLE_PEDANTIC)
- endif (LLVM_ENABLE_WARNINGS)
if (LLVM_ENABLE_WERROR)
- append("/WX" msvc_warning_flags)
+ append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
endif (LLVM_ENABLE_WERROR)
- foreach(flag ${msvc_warning_flags})
- append("${flag}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- endforeach(flag)
-
append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
# /Zc:strictStrings is incompatible with VS12's (Visual Studio 2013's)
@@ -373,11 +333,13 @@ if( MSVC )
# "Enforce type conversion rules".
append("/Zc:rvalueCast" CMAKE_CXX_FLAGS)
- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT LLVM_ENABLE_LTO)
# clang-cl and cl by default produce non-deterministic binaries because
# link.exe /incremental requires a timestamp in the .obj file. clang-cl
# has the flag /Brepro to force deterministic binaries. We want to pass that
- # whenever you're building with clang unless you're passing /incremental.
+ # whenever you're building with clang unless you're passing /incremental
+ # or using LTO (/Brepro with LTO would result in a warning about the flag
+ # being unused, because we're not generating object files).
# This checks CMAKE_CXX_COMPILER_ID in addition to check_cxx_compiler_flag()
# because cl.exe does not emit an error on flags it doesn't understand,
# letting check_cxx_compiler_flag() claim it understands all flags.
@@ -401,63 +363,6 @@ if( MSVC )
endif()
elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
- if (LLVM_ENABLE_WARNINGS)
- append("-Wall -W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- append("-Wcast-qual" CMAKE_CXX_FLAGS)
-
- # Turn off missing field initializer warnings for gcc to avoid noise from
- # false positives with empty {}. Turn them on otherwise (they're off by
- # default for clang).
- check_cxx_compiler_flag("-Wmissing-field-initializers" CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
- if (CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
- if (CMAKE_COMPILER_IS_GNUCXX)
- append("-Wno-missing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- else()
- append("-Wmissing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- endif()
- endif()
-
- append_if(LLVM_ENABLE_PEDANTIC "-pedantic" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- append_if(LLVM_ENABLE_PEDANTIC "-Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- 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)
-
- # 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
- # the compiler at all. This flag is not activated for gcc since it will
- # incorrectly identify a protected non-virtual base when there is a friend
- # declaration.
- if (NOT CMAKE_COMPILER_IS_GNUCXX)
- set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
- set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11 -Werror=non-virtual-dtor")
- CHECK_CXX_SOURCE_COMPILES("class base {public: virtual void anchor();protected: ~base();};
- class derived final : public base { public: ~derived();};
- int main() { return 0; }"
- CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR)
- set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
- append_if(CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR
- "-Wnon-virtual-dtor" CMAKE_CXX_FLAGS)
- endif()
-
- # Enable -Wdelete-non-virtual-dtor if available.
- add_flag_if_supported("-Wdelete-non-virtual-dtor" DELETE_NON_VIRTUAL_DTOR_FLAG)
-
- # Check if -Wcomment is OK with an // comment ending with '\' if the next
- # line is also a // comment.
- set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
- set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror -Wcomment")
- CHECK_C_SOURCE_COMPILES("// \\\\\\n//\\nint main() {return 0;}"
- C_WCOMMENT_ALLOWS_LINE_WRAP)
- set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
- if (NOT C_WCOMMENT_ALLOWS_LINE_WRAP)
- append("-Wno-comment" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- endif()
-
- # Enable -Wstring-conversion to catch misuse of string literals.
- add_flag_if_supported("-Wstring-conversion" STRING_CONVERSION_FLAG)
- endif (LLVM_ENABLE_WARNINGS)
append_if(LLVM_ENABLE_WERROR "-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
add_flag_if_supported("-Werror=date-time" WERROR_DATE_TIME)
if (LLVM_ENABLE_CXX1Y)
@@ -511,6 +416,155 @@ elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
endif(LLVM_ENABLE_MODULES)
endif( MSVC )
+if (MSVC AND NOT CLANG_CL)
+ set(msvc_warning_flags
+ # Disabled warnings.
+ -wd4141 # Suppress ''modifier' : used more than once' (because of __forceinline combined with inline)
+ -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
+ -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored'
+ -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
+ -wd4258 # Suppress ''var' : definition from the for loop is ignored; the definition from the enclosing scope is used'
+ -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
+ -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
+ -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
+ -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized'
+ -wd4355 # Suppress ''this' : used in base member initializer list'
+ -wd4456 # Suppress 'declaration of 'var' hides local variable'
+ -wd4457 # Suppress 'declaration of 'var' hides function parameter'
+ -wd4458 # Suppress 'declaration of 'var' hides class member'
+ -wd4459 # Suppress 'declaration of 'var' hides global declaration'
+ -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated'
+ -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
+ -wd4722 # Suppress 'function' : destructor never returns, potential memory leak
+ -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)'
+ -wd4100 # Suppress 'unreferenced formal parameter'
+ -wd4127 # Suppress 'conditional expression is constant'
+ -wd4512 # Suppress 'assignment operator could not be generated'
+ -wd4505 # Suppress 'unreferenced local function has been removed'
+ -wd4610 # Suppress '<class> can never be instantiated'
+ -wd4510 # Suppress 'default constructor could not be generated'
+ -wd4702 # Suppress 'unreachable code'
+ -wd4245 # Suppress 'signed/unsigned mismatch'
+ -wd4706 # Suppress 'assignment within conditional expression'
+ -wd4310 # Suppress 'cast truncates constant value'
+ -wd4701 # Suppress 'potentially uninitialized local variable'
+ -wd4703 # Suppress 'potentially uninitialized local pointer variable'
+ -wd4389 # Suppress 'signed/unsigned mismatch'
+ -wd4611 # Suppress 'interaction between '_setjmp' and C++ object destruction is non-portable'
+ -wd4805 # Suppress 'unsafe mix of type <type> and type <type> in operation'
+ -wd4204 # Suppress 'nonstandard extension used : non-constant aggregate initializer'
+ -wd4577 # Suppress 'noexcept used with no exception handling mode specified; termination on exception is not guaranteed'
+ -wd4091 # Suppress 'typedef: ignored on left of '' when no variable is declared'
+ # C4592 is disabled because of false positives in Visual Studio 2015
+ # 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'
+
+ # 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
+ # any code that uses the LLVM_ALIGNAS macro), so this is must be disabled to
+ # avoid unwanted alignment warnings.
+ # When we switch to requiring a version of MSVC that supports the 'alignas'
+ # specifier (MSVC 2015?) this warning can be re-enabled.
+ -wd4324 # Suppress 'structure was padded due to __declspec(align())'
+
+ # Promoted warnings.
+ -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning.
+
+ # Promoted warnings to errors.
+ -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error.
+ )
+
+ # Enable warnings
+ if (LLVM_ENABLE_WARNINGS)
+ # Put /W4 in front of all the -we flags. cl.exe doesn't care, but for
+ # clang-cl having /W4 after the -we flags will re-enable the warnings
+ # disabled by -we.
+ set(msvc_warning_flags "/W4 ${msvc_warning_flags}")
+ # CMake appends /W3 by default, and having /W3 followed by /W4 will result in
+ # cl : Command line warning D9025 : overriding '/W3' with '/W4'. Since this is
+ # a command line warning and not a compiler warning, it cannot be suppressed except
+ # by fixing the command line.
+ string(REGEX REPLACE " /W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+ string(REGEX REPLACE " /W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+
+ if (LLVM_ENABLE_PEDANTIC)
+ # No MSVC equivalent available
+ endif (LLVM_ENABLE_PEDANTIC)
+ endif (LLVM_ENABLE_WARNINGS)
+
+ foreach(flag ${msvc_warning_flags})
+ append("${flag}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ endforeach(flag)
+endif (MSVC AND NOT CLANG_CL)
+
+if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
+ append("-Wall -W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ append("-Wcast-qual" CMAKE_CXX_FLAGS)
+
+ # Turn off missing field initializer warnings for gcc to avoid noise from
+ # false positives with empty {}. Turn them on otherwise (they're off by
+ # default for clang).
+ check_cxx_compiler_flag("-Wmissing-field-initializers" CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
+ if (CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG)
+ if (CMAKE_COMPILER_IS_GNUCXX)
+ append("-Wno-missing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ else()
+ append("-Wmissing-field-initializers" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ endif()
+ endif()
+
+ if (LLVM_ENABLE_PEDANTIC AND LLVM_COMPILER_IS_GCC_COMPATIBLE)
+ append("-pedantic" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ append("-Wno-long-long" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ endif()
+
+ 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)
+
+ # 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
+ # the compiler at all. This flag is not activated for gcc since it will
+ # incorrectly identify a protected non-virtual base when there is a friend
+ # declaration. Don't activate this in general on Windows as this warning has
+ # too many false positives on COM-style classes, which are destroyed with
+ # Release() (PR32286).
+ if (NOT CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
+ set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
+ set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11 -Werror=non-virtual-dtor")
+ CHECK_CXX_SOURCE_COMPILES("class base {public: virtual void anchor();protected: ~base();};
+ class derived final : public base { public: ~derived();};
+ int main() { return 0; }"
+ CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR)
+ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+ append_if(CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR
+ "-Wnon-virtual-dtor" CMAKE_CXX_FLAGS)
+ endif()
+
+ # Enable -Wdelete-non-virtual-dtor if available.
+ add_flag_if_supported("-Wdelete-non-virtual-dtor" DELETE_NON_VIRTUAL_DTOR_FLAG)
+
+ # Check if -Wcomment is OK with an // comment ending with '\' if the next
+ # line is also a // comment.
+ set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
+ set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror -Wcomment")
+ CHECK_C_SOURCE_COMPILES("// \\\\\\n//\\nint main() {return 0;}"
+ C_WCOMMENT_ALLOWS_LINE_WRAP)
+ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+ if (NOT C_WCOMMENT_ALLOWS_LINE_WRAP)
+ append("-Wno-comment" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ endif()
+
+ # Enable -Wstring-conversion to catch misuse of string literals.
+ add_flag_if_supported("-Wstring-conversion" STRING_CONVERSION_FLAG)
+endif (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
+
+if (LLVM_COMPILER_IS_GCC_COMPATIBLE AND NOT LLVM_ENABLE_WARNINGS)
+ append("-w" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+endif()
+
macro(append_common_sanitizer_flags)
if (NOT MSVC)
# Append -fno-omit-frame-pointer and turn on debug info to get better
@@ -527,7 +581,7 @@ macro(append_common_sanitizer_flags)
elseif (CLANG_CL)
# Keep frame pointers around.
append("/Oy-" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- if (CMAKE_LINKER MATCHES "lld-link.exe")
+ if (LINKER_IS_LLD_LINK)
# Use DWARF debug info with LLD.
append("-gdwarf" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
else()
@@ -555,8 +609,11 @@ if(LLVM_USE_SANITIZER)
append_common_sanitizer_flags()
append("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
- append("-fsanitize-blacklist=${CMAKE_SOURCE_DIR}/utils/sanitizers/ubsan_blacklist.txt"
- CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ set(BLACKLIST_FILE "${CMAKE_SOURCE_DIR}/utils/sanitizers/ubsan_blacklist.txt")
+ if (EXISTS "${BLACKLIST_FILE}")
+ append("-fsanitize-blacklist=${BLACKLIST_FILE}"
+ CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ endif()
elseif (LLVM_USE_SANITIZER STREQUAL "Thread")
append_common_sanitizer_flags()
append("-fsanitize=thread" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
@@ -578,6 +635,10 @@ if(LLVM_USE_SANITIZER)
else()
message(FATAL_ERROR "LLVM_USE_SANITIZER is not supported on this platform.")
endif()
+ if (LLVM_USE_SANITIZER MATCHES "(Undefined;)?Address(;Undefined)?")
+ add_flag_if_supported("-fsanitize-address-use-after-scope"
+ FSANITIZE_USE_AFTER_SCOPE_FLAG)
+ endif()
if (LLVM_USE_SANITIZE_COVERAGE)
append("-fsanitize-coverage=trace-pc-guard,indirect-calls,trace-cmp" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
endif()
@@ -588,9 +649,9 @@ if(LLVM_USE_SPLIT_DWARF)
add_definitions("-gsplit-dwarf")
endif()
-add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
-add_llvm_definitions( -D__STDC_FORMAT_MACROS )
-add_llvm_definitions( -D__STDC_LIMIT_MACROS )
+add_definitions( -D__STDC_CONSTANT_MACROS )
+add_definitions( -D__STDC_FORMAT_MACROS )
+add_definitions( -D__STDC_LIMIT_MACROS )
# clang doesn't print colored diagnostics when invoked from Ninja
if (UNIX AND
@@ -658,20 +719,38 @@ append_if(LLVM_BUILD_INSTRUMENTED_COVERAGE "-fprofile-instr-generate='${LLVM_PRO
set(LLVM_ENABLE_LTO OFF CACHE STRING "Build LLVM with LTO. May be specified as Thin or Full to use a particular kind of LTO")
string(TOUPPER "${LLVM_ENABLE_LTO}" uppercase_LLVM_ENABLE_LTO)
+if(LLVM_ENABLE_LTO AND LLVM_ON_WIN32 AND NOT LINKER_IS_LLD_LINK)
+ message(FATAL_ERROR "When compiling for Windows, LLVM_ENABLE_LTO requires using lld as the linker (point CMAKE_LINKER at lld-link.exe)")
+endif()
if(uppercase_LLVM_ENABLE_LTO STREQUAL "THIN")
- append("-flto=thin" CMAKE_CXX_FLAGS CMAKE_C_FLAGS
- CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
- # On darwin, enable the lto cache. This improves initial build time a little
- # since we re-link a lot of the same objects, and significantly improves
- # incremental build time.
- append_if(APPLE "-Wl,-cache_path_lto,${PROJECT_BINARY_DIR}/lto.cache"
- CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ append("-flto=thin" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
+ if(NOT LINKER_IS_LLD_LINK)
+ append("-flto=thin" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ endif()
+ # If the linker supports it, enable the lto cache. This improves initial build
+ # time a little since we re-link a lot of the same objects, and significantly
+ # improves incremental build time.
+ # FIXME: We should move all this logic into the clang driver.
+ if(APPLE)
+ append("-Wl,-cache_path_lto,${PROJECT_BINARY_DIR}/lto.cache"
+ CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ elseif(UNIX AND LLVM_USE_LINKER STREQUAL "lld")
+ append("-Wl,--thinlto-cache-dir=${PROJECT_BINARY_DIR}/lto.cache"
+ CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ elseif(LLVM_USE_LINKER STREQUAL "gold")
+ append("-Wl,--plugin-opt,cache-dir=${PROJECT_BINARY_DIR}/lto.cache"
+ CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ endif()
elseif(uppercase_LLVM_ENABLE_LTO STREQUAL "FULL")
- append("-flto=full" CMAKE_CXX_FLAGS CMAKE_C_FLAGS
- CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ append("-flto=full" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
+ if(NOT LINKER_IS_LLD_LINK)
+ append("-flto=full" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ endif()
elseif(LLVM_ENABLE_LTO)
- append("-flto" CMAKE_CXX_FLAGS CMAKE_C_FLAGS
- CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ append("-flto" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
+ if(NOT LINKER_IS_LLD_LINK)
+ append("-flto" CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
+ endif()
endif()
# This option makes utils/extract_symbols.py be used to determine the list of
@@ -698,3 +777,16 @@ if(WIN32 OR CYGWIN)
else()
set(LLVM_ENABLE_PLUGINS ON)
endif()
+
+function(get_compile_definitions)
+ get_directory_property(top_dir_definitions DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS)
+ foreach(definition ${top_dir_definitions})
+ if(DEFINED result)
+ string(APPEND result " -D${definition}")
+ else()
+ set(result "-D${definition}")
+ endif()
+ endforeach()
+ set(LLVM_DEFINITIONS "${result}" PARENT_SCOPE)
+endfunction()
+get_compile_definitions()
diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake
index 725178ab57b1..52330151065b 100755
--- a/cmake/modules/LLVM-Config.cmake
+++ b/cmake/modules/LLVM-Config.cmake
@@ -8,27 +8,61 @@ function(link_system_libs target)
message(AUTHOR_WARNING "link_system_libs no longer needed")
endfunction()
-
+# is_llvm_target_library(
+# library
+# Name of the LLVM library to check
+# return_var
+# Output variable name
+# ALL_TARGETS;INCLUDED_TARGETS;OMITTED_TARGETS
+# ALL_TARGETS - default looks at the full list of known targets
+# INCLUDED_TARGETS - looks only at targets being configured
+# OMITTED_TARGETS - looks only at targets that are not being configured
+# )
function(is_llvm_target_library library return_var)
+ cmake_parse_arguments(ARG "ALL_TARGETS;INCLUDED_TARGETS;OMITTED_TARGETS" "" "" ${ARGN})
# Sets variable `return_var' to ON if `library' corresponds to a
# LLVM supported target. To OFF if it doesn't.
set(${return_var} OFF PARENT_SCOPE)
string(TOUPPER "${library}" capitalized_lib)
- string(TOUPPER "${LLVM_ALL_TARGETS}" targets)
+ if(ARG_INCLUDED_TARGETS)
+ string(TOUPPER "${LLVM_TARGETS_TO_BUILD}" targets)
+ elseif(ARG_OMITTED_TARGETS)
+ set(omitted_targets ${LLVM_ALL_TARGETS})
+ list(REMOVE_ITEM omitted_targets ${LLVM_TARGETS_TO_BUILD})
+ string(TOUPPER "${omitted_targets}" targets)
+ else()
+ string(TOUPPER "${LLVM_ALL_TARGETS}" targets)
+ endif()
foreach(t ${targets})
if( capitalized_lib STREQUAL t OR
- capitalized_lib STREQUAL "LLVM${t}" OR
- capitalized_lib STREQUAL "LLVM${t}CODEGEN" OR
- capitalized_lib STREQUAL "LLVM${t}ASMPARSER" OR
- capitalized_lib STREQUAL "LLVM${t}ASMPRINTER" OR
- capitalized_lib STREQUAL "LLVM${t}DISASSEMBLER" OR
- capitalized_lib STREQUAL "LLVM${t}INFO" )
+ capitalized_lib STREQUAL "${t}" OR
+ capitalized_lib STREQUAL "${t}DESC" OR
+ capitalized_lib STREQUAL "${t}CODEGEN" OR
+ capitalized_lib STREQUAL "${t}ASMPARSER" OR
+ capitalized_lib STREQUAL "${t}ASMPRINTER" OR
+ capitalized_lib STREQUAL "${t}DISASSEMBLER" OR
+ capitalized_lib STREQUAL "${t}INFO" OR
+ capitalized_lib STREQUAL "${t}UTILS" )
set(${return_var} ON PARENT_SCOPE)
break()
endif()
endforeach()
endfunction(is_llvm_target_library)
+function(is_llvm_target_specifier library return_var)
+ is_llvm_target_library(${library} ${return_var} ${ARGN})
+ string(TOUPPER "${library}" capitalized_lib)
+ if(NOT ${return_var})
+ if( capitalized_lib STREQUAL "ALLTARGETSASMPARSERS" OR
+ capitalized_lib STREQUAL "ALLTARGETSDESCS" OR
+ capitalized_lib STREQUAL "ALLTARGETSDISASSEMBLERS" OR
+ capitalized_lib STREQUAL "ALLTARGETSINFOS" OR
+ capitalized_lib STREQUAL "NATIVE" OR
+ capitalized_lib STREQUAL "NATIVECODEGEN" )
+ set(${return_var} ON PARENT_SCOPE)
+ endif()
+ endif()
+endfunction()
macro(llvm_config executable)
cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN})
@@ -93,6 +127,21 @@ function(llvm_map_components_to_libnames out_libs)
endif()
string(TOUPPER "${LLVM_AVAILABLE_LIBS}" capitalized_libs)
+ get_property(LLVM_TARGETS_CONFIGURED GLOBAL PROPERTY LLVM_TARGETS_CONFIGURED)
+
+ # Generally in our build system we avoid order-dependence. Unfortunately since
+ # not all targets create the same set of libraries we actually need to ensure
+ # that all build targets associated with a target are added before we can
+ # process target dependencies.
+ if(NOT LLVM_TARGETS_CONFIGURED)
+ foreach(c ${link_components})
+ is_llvm_target_specifier(${c} iltl_result ALL_TARGETS)
+ if(iltl_result)
+ message(FATAL_ERROR "Specified target library before target registration is complete.")
+ endif()
+ endforeach()
+ endif()
+
# Expand some keywords:
list(FIND LLVM_TARGETS_TO_BUILD "${LLVM_NATIVE_ARCH}" have_native_backend)
list(FIND link_components "engine" engine_required)
@@ -141,6 +190,12 @@ function(llvm_map_components_to_libnames out_libs)
if( TARGET LLVM${c}Disassembler )
list(APPEND expanded_components "LLVM${c}Disassembler")
endif()
+ if( TARGET LLVM${c}Info )
+ list(APPEND expanded_components "LLVM${c}Info")
+ endif()
+ if( TARGET LLVM${c}Utils )
+ list(APPEND expanded_components "LLVM${c}Utils")
+ endif()
elseif( c STREQUAL "native" )
# already processed
elseif( c STREQUAL "nativecodegen" )
@@ -198,9 +253,16 @@ function(llvm_map_components_to_libnames out_libs)
list(FIND capitalized_libs LLVM${capitalized} lib_idx)
if( lib_idx LESS 0 )
# The component is unknown. Maybe is an omitted target?
- is_llvm_target_library(${c} iltl_result)
- if( NOT iltl_result )
- message(FATAL_ERROR "Library `${c}' not found in list of llvm libraries.")
+ is_llvm_target_library(${c} iltl_result OMITTED_TARGETS)
+ if(iltl_result)
+ # A missing library to a directly referenced omitted target would be bad.
+ message(FATAL_ERROR "Library '${c}' is a direct reference to a target library for an omitted target.")
+ else()
+ # If it is not an omitted target we should assume it is a component
+ # that hasn't yet been processed by CMake. Missing components will
+ # cause errors later in the configuration, so we can safely assume
+ # that this is valid here.
+ list(APPEND expanded_components LLVM${c})
endif()
else( lib_idx LESS 0 )
list(GET LLVM_AVAILABLE_LIBS ${lib_idx} canonical_lib)
diff --git a/cmake/modules/LLVMConfig.cmake.in b/cmake/modules/LLVMConfig.cmake.in
index c30c92b66d8a..7a8eb3674720 100644
--- a/cmake/modules/LLVMConfig.cmake.in
+++ b/cmake/modules/LLVMConfig.cmake.in
@@ -45,6 +45,10 @@ set(LLVM_ENABLE_PIC @LLVM_ENABLE_PIC@)
set(LLVM_BUILD_32_BITS @LLVM_BUILD_32_BITS@)
+if (NOT "@LLVM_PTHREAD_LIB@" STREQUAL "")
+ set(LLVM_PTHREAD_LIB "@LLVM_PTHREAD_LIB@")
+endif()
+
set(LLVM_ENABLE_PLUGINS @LLVM_ENABLE_PLUGINS@)
set(LLVM_EXPORT_SYMBOLS_FOR_PLUGINS @LLVM_EXPORT_SYMBOLS_FOR_PLUGINS@)
set(LLVM_PLUGIN_EXT @LLVM_PLUGIN_EXT@)
@@ -75,4 +79,5 @@ if(NOT TARGET LLVMSupport)
@llvm_config_include_buildtree_only_exports@
endif()
+set_property(GLOBAL PROPERTY LLVM_TARGETS_CONFIGURED On)
include(${LLVM_CMAKE_DIR}/LLVM-Config.cmake)
diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake
index 9682002c2abd..da0858e54d44 100644
--- a/cmake/modules/TableGen.cmake
+++ b/cmake/modules/TableGen.cmake
@@ -23,6 +23,13 @@ function(tablegen project ofn)
set(LLVM_TARGET_DEFINITIONS_ABSOLUTE
${CMAKE_CURRENT_SOURCE_DIR}/${LLVM_TARGET_DEFINITIONS})
endif()
+ if (LLVM_ENABLE_DAGISEL_COV)
+ list(FIND ARGN "-gen-dag-isel" idx)
+ if( NOT idx EQUAL -1 )
+ list(APPEND LLVM_TABLEGEN_FLAGS "-instrument-coverage")
+ endif()
+ endif()
+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
# Generate tablegen output in a temporary file.
COMMAND ${${project}_TABLEGEN_EXE} ${ARGN} -I ${CMAKE_CURRENT_SOURCE_DIR}
@@ -92,7 +99,7 @@ macro(add_tablegen target project)
set(LLVM_ENABLE_OBJLIB ON)
endif()
- add_llvm_utility(${target} ${ARGN})
+ add_llvm_executable(${target} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS})
set(${project}_TABLEGEN "${target}" CACHE
diff --git a/cmake/modules/VersionFromVCS.cmake b/cmake/modules/VersionFromVCS.cmake
index 8d56b66fa478..983b48fefa0e 100644
--- a/cmake/modules/VersionFromVCS.cmake
+++ b/cmake/modules/VersionFromVCS.cmake
@@ -25,60 +25,64 @@ function(add_version_info_from_vcs VERS)
set(LLVM_REPOSITORY ${Project_WC_URL} PARENT_SCOPE)
endif()
endif()
- elseif( EXISTS ${SOURCE_DIR}/.git )
- set(result "${result}git")
- # Try to get a ref-id
- if( EXISTS ${SOURCE_DIR}/.git/svn )
- find_program(git_executable NAMES git git.exe git.cmd)
- if( git_executable )
- set(is_git_svn_rev_exact false)
- execute_process(COMMAND
- ${git_executable} svn info
- WORKING_DIRECTORY ${SOURCE_DIR}
- TIMEOUT 5
- RESULT_VARIABLE git_result
- OUTPUT_VARIABLE git_output)
- if( git_result EQUAL 0 )
- string(REGEX MATCH "URL: ([^ \n]*)" svn_url ${git_output})
- if(svn_url)
- set(LLVM_REPOSITORY ${CMAKE_MATCH_1} PARENT_SCOPE)
- endif()
-
- string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
- "\\2" git_svn_rev_number "${git_output}")
- set(SVN_REVISION ${git_svn_rev_number} PARENT_SCOPE)
- set(git_svn_rev "-svn-${git_svn_rev}")
+ else()
+ find_program(git_executable NAMES git git.exe git.cmd)
- # Determine if the HEAD points directly at a subversion revision.
- execute_process(COMMAND ${git_executable} svn find-rev HEAD
+ if( git_executable )
+ # Run from a subdirectory to force git to print an absoute path.
+ execute_process(COMMAND ${git_executable} rev-parse --git-dir
+ WORKING_DIRECTORY ${SOURCE_DIR}/cmake
+ RESULT_VARIABLE git_result
+ OUTPUT_VARIABLE git_dir)
+ if(git_result EQUAL 0)
+ # Try to get a ref-id
+ string(STRIP "${git_dir}" git_dir)
+ set(result "${result}git")
+ if( EXISTS ${git_dir}/svn )
+ # Get the repository URL
+ execute_process(COMMAND
+ ${git_executable} svn info
WORKING_DIRECTORY ${SOURCE_DIR}
TIMEOUT 5
RESULT_VARIABLE git_result
OUTPUT_VARIABLE git_output)
if( git_result EQUAL 0 )
- string(STRIP "${git_output}" git_head_svn_rev_number)
- if( git_head_svn_rev_number EQUAL git_svn_rev_number )
- set(is_git_svn_rev_exact true)
+ string(REGEX MATCH "URL: ([^ \n]*)" svn_url ${git_output})
+ if(svn_url)
+ set(LLVM_REPOSITORY ${CMAKE_MATCH_1} PARENT_SCOPE)
endif()
endif()
- else()
- set(git_svn_rev "")
+
+ # Get the svn revision number for this git commit if one exists.
+ execute_process(COMMAND ${git_executable} svn find-rev HEAD
+ WORKING_DIRECTORY ${SOURCE_DIR}
+ TIMEOUT 5
+ RESULT_VARIABLE git_result
+ OUTPUT_VARIABLE git_head_svn_rev_number
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if( git_result EQUAL 0 AND git_output)
+ set(SVN_REVISION ${git_head_svn_rev_number} PARENT_SCOPE)
+ set(git_svn_rev "-svn-${git_head_svn_rev_number}")
+ else()
+ set(git_svn_rev "")
+ endif()
endif()
+
+ # Get the git ref id
execute_process(COMMAND
${git_executable} rev-parse --short HEAD
WORKING_DIRECTORY ${SOURCE_DIR}
TIMEOUT 5
RESULT_VARIABLE git_result
- OUTPUT_VARIABLE git_output)
+ OUTPUT_VARIABLE git_ref_id
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
- if( git_result EQUAL 0 AND NOT is_git_svn_rev_exact )
- string(STRIP "${git_output}" git_ref_id)
+ if( git_result EQUAL 0 )
set(GIT_COMMIT ${git_ref_id} PARENT_SCOPE)
set(result "${result}${git_svn_rev}-${git_ref_id}")
else()
set(result "${result}${git_svn_rev}")
endif()
-
endif()
endif()
endif()