1
macro(add_to_alloptions _NEWNAME)
2
list(APPEND ALLOPTIONS ${_NEWNAME})
5
macro(set_option _NAME _DESC)
6
add_to_alloptions(${_NAME})
12
option(${_NAME} ${_DESC} ${_DEFLT})
15
macro(dep_option _NAME _DESC _DEFLT _DEPTEST _FAILDFLT)
16
add_to_alloptions("${_NAME}")
17
cmake_dependent_option("${_NAME}" "${_DESC}" "${_DEFLT}" "${_DEPTEST}" "${_FAILDFLT}")
20
macro(option_string _NAME _DESC _VALUE)
21
add_to_alloptions(${_NAME})
22
set(${_NAME} ${_VALUE} CACHE STRING "${_DESC}")
23
set(HAVE_${_NAME} ${_VALUE})
26
macro(message_bool_option _NAME _VALUE)
32
message(STATUS " ${_NAME}:${_PAD}ON")
34
message(STATUS " ${_NAME}:${_PAD}OFF")
38
macro(message_tested_option _NAME)
39
set(_REQVALUE ${${_NAME}})
44
string(SUBSTRING "${_NAME}" 0 4 _NAMESTART)
45
if(_NAMESTART STREQUAL "SDL_")
46
string(SUBSTRING "${_NAME}" 4 -1 _STRIPPEDNAME)
48
set(_STRIPPEDNAME "${_NAME}")
50
if(NOT HAVE_${_STRIPPEDNAME})
51
set(HAVE_${_STRIPPEDNAME} OFF)
52
elseif("${HAVE_${_STRIPPEDNAME}}" MATCHES "1|TRUE|YES|Y")
53
set(HAVE_${_STRIPPEDNAME} ON)
55
message(STATUS " ${_NAME}${_PAD}(Wanted: ${_REQVALUE}): ${HAVE_${_STRIPPEDNAME}}")
58
function(find_stringlength_longest_item inList outLength)
60
foreach(item IN LISTS ${inList})
61
string(LENGTH "${item}" slen)
62
if(slen GREATER maxLength)
63
set(maxLength ${slen})
66
set("${outLength}" ${maxLength} PARENT_SCOPE)
69
function(message_dictlist inList)
70
find_stringlength_longest_item(${inList} maxLength)
71
foreach(name IN LISTS ${inList})
73
string(LENGTH ${name} nameLength)
74
math(EXPR padLength "(${maxLength} + 1) - ${nameLength}")
75
string(RANDOM LENGTH ${padLength} ALPHABET " " padding)
76
message_tested_option(${name} ${padding})
81
include(CheckOBJCSourceCompiles)
85
function(SDL_detect_linker)
86
if(CMAKE_VERSION VERSION_LESS 3.29)
87
if(NOT DEFINED SDL_CMAKE_C_COMPILER_LINKER_ID)
88
execute_process(COMMAND ${CMAKE_LINKER} -v OUTPUT_VARIABLE LINKER_OUTPUT ERROR_VARIABLE LINKER_OUTPUT)
89
string(REGEX REPLACE "[\r\n]" " " LINKER_OUTPUT "${LINKER_OUTPUT}")
90
if(LINKER_OUTPUT MATCHES ".*Microsoft.*")
95
message(STATUS "Linker identification: ${linker}")
96
set(SDL_CMAKE_C_COMPILER_LINKER_ID "${linker}" CACHE STRING "Linker identification")
97
mark_as_advanced(SDL_CMAKE_C_COMPILER_LINKER_ID)
99
set(CMAKE_C_COMPILER_LINKER_ID "${SDL_CMAKE_C_COMPILER_LINKER_ID}" PARENT_SCOPE)
103
function(read_absolute_symlink DEST PATH)
104
file(READ_SYMLINK "${PATH}" p)
105
if(NOT IS_ABSOLUTE "${p}")
106
get_filename_component(pdir "${PATH}" DIRECTORY)
107
set(p "${pdir}/${p}")
109
get_filename_component(p "${p}" ABSOLUTE)
110
set("${DEST}" "${p}" PARENT_SCOPE)
113
function(win32_implib_identify_dll DEST IMPLIB)
114
cmake_parse_arguments(ARGS "NOTFATAL" "" "" ${ARGN})
117
COMMAND "${CMAKE_DLLTOOL}" --identify "${IMPLIB}"
118
RESULT_VARIABLE retcode
119
OUTPUT_VARIABLE stdout
120
ERROR_VARIABLE stderr)
121
if(NOT retcode EQUAL 0)
122
if(NOT ARGS_NOTFATAL)
123
message(FATAL_ERROR "${CMAKE_DLLTOOL} failed.")
125
set("${DEST}" "${DEST}-NOTFOUND" PARENT_SCOPE)
129
string(STRIP "${stdout}" result)
130
set(${DEST} "${result}" PARENT_SCOPE)
132
get_filename_component(CMAKE_C_COMPILER_DIRECTORY "${CMAKE_C_COMPILER}" DIRECTORY CACHE)
133
find_program(CMAKE_DUMPBIN NAMES dumpbin PATHS "${CMAKE_C_COMPILER_DIRECTORY}")
136
COMMAND "${CMAKE_DUMPBIN}" "-headers" "${IMPLIB}"
137
RESULT_VARIABLE retcode
138
OUTPUT_VARIABLE stdout
139
ERROR_VARIABLE stderr)
140
if(NOT retcode EQUAL 0)
141
if(NOT ARGS_NOTFATAL)
142
message(FATAL_ERROR "dumpbin failed.")
144
set(${DEST} "${DEST}-NOTFOUND" PARENT_SCOPE)
148
string(REGEX MATCH "DLL name[ ]+:[ ]+([^\n]+)\n" match "${stdout}")
150
if(NOT ARGS_NOTFATAL)
151
message(FATAL_ERROR "dumpbin did not find any associated dll for ${IMPLIB}.")
153
set(${DEST} "${DEST}-NOTFOUND" PARENT_SCOPE)
157
set(result "${CMAKE_MATCH_1}")
158
set(${DEST} "${result}" PARENT_SCOPE)
160
message(FATAL_ERROR "Cannot find dumpbin, please set CMAKE_DUMPBIN cmake variable")
163
if(NOT ARGS_NOTFATAL)
164
message(FATAL_ERROR "Don't know how to identify dll from import library. Set CMAKE_DLLTOOL (for mingw) or CMAKE_DUMPBIN (for MSVC)")
166
set(${DEST} "${DEST}-NOTFOUND")
171
function(get_actual_target)
173
set(target "${${dst}}")
174
set(input "${target}")
175
get_target_property(alias "${target}" ALIASED_TARGET)
177
set(target "${alias}")
178
get_target_property(alias "${target}" ALIASED_TARGET)
180
message(DEBUG "get_actual_target(\"${input}\") -> \"${target}\"")
181
set("${dst}" "${target}" PARENT_SCOPE)
184
function(target_get_dynamic_library DEST TARGET)
186
get_actual_target(TARGET)
188
# Use the target dll of the import library
189
set(props_to_check IMPORTED_IMPLIB)
191
list(APPEND props_to_check IMPORTED_IMPLIB_${CMAKE_BUILD_TYPE})
193
list(APPEND props_to_check IMPORTED_LOCATION)
195
list(APPEND props_to_check IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
197
foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
198
list(APPEND props_to_check IMPORTED_IMPLIB_${config_type})
199
list(APPEND props_to_check IMPORTED_LOCATION_${config_type})
202
foreach(prop_to_check ${props_to_check})
204
get_target_property(propvalue "${TARGET}" ${prop_to_check})
205
if(propvalue AND EXISTS "${propvalue}")
206
win32_implib_identify_dll(result "${propvalue}" NOTFATAL)
211
# 1. find the target library a file might be symbolic linking to
212
# 2. find all other files in the same folder that symbolic link to it
213
# 3. sort all these files, and select the 1st item on Linux, and last on macOS
214
set(location_properties IMPORTED_LOCATION)
216
list(APPEND location_properties IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
218
foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
219
list(APPEND location_properties IMPORTED_LOCATION_${config_type})
222
set(valid_shared_library_regex "\\.[0-9]+\\.dylib$")
224
set(valid_shared_library_regex "\\.so\\.([0-9.]+)?[0-9]")
226
foreach(location_property ${location_properties})
228
get_target_property(library_path "${TARGET}" ${location_property})
229
message(DEBUG "get_target_property(${TARGET} ${location_property}) -> ${library_path}")
230
if(EXISTS "${library_path}")
231
get_filename_component(library_path "${library_path}" ABSOLUTE)
232
while (IS_SYMLINK "${library_path}")
233
read_absolute_symlink(library_path "${library_path}")
235
message(DEBUG "${TARGET} -> ${library_path}")
236
get_filename_component(libdir "${library_path}" DIRECTORY)
237
file(GLOB subfiles "${libdir}/*")
238
set(similar_files "${library_path}")
239
foreach(subfile ${subfiles})
240
if(IS_SYMLINK "${subfile}")
241
read_absolute_symlink(subfile_target "${subfile}")
242
while(IS_SYMLINK "${subfile_target}")
243
read_absolute_symlink(subfile_target "${subfile_target}")
245
get_filename_component(subfile_target "${subfile_target}" ABSOLUTE)
246
if(subfile_target STREQUAL library_path AND subfile MATCHES "${valid_shared_library_regex}")
247
list(APPEND similar_files "${subfile}")
251
list(SORT similar_files)
252
message(DEBUG "files that are similar to \"${library_path}\"=${similar_files}")
254
list(REVERSE similar_files)
256
list(GET similar_files 0 item)
257
get_filename_component(result "${item}" NAME)
263
string(TOLOWER "${result}" result_lower)
265
if(NOT result_lower MATCHES ".*dll")
266
message(FATAL_ERROR "\"${result}\" is not a .dll library")
269
if(NOT result_lower MATCHES ".*dylib.*")
270
message(FATAL_ERROR "\"${result}\" is not a .dylib shared library")
273
if(NOT result_lower MATCHES ".*so.*")
274
message(FATAL_ERROR "\"${result}\" is not a .so shared library")
278
get_target_property(target_type ${TARGET} TYPE)
279
if(target_type MATCHES "SHARED_LIBRARY|MODULE_LIBRARY")
281
elseif(target_type MATCHES "STATIC_LIBRARY|OBJECT_LIBRARY|INTERFACE_LIBRARY|EXECUTABLE")
282
message(SEND_ERROR "${TARGET} is not a shared library, but has type=${target_type}")
284
message(WARNING "Unable to extract dynamic library from target=${TARGET}, type=${target_type}.")
286
# TARGET_SONAME_FILE is not allowed for DLL target platforms.
288
set(result "$<TARGET_FILE_NAME:${TARGET}>")
290
set(result "$<TARGET_SONAME_FILE_NAME:${TARGET}>")
293
set(${DEST} ${result} PARENT_SCOPE)
296
function(check_linker_supports_version_file VAR)
298
if(CMAKE_C_COMPILER_LINKER_ID MATCHES "^(MSVC)$")
299
set(LINKER_SUPPORTS_VERSION_SCRIPT FALSE)
301
cmake_push_check_state(RESET)
302
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.sym" "n_0 {\n global:\n func;\n local: *;\n};\n")
303
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/dummy.sym")
304
check_c_source_compiles("int func(void) {return 0;} int main(int argc,char*argv[]){(void)argc;(void)argv;return func();}" LINKER_SUPPORTS_VERSION_SCRIPT FAIL_REGEX "(unsupported|syntax error|unrecognized option)")
305
cmake_pop_check_state()
307
set(${VAR} "${LINKER_SUPPORTS_VERSION_SCRIPT}" PARENT_SCOPE)
310
if(CMAKE_VERSION VERSION_LESS 3.18)
311
function(check_linker_flag LANG FLAG VAR)
312
cmake_push_check_state(RESET)
313
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${FLAG})
314
if(LANG STREQUAL "C")
315
include(CheckCSourceCompiles)
316
check_c_source_compiles("int main(int argc,char*argv[]){(void)argc;(void)argv;return 0;}" ${VAR} FAIL_REGEX "(unsupported|syntax error)")
317
elseif(LANG STREQUAL "CXX")
318
include(CheckCXXSourceCompiles)
319
check_cxx_source_compiles("int main(int argc,char*argv[]){(void)argc;(void)argv;return 0;}" ${VAR} FAIL_REGEX "(unsupported|syntax error)")
321
message(FATAL_ERROR "Unsupported language: ${LANG}")
323
cmake_pop_check_state()
326
cmake_policy(SET CMP0057 NEW) # Support new if() IN_LIST operator. (used inside check_linker_flag, used in CMake 3.18)
327
include(CheckLinkerFlag)
332
if(NOT CMAKE_OBJC_COMPILER)
333
message(WARNING "Cannot find working OBJC compiler.")
337
function(SDL_PrintSummary)
338
##### Info output #####
340
message(STATUS "SDL3 was configured with the following options:")
342
message(STATUS "Platform: ${CMAKE_SYSTEM}")
343
message(STATUS "64-bit: ${ARCH_64}")
344
message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
345
message(STATUS "Revision: ${SDL_REVISION}")
346
message(STATUS "Vendor: ${SDL_VENDOR_INFO}")
348
message(STATUS "Subsystems:")
350
find_stringlength_longest_item(SDL_SUBSYSTEMS maxLength)
351
foreach(_SUB IN LISTS SDL_SUBSYSTEMS)
352
string(LENGTH ${_SUB} _SUBLEN)
353
math(EXPR _PADLEN "(${maxLength} + 1) - ${_SUBLEN}")
354
string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
355
string(TOUPPER ${_SUB} _OPT)
356
message_bool_option(${_SUB} SDL_${_OPT} ${_PADDING})
359
message(STATUS "Options:")
360
list(SORT ALLOPTIONS)
361
message_dictlist(ALLOPTIONS)
363
message(STATUS " Build Shared Library: ${SDL_SHARED}")
364
message(STATUS " Build Static Library: ${SDL_STATIC}")
366
message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
369
message(STATUS " Build libraries as Apple Framework: ${SDL_FRAMEWORK}")
373
message(STATUS "If something was not detected, although the libraries")
374
message(STATUS "were installed, then make sure you have set the")
375
message(STATUS "CMAKE_C_FLAGS and CMAKE_PREFIX_PATH CMake variables correctly.")
379
if(WARN_ABOUT_ARM_SIMD_ASM_MIT)
380
message(STATUS "SDL is being built with ARM SIMD optimizations, which")
381
message(STATUS "uses code licensed under the MIT license. If this is a")
382
message(STATUS "problem, please disable that code by rerunning CMake with:")
384
message(STATUS " -DSDL_ARMSIMD=OFF")
388
if(WARN_ABOUT_ARM_NEON_ASM_MIT)
389
message(STATUS "SDL is being built with ARM NEON optimizations, which")
390
message(STATUS "uses code licensed under the MIT license. If this is a")
391
message(STATUS "problem, please disable that code by rerunning CMake with:")
393
message(STATUS " -DSDL_ARMNEON=OFF")
397
if(UNIX AND NOT (ANDROID OR APPLE OR EMSCRIPTEN))
398
if(NOT (HAVE_X11 OR HAVE_WAYLAND))
399
message(STATUS "SDL is being built without a X11 or wayland video driver.")
400
message(STATUS "The library will not be able to create windows on most unix environments.")
406
function(SDL_install_pdb TARGET DIRECTORY)
407
get_property(type TARGET ${TARGET} PROPERTY TYPE)
408
if(type MATCHES "^(SHARED_LIBRARY|EXECUTABLE)$")
409
install(FILES $<TARGET_PDB_FILE:${TARGET}> DESTINATION "${DIRECTORY}" OPTIONAL)
410
elseif(type STREQUAL "STATIC_LIBRARY")
411
# FIXME: Use $<TARGET_COMPILE_PDB_FILE:${TARGET} once it becomes available (https://gitlab.kitware.com/cmake/cmake/-/issues/25244)
412
if(CMAKE_GENERATOR MATCHES "^Visual Studio.*")
413
install(CODE "file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${DIRECTORY}\" TYPE FILE OPTIONAL FILES \"${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}/${TARGET}.pdb\")")
415
install(CODE "file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${DIRECTORY}\" TYPE FILE OPTIONAL FILES \"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TARGET}.dir/${TARGET}.pdb\")")