-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMDEF_ENV.cmake
522 lines (469 loc) · 12.2 KB
/
CMDEF_ENV.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
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
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
## Main
#
# initialize base CMDEF CMake variables.
#
# Module relay on some CMake variables like
# - CMAKE_SIZEOF_VOID_P (not defined for Script mode)
# - CMAKE_CURRENT_BINARY_DIR (defined as "${CMAKE_CURRENT_LIST_DIR}" for script mode)
#
INCLUDE_GUARD(GLOBAL)
FIND_PACKAGE(CMLIB REQUIRED)
#
# Variable that is defined only as local.
# Is not intended to be modified by user
#
# It holds list of supported/well_tested architectures
#
# aplsil architecture referes to Apple silicon
#
SET(_CMDEF_ENV_SUPPORTED_ARCH_LIST "x86-64" "x86" "aarch64" "aplsil")
##
# Initialize CMDEF CMake variables.
#
# <function>(
# )
#
FUNCTION(CMDEF_ENV_INIT)
_CMDEF_ENV_SET_OS()
_CMDEF_ENV_SET_PACKAGE(${CMDEF_OS_NAME})
_CMDEF_ENV_SET_OUTPUT_DIR()
_CMDEF_ENV_SET_TARGET_INSTALL_DIR()
_CMDEF_ENV_SET_DESCRIPTION()
_CMDEF_ENV_SET_NAMING_CONVENTION()
_CMDEF_ENV_SET_SUPPORTED_LANG()
IF(CMDEF_OS_WINDOWS)
IF(NOT CMDEF_WINDOWS_EXECUTABLE_MT)
FIND_PROGRAM(CMDEF_WINDOWS_EXECUTABLE_MT "mt.exe")
IF(${CMDEF_WINDOWS_EXECUTABLE_MT} STREQUAL "${prefix}WINDOWS_EXECUTABLE_MT-NOTFOUND")
MESSAGE(WARNING "Could not find mt.exe. Some functionality may not be available. Suggesting mt.exe")
SET(CMDEF_WINDOWS_EXECUTABLE_MT "mt.exe" CACHE STRING "mt.exe" FORCE)
ENDIF()
ENDIF()
ENDIF()
IF(CMDEF_OS_MACOS)
FIND_PROGRAM(CMDEF_MACOS_EXECUTABLE_IBTOOL ibtool
HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin")
IF(${CMDEF_MACOS_EXECUTABLE_IBTOOL} STREQUAL "${prefix}MACOS_EXECUTABLE_IBTOOL-NOTFOUND")
MESSAGE(SEND_ERROR "Could not find 'ibtool'. Some functionality may not be available")
ENDIF()
ENDIF()
SET(CMDEF_MULTICONF_FOLDER_NAME "CMDEF"
CACHE PATH
"Name of folder for CMDEF targets in multiconfig like Visual Studio"
)
ENDFUNCTION()
## Helper
# Set package variables
#
# <function>(
# )
#
MACRO(_CMDEF_ENV_SET_PACKAGE os_name)
SET(CMDEF_LIBRARY_PREFIX "lib"
CACHE STRING
"Suffix for package names if the installed target is library"
)
SET(CMDEF_LIBRARY_NAME_FLAG_STATIC "-static"
CACHE STRING
"Flag which is appended to library name and CMDEF_*_NAME_DEBUG_SUFFIX"
)
SET(CMDEF_LIBRARY_NAME_FLAG_SHARED ""
CACHE STRING
"Flag which is appended to library name and CMDEF_*_NAME_DEBUG_SUFFIX"
)
SET(CMDEF_LIBRARY_NAME_DEBUG_SUFFIX "d"
CACHE STRING
"Suffix for library name if the target is configured in debug"
)
SET(CMDEF_LIBRARY_NAME_DEV_SUFFIX "-dev"
CACHE STRING
"Suffix for development library"
)
SET(CMDEF_EXECUTABLE_NAME_DEBUG_SUFFIX "d"
CACHE STRING
"Suffix for executable name if the target is configured in debug"
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_STATIC_WINDOWS ".lib"
CACHE STRING
".lib"
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_SHARED_WINDOWS ".dll"
CACHE STRING
".dll"
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_STATIC_LINUX ".a"
CACHE STRING
".a"
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_SHARED_LINUX ".so"
CACHE STRING
".so"
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_STATIC_MACOS ".a"
CACHE STRING
".a"
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_SHARED_MACOS ".dylib"
CACHE STRING
".dylib"
)
IF(NOT DEFINED CMDEF_OS_NAME_UPPER)
MESSAGE(FATAL_ERROR "")
ENDIF()
SET(shared_var_name CMDEF_LIBRARY_NAME_SUFFIX_SHARED_${CMDEF_OS_NAME_UPPER})
SET(static_var_name CMDEF_LIBRARY_NAME_SUFFIX_STATIC_${CMDEF_OS_NAME_UPPER})
IF(NOT DEFINED ${shared_var_name} OR
NOT DEFINED ${static_var_name})
MESSAGE(FATAL_ERROR "Undefined suffix variable!")
ENDIF()
SET(CMDEF_LIBRARY_NAME_SUFFIX_SHARED "${${shared_var_name}}"
CACHE STRING
"Suffix for shared library. Determined by host OS."
)
SET(CMDEF_LIBRARY_NAME_SUFFIX_STATIC "${${static_var_name}}"
CACHE STRING
"Suffix for static library. Determined by host OS."
)
ENDMACRO()
## Helper
# Set naming convention variables
#
# <function>(
# )
#
FUNCTION(_CMDEF_ENV_SET_NAMING_CONVENTION)
SET(CMDEF_ENV_NAME_SEPARATOR "_"
CACHE STRING
"Separator for package name"
)
SET(CMDEF_ENV_NAMESPACE_SUFFIX "::"
CACHE STRING
"Suffix for namespace"
)
ENDFUNCTION()
## Helper
# Set and control list of supported languages
#
# <function> (
# )
#
FUNCTION(_CMDEF_ENV_SET_SUPPORTED_LANG)
SET(CMDEF_SUPPORTED_LANG_LIST C;CXX;OBJC;OBJCXX;RC;
CACHE STRING
"Supported programming languages"
)
SET(CMDEF_LANG_CXX_SOURCE_FILE_EXTENSIONS .cpp .cc .cxx .hpp
CACHE STRING
"List of C++ source file extensions"
)
SET(CMDEF_LANG_C_SOURCE_FILE_EXTENSIONS .c .h
CACHE STRING
"List of C source file extensions"
)
SET(CMDEF_LANG_OBJC_SOURCE_FILE_EXTENSIONS .m .h
CACHE STRING
"List of OBJC source file extensions"
)
SET(CMDEF_LANG_OBJCXX_SOURCE_FILE_EXTENSIONS .mm
CACHE STRING
"List of OBJCXX source file extensions"
)
SET(CMDEF_LANG_RC_SOURCE_FILE_EXTENSIONS .rc
CACHE STRING
"List of RC source file extensions"
)
ENDFUNCTION()
## Helper
# Define variables for OS
#
# <function> (
# )
#
MACRO(_CMDEF_ENV_SET_OS)
CMAKE_HOST_SYSTEM_INFORMATION(RESULT _os_name QUERY OS_NAME)
MESSAGE(STATUS "System name: ${_os_name}")
SET(os_name "")
IF("${_os_name}" STREQUAL "Darwin" OR
"${_os_name}" STREQUAL "Mac OS X" OR
"${_os_name}" STREQUAL "macOS")
SET(os_name "macos")
ELSEIF("${_os_name}" STREQUAL "Linux")
SET(os_name "linux")
ELSEIF("${_os_name}" STREQUAL "Windows")
SET(os_name "windows")
ENDIF()
SET(CMDEF_OS_NAME ${os_name}
CACHE STRING
"String, normalized representation of OS name"
)
IF("${CMDEF_OS_NAME}" STREQUAL "macos")
SET(_OS_MACOS ON)
SET(_OS_POSIX ON)
SET(_OS_WINDOWS OFF)
SET(_OS_LINUX OFF)
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
ELSEIF("${CMDEF_OS_NAME}" STREQUAL "linux")
SET(_OS_LINUX ON)
SET(_OS_POSIX ON)
SET(_OS_WINDOWS OFF)
SET(_OS_MACOS OFF)
ELSEIF("${CMDEF_OS_NAME}" STREQUAL "windows")
SET(_OS_LINUX OFF)
SET(_OS_POSIX OFF)
SET(_OS_WINDOWS ON)
SET(_OS_MACOS OFF)
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
ELSE()
MESSAGE(FATAL_ERROR "Unsupported CMDEF_OS_NAME value: ${CMDEF_OS_NAME}")
ENDIF()
STRING(SUBSTRING "${CMDEF_OS_NAME}" 0 3 os_name_short)
SET(CMDEF_OS_NAME_SHORT ${os_name_short}
CACHE STRING
"Short-string representation of OS name"
)
STRING(TOUPPER ${CMDEF_OS_NAME} os_name_upper)
SET(CMDEF_OS_NAME_UPPER ${os_name_upper}
CACHE INTERNAL
"String representation of OS name - upper case"
FORCE
)
SET(CMDEF_OS_MACOS ${_OS_MACOS}
CACHE BOOL
"OS version/type"
)
SET(CMDEF_OS_WINDOWS ${_OS_WINDOWS}
CACHE BOOL
"OS version/type"
)
SET(CMDEF_OS_LINUX ${_OS_LINUX}
CACHE BOOL
"OS version/type"
)
SET(CMDEF_OS_POSIX ${_OS_POSIX}
CACHE BOOL
"Do we have POSIX OS?"
)
IF(NOT CMDEF_ARCHITECTURE)
SET(arch)
IF(NOT "$ENV{CMDEF_ARCHITECTURE}" STREQUAL "")
SET(arch "$ENV{CMDEF_ARCHITECTURE}")
ELSE()
_CMDEF_ENV_GET_ARCH(arch)
ENDIF()
SET(CMDEF_ARCHITECTURE ${arch}
CACHE STRING
"Achitecture for which we will compile"
)
ENDIF()
MESSAGE(STATUS "Architecture: ${CMDEF_ARCHITECTURE}")
LIST(FIND _CMDEF_ENV_SUPPORTED_ARCH_LIST "${CMDEF_ARCHITECTURE}" arch_found)
IF(arch_found EQUAL -1)
MESSAGE(WARNING "Unsupported Architecture: ${CMDEF_ARCHITECTURE}")
ENDIF()
IF (NOT CMDEF_DISTRO_ID)
SET(distro_id)
IF(NOT "$ENV{CMDEF_DISTRO_ID}" STREQUAL "")
SET(distro_id "$ENV{CMDEF_DISTRO_ID}")
ELSE()
_CMDEF_ENV_GET_DISTRO_ID(distro_id)
ENDIF()
SET(CMDEF_DISTRO_ID ${distro_id}
CACHE STRING
"Distro ID for which we will compile"
)
ENDIF()
MESSAGE(STATUS "Distro ID: ${CMDEF_DISTRO_ID}")
IF (NOT CMDEF_DISTRO_VERSION_ID)
SET(version_id)
IF(NOT "$ENV{CMDEF_DISTRO_VERSION_ID}" STREQUAL "")
SET(version_id "$ENV{CMDEF_DISTRO_VERSION_ID}")
ELSE()
_CMDEF_ENV_GET_DISTRO_VERSION_ID(version_id)
ENDIF()
SET(CMDEF_DISTRO_VERSION_ID ${version_id}
CACHE STRING
"Distro Version ID for which we will compile"
)
ENDIF()
MESSAGE(STATUS "Distro Version ID: ${CMDEF_DISTRO_VERSION_ID}")
ENDMACRO()
## Helper
# Set output directory variable
#
# <function>(
# <prefix>
# )
#
MACRO(_CMDEF_ENV_SET_OUTPUT_DIR)
SET(CMDEF_TARGET_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>"
CACHE PATH
"Output directory for CMake targets"
)
ENDMACRO()
## Helper
# Set install dir names which serve as DESTINATION
# for 'install' command.
#
# All install dirs must be one level. Two level dirs are note supported!
#
# <function>(
# <prefix>
# )
#
MACRO(_CMDEF_ENV_SET_TARGET_INSTALL_DIR)
SET(CMDEF_INCLUDE_INSTALL_DIR "include/"
CACHE PATH
"Name of include directory after install (in package)"
)
SET(CMDEF_SOURCE_INSTALL_DIR "source/"
CACHE PATH
"Name of source directory after install (in package)"
)
SET(CMDEF_LIBRARY_INSTALL_DIR "lib/"
CACHE PATH
"Name of library directory after install (in package)"
)
SET(CMDEF_BINARY_INSTALL_DIR "bin/"
CACHE PATH
"Name of bin directory after install (in package)"
)
ENDMACRO()
## Helper
#
#
#
# <function>(
# )
#
FUNCTION(_CMDEF_ENV_SET_WINDOWS_FLAGS)
IF(NOT DEFINED CMDEF_OS_WINDOWS)
MESSAGE(FATAL_ERROR "Canot determine target OS. Not defined.")
ENDIF()
IF(NOT CMDEF_OS_WINDOWS)
RETURN()
ENDIF()
SET(CMDEF_WINDOWS_STATIC_RUNTIME ON
CACHE BOOL
"If ON then STATIC runtime is used, of OFF DYNAMIC runtime is used"
)
ENDFUNCTION()
## Helper
#
# <function> (
#
#)
#
FUNCTION(_CMDEF_ENV_SET_DESCRIPTION)
SET(CMDEF_ENV_DESCRIPTION_COMPANY_NAME "Company name"
CACHE STRING
"Name of the company"
)
SET(CMDEF_ENV_DESCRIPTION_COPYRIGHT "${CMDEF_ENV_DESCRIPTION_COMPANY_NAME}"
CACHE STRING
"Copyrigth which will be added to binaries"
)
ENDFUNCTION()
## Helper
#
# Determine architecture.
# If the cannot be determined is set to 'unknown'
#
# <function>(
# <arch_output_var_name>
# )
#
FUNCTION(_CMDEF_ENV_GET_ARCH arch)
IF(CMDEF_OS_WINDOWS)
SET(${arch} "x86-64" PARENT_SCOPE)
RETURN()
ENDIF()
IF(CMDEF_OS_MACOS)
SET(${arch} "aplsil" PARENT_SCOPE)
RETURN()
ENDIF()
IF(CMDEF_OS_LINUX)
FIND_PROGRAM(CMDEF_UNAME uname REQUIRED)
EXECUTE_PROCESS(COMMAND "${CMDEF_UNAME}" -m
OUTPUT_VARIABLE _arch
RESULT_VARIABLE result
OUTPUT_STRIP_TRAILING_WHITESPACE
)
IF(NOT (result EQUAL 0))
MESSAGE(FATAL_ERROR "Cannot determine architecture! Set up CMDEF_ARCHITECTURE manually or repair uname")
ENDIF()
STRING(REGEX REPLACE "[^a-zA-Z0-9.]" "-" _arch_mapped "${_arch}")
STRING(TOLOWER "${_arch_mapped}" _arch_normalized)
SET(${arch} "${_arch_normalized}" PARENT_SCOPE)
RETURN()
ENDIF()
MESSAGE(FATAL_ERROR "Cannot get architecture for unknown OS ${CMDEF_OS_NAME}")
ENDFUNCTION()
## Helper
#
# Determine distribution ID
#
# <function>(
# <distro_id_var_name>
# )
#
FUNCTION(_CMDEF_ENV_GET_DISTRO_ID distro_id)
IF(CMDEF_OS_WINDOWS)
SET(${distro_id} "${CMDEF_OS_NAME}" PARENT_SCOPE)
RETURN()
ENDIF()
IF(CMDEF_OS_MACOS)
SET(${distro_id} "${CMDEF_OS_NAME}" PARENT_SCOPE)
RETURN()
ENDIF()
IF(CMDEF_OS_LINUX)
FIND_PROGRAM(CMDEF_LSB_RELEASE lsb_release REQUIRED)
EXECUTE_PROCESS(COMMAND "${CMDEF_LSB_RELEASE}" -i -s
OUTPUT_VARIABLE _distro_id
RESULT_VARIABLE result
OUTPUT_STRIP_TRAILING_WHITESPACE
)
IF(NOT (result EQUAL 0))
MESSAGE(FATAL_ERROR "Cannot determine distro ID! Set up CMDEF_DISTRO_ID manually or repair lsb_release")
ENDIF()
STRING(REGEX REPLACE "[^a-zA-Z0-9.]" "-" _distro_id_mapped "${_distro_id}")
STRING(TOLOWER "${_distro_id_mapped}" _distro_id_normalized)
SET(${distro_id} "${_distro_id_normalized}" PARENT_SCOPE)
RETURN()
ENDIF()
MESSAGE(FATAL_ERROR "Cannot get distro id for unknown OS ${CMDEF_OS_NAME}")
ENDFUNCTION()
## Helper
#
# Determine Distro Version ID
#
# <function>(
# <version_id_var_name>
# )
#
FUNCTION(_CMDEF_ENV_GET_DISTRO_VERSION_ID version_id)
IF(CMDEF_OS_WINDOWS)
SET(${version_id} "1" PARENT_SCOPE)
RETURN()
ENDIF()
IF(CMDEF_OS_MACOS)
SET(${version_id} "11" PARENT_SCOPE)
RETURN()
ENDIF()
IF(CMDEF_OS_LINUX)
FIND_PROGRAM(CMDEF_LSB_RELEASE lsb_release REQUIRED)
EXECUTE_PROCESS(COMMAND "${CMDEF_LSB_RELEASE}" -r -s
OUTPUT_VARIABLE _version_id
RESULT_VARIABLE result
OUTPUT_STRIP_TRAILING_WHITESPACE
)
IF(NOT (result EQUAL 0))
MESSAGE(FATAL_ERROR "Cannot determine version ID! Set up CMDEF_DISTRO_VERSION_ID manually or repair lsb_release")
ENDIF()
STRING(REGEX REPLACE "[^a-zA-Z0-9.]" "-" _version_id_mapped "${_version_id}")
STRING(TOLOWER "${_version_id_mapped}" _version_id_normalized)
SET(${version_id} "${_version_id_normalized}" PARENT_SCOPE)
RETURN()
ENDIF()
MESSAGE(FATAL_ERROR "Cannot get distro id for unknown OS ${CMDEF_OS_NAME}")
ENDFUNCTION()
CMDEF_ENV_INIT()