1# #################################################################################################
2# ALib.cmake - CMake file for projects using ALib
4# Copyright 2013-2026 A-Worx GmbH, Germany
5# Published under 'Boost Software License' (a free software license, see LICENSE.txt)
7# CMake file for projects using ALib
8# #################################################################################################
10# --------------------------------------------------------------------------------------------------
12# --------------------------------------------------------------------------------------------------
13 cmake_minimum_required(VERSION 3.20)
15 # --------- ALib Version ---------
17 set( ALIB_VERSION "2605R0" CACHE STRING
18 "The ALib version. Not modifiable (will be overwritten on generation!)" FORCE )
20 set( ALIB_VERSION_NO "2605" )
21 set( ALIB_VERSION_REV "0" )
23 # C++20-Module support (optional)
24 if( NOT DEFINED ALIB_C20_MODULES )
25 set( ALIB_C20_MODULES "Off" CACHE PATH
26 "If on, this script will compile ALib using C++20-Modules. Also, in this case, a macro of the same name is passed to the compiler.")
29 if( ALIB_C20_MODULES )
30 if( CMAKE_VERSION VERSION_LESS 3.28 )
31 message( FATAL_ERROR "ALib.cmake: ALIB_C20_MODULES=On requires CMake >= 3.28. Current version: ${CMAKE_VERSION}" )
33 if( NOT (CMAKE_GENERATOR MATCHES "Ninja" OR CMAKE_GENERATOR MATCHES "Visual Studio 17") )
35 "ALib.cmake: ALIB_C20_MODULES=On requires a generator with C++20-Module support. "
36 "Use Ninja, Ninja Multi-Config, or Visual Studio 17.4+. Current generator: ${CMAKE_GENERATOR}" )
38 set(CMAKE_CXX_SCAN_FOR_MODULES ON)
40 set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
44 if (tmp_alib_included_marker)
45 message( FATAL_ERROR "ALib.cmake: Already included (included twice!)" )
48 set(tmp_alib_included_marker "1")
51 # Infer base directory from this script's location
52 if( NOT DEFINED ALIB_BASE_DIR )
53 set( temp "${CMAKE_CURRENT_LIST_DIR}/../.." )
54 get_filename_component(temp ${temp} ABSOLUTE)
55 set( ALIB_BASE_DIR ${temp} CACHE PATH
56 "The base path to ALib containing source code, project files, tools, docs, etc.")
61 if ( NOT EXISTS "${ALIB_BASE_DIR}/src/ALib.Lang.H"
62 OR NOT EXISTS "${ALIB_BASE_DIR}/src/alib" )
63 message( FATAL_ERROR "ALib.cmake: Can't read sources in ALIB_BASE_DIR \"${ALIB_BASE_DIR}\"" )
67 # Check if CMAKE_CXX_STANDARD is defined
68 if(DEFINED CMAKE_CXX_STANDARD)
69 # Verify if it's at least 20
70 if(CMAKE_CXX_STANDARD LESS 20)
71 message(FATAL_ERROR "ALib compilation needs C++20 standard. Given is: ${CMAKE_CXX_STANDARD}")
74 # Set the C++ standard to 20 if not defined
75 set(CMAKE_CXX_STANDARD 20)
76 set(CMAKE_CXX_EXTENSIONS OFF) # Disable compiler-specific extensions
78 set(CMAKE_CXX_STANDARD_REQUIRED ON)
80 # build type defaults to "Debug"
81 if ( CMAKE_BUILD_TYPE STREQUAL "" )
82 set( CMAKE_BUILD_TYPE "Debug" )
85 MESSAGE( STATUS "Build type: ${CMAKE_BUILD_TYPE}" )
87 # include tool functions
88 include( ${CMAKE_CURRENT_LIST_DIR}/ALibTools.cmake )
90 # Remember this cmake directory for use inside functions
91 set(ALIB_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR})
94 if( NOT DEFINED ALIB_CLANG_USE_LIBCPP )
95 set( ALIB_CLANG_USE_LIBCPP "Off" )
97 CacheAsBool( ALIB_CLANG_USE_LIBCPP
98 "Defaults to false. If set and Clang is used, function ALibSetCompilerAndLinker sets compiler and linker flags to use LLVM libc++ instead of GNU libstdc++." )
99 if( ALIB_CLANG_USE_LIBCPP )
100 message( "Using LLVM libc++ (instead of GNU libstdc++)" )
103 # Single-threaded compilation?
104 if( NOT DEFINED ALIB_SINGLE_THREADED )
105 set( ALIB_SINGLE_THREADED "Off" )
107 CacheAsBool( ALIB_SINGLE_THREADED
108 "Defaults to false. Disables multi-threading functionality in ALib." )
109 if( ALIB_SINGLE_THREADED )
110 message( "Single-threaded library compilation" )
113# --------------------------------------------------------------------------------------------------
114# ALib Module Dependency Resolution
115# --------------------------------------------------------------------------------------------------
117 include( ${CMAKE_CURRENT_LIST_DIR}/ALibModules.cmake )
119# --------------------------------------------------------------------------------------------------
120# ALib Cache Variables
121# The variables are only set, if not already predefined prior to invoking this script.
122# --------------------------------------------------------------------------------------------------
124# --------- ALIB_DEBUG, ALIB_DEBUG_GLIB, ALIB_COVERAGE_COMPILE ---------
125if( NOT DEFINED ALIB_DEBUG )
126 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
127 set( ALIB_DEBUG "On" )
129 set( ALIB_DEBUG "Off" )
132CacheAsBool( ALIB_DEBUG
133 "Enable/disable ALib debug code. Defaults to true with debug builds, otherwise to false. Can be set with release builds to identify errors in those." )
135if( NOT DEFINED ALIB_DEBUG_GLIB )
136 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
137 set( ALIB_DEBUG_GLIB "Off" )
139 set( ALIB_DEBUG_GLIB "Off" )
142CacheAsBool( ALIB_DEBUG_GLIB
143 "Defaults to false. If true, the configuration macros '_GLIBCXX_DEBUG', '_GLIBCXX_DEBUG_PEDANTIC' and '_GLIBCPP_CONCEPT_CHECKS' are set." )
146if( NOT DEFINED ALIB_COVERAGE_COMPILE )
147 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
148 set( ALIB_COVERAGE_COMPILE "Off" )
150 set( ALIB_COVERAGE_COMPILE "Off" )
153CacheAsBool( ALIB_COVERAGE_COMPILE
154 "Defaults to false. If true, option --coverage is added to GNU compiler command-line.")
155# --------- ALIB_DEBUG_CRITICAL_SECTIONS, ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH ---------
156if (NOT DEFINED ALIB_DEBUG_CRITICAL_SECTIONS)
157 SetToNot(ALIB_DEBUG_CRITICAL_SECTIONS ALIB_SINGLE_THREADED)
159 AND ALIB_SINGLE_THREADED
160 AND ALIB_DEBUG_CRITICAL_SECTIONS )
161 message( "ALIB_DEBUG_CRITICAL_SECTIONS=On given while ALIB_SINGLE_THREADED=On. Disabling ALIB_DEBUG_CRITICAL_SECTIONS " )
162 Set(ALIB_DEBUG_CRITICAL_SECTIONS "Off")
166 if( ALIB_DEBUG_CRITICAL_SECTIONS )
167 message( "ALIB_DEBUG_CRITICAL_SECTIONS=On given while ALIB_DEBUG=off. Disabling ALIB_DEBUG_CRITICAL_SECTIONS " )
168 Set(ALIB_DEBUG_CRITICAL_SECTIONS "Off")
172CacheAsBool( ALIB_DEBUG_CRITICAL_SECTIONS
173 "Defaults to true unless ALIB_SINGLE_THREADED is set.")
175if ( ALIB_DEBUG_CRITICAL_SECTIONS )
176 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_CRITICAL_SECTIONS" )
178 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_CRITICAL_SECTIONS" )
182if( NOT DEFINED ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH )
184 set( ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH "On" )
186 set( ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH ALIB_SINGLE_THREADED )
190CacheAsBool( ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH
191 "If true, no thread library is searched and bound to the target. If false, a thread library is searched and bound even if module Threads is not included. This is to allow debug assertions with multithreaded use of a single-threaded ALib Build. Defaults to false." )
194# --------- Others ---------
195if( NOT DEFINED ALIB_PRECOMPILED_HEADER )
196 set( ALIB_PRECOMPILED_HEADER "On" CACHE BOOL
197 "If on, header file ’alib_precompile.hpp' will included some default headers, depending on the selected modules. Defaults to on." )
199if ( ALIB_PRECOMPILED_HEADER )
200 list( APPEND ALIB_CFG_MACROS "ALIB_PRECOMPILED_HEADER" )
202 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_PRECOMPILED_HEADER" )
205if( NOT DEFINED ALIB_CMAKE_VERBOSE )
206 set( ALIB_CMAKE_VERBOSE "Off" CACHE BOOL
207 "If true, CMake generation runs will provide a detailed report." )
211# --------- ALIB_DEBUG_ALLOCATIONS ---------
212if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
213 CacheAsBool( ALIB_DEBUG_ALLOCATIONS
214 "Adds allocation debug mechanics with lang::HeapAllocator and ALib Monomem allocators. Defaults to false." )
218# --------- Per module values ---------
219if( "SINGLETONS" IN_LIST ALibBuild )
221 set( platformDefaultFor_SINGLETON_MAPPED "On" )
223 set( platformDefaultFor_SINGLETON_MAPPED "Off" )
225 if( NOT DEFINED ALIB_FEAT_SINGLETON_MAPPED )
226 set( ALIB_FEAT_SINGLETON_MAPPED ${platformDefaultFor_SINGLETON_MAPPED} CACHE BOOL
227 "Defaults to true on Windows OS, which then selects code to implement class Singleton to work with multiple data segments, as imposed by the use of Windows DLLs.")
231if( "BITBUFFER" IN_LIST ALibBuild )
232 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
233 if( NOT DEFINED ALIB_DEBUG_ARRAY_COMPRESSION )
234 set( ALIB_DEBUG_ARRAY_COMPRESSION "On" CACHE BOOL
235 "If true, in debug compilations, compressed arrays are read back to check if result is same. Defaults to true." )
240if( "CONTAINERS" IN_LIST ALibBuild )
241 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
242 if( NOT DEFINED ALIB_DEBUG_CONTAINERS )
243 set( ALIB_DEBUG_CONTAINERS "Off" CACHE BOOL
244 "Adds debug features to module ALib Containers. Defaults to false." )
249if( "MONOMEM" IN_LIST ALibBuild )
250 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
251 if( NOT DEFINED ALIB_DEBUG_MEMORY )
252 set( ALIB_DEBUG_MEMORY "Off" CACHE BOOL
253 "Adds consistency checks and collection of statistics with module ALib Monomem. Defaults to false." )
259if( "BOXING" IN_LIST ALibBuild )
260 if( NOT DEFINED ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS )
261 set( ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS "Off" CACHE BOOL
262 "If true, any C++ integral type will be boxed to its original type. If false (the default) all types are boxed to type 'integer', respectively / 'uinteger' and only this can be unboxed.")
265 if( NOT DEFINED ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS )
266 set( ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS "Off" CACHE BOOL
267 "If true, any C++ character type will be boxed to its original type. If false (the default) all types are boxed to type 'character' and only this can be unboxed.")
270 if( NOT DEFINED ALIB_FEAT_BOXING_BIJECTIVE_FLOATS )
271 set( ALIB_FEAT_BOXING_BIJECTIVE_FLOATS "Off" CACHE BOOL
272 "If true, type float will be boxed as float. If false (the default) float will be boxed as double and cannot be unboxed.")
275 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
276 if( NOT DEFINED ALIB_DEBUG_BOXING )
277 set( ALIB_DEBUG_BOXING "Off" CACHE BOOL
278 "Adds collection of statistics and debug methods to module ALib Boxing. Defaults to false." )
285 set( defaultALIB_CHARACTERS_WIDE "On" )
286 set( defaultALIB_CHARACTERS_SIZEOF_WCHAR "2" )
288 set( defaultALIB_CHARACTERS_WIDE "Off" )
289 set( defaultALIB_CHARACTERS_SIZEOF_WCHAR "4" )
292 if( NOT DEFINED ALIB_CHARACTERS_WIDE )
293 set( ALIB_CHARACTERS_WIDE ${defaultALIB_CHARACTERS_WIDE} CACHE BOOL
294 "If false, the type 'alib::character' is 1-byte wide, otherwise it has the width given with ALIB_CHARACTERS_SIZEOF_WCHAR. Default value depends on platform preference.")
297 if( NOT DEFINED ALIB_CHARACTERS_SIZEOF_WCHAR )
298 set( ALIB_CHARACTERS_SIZEOF_WCHAR ${defaultALIB_CHARACTERS_SIZEOF_WCHAR} CACHE STRING
299 "The width of wide characters, maybe 2 or 4. Default value depends on platform/compiler preference.")
303if( "STRINGS" IN_LIST ALibBuild )
304 if( NOT DEFINED ALIB_FEAT_BOOST_REGEX )
305 set( ALIB_FEAT_BOOST_REGEX "Off" CACHE BOOL
306 "Defaults to false. If true, activates ALib classes that use boost regular expressions, for example, strings::util::RegexMatcher. The corresponding boost library is searched and added to CMake variable ALIB_EXTERNAL_LIBS.")
309 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
310 if( NOT DEFINED ALIB_DEBUG_STRINGS )
311 set( ALIB_DEBUG_STRINGS "Off" CACHE BOOL
312 "Defaults to false. Adds consistency checks to ALib string classes. Useful when developing code to manipulate strings externally, i.e AppendableTraits to specializations.")
317if( "CAMP" IN_LIST ALibBuild )
318 if( NOT DEFINED ALIB_CAMP_OMIT_DEFAULT_RESOURCES )
319 set( ALIB_CAMP_OMIT_DEFAULT_RESOURCES "Off" CACHE BOOL
320 "If true, ALib modules do not add default versions of resource strings. See section 'Bootstrapping' of ALib Programmer's Manual for more information. Defaults to false.")
323 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
324 CacheAsBool( ALIB_DEBUG_RESOURCES
325 "Adds collection of statistics and resource export with module ALib Resources. Defaults to false." )
330if( "FILETREE" IN_LIST ALibBuild )
331 if( NOT DEFINED ALIB_SYSTEM_FORCE_STD_FILE_STATUS )
332 set( ALIB_SYSTEM_FORCE_STD_FILE_STATUS "Off" CACHE BOOL
333 "If true, file scanning of ALib camp 'Files' falls back to a basic implementation using C++ library std::filesystem.")
337if( "ALOX" IN_LIST ALibBuild )
339 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
340 set( defaultALOX_DBG_LOG "On" )
342 set( defaultALOX_DBG_LOG "Off" )
344 if( NOT DEFINED ALOX_DBG_LOG )
345 set( ALOX_DBG_LOG ${defaultALOX_DBG_LOG} CACHE BOOL
346 "Enable/disable debug log statements. Defaults to true with debug builds, otherwise to false." )
349 if( NOT DEFINED ALOX_DBG_LOG_CI )
350 set( ALOX_DBG_LOG_CI "On" CACHE BOOL
351 "Defaults to true. If set, caller information is used with debug log statements." )
354 if( NOT DEFINED ALOX_REL_LOG )
355 set( ALOX_REL_LOG "On" CACHE BOOL
356 "Enable/disable release log statements. Defaults to true." )
359 if( NOT DEFINED ALOX_REL_LOG_CI )
360 set( ALOX_REL_LOG_CI "Off" CACHE BOOL
361 "Defaults to false. If set, caller information is used even with release log statements (and even in release builds!)" )
365# --------------------------------------------------------------------------------------------------
366# Configuration macros
367# --------------------------------------------------------------------------------------------------
370if( NOT ALibAllModules )
372 LIST( APPEND moduleList "ALOX;APP;BITBUFFER;BOXING;CAMP;CONTAINERS" )
373 LIST( APPEND moduleList "ENUMRECORDS;EXCEPTIONS;EXPRESSIONS;FILETREE;FORMAT" )
374 LIST( APPEND moduleList "MONOMEM;RESOURCES;SINGLETONS;STRINGS;SYSTEM" )
375 LIST( APPEND moduleList "THREADMODEL;VARIABLES" )
376 FOREACH( module IN LISTS moduleList )
377 IF( module IN_LIST ALibBuild )
378 list( APPEND ALIB_CFG_MACROS "ALIB_${module}" )
383# symbol ALIB_C20_MODULES
384if ( ALIB_C20_MODULES )
385 list( APPEND ALIB_CFG_MACROS "ALIB_C20_MODULES=1")
387 list( APPEND ALIB_CFG_MACROS "ALIB_C20_MODULES=0")
392 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG" )
394 if ( ALIB_DEBUG_GLIB )
395 list( APPEND ALIB_CFG_MACROS "_GLIBCXX_DEBUG"
396 "_GLIBCXX_DEBUG_PEDANTIC"
397 "_GLIBCPP_CONCEPT_CHECKS" )
399 list( APPEND ALIB_SYMBOLS_UNUSED "_GLIBCXX_DEBUG"
400 "_GLIBCXX_DEBUG_PEDANTIC"
401 "_GLIBCPP_CONCEPT_CHECKS" )
406if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
407 if ( ALIB_DEBUG_ALLOCATIONS )
408 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_ALLOCATIONS" )
410 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_ALLOCATIONS" )
415if( "SINGLETONS" IN_LIST ALibBuild )
416 if (NOT platformDefaultFor_SINGLETON_MAPPED STREQUAL ALIB_FEAT_SINGLETON_MAPPED)
417 if ( ALIB_FEAT_SINGLETON_MAPPED )
418 list( APPEND ALIB_CFG_MACROS "ALIB_FEAT_SINGLETON_MAPPED" )
420 list( APPEND ALIB_CFG_MACROS "ALIB_FEAT_SINGLETON_MAPPED=0" )
423 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_SINGLETON_MAPPED=0" )
427if( "BITBUFFER" IN_LIST ALibBuild )
428 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
429 if ( ALIB_DEBUG_ARRAY_COMPRESSION )
430 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_ARRAY_COMPRESSION=1" )
432 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_ARRAY_COMPRESSION=0" )
437if( "BOXING" IN_LIST ALibBuild )
438 if ( ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS )
439 list( APPEND ALIB_CFG_MACROS "ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS" )
441 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS" )
443 if ( ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS )
444 list( APPEND ALIB_CFG_MACROS "ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS" )
446 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS" )
448 if ( ALIB_FEAT_BOXING_BIJECTIVE_FLOATS )
449 list( APPEND ALIB_CFG_MACROS "ALIB_FEAT_BOXING_BIJECTIVE_FLOATS" )
451 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOXING_BIJECTIVE_FLOATS" )
453 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
454 if( ALIB_DEBUG_BOXING )
455 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_BOXING" )
457 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_BOXING" )
463 if (NOT (defaultALIB_CHARACTERS_WIDE STREQUAL ALIB_CHARACTERS_WIDE ))
464 if ( ALIB_CHARACTERS_WIDE )
465 list( APPEND ALIB_CFG_MACROS "ALIB_CHARACTERS_WIDE" )
467 list( APPEND ALIB_CFG_MACROS "ALIB_CHARACTERS_WIDE=0" )
470 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CHARACTERS_WIDE" )
473 if (NOT defaultALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL ALIB_CHARACTERS_SIZEOF_WCHAR)
474 if ( NOT (ALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL "2" OR ALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL "4") )
475 message( FATAL_ERROR "Value of ALIB_CHARACTERS_SIZEOF_WCHAR must be 2 or 4" )
478 list( APPEND ALIB_CFG_MACROS "ALIB_CHARACTERS_SIZEOF_WCHAR=${ALIB_CHARACTERS_SIZEOF_WCHAR}" )
480 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CHARACTERS_SIZEOF_WCHAR=${ALIB_CHARACTERS_SIZEOF_WCHAR}" )
484if( "CONTAINERS" IN_LIST ALibBuild
485 AND CMAKE_BUILD_TYPE STREQUAL "Debug" )
486 if ( ALIB_DEBUG_CONTAINERS )
487 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_CONTAINERS" )
489 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_CONTAINERS" )
493if( ALIB_SINGLE_THREADED )
494 list( APPEND ALIB_CFG_MACROS "ALIB_SINGLE_THREADED" )
496 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_SINGLE_THREADED" )
498 if( CMAKE_BUILD_TYPE STREQUAL "Debug" )
499 if ( ALIB_DEBUG_CRITICAL_SECTIONS )
500 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_CRITICAL_SECTIONS" )
502 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_CRITICAL_SECTIONS" )
508if( "MONOMEM" IN_LIST ALibBuild )
510 if ( ALIB_DEBUG_MEMORY )
511 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_MEMORY" )
513 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_MEMORY" )
518if( "STRINGS" IN_LIST ALibBuild )
519 if ( ALIB_FEAT_BOOST_REGEX )
520 list( APPEND ALIB_CFG_MACROS "ALIB_FEAT_BOOST_REGEX" )
522 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOOST_REGEX" )
526 if ( ALIB_DEBUG_STRINGS )
527 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_STRINGS" )
529 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_STRINGS" )
534if( "CAMP" IN_LIST ALibBuild )
536 if( ALIB_CAMP_OMIT_DEFAULT_RESOURCES )
537 list( APPEND ALIB_CFG_MACROS "ALIB_CAMP_OMIT_DEFAULT_RESOURCES" )
539 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CAMP_OMIT_DEFAULT_RESOURCES" )
542 if( ALIB_CAMP_RESOURCE_COMPILATION )
543 list( APPEND ALIB_CFG_MACROS "ALIB_CAMP_RESOURCE_COMPILATION" )
545 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CAMP_RESOURCE_COMPILATION" )
550 if( ALIB_DEBUG_RESOURCES )
551 list( APPEND ALIB_CFG_MACROS "ALIB_DEBUG_RESOURCES" )
553 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_RESOURCES" )
558if( "FILETREE" IN_LIST ALibBuild )
559 if ( ALIB_SYSTEM_FORCE_STD_FILE_STATUS )
560 list( APPEND ALIB_CFG_MACROS "ALIB_SYSTEM_FORCE_STD_FILE_STATUS" )
562 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_SYSTEM_FORCE_STD_FILE_STATUS" )
566if( "ALOX" IN_LIST ALibBuild )
568 if (NOT defaultALOX_DBG_LOG STREQUAL ALOX_DBG_LOG)
569 if( NOT ALOX_DBG_LOG )
570 list( APPEND ALIB_CFG_MACROS "ALOX_DBG_LOG" )
572 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG" )
575 if ( NOT ALOX_DBG_LOG_CI )
576 list( APPEND ALIB_CFG_MACROS "ALOX_DBG_LOG_CI=0" )
578 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG_CI=0" )
581 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG" )
582 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG_CI" )
585 if ( NOT ALOX_REL_LOG )
586 list( APPEND ALIB_CFG_MACROS "ALOX_REL_LOG=0" )
588 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_REL_LOG=0" )
590 if ( ALOX_REL_LOG_CI )
591 list( APPEND ALIB_CFG_MACROS "ALOX_REL_LOG_CI" )
593 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_REL_LOG_CI" )
599# --------------------------------------------------------------------------------------------------
600# ALib Source File Definition
601# --------------------------------------------------------------------------------------------------
602include( ${CMAKE_CURRENT_LIST_DIR}/ALibSources.cmake )
605# --------------------------------------------------------------------------------------------------
607# --------------------------------------------------------------------------------------------------
608if ( NOT ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH )
609 find_package(Threads)
611 list( APPEND ALIB_CFG_MACROS "ALIB_EXT_LIB_THREADS_AVAILABLE" )
612 if(CMAKE_USE_PTHREADS_INIT)
613 list( APPEND ALIB_COMPILER_OPTIONS "-pthread" )
617 list( APPEND ALIB_EXTERNAL_LIBS ${CMAKE_THREAD_LIBS_INIT} )
620if ( ALIB_FEAT_BOOST_REGEX )
621 set(Boost_USE_STATIC_LIBS "On" CACHE BOOL "Link boost statically" )
622 if( NOT DEFINED ALIB_SINGLE_THREADED )
623 set(Boost_USE_MULTITHREADED "On" CACHE BOOL "Use multithreaded version of boost")
625 set(Boost_USE_MULTITHREADED "Off" CACHE BOOL "Use single-threaded version of boost")
628 # We do not use the the new boost installation behaviour behavior for this call:
629 find_package( Boost CONFIG REQUIRED COMPONENTS regex )
632 list( APPEND ALIB_EXTERNAL_LIBS Boost::regex )
633 if(Boost_USE_STATIC_LIBS)
634 message(STATUS "Found Boost version ${Boost_LIB_VERSION}, linking against boost static libraries")
636 message(STATUS "Found Boost version ${Boost_LIB_VERSION}, linking against boost shared libraries")
639 MESSAGE("Attention: Boost::regex requested, but library not found!")
644 list( APPEND ALIB_EXTERNAL_LIBS "-framework Foundation")
649 list( APPEND ALIB_EXTERNAL_LIBS "m")
656# --------------------------------------------------------------------------------------------------
657# A-Worx compiler features and flags
658# --------------------------------------------------------------------------------------------------
660# Set minimum required standard C++20
661list( APPEND ALIB_COMPILER_FEATURES "cxx_std_20" )
663# if "ALIB_SUPPRESS_COMPILER_WARNINGS" is set prior to invoking this script, this entry is removed
664# and nothing is added.
665if ("ALIB_SUPPRESS_COMPILER_WARNINGS" IN_LIST ALIB_COMPILER_WARNINGS)
666 LIST( REMOVE_ITEM ALIB_COMPILER_WARNINGS "ALIB_SUPPRESS_COMPILER_WARNINGS" )
668 if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
669 # add -H to generate output "!/x" for use of precompiled header
670 list( APPEND ALIB_COMPILER_WARNINGS "-Wall" )
671 list( APPEND ALIB_COMPILER_WARNINGS "-Wextra" )
672 #list( APPEND ALIB_COMPILER_WARNINGS "-Weffc++" )
673 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-psabi" )
674 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-misleading-indentation" )
676 # this was "suddenly" needed with GCC 13.2.1 with release compilation
677 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-stringop-overread" )
679 # add coverage flags to GCC
680 if( ALIB_COVERAGE_COMPILE )
681 list( APPEND ALIB_COMPILER_OPTIONS "--coverage" )
682 list( APPEND ALIB_LINKER_OPTIONS "--coverage" )
685 # force unicode (needed for mingw)
687 list( APPEND ALIB_COMPILER_OPTIONS "-municode" )
688 list( APPEND ALIB_COMPILER_OPTIONS "-DUNICODE" )
689 list( APPEND ALIB_COMPILER_OPTIONS "-D_UNICODE" )
693 # Clang: We are using -Weverything, although this is not recommended. We think it should be
694 # recommended. ALib, for example, does not use old-style casts and explicitly cast each
695 # and every type change! The benefit for ALib users is that ALib code can be used in very
696 # strict build environments without using special warning flags.
697 # Of course, some very obvious warnings then have to be removed explicitly:
698 elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
699 list( APPEND ALIB_COMPILER_WARNINGS "-pedantic" )
700 list( APPEND ALIB_COMPILER_WARNINGS "-Weffc++" )
701 list( APPEND ALIB_COMPILER_WARNINGS "-Weverything" )
702 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-unknown-warning-option" )
703 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++20-extensions" )
704 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++20-compat" )
705 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++98-compat" )
706 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++98-compat-pedantic" )
707 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-covered-switch-default" )
708 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-decls-in-multiple-modules" )
709 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-deprecated-declarations" )
710 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-documentation-unknown-command" )
711 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-exit-time-destructors" )
712 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-global-constructors" )
713 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-ms-bitfield-padding" )
714 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-misleading-indentation" )
715 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-padded" )
716 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-weak-vtables" )
717 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-thread-safety-analysis" )
719 # Note: After fighting with this for a while and locally removing the warning in many
720 # places, we gave up with Clang 19 and C++20-Module compilation. Strangely, with the
721 # latter activated, Clang became even more suspicious and we decided to switch it off.
722 # It seems that also a bigger part of the community sees it that way. Where is the
723 # point to using a std::array instead of a C-array when std::array does no bounds
725 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-unsafe-buffer-usage" )
727 if( CMAKE_BUILD_TYPE STREQUAL "Debug" )
728 list( APPEND ALIB_COMPILER_OPTIONS "-fno-limit-debug-info" )
732 elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
733 list( APPEND ALIB_COMPILER_WARNINGS "/W4" )
734 ##list( APPEND ALIB_COMPILER_WARNINGS "/WX" )
735 list( APPEND ALIB_COMPILER_WARNINGS "/EHsc" )
736 # Disable warning on class Exception having a protected base type.
737 list( APPEND ALIB_COMPILER_WARNINGS "/wd4670" )
738 list( APPEND ALIB_COMPILER_WARNINGS "/wd4673" )
739 list( APPEND ALIB_COMPILER_WARNINGS "/wd4702" )
743# --------------------------------------------------------------------------------------------------
744# A-Worx linker features and flags
745# --------------------------------------------------------------------------------------------------
747 list( APPEND ALIB_LINKER_OPTIONS "-lObjc" )
749 list( APPEND ALIB_LINKER_OPTIONS "" )
753# -------------------------------------------------------------------------------------------------
754# Set filename of ALib library (if not given in ALIB_LIBRARY_FILENAME)
755# -------------------------------------------------------------------------------------------------
756if ( NOT ALIB_LIBRARY_FILENAME )
757 set( ALIB_LIBRARY_FILENAME "alib_${ALIB_VERSION_NO}R${ALIB_VERSION_REV}" )
760 if ( (CMAKE_BUILD_TYPE STREQUAL "Debug") )
761 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}DBG )
763 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}RELDBG )
765 if( DEFINED ALIB_SINGLE_THREADED )
766 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_ST )
768 if ( ALIB_DEBUG_CRITICAL_SECTIONS )
769 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DCS )
771 if ( ALIB_DEBUG_ALLOCATIONS )
772 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DALC )
775 if ( (CMAKE_BUILD_TYPE STREQUAL "Debug") )
776 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}DBGREL )
781 if ( ${ALIB_FEAT_SINGLETON_MAPPED} )
782 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_MS )
784 if ( ${ALIB_CHARACTERS_WIDE} )
785 if ( ALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL "2" )
786 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_WC2 )
788 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_WC4 )
791 if ( ${ALIB_FEAT_BOOST_REGEX} )
792 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BREGEX )
794 if ( ${ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS} )
795 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BIJCHARS )
797 if ( ${ALIB_FEAT_BOXING_BIJECTIVE_FLOATS} )
798 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BIJFLOATS )
800 if ( ${ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS} )
801 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BIJINTS )
804 # Add all module's names, prefixed by "DBG" if special debug flag is set
805 if( NOT ALibAllModules )
806 FOREACH(modName IN LISTS ALibBuild)
809 IF( modName STREQUAL "BOXING" )
810 if ( ALIB_DEBUG_BOXING AND ALIB_DEBUG )
811 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGBOXING )
813 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BOXING )
816 # CONTAINERS debug mode?
817 ELSEIF( modName STREQUAL "CONTAINERS" )
818 if ( ALIB_DEBUG_CONTAINERS AND ALIB_DEBUG )
819 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGCONTAINERS )
821 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_CONTAINERS )
824 # MONOMEM debug mode?
825 ELSEIF( modName STREQUAL "MONOMEM" )
826 if ( ALIB_DEBUG_MEMORY AND ALIB_DEBUG )
827 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGMONOMEM )
829 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_MONOMEM )
832 # STRINGS debug mode?
833 ELSEIF( modName STREQUAL "STRINGS" )
834 if ( ALIB_DEBUG_STRINGS AND ALIB_DEBUG )
835 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGSTRINGS )
837 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_STRINGS )
840 # RESOURCES debug mode?
841 ELSEIF( modName STREQUAL "RESOURCES" )
842 if ( ALIB_DEBUG_RESOURCES AND ALIB_DEBUG )
843 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGRESOURCES )
845 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_RESOURCES )
848 # ALOX: add non-default feature s
849 ELSEIF( modName STREQUAL "ALOX" )
850 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_ALOX )
851 if ( (CMAKE_BUILD_TYPE STREQUAL "Debug") AND (NOT ${ALOX_DBG_LOG}) )
852 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}NDL )
855 if ( NOT ALOX_REL_LOG )
856 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}NRL )
859 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_${modName} )
865 # Remove all dependent modules from the name, which are not added in a debug version:
866 list( FIND ALibBuild "BOXING" idx )
868 STRING(REPLACE "_SINGLETONS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
871 list( FIND ALibBuild "ENUMRECORDS" idx )
873 STRING(REPLACE "_SINGLETONS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
874 STRING(REPLACE "_STRINGS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
877 list( FIND ALibBuild "BITBUFFER" idx )
879 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
880 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
883 list( FIND ALibBuild "THREADMODEL" idx )
885 STRING(REPLACE "_BOXING" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
886 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
887 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
890 list( FIND ALibBuild "SYSTEM" idx )
892 STRING(REPLACE "_BOXING" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
893 STRING(REPLACE "_ENUMRECORDS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
896 list( FIND ALibBuild "RESOURCES" idx )
898 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
899 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
900 STRING(REPLACE "_STRINGS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
903 list( FIND ALibBuild "EXCEPTIONS" idx )
905 STRING(REPLACE "_RESOURCES" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
906 STRING(REPLACE "_BOXING" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
907 STRING(REPLACE "_ENUMRECORDS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
910 list( FIND ALibBuild "VARIABLES" idx )
912 STRING(REPLACE "_SYSTEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
913 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
914 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
917 list( FIND ALibBuild "FORMAT" idx )
919 STRING(REPLACE "_EXCEPTIONS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
923 list( FIND ALibBuild "CAMP" idx )
925 STRING(REPLACE "_FORMAT" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
926 STRING(REPLACE "_VARIABLES" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
929 list( FIND ALibBuild "ALOX" idx )
931 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
934 list( FIND ALibBuild "APP" idx )
936 STRING(REPLACE "_ALOX" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
939 list( FIND ALibBuild "EXPRESSIONS" idx )
941 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
944 list( FIND ALibBuild "FILETREE" idx )
946 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
949 endif() # not all modules
954# -------------------------------------------------------------------------------------------------
955# Display result summary
956# -------------------------------------------------------------------------------------------------
957message( "ALib CMake Configuration:" )
958 message( " Modules requested : ${ALIB_BUILD}" )
959IF( NOT ALibAllModules )
960 message( " Resulting Selection: ${ALibBuild}" )
961 message( " Omitted Modules : ${ALibOmittedModules}" )
963 message( " Resulting Selection: All (${ALibBuild})" )
966 message( " Single-Threaded : ${ALIB_SINGLE_THREADED}" )
968 message( " Library filename : ${ALIB_LIBRARY_FILENAME}" )
969 message( " Compiler ID : ${CMAKE_CXX_COMPILER_ID}" )
971IF( NOT ALIB_CMAKE_VERBOSE )
972 message( " (For further details enable CMake variable 'ALIB_CMAKE_VERBOSE')" )
975 message( " Source folder : ${ALIB_SOURCE_DIR}" )
976 LIST( LENGTH ALIB_H length)
977 message( " File types : *.H: ${length} files" )
978 LIST( LENGTH ALIB_MODIF length)
979 message( " *.ixx: ${length} files" )
980 LIST( LENGTH ALIB_HPP length)
981 message( " *.hpp: ${length} files" )
982 LIST( LENGTH ALIB_UNI length)
983 message( " *.uni.cpp: ${length} files" )
984 LIST( LENGTH ALIB_MOD length)
985 message( " *.mod.cpp: ${length} files" )
986 LIST( LENGTH ALIB_UNI length)
987 message( " *.imp: ${length} files" )
988 LIST( LENGTH ALIB_MACROS length)
989 message( " *.prepro.hpp: ${length} files" )
990 LIST( LENGTH ALIB_RC length)
991 message( " *.alibrc: ${length} files" )
993 LIST( APPEND result ${ALIB_H} )
994 LIST( APPEND result ${ALIB_MODIF} )
995 LIST( APPEND result ${ALIB_HPP} )
996 LIST( APPEND result ${ALIB_UNI} )
997 LIST( APPEND result ${ALIB_MOD} )
998 LIST( APPEND result ${ALIB_UNI} )
999 LIST( APPEND result ${ALIB_MACROS} )
1000 LIST( APPEND result ${ALIB_RC} )
1002 LIST( LENGTH result length)
1003 message( " Total: ${length} source files." )
1004 message( "\n List of files:" )
1005 FOREACH( entry IN LISTS result )
1006 STRING(REPLACE "${ALIB_SOURCE_DIR}/" "" entry ${entry} )
1007 message( " ${entry}" )
1011 LIST( APPEND result ${ALIB_CFG_MACROS} )
1013 LIST( LENGTH result length)
1014 message( "\n Compiler definitions (${length} items):" )
1015 FOREACH( entry IN LISTS result )
1016 message( " ${entry}" )
1021 LIST( APPEND result ${ALIB_SYMBOLS_UNUSED} )
1023 LIST( LENGTH result length)
1024 message( "\n Compiler definitions NOT given/omitted (${length} items):" )
1025 FOREACH( entry IN LISTS result )
1026 message( " ${entry}" )
1030 LIST( APPEND result ${ALIB_COMPILER_WARNINGS} )
1032 LIST( LENGTH result length)
1033 message( "\n Compiler warnings (${length} items):" )
1034 FOREACH( entry IN LISTS result )
1035 message( " ${entry}" )
1039 LIST( APPEND result ${ALIB_COMPILER_OPTIONS} )
1041 LIST( LENGTH result length)
1042 message( "\n Compiler flags (${length} items):" )
1043 FOREACH( entry IN LISTS result )
1044 message( " ${entry}" )
1048 LIST( APPEND result ${ALIB_COMPILER_FEATURES} )
1050 LIST( LENGTH result length)
1051 message( "\n Compiler features (${length} items):" )
1052 FOREACH( entry IN LISTS result )
1053 message( " ${entry}" )
1057 LIST( APPEND result ${ALIB_EXTERNAL_LIBS} )
1059 LIST( LENGTH result length)
1060 message( "\n External libraries (${length} items):" )
1061 FOREACH( entry IN LISTS result )
1062 message( " ${entry}" )
1066 LIST( APPEND result ${ALIB_LINKER_OPTIONS} )
1068 LIST( LENGTH result length)
1069 message( "\n Linker flags (${length} items):" )
1070 FOREACH( entry IN LISTS result )
1071 message( " ${entry}" )
1078# -------------------------------------------------------------------------------------------------
1079# ALibFilterSupportedCompilerFlags()
1080# Checks the flags in the given list for compatibility with current C/C++ compiler.
1081# -------------------------------------------------------------------------------------------------
1082include(CheckCCompilerFlag)
1083include(CheckCXXCompilerFlag)
1085# filter_supported_flags(<C|CXX> <out-var> <flags...>)
1086macro(ALibFilterSupportedCompilerFlags LANG VAR)
1087 # Short-circuit only in actual try_compile sub-configures
1088 if(DEFINED CMAKE_TRY_COMPILE OR PROJECT_NAME MATCHES "^cmTC_")
1089 set(${VAR} "${ARGN}")
1094 #message(STATUS "filter_supported_flags: LANG=${LANG} input=[${ARGN}]")
1096 set(_saved ${CMAKE_REQUIRED_QUIET})
1097 set(CMAKE_REQUIRED_QUIET ON)
1100 foreach(FLAG ${ARGN}) # classic form—works on all CMake versions
1102 "${CMAKE_${LANG}_COMPILER_ID};${CMAKE_${LANG}_COMPILER_VERSION};${LANG};${FLAG}")
1104 if(LANG STREQUAL "C")
1105 check_c_compiler_flag("${FLAG}" _has_${_key})
1107 list(APPEND _supported "${FLAG}")
1109 message("ALib: Dropping compiler flag '${FLAG}' (not supported)")
1111 elseif(${LANG} STREQUAL "CXX")
1112 check_cxx_compiler_flag("${FLAG}" _has_${_key})
1114 list(APPEND _supported "${FLAG}")
1116 message("ALib: Dropping compiler flag '${FLAG}' (not supported)")
1119 message(FATAL_ERROR "filter_supported_flags: LANG must be C or CXX. Given ${LANG}")
1123 set(CMAKE_REQUIRED_QUIET ${_saved})
1124 set(${VAR} "${_supported}") # macro: mutates caller scope
1125 #message(STATUS "filter_supported_flags: output=[${${VAR}}]")
1129# -------------------------------------------------------------------------------------------------
1130# ALibSetCompilerAndLinker(target)
1132# Simple CMake function that sets
1134# - ALIB_COMPILER_FEATURES
1135# - ALIB_COMPILER_OPTIONS
1136# - ALIB_COMPILER_WARNINGS
1137# - ALIB_LINKER_OPTIONS
1139# In addition, position independent compile (-fPic) is enabled (for static libraries its default
1140# is off with CMake).
1141# -------------------------------------------------------------------------------------------------
1142function( ALibSetCompilerAndLinker target )
1143 message("${target}: Applying ALib compiler and linker settings")
1146 ALibFilterSupportedCompilerFlags(CXX ALIB_COMPILER_WARNINGS ${ALIB_COMPILER_WARNINGS})
1147 target_compile_features ( ${target} PRIVATE ${ALIB_COMPILER_FEATURES} )
1148 target_compile_options ( ${target} PRIVATE ${ALIB_COMPILER_OPTIONS} )
1149 target_compile_options ( ${target} PRIVATE ${ALIB_COMPILER_WARNINGS} )
1150 set_property ( TARGET ${target} PROPERTY POSITION_INDEPENDENT_CODE ON )
1151 target_include_directories( ${target} PUBLIC ${ALIB_SOURCE_DIR} )
1153 IF(DEFINED ALIB_PRECOMPILED_HEADER)
1154 IF(ALIB_PRECOMPILED_HEADER)
1155 target_precompile_headers( ${target} PRIVATE "${ALIB_SOURCE_DIR}/alib_precompile.hpp" )
1160 target_compile_definitions( ${target} PUBLIC ${ALIB_CFG_MACROS} )
1163 IF( NOT ALIB_LINKER_OPTIONS STREQUAL "" )
1164 set_target_properties ( ${target} PROPERTIES LINK_FLAGS ${ALIB_LINKER_OPTIONS} )
1166 IF( NOT ALIB_EXTERNAL_LIBS STREQUAL "" )
1167 target_link_libraries ( ${target} PRIVATE ${ALIB_EXTERNAL_LIBS} )
1170 # Use clang's own stdc++ library if requested
1171 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND ALIB_CLANG_USE_LIBCPP )
1172 target_compile_options(${target} PRIVATE -stdlib=libc++)
1173 target_link_libraries( ${target} PRIVATE c++)
1176 # With MSVC force UTF8 encoding of string literals
1178 target_compile_options(${target} PRIVATE /utf-8)
1183# -------------------------------------------------------------------------------------------------
1185# -------------------------------------------------------------------------------------------------
1186function( ALibAddStaticLibrary )
1188 add_library ( ALib_StaticLib STATIC )
1190 if( ALIB_C20_MODULES )
1191 set_source_files_properties( ${ALIB_MODIF} ${ALIB_MOD}
1192 PROPERTIES COMPILE_DEFINITIONS "ALIB_C20_MODULES=1" )
1193 target_sources ( ALib_StaticLib
1195 FILE_SET cxx_modules TYPE CXX_MODULES
1196 BASE_DIRS "${ALIB_SOURCE_DIR}/alib"
1197 FILES ${ALIB_MODIF} )
1198 target_sources ( ALib_StaticLib PRIVATE ${ALIB_MOD} )
1200 target_sources ( ALib_StaticLib PRIVATE ${ALIB_UNI} )
1202 message("ALib_StaticLib target added")
1204 ALibSetCompilerAndLinker ( ALib_StaticLib )
1205 set_target_properties ( ALib_StaticLib PROPERTIES ARCHIVE_OUTPUT_NAME ${ALIB_LIBRARY_FILENAME} )
1209function( ALibAddSharedLibrary )
1210 add_library ( ALib_SharedLib SHARED )
1211 if( ALIB_C20_MODULES )
1212 set_source_files_properties( ${ALIB_MODIF} ${ALIB_MOD}
1213 PROPERTIES COMPILE_DEFINITIONS "ALIB_C20_MODULES=1" )
1214 target_sources ( ALib_SharedLib
1216 FILE_SET cxx_modules TYPE CXX_MODULES
1217 BASE_DIRS "${ALIB_SOURCE_DIR}/alib"
1218 FILES ${ALIB_MODIF} )
1219 target_sources ( ALib_SharedLib PRIVATE ${ALIB_MOD} )
1221 target_sources ( ALib_SharedLib PRIVATE ${ALIB_UNI} )
1223 message("ALib_SharedLib target added")
1225 ALibSetCompilerAndLinker ( ALib_SharedLib )
1226 set_target_properties ( ALib_SharedLib PROPERTIES LIBRARY_OUTPUT_NAME ${ALIB_LIBRARY_FILENAME} )
1229 target_compile_definitions(ALib_SharedLib PRIVATE "ALIB_API_IS_DLL" )
1235# --------------------------------------------------------------------------------------------------
1236# CMake debugging Uncomment a line to have CMake summarize information
1237# --------------------------------------------------------------------------------------------------
1238#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} INCLUDE_DIRECTORIES )
1239#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} SOURCES )
1240#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} COMPILE_DEFINITIONS )
1241#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} COMPILE_OPTIONS )
1242#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} COMPILE_FEATURES )
1243#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} AUTOUIC_OPTIONS )
1244#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} POSITION_INDEPENDENT_CODE )
1245#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} CONTAINER_SIZE_REQUIRED )
1246#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} LIB_VERSION )
1248set(CMAKE_VERBOSE_MAKEFILE ON)
1249set(CMAKE_RULE_MESSAGES ON )