summaryrefslogtreecommitdiff
path: root/libs/libmdbx/src/cmake
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-06-14 13:55:06 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-06-14 13:55:06 +0300
commit52e4ddcd83b3b64bcf97fdfcfa1120c87b7b3eb4 (patch)
tree991ccd18cf211ae6e956d9d06002e351cd7a174d /libs/libmdbx/src/cmake
parent8862cf78b01bb4b9ae0da13b8e6acbf94f7c1cbe (diff)
fixes #2450 (Update libmdbx to 0.8.1)
Diffstat (limited to 'libs/libmdbx/src/cmake')
-rw-r--r--libs/libmdbx/src/cmake/compiler.cmake156
-rw-r--r--libs/libmdbx/src/cmake/utils.cmake83
2 files changed, 150 insertions, 89 deletions
diff --git a/libs/libmdbx/src/cmake/compiler.cmake b/libs/libmdbx/src/cmake/compiler.cmake
index a3bca1ac29..544a22d9fb 100644
--- a/libs/libmdbx/src/cmake/compiler.cmake
+++ b/libs/libmdbx/src/cmake/compiler.cmake
@@ -64,11 +64,11 @@ endmacro(check_compiler_flag)
# We support building with Clang and gcc. First check
# what we're using for build.
-if(CMAKE_C_COMPILER_LOADED AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
+if(CMAKE_C_COMPILER_LOADED AND CMAKE_C_COMPILER_ID MATCHES ".*[Cc][Ll][Aa][Nn][Gg].*")
set(CMAKE_COMPILER_IS_CLANG ON)
set(CMAKE_COMPILER_IS_GNUCC OFF)
endif()
-if(CMAKE_CXX_COMPILER_LOADED AND CMAKE_CXx_COMPILER_ID STREQUAL "Clang")
+if(CMAKE_CXX_COMPILER_LOADED AND CMAKE_CXX_COMPILER_ID MATCHES ".*[Cc][Ll][Aa][Nn][Gg].*")
set(CMAKE_COMPILER_IS_CLANG ON)
set(CMAKE_COMPILER_IS_GNUCXX OFF)
endif()
@@ -161,40 +161,47 @@ if(NOT DEFINED IOS)
endif()
endif()
+if(NOT DEFINED CMAKE_TARGET_BITNESS)
+ if (CMAKE_SIZEOF_VOID_P LESS 4)
+ set(CMAKE_TARGET_BITNESS 16)
+ elseif (CMAKE_SIZEOF_VOID_P LESS 8)
+ set(CMAKE_TARGET_BITNESS 32)
+ else()
+ set(CMAKE_TARGET_BITNESS 64)
+ endif()
+endif()
+
if(CMAKE_COMPILER_IS_ELBRUSC OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
set(E2K TRUE)
set(CMAKE_SYSTEM_ARCH "Elbrus")
-elseif((MSVC64 OR MINGW64) AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+elseif((MSVC64 OR MINGW64) AND CMAKE_TARGET_BITNESS EQUAL 64)
set(X86_64 TRUE)
set(CMAKE_SYSTEM_ARCH "x86_64")
elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
set(X86_32 TRUE)
set(CMAKE_SYSTEM_ARCH "x86")
-elseif(CMAKE_COMPILER_IS_ELBRUSC OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
- set(E2K TRUE)
- set(CMAKE_SYSTEM_ARCH "Elbrus")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" AND CMAKE_TARGET_BITNESS EQUAL 64)
set(X86_64 TRUE)
set(CMAKE_SYSTEM_ARCH "x86_64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
set(X86_32 TRUE)
set(CMAKE_SYSTEM_ARCH "x86")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|ARM64.*)" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|ARM64.*)" AND CMAKE_TARGET_BITNESS EQUAL 64)
set(AARCH64 TRUE)
set(CMAKE_SYSTEM_ARCH "ARM64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
set(ARM32 TRUE)
set(CMAKE_SYSTEM_ARCH "ARM")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le.*" AND CMAKE_TARGET_BITNESS EQUAL 64)
set(PPC64LE TRUE)
set(CMAKE_SYSTEM_ARCH "PPC64LE")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64.*" AND CMAKE_TARGET_BITNESS EQUAL 64)
set(PPC64 TRUE)
set(CMAKE_SYSTEM_ARCH "PPC64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc).*")
set(PPC32 TRUE)
set(CMAKE_SYSTEM_ARCH "PPC")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS)64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS)64.*" AND CMAKE_TARGET_BITNESS EQUAL 64)
set(MIPS64 TRUE)
set(CMAKE_SYSTEM_ARCH "MIPS64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS).*")
@@ -213,7 +220,9 @@ else()
check_compiler_flag("-Wextra" CC_HAS_WEXTRA)
check_compiler_flag("-Werror" CC_HAS_WERROR)
check_compiler_flag("-fexceptions" CC_HAS_FEXCEPTIONS)
- check_cxx_compiler_flag("-fcxx-exceptions" CC_HAS_FCXX_EXCEPTIONS)
+ if(CMAKE_CXX_COMPILER_LOADED)
+ check_cxx_compiler_flag("-fcxx-exceptions" CC_HAS_FCXX_EXCEPTIONS)
+ endif()
check_compiler_flag("-funwind-tables" CC_HAS_FUNWIND_TABLES)
check_compiler_flag("-fno-omit-frame-pointer" CC_HAS_FNO_OMIT_FRAME_POINTER)
check_compiler_flag("-fno-common" CC_HAS_FNO_COMMON)
@@ -229,10 +238,17 @@ else()
# Check for an omp support
set(CMAKE_REQUIRED_FLAGS "-fopenmp -Werror")
- check_cxx_source_compiles("int main(void) {
- #pragma omp parallel
- return 0;
- }" HAVE_OPENMP)
+ if(CMAKE_CXX_COMPILER_LOADED)
+ check_cxx_source_compiles("int main(void) {
+ #pragma omp parallel
+ return 0;
+ }" HAVE_OPENMP)
+ else()
+ check_c_source_compiles("int main(void) {
+ #pragma omp parallel
+ return 0;
+ }" HAVE_OPENMP)
+ endif()
set(CMAKE_REQUIRED_FLAGS "")
endif()
@@ -312,61 +328,81 @@ if(CMAKE_COMPILER_IS_CLANG)
execute_process(COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -print-search-dirs
OUTPUT_VARIABLE clang_search_dirs RESULT_VARIABLE clang_probe_result ERROR_QUIET)
- unset(clang_bindir)
- unset(clang_libdir)
+ unset(clang_bindirs)
+ unset(clang_libdirs)
if(clang_probe_result EQUAL 0)
- string(REGEX MATCH "^(.*programs: =)([^:]*:)*([^:]+/llvm[-.0-9]+/bin[^:]*)(:[^:]*)*(\n.+)$" clang_bindir_valid ${clang_search_dirs})
- if(clang_bindir_valid)
- string(REGEX REPLACE "^(.*programs: =)([^:]*:)*([^:]+/llvm[-.0-9]+/bin[^:]*)(:[^:]*)*(\n.+)$" "\\3" clang_bindir ${clang_search_dirs})
- if(CMAKE_SYSTEM_NAME STREQUAL "WINDOWS")
- set(clang_libdir ${clang_bindir})
- else()
- get_filename_component(clang_libdir "${clang_bindir}/../lib" REALPATH)
- endif()
+ string(REGEX MATCH "(^|\n.*)(.*programs: =)([^\n]+)((\n.*)|$)" regexp_valid ${clang_search_dirs})
+ if(regexp_valid)
+ string(REGEX REPLACE "(^|\n.*)(.*programs: =)([^\n]+)((\n.*)|$)" "\\3" list ${clang_search_dirs})
+ string(REPLACE ":" ";" list "${list}")
+ #set(clang_bindirs "")
+ foreach(dir IN LISTS list)
+ get_filename_component(dir "${dir}" REALPATH)
+ list(APPEND clang_bindirs "${dir}")
+ endforeach()
+ list(REMOVE_DUPLICATES clang_bindirs)
+ endif()
+ string(REGEX MATCH "(^|\n.*)(.*libraries: =)([^\n]+)((\n.*)|$)" regexp_valid ${clang_search_dirs})
+ if(regexp_valid)
+ string(REGEX REPLACE "(^|\n.*)(.*libraries: =)([^\n]+)((\n.*)|$)" "\\3" list ${clang_search_dirs})
+ string(REPLACE ":" ";" list "${list}")
+ #set(clang_libdirs "")
+ foreach(dir IN LISTS list)
+ get_filename_component(dir "${dir}" REALPATH)
+ list(APPEND clang_libdirs "${dir}")
+ endforeach()
+ list(REMOVE_DUPLICATES clang_libdirs)
endif()
else()
- get_filename_component(clang_bindir ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} DIRECTORY)
+ get_filename_component(clang_bindirs ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} DIRECTORY)
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
- set(clang_libdir ${clang_bindir})
+ set(clang_libdirs ${clang_bindirs})
else()
- get_filename_component(clang_libdir "${clang_bindir}/../lib" REALPATH)
+ get_filename_component(clang_libdirs "${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER}/../lib" REALPATH)
endif()
endif()
- if(clang_bindir AND clang_libdir)
- message(STATUS "Found CLANG/LLVM directories: ${clang_bindir}, ${clang_libdir}")
+ if(clang_bindirs AND clang_libdirs)
+ message(STATUS "Found CLANG/LLVM directories: ${clang_bindirs}, ${clang_libdirs}")
else()
message(STATUS "Could NOT find CLANG/LLVM directories (bin and/or lib).")
endif()
- if(NOT CMAKE_CLANG_LD AND clang_bindir)
- find_program(CMAKE_CLANG_LD NAMES lld-link ld.lld ld64.lld lld-link llvm-link link llvm-ld ld PATHS ${clang_bindir} NO_DEFAULT_PATH)
+ if(NOT CMAKE_CLANG_LD AND clang_bindirs)
+ find_program(CMAKE_CLANG_LD NAMES lld-link ld.lld "ld${CMAKE_TARGET_BITNESS}.lld" lld llvm-link llvm-ld PATHS ${clang_bindirs} NO_DEFAULT_PATH)
endif()
- if(NOT CMAKE_CLANG_AR AND clang_bindir)
- find_program(CMAKE_CLANG_AR NAMES llvm-ar ar PATHS ${clang_bindir} NO_DEFAULT_PATH)
+ if(NOT CMAKE_CLANG_AR AND clang_bindirs)
+ find_program(CMAKE_CLANG_AR NAMES llvm-ar ar PATHS ${clang_bindirs} NO_DEFAULT_PATH)
endif()
- if(NOT CMAKE_CLANG_NM AND clang_bindir)
- find_program(CMAKE_CLANG_NM NAMES llvm-nm nm PATHS ${clang_bindir} NO_DEFAULT_PATH)
+ if(NOT CMAKE_CLANG_NM AND clang_bindirs)
+ find_program(CMAKE_CLANG_NM NAMES llvm-nm nm PATHS ${clang_bindirs} NO_DEFAULT_PATH)
endif()
- if(NOT CMAKE_CLANG_RANLIB AND clang_bindir)
- find_program(CMAKE_CLANG_RANLIB NAMES llvm-ranlib ranlib PATHS ${clang_bindir} NO_DEFAULT_PATH)
+ if(NOT CMAKE_CLANG_RANLIB AND clang_bindirs)
+ find_program(CMAKE_CLANG_RANLIB NAMES llvm-ranlib ranlib PATHS ${clang_bindirs} NO_DEFAULT_PATH)
endif()
set(clang_lto_plugin_name "LLVMgold${CMAKE_SHARED_LIBRARY_SUFFIX}")
- if(NOT CMAKE_LD_GOLD AND clang_bindir)
- find_program(CMAKE_LD_GOLD NAMES ld.gold PATHS)
+ if(NOT CMAKE_LD_GOLD AND clang_bindirs)
+ find_program(CMAKE_LD_GOLD NAMES ld.gold PATHS ${clang_bindirs})
endif()
- if(NOT CLANG_LTO_PLUGIN AND clang_libdir)
- find_file(CLANG_LTO_PLUGIN ${clang_lto_plugin_name} PATH ${clang_libdir} NO_DEFAULT_PATH)
+ if(NOT CLANG_LTO_PLUGIN AND clang_libdirs)
+ find_file(CLANG_LTO_PLUGIN ${clang_lto_plugin_name} PATHS ${clang_libdirs} NO_DEFAULT_PATH)
endif()
+
if(CLANG_LTO_PLUGIN)
message(STATUS "Found CLANG/LLVM's plugin for LTO: ${CLANG_LTO_PLUGIN}")
else()
message(STATUS "Could NOT find CLANG/LLVM's plugin (${clang_lto_plugin_name}) for LTO.")
endif()
- if(CMAKE_CLANG_LD AND CMAKE_CLANG_AR AND CMAKE_CLANG_NM AND CMAKE_CLANG_RANLIB)
- message(STATUS "Found CLANG/LLVM's binutils for LTO: ${CMAKE_CLANG_AR}, ${CMAKE_CLANG_RANLIB}")
+ if(CMAKE_CLANG_LD)
+ message(STATUS "Found CLANG/LLVM's linker for LTO: ${CMAKE_CLANG_LD}")
+ else()
+ message(STATUS "Could NOT find CLANG/LLVM's linker (lld, llvm-ld, llvm-link) for LTO.")
+ endif()
+
+ if(CMAKE_CLANG_AR AND CMAKE_CLANG_RANLIB AND CMAKE_CLANG_NM)
+ message(STATUS "Found CLANG/LLVM's binutils for LTO: ${CMAKE_CLANG_AR}, ${CMAKE_CLANG_RANLIB}, ${CMAKE_CLANG_NM}")
else()
message(STATUS "Could NOT find CLANG/LLVM's binutils (ar, ranlib, nm) for LTO.")
endif()
@@ -378,12 +414,19 @@ if(CMAKE_COMPILER_IS_CLANG)
unset(clang_search_dirs)
endif()
- if((CLANG_LTO_PLUGIN AND CMAKE_LD_GOLD) OR
- (CMAKE_CLANG_LD AND CMAKE_CLANG_AR AND CMAKE_CLANG_NM AND CMAKE_CLANG_RANLIB))
+ if (CMAKE_CLANG_AR AND CMAKE_CLANG_NM AND CMAKE_CLANG_RANLIB
+ AND ((CLANG_LTO_PLUGIN AND CMAKE_LD_GOLD)
+ OR (CMAKE_CLANG_LD
+ AND NOT (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux"
+ AND CMAKE_SYSTEM_NAME STREQUAL "Linux"))
+ OR APPLE))
set(CLANG_LTO_AVAILABLE TRUE)
message(STATUS "Link-Time Optimization by CLANG/LLVM is available")
elseif(CMAKE_TOOLCHAIN_FILE AND NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 7.0)
set(CLANG_LTO_AVAILABLE TRUE)
+ if(NOT CMAKE_CLANG_LD)
+ set(CMAKE_CLANG_LD ${CMAKE_LINKER})
+ endif()
if(NOT CMAKE_CLANG_AR)
set(CMAKE_CLANG_AR ${CMAKE_AR})
endif()
@@ -442,9 +485,6 @@ endif()
macro(setup_compile_flags)
# save initial C/CXX flags
if(NOT INITIAL_CMAKE_FLAGS_SAVED)
- if(MSVC)
- string(REGEX REPLACE "^(.*)(/EHsc)( *)(.*)$" "\\1/EHs\\3\\4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
- endif()
set(INITIAL_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
set(INITIAL_CMAKE_C_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
set(INITIAL_CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
@@ -468,6 +508,22 @@ macro(setup_compile_flags)
if(CC_HAS_FCXX_EXCEPTIONS)
add_compile_flags("CXX" "-fcxx-exceptions -frtti")
endif()
+ if(MSVC)
+ # checks for /EHa or /clr options exists,
+ # i.e. is enabled structured async WinNT exceptions
+ string(REGEX MATCH "^(.* )*[-/]EHc*a( .*)*$" msvc_async_eh_enabled "${CXX_FLAGS}" "${C_FLAGS}")
+ string(REGEX MATCH "^(.* )*[-/]clr( .*)*$" msvc_clr_enabled "${CXX_FLAGS}" "${C_FLAGS}")
+ # remote any /EH? options
+ string(REGEX REPLACE "( *[-/]-*EH[csa]+ *)+" "" CXX_FLAGS "${CXX_FLAGS}")
+ string(REGEX REPLACE "( *[-/]-*EH[csa]+ *)+" "" C_FLAGS "${C_FLAGS}")
+ if (msvc_clr_enabled STREQUAL "")
+ if(NOT msvc_async_eh_enabled STREQUAL "")
+ add_compile_flags("C;CXX" "/EHa")
+ else()
+ add_compile_flags("C;CXX" "/EHsc")
+ endif()
+ endif()
+ endif(MSVC)
if(CC_HAS_WNO_ATTRIBUTES AND CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG}
AND CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 9)
diff --git a/libs/libmdbx/src/cmake/utils.cmake b/libs/libmdbx/src/cmake/utils.cmake
index 13add097dc..8e98267f4e 100644
--- a/libs/libmdbx/src/cmake/utils.cmake
+++ b/libs/libmdbx/src/cmake/utils.cmake
@@ -61,7 +61,7 @@ macro(set_source_files_compile_flags)
unset(_lang)
endmacro(set_source_files_compile_flags)
-macro(fetch_version name version_file parent_scope)
+macro(fetch_version name source_root_directory parent_scope)
set(${name}_VERSION "")
set(${name}_GIT_DESCRIBE "")
set(${name}_GIT_TIMESTAMP "")
@@ -69,11 +69,11 @@ macro(fetch_version name version_file parent_scope)
set(${name}_GIT_COMMIT "")
set(${name}_GIT_REVISION 0)
set(${name}_GIT_VERSION "")
- if(GIT AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
+ if(GIT AND EXISTS "${source_root_directory}/.git")
execute_process(COMMAND ${GIT} describe --tags --long --dirty=-dirty
OUTPUT_VARIABLE ${name}_GIT_DESCRIBE
OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ WORKING_DIRECTORY ${source_root_directory}
RESULT_VARIABLE rc)
if(rc OR "${name}_GIT_DESCRIBE" STREQUAL "")
message(FATAL_ERROR "Please fetch tags and/or install latest version of git ('describe --tags --long --dirty' failed)")
@@ -82,13 +82,13 @@ macro(fetch_version name version_file parent_scope)
execute_process(COMMAND ${GIT} show --no-patch --format=%cI HEAD
OUTPUT_VARIABLE ${name}_GIT_TIMESTAMP
OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ WORKING_DIRECTORY ${source_root_directory}
RESULT_VARIABLE rc)
if(rc OR "${name}_GIT_TIMESTAMP" STREQUAL "%cI")
execute_process(COMMAND ${GIT} show --no-patch --format=%ci HEAD
OUTPUT_VARIABLE ${name}_GIT_TIMESTAMP
OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ WORKING_DIRECTORY ${source_root_directory}
RESULT_VARIABLE rc)
if(rc OR "${name}_GIT_TIMESTAMP" STREQUAL "%ci")
message(FATAL_ERROR "Please install latest version of git ('show --no-patch --format=%cI HEAD' failed)")
@@ -98,7 +98,7 @@ macro(fetch_version name version_file parent_scope)
execute_process(COMMAND ${GIT} show --no-patch --format=%T HEAD
OUTPUT_VARIABLE ${name}_GIT_TREE
OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ WORKING_DIRECTORY ${source_root_directory}
RESULT_VARIABLE rc)
if(rc OR "${name}_GIT_TREE" STREQUAL "")
message(FATAL_ERROR "Please install latest version of git ('show --no-patch --format=%T HEAD' failed)")
@@ -107,19 +107,36 @@ macro(fetch_version name version_file parent_scope)
execute_process(COMMAND ${GIT} show --no-patch --format=%H HEAD
OUTPUT_VARIABLE ${name}_GIT_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ WORKING_DIRECTORY ${source_root_directory}
RESULT_VARIABLE rc)
if(rc OR "${name}_GIT_COMMIT" STREQUAL "")
message(FATAL_ERROR "Please install latest version of git ('show --no-patch --format=%H HEAD' failed)")
endif()
- execute_process(COMMAND ${GIT} rev-list --count --no-merges HEAD
+ execute_process(COMMAND ${GIT} tag --sort=-version:refname
+ OUTPUT_VARIABLE tag_list
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ WORKING_DIRECTORY ${source_root_directory}
+ RESULT_VARIABLE rc)
+ if(rc)
+ message(FATAL_ERROR "Please install latest version of git ('tag --sort=-version:refname' failed)")
+ endif()
+ string(REGEX REPLACE "\n" ";" tag_list "${tag_list}")
+ set(last_release_tag "")
+ set(git_revlist_arg "HEAD")
+ foreach(tag IN LISTS tag_list)
+ if(NOT last_release_tag)
+ string(REGEX MATCH "^v[0-9]+(\.[0-9]+)+" last_release_tag "${tag}")
+ set(git_revlist_arg "${tag}..HEAD")
+ endif()
+ endforeach(tag)
+ execute_process(COMMAND ${GIT} rev-list --count "${git_revlist_arg}"
OUTPUT_VARIABLE ${name}_GIT_REVISION
OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ WORKING_DIRECTORY ${source_root_directory}
RESULT_VARIABLE rc)
if(rc OR "${name}_GIT_REVISION" STREQUAL "")
- message(FATAL_ERROR "Please install latest version of git ('rev-list --count --no-merges HEAD' failed)")
+ message(FATAL_ERROR "Please install latest version of git ('rev-list --count ${git_revlist_arg}' failed)")
endif()
string(REGEX MATCH "^(v)?([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" git_version_valid "${${name}_GIT_DESCRIBE}")
@@ -136,8 +153,8 @@ macro(fetch_version name version_file parent_scope)
endif()
endif()
- if(NOT ${name}_GIT_VERSION OR NOT ${name}_GIT_TIMESTAMP OR NOT ${name}_GIT_REVISION)
- if(GIT AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
+ if(NOT ${name}_GIT_VERSION OR NOT ${name}_GIT_TIMESTAMP OR ${name}_GIT_REVISION STREQUAL "")
+ if(GIT AND EXISTS "${source_root_directory}/.git")
message(WARNING "Unable to retrive ${name} version from git.")
endif()
set(${name}_GIT_VERSION "0;0;0;0")
@@ -145,8 +162,9 @@ macro(fetch_version name version_file parent_scope)
set(${name}_GIT_REVISION 0)
# Try to get version from VERSION file
+ set(version_file "${source_root_directory}/VERSION")
if(EXISTS "${version_file}")
- file(STRINGS "${version_file}" ${name}_VERSION)
+ file(STRINGS "${version_file}" ${name}_VERSION LIMIT_COUNT 1 LIMIT_INPUT 42)
endif()
if(NOT ${name}_VERSION)
@@ -168,32 +186,19 @@ macro(fetch_version name version_file parent_scope)
list(GET ${name}_VERSION_LIST 2 "${name}_VERSION_RELEASE")
list(GET ${name}_VERSION_LIST 3 "${name}_VERSION_REVISION")
- if(parent_scope)
- set(${name}_VERSION_MAJOR ${${name}_VERSION_MAJOR} PARENT_SCOPE)
- set(${name}_VERSION_MINOR ${${name}_VERSION_MINOR} PARENT_SCOPE)
- set(${name}_VERSION_RELEASE ${${name}_VERSION_RELEASE} PARENT_SCOPE)
- set(${name}_VERSION_REVISION ${${name}_VERSION_REVISION} PARENT_SCOPE)
- set(${name}_VERSION ${${name}_VERSION} PARENT_SCOPE)
-
- set(${name}_GIT_DESCRIBE ${${name}_GIT_DESCRIBE} PARENT_SCOPE)
- set(${name}_GIT_TIMESTAMP ${${name}_GIT_TIMESTAMP} PARENT_SCOPE)
- set(${name}_GIT_TREE ${${name}_GIT_TREE} PARENT_SCOPE)
- set(${name}_GIT_COMMIT ${${name}_GIT_COMMIT} PARENT_SCOPE)
- set(${name}_GIT_REVISION ${${name}_GIT_REVISION} PARENT_SCOPE)
- set(${name}_GIT_VERSION ${${name}_GIT_VERSION} PARENT_SCOPE)
- else()
- set(${name}_VERSION_MAJOR ${${name}_VERSION_MAJOR})
- set(${name}_VERSION_MINOR ${${name}_VERSION_MINOR})
- set(${name}_VERSION_RELEASE ${${name}_VERSION_RELEASE})
- set(${name}_VERSION_REVISION ${${name}_VERSION_REVISION})
- set(${name}_VERSION ${${name}_VERSION})
-
- set(${name}_GIT_DESCRIBE ${${name}_GIT_DESCRIBE})
- set(${name}_GIT_TIMESTAMP ${${name}_GIT_TIMESTAMP})
- set(${name}_GIT_TREE ${${name}_GIT_TREE})
- set(${name}_GIT_COMMIT ${${name}_GIT_COMMIT})
- set(${name}_GIT_REVISION ${${name}_GIT_REVISION})
- set(${name}_GIT_VERSION ${${name}_GIT_VERSION})
+ if(${parent_scope})
+ set(${name}_VERSION_MAJOR "${${name}_VERSION_MAJOR}" PARENT_SCOPE)
+ set(${name}_VERSION_MINOR "${${name}_VERSION_MINOR}" PARENT_SCOPE)
+ set(${name}_VERSION_RELEASE "${${name}_VERSION_RELEASE}" PARENT_SCOPE)
+ set(${name}_VERSION_REVISION "${${name}_VERSION_REVISION}" PARENT_SCOPE)
+ set(${name}_VERSION "${${name}_VERSION}" PARENT_SCOPE)
+
+ set(${name}_GIT_DESCRIBE "${${name}_GIT_DESCRIBE}" PARENT_SCOPE)
+ set(${name}_GIT_TIMESTAMP "${${name}_GIT_TIMESTAMP}" PARENT_SCOPE)
+ set(${name}_GIT_TREE "${${name}_GIT_TREE}" PARENT_SCOPE)
+ set(${name}_GIT_COMMIT "${${name}_GIT_COMMIT}" PARENT_SCOPE)
+ set(${name}_GIT_REVISION "${${name}_GIT_REVISION}" PARENT_SCOPE)
+ set(${name}_GIT_VERSION "${${name}_GIT_VERSION}" PARENT_SCOPE)
endif()
endmacro(fetch_version)