-
Notifications
You must be signed in to change notification settings - Fork 86
/
build_helpers.cmake
97 lines (92 loc) · 4.24 KB
/
build_helpers.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
function(ginkgo_default_includes name)
# set include path depending on used interface
target_include_directories("${name}"
PUBLIC
$<BUILD_INTERFACE:${Ginkgo_BINARY_DIR}/include>
$<BUILD_INTERFACE:${Ginkgo_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${Ginkgo_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
endfunction()
function(ginkgo_compile_features name)
target_compile_features("${name}" PUBLIC cxx_std_11)
if(GINKGO_WITH_CLANG_TIDY AND GINKGO_CLANG_TIDY_PATH)
set_property(TARGET "${name}" PROPERTY CXX_CLANG_TIDY "${GINKGO_CLANG_TIDY_PATH};-checks=*")
endif()
if(GINKGO_WITH_IWYU AND GINKGO_IWYU_PATH)
set_property(TARGET "${name}" PROPERTY CXX_INCLUDE_WHAT_YOU_USE ${GINKGO_IWYU_PATH})
endif()
if(GINKGO_CHANGED_SHARED_LIBRARY)
# Put all shared libraries and corresponding imported libraries into the specified path
set_property(TARGET "${name}" PROPERTY
RUNTIME_OUTPUT_DIRECTORY "${GINKGO_WINDOWS_SHARED_LIBRARY_PATH}")
set_property(TARGET "${name}" PROPERTY
ARCHIVE_OUTPUT_DIRECTORY "${GINKGO_WINDOWS_SHARED_LIBRARY_PATH}")
if(MSVC)
# MSVC would create subfolder according to build_type. Ginkgo forces the output be the same whatever build_type is.
foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${CONFIG} CONFIG )
set_property(TARGET "${name}" PROPERTY
RUNTIME_OUTPUT_DIRECTORY_${CONFIG} "${GINKGO_WINDOWS_SHARED_LIBRARY_PATH}")
set_property(TARGET "${name}" PROPERTY
ARCHIVE_OUTPUT_DIRECTORY_${CONFIG} "${GINKGO_WINDOWS_SHARED_LIBRARY_PATH}")
endforeach()
endif()
if(GINKGO_CHECK_PATH)
ginkgo_check_shared_library("${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
endif()
endif()
endfunction()
function(ginkgo_check_shared_library name)
# Cygwin uses : not ; to split path
if(CYGWIN)
string(REPLACE ":" ";" ENV_PATH "$ENV{PATH}")
else()
set(ENV_PATH "$ENV{PATH}")
endif()
set(PATH_LIST ${ENV_PATH})
set(PASSED_TEST FALSE)
foreach(ITEM IN LISTS PATH_LIST)
string(REPLACE "\\" "/" ITEM "${ITEM}")
if("${ITEM}" STREQUAL "${GINKGO_WINDOWS_SHARED_LIBRARY_PATH}")
set(PASSED_TEST TRUE)
break()
else()
# If any path before this build, the path must not contain the ginkgo shared library
find_file(EXISTING_DLL "${name}" PATHS "${ITEM}" NO_DEFAULT_PATH)
if(NOT "${EXISTING_DLL}" STREQUAL "EXISTING_DLL-NOTFOUND")
# clean the EXISTING_DLL before termination
unset(EXISTING_DLL CACHE)
message(FATAL_ERROR "Detect ${name} in ${ITEM} eariler than this build. "
"Please add ${GINKGO_WINDOWS_SHARED_LIBRARY_PATH} before other ginkgo path.")
endif()
# do not keep this variable in cache
unset(EXISTING_DLL CACHE)
endif()
endforeach()
if(NOT PASSED_TEST)
# Did not find this build in the environment variable PATH
message(FATAL_ERROR "Did not find this build in the environment variable PATH. "
"Please add ${GINKGO_WINDOWS_SHARED_LIBRARY_PATH} into the environment variable PATH.")
endif()
endfunction()
function(ginkgo_switch_windows_link lang from to)
foreach(flag_var
"CMAKE_${lang}_FLAGS" "CMAKE_${lang}_FLAGS_DEBUG" "CMAKE_${lang}_FLAGS_RELEASE"
"CMAKE_${lang}_FLAGS_MINSIZEREL" "CMAKE_${lang}_FLAGS_RELWITHDEBINFO"
)
if(${flag_var} MATCHES "/${from}")
string(REGEX REPLACE "/${from}" "/${to}" ${flag_var} "${${flag_var}}")
endif(${flag_var} MATCHES "/${from}")
if(${flag_var} MATCHES "-${from}")
string(REGEX REPLACE "-${from}" "-${to}" ${flag_var} "${${flag_var}}")
endif(${flag_var} MATCHES "-${from}")
set(${flag_var} "${${flag_var}}" CACHE STRING "" FORCE)
endforeach()
endfunction()
macro(ginkgo_switch_to_windows_static lang)
ginkgo_switch_windows_link(${lang} "MD" "MT")
endmacro()
macro(ginkgo_switch_to_windows_dynamic lang)
ginkgo_switch_windows_link(${lang} "MT" "MD")
endmacro()