-
Notifications
You must be signed in to change notification settings - Fork 789
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
274 lines (241 loc) · 9.15 KB
/
Copy pathCMakeLists.txt
File metadata and controls
274 lines (241 loc) · 9.15 KB
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
cmake_minimum_required(VERSION 3.20)
project(awtk LANGUAGES C CXX)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
include(awtk_options)
if(NOT CMAKE_BUILD_TYPE)
if(AWTK_DEBUG)
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
else()
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
endif()
include(awtk_platform)
if(AWTK_OS_LINUX OR AWTK_OS_DARWIN)
find_package(PkgConfig QUIET)
endif()
# MSVC shared: without dllexports/awtk.def the linker emits no import library (awtk.lib) -> LNK1104 for any exe linking awtk.
# awtk.def is gitignored and produced by the Node idl/def pipeline (see cmake/awtk_codegen.cmake).
if(AWTK_BUILD_SHARED AND AWTK_WINDOWS_MSVC)
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/dllexports/awtk.def")
find_program(AWTK_MSVC_DEFGEN_NODE NAMES node nodejs)
if(AWTK_MSVC_DEFGEN_NODE)
message(STATUS "AWTK: dllexports/awtk.def missing — enabling AWTK_RUN_IDL_CODEGEN (Node: ${AWTK_MSVC_DEFGEN_NODE})")
set(AWTK_RUN_IDL_CODEGEN ON CACHE BOOL "Run Node idl/def generators at build time" FORCE)
else()
message(WARNING "AWTK MSVC shared: dllexports/awtk.def is missing and Node.js was not found; disabling demos and cmake_find_awtk example (install libawtk only).")
set(AWTK_BUILD_DEMOS OFF CACHE BOOL "Build demos" FORCE)
set(AWTK_BUILD_CMAKE_FIND_DEMO OFF CACHE BOOL "Build examples/cmake_find_awtk against the build tree" FORCE)
endif()
endif()
endif()
include(awtk_codegen)
include(third_party_libs)
include(src_libs)
include(awtk_link_bundle)
if(AWTK_BUILD_SHARED)
add_library(awtk SHARED "${CMAKE_CURRENT_SOURCE_DIR}/cmake/empty.c")
else()
add_library(awtk STATIC "${CMAKE_CURRENT_SOURCE_DIR}/cmake/empty.c")
endif()
set_target_properties(awtk PROPERTIES OUTPUT_NAME "awtk" LINKER_LANGUAGE CXX)
if(AWTK_WINDOWS_MINGW)
set_target_properties(awtk PROPERTIES PREFIX "")
endif()
target_include_directories(awtk PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/ext_widgets>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/awtk>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/awtk/ext_widgets>
)
add_dependencies(awtk awtk_idl_codegen)
add_dependencies(awtk ${AWTK_WHOLE_ARCHIVE_LIBS})
if(TARGET SDL2)
add_dependencies(awtk SDL2)
endif()
# Pack internal static libs into libawtk (see cmake/awtk_link_bundle.cmake + awtk_config_common.py).
awtk_link_whole_archive_static_libs(awtk)
if(MSVC)
# .def may be created at build time (AWTK_RUN_IDL_CODEGEN); do not require EXISTS at configure.
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/dllexports/awtk.def" OR AWTK_RUN_IDL_CODEGEN)
target_link_options(awtk PRIVATE "/DEF:${CMAKE_CURRENT_SOURCE_DIR}/dllexports/awtk.def")
endif()
if(AWTK_DEBUG AND AWTK_PDB)
target_link_options(awtk PRIVATE /DEBUG)
endif()
elseif(AWTK_WINDOWS_MINGW)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/dllexports/awtk.def" OR AWTK_RUN_IDL_CODEGEN)
target_link_options(awtk PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/dllexports/awtk.def")
endif()
endif()
if(NOT AWTK_OS_DARWIN)
target_link_libraries(awtk PRIVATE awtk_glad)
endif()
# LINK_ONLY: SDL is linked into libawtk but must not appear in export() / install(EXPORT) dependency graph.
target_link_libraries(awtk PRIVATE "$<LINK_ONLY:${AWTK_SDL_LINK_TARGET}>")
find_package(Threads REQUIRED)
if(AWTK_OS_LINUX)
find_package(OpenGL REQUIRED)
find_library(AWTK_X11_LIB X11 REQUIRED)
find_library(AWTK_XEXT_LIB Xext REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(AWTK_GTK3 REQUIRED IMPORTED_TARGET gtk+-3.0)
target_link_libraries(awtk PRIVATE
OpenGL::GL
${AWTK_X11_LIB}
${AWTK_XEXT_LIB}
PkgConfig::AWTK_GTK3
Threads::Threads
m
stdc++
${CMAKE_DL_LIBS}
)
find_library(AWTK_ASOUND asound)
if(AWTK_ASOUND)
target_link_libraries(awtk PRIVATE ${AWTK_ASOUND})
endif()
find_library(AWTK_SNDIO sndio)
if(AWTK_SNDIO)
target_link_libraries(awtk PRIVATE ${AWTK_SNDIO})
endif()
elseif(AWTK_OS_DARWIN)
target_link_libraries(awtk PRIVATE
Threads::Threads
iconv
"-framework IOKit"
"-framework Cocoa"
"-framework QuartzCore"
"-framework OpenGL"
"-weak_framework Metal"
"-weak_framework MetalKit"
)
elseif(AWTK_OS_WINDOWS AND AWTK_WINDOWS_MSVC)
target_link_libraries(awtk PRIVATE
gdi32 user32 winmm imm32 version shell32 Setupapi ole32 oleaut32 advapi32 delayimp psapi ws2_32
)
elseif(AWTK_WINDOWS_MINGW)
target_link_libraries(awtk PRIVATE
kernel32 gdi32 user32 winmm imm32 version shell32 Setupapi ole32 oleaut32 advapi32 uuid stdc++ ws2_32 iphlpapi
)
endif()
awtk_apply_platform_link_options(awtk PRIVATE)
if(AWTK_DEBUG AND (AWTK_OS_LINUX OR AWTK_OS_DARWIN))
target_compile_options(awtk PRIVATE -g -O0)
elseif(NOT AWTK_DEBUG AND (AWTK_OS_LINUX OR AWTK_OS_DARWIN))
target_compile_options(awtk PRIVATE -Os)
endif()
# --- Install + CMake package ---
set(AWTK_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/awtk")
if(AWTK_OS_DARWIN)
set_target_properties(awtk PROPERTIES INSTALL_RPATH "@loader_path")
elseif(AWTK_OS_LINUX)
set_target_properties(awtk PROPERTIES INSTALL_RPATH "$ORIGIN")
endif()
set(_awtk_export_install_targets awtk)
if(AWTK_SDL_VERSION STREQUAL "2")
if(TARGET SDL2)
list(APPEND _awtk_export_install_targets SDL2)
endif()
if(TARGET SDL2main)
list(APPEND _awtk_export_install_targets SDL2main)
endif()
endif()
install(TARGETS ${_awtk_export_install_targets} EXPORT awtkTargets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk"
FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" PATTERN "*.inc"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rd/fribidi/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk/3rd/fribidi"
FILES_MATCHING PATTERN "*.h"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rd/mbedtls/include/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk/3rd/mbedtls/include"
FILES_MATCHING PATTERN "*.h"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rd/gpinyin/include/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk/3rd/gpinyin/include"
FILES_MATCHING PATTERN "*.h"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rd/libunibreak/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk/3rd/libunibreak"
FILES_MATCHING PATTERN "*.h"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rd/svgtiny/include/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk/3rd/svgtiny/include"
FILES_MATCHING PATTERN "*.h"
)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rd/nanovg_plus/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/awtk/3rd/nanovg_plus"
FILES_MATCHING PATTERN "*.h"
)
install(EXPORT awtkTargets
FILE awtkTargets.cmake
NAMESPACE awtk::
DESTINATION "${AWTK_INSTALL_CMAKEDIR}"
)
if(AWTK_OS_LINUX AND AWTK_SDL_VERSION STREQUAL "2")
set(AWTK_CONFIG_NEED_SDL2_GTK TRUE)
else()
set(AWTK_CONFIG_NEED_SDL2_GTK FALSE)
endif()
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/AwtkConfigSdlGtk.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/export/AwtkConfigSdlGtk.cmake"
@ONLY
)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/AwtkConfigSdlGtk.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/AwtkConfigSdlGtk.cmake"
@ONLY
)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/AwtkConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/export/awtkConfig.cmake"
INSTALL_DESTINATION "${AWTK_INSTALL_CMAKEDIR}"
)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/awtkConfigVersion.cmake"
VERSION 1.7.0
COMPATIBILITY SameMajorVersion
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/export/awtkConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/export/AwtkConfigSdlGtk.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/awtkConfigVersion.cmake"
DESTINATION "${AWTK_INSTALL_CMAKEDIR}"
)
# Build-tree package: IMPORTED awtk::awtk (cannot use export(TARGETS) while linking bundled SDL2).
# Use configure_file (not file(GENERATE)) so $<TARGET_FILE:awtk> stays literal; multi-config
# generators otherwise evaluate it per-config and clash on a single output path.
if(AWTK_BUILD_SHARED)
set(AWTK_IMPORT_KIND "SHARED")
else()
set(AWTK_IMPORT_KIND "STATIC")
endif()
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/awtk_build_tree_exports.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/awtk_build_tree_exports.cmake"
@ONLY
)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/AwtkConfigBuildTree.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/awtkConfig.cmake"
@ONLY
)
option(AWTK_BUILD_CMAKE_FIND_DEMO "Build examples/cmake_find_awtk against the build tree" ON)
if(AWTK_BUILD_CMAKE_FIND_DEMO)
add_subdirectory(examples/cmake_find_awtk)
endif()
if(AWTK_BUILD_DEMOS)
add_subdirectory(demos)
endif()