blob: 3ebb7a3f923f27119fa7999ac79a90732081a868 (
plain)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
cmake_minimum_required(VERSION 3.5)
project(cmake-user LANGUAGES C)
message(STATUS "CMAKE_COMMAND: ${CMAKE_COMMAND}")
set(CHECK_CMAKE_VERSION "NOTFOUND" CACHE STRING "Version of CMake expected to be found")
if(NOT CHECK_CMAKE_VERSION)
message(WARNING "CMake version check: skipped (actual: ${CMAKE_VERSION})")
elseif(NOT CHECK_CMAKE_VERSION VERSION_EQUAL CMAKE_VERSION)
message(SEND_ERROR "CMake version check: failed (actual: ${CMAKE_VERSION} expected: ${CHECK_CMAKE_VERSION})")
else()
message(STATUS "CMake version check: success (actual: ${CMAKE_VERSION})")
endif()
# add_library overload
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib.c" "int lib_unused() { return 1; }")
add_library(lib "${CMAKE_CURRENT_BINARY_DIR}/lib.c")
# add_executable overload
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/exe.c" "int main() { return 0; }")
add_executable(exe "${CMAKE_CURRENT_BINARY_DIR}/exe.c")
# install overload
set(X_VCPKG_APPLOCAL_DEPS_INSTALL 1)
install(TARGETS exe lib
RUNTIME DESTINATION bin
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
)
# find_package overload and wrapper
set(FIND_PACKAGES "" CACHE STRING "List of packages to be found and used")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
foreach(package ${FIND_PACKAGES})
set(extra_args "")
if(package STREQUAL "Curses")
set(CURSES_NEED_WIDE 1)
elseif(package STREQUAL "ICU")
set(extra_args COMPONENTS uc)
endif()
string(TOUPPER "${package}" package_upper)
set(CMAKE_FIND_DEBUG_MODE ON)
find_package("${package}" ${extra_args} QUIET)
set(CMAKE_FIND_DEBUG_MODE OFF)
if(NOT ${package}_FOUND AND NOT ${package_upper}_FOUND)
message(SEND_ERROR "find_package(${package} ${extra_args}) check: failed")
continue()
endif()
# REQUIRED changes the behaviour find_package_handle_standard_args.
find_package("${package}" ${extra_args} REQUIRED)
message(STATUS "find_package(${package} ${extra_args}) check: success")
set(libraries_var "")
if(DEFINED ${package}_LIBRARIES)
set(libraries_var "${package}_LIBRARIES")
elseif(DEFINED ${package_upper}_LIBRARIES)
set(libraries_var "${package_upper}_LIBRARIES")
elseif(DEFINED ${package}_LIBRARY)
set(libraries_var "${package}_LIBRARY")
elseif(DEFINED ${package_upper}_LIBRARY)
set(libraries_var "${package_upper}_LIBRARY")
else()
message(STATUS "${package}_LIBRARY/IES: undefined")
continue()
endif()
set(libraries "${${libraries_var}}")
message(STATUS "${libraries_var}: ${libraries}")
if(package STREQUAL "Intl" AND NOT Intl_LIBRARY)
continue() # using libintl.h from C runtime library
endif()
target_link_libraries(exe PRIVATE ${libraries})
set(last_keyword "")
foreach(item IN LISTS libraries)
if(item STREQUAL "optimized" OR item STREQUAL "debug")
set(last_keyword "${item}")
continue()
endif()
string(FIND "${item}" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/" starts_with_release)
string(FIND "${item}" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib/" starts_with_debug)
if(starts_with_release EQUAL "0")
if(last_keyword STREQUAL "optimized")
# okay
elseif(last_keyword STREQUAL "debug")
message(SEND_ERROR "Release lib for 'debug' keyword: ${item}")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(SEND_ERROR "Release lib for 'Debug' build: ${item}")
endif()
elseif(starts_with_debug EQUAL "0")
if(last_keyword STREQUAL "debug")
# okay
elseif(last_keyword STREQUAL "optimized")
message(SEND_ERROR "Debug lib for 'optimized' keyword: ${item}")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
message(SEND_ERROR "Debug lib for 'Release' build: ${item}")
endif()
endif()
set(last_keyword "")
continue()
endforeach()
set(target "${package}::${package}")
string(REPLACE "SQLite3::" "SQLite::" target "${target}")
if(TARGET "${target}")
get_target_property(type "${target}" TYPE)
message(STATUS "${target}: ${type}")
if(type MATCHES "LIBRARY" AND NOT type MATCHES "INTERFACE")
get_target_property(configurations "${target}" IMPORTED_CONFIGURATIONS)
message(STATUS "IMPORTED_CONFIGURATIONS: ${configurations}")
if(configurations)
string(TOLOWER "${configurations}" configurations)
if("release" IN_LIST configurations)
set(property IMPORTED_IMPLIB_RELEASE)
get_target_property(location "${target}" "${property}")
if(NOT location)
set(property IMPORTED_LOCATION_RELEASE)
get_target_property(location "${target}" "${property}")
endif()
message(STATUS "${property}: ${location}")
string(FIND "${location}" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib" index)
if (NOT index EQUAL "0")
message(SEND_ERROR "Release lib is in wrong location.")
endif()
elseif(NOT CHECK_BUILD_TYPE OR CHECK_BUILD_TYPE STREQUAL "release")
message(SEND_ERROR "Release configuration is missing.")
endif()
if("debug" IN_LIST configurations)
set(property IMPORTED_IMPLIB_DEBUG)
get_target_property(location "${target}" "${property}")
if(NOT location)
set(property IMPORTED_LOCATION_DEBUG)
get_target_property(location "${target}" "${property}")
endif()
message(STATUS "${property}: ${location}")
string(FIND "${location}" "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib" index)
if (NOT index EQUAL "0")
message(SEND_ERROR "Debug lib is in wrong location.")
endif()
elseif(NOT CHECK_BUILD_TYPE OR CHECK_BUILD_TYPE STREQUAL "debug")
message(SEND_ERROR "Debug configuration is missing.")
endif()
endif()
endif()
else()
get_directory_property(imported_targets IMPORTED_TARGETS)
if(imported_targets)
message(STATUS "Imported targets: ${imported_targets}")
endif()
endif()
endforeach()
|