1# #################################################################################################
2# ALib.cmake - CMake file for projects using ALib
4# Copyright 2013-2025 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) # For C++ 20 module compilation, V. 3.28 is needed
15 # --------- ALib Version ---------
17 set( ALIB_VERSION "2511R0" CACHE STRING
18 "The ALib version. Not modifiable (will be overwritten on generation!)" FORCE )
20 set( ALIB_VERSION_NO "2511" )
21 set( ALIB_VERSION_REV "0" )
25 # C++20 module support is deprecated!
26 if( NOT DEFINED ALIB_C20_MODULES )
27 set( ALIB_C20_MODULES "Off")
28 #set( ALIB_C20_MODULES "Off" CACHE PATH
29 # "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.")
32 if( ALIB_C20_MODULES )
33 message( FATAL_ERROR "ALib.cmake: ALIB configured to use C++20 modules. As of today, the effort to offer dual-compile support is dropped and not supported" )
35 set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
38 if (tmp_alib_included_marker)
39 message( FATAL_ERROR "ALib.cmake: Already included (included twice!)" )
42 set(tmp_alib_included_marker "1")
45 # Infer base directory from this script's location
46 if( NOT DEFINED ALIB_BASE_DIR )
47 set( temp "${CMAKE_CURRENT_LIST_DIR}/../.." )
48 get_filename_component(temp ${temp} ABSOLUTE)
49 set( ALIB_BASE_DIR ${temp} CACHE PATH
50 "The base path to ALib containing source code, project files, tools, docs, etc.")
55 if ( NOT EXISTS "${ALIB_BASE_DIR}/src/ALib.Lang.H"
56 OR NOT EXISTS "${ALIB_BASE_DIR}/src/alib" )
57 message( FATAL_ERROR "ALib.cmake: Can't read sources in ALIB_BASE_DIR \"${ALIB_BASE_DIR}\"" )
61 # Check if CMAKE_CXX_STANDARD is defined
62 if(DEFINED CMAKE_CXX_STANDARD)
63 # Verify if it's at least 20
64 if(CMAKE_CXX_STANDARD LESS 20)
65 message(FATAL_ERROR "ALib compilation needs C++20 standard. Given is: ${CMAKE_CXX_STANDARD}")
68 # Set the C++ standard to 20 if not defined
69 set(CMAKE_CXX_STANDARD 20)
70 set(CMAKE_CXX_EXTENSIONS OFF) # Disable compiler-specific extensions
72 set(CMAKE_CXX_STANDARD_REQUIRED ON)
74 # build type defaults to "Debug"
75 if ( "${CMAKE_BUILD_TYPE}" STREQUAL "" )
76 set( CMAKE_BUILD_TYPE "Debug" )
79 MESSAGE( STATUS "Build type: ${CMAKE_BUILD_TYPE}" )
81 # include tool functions
82 include( ${CMAKE_CURRENT_LIST_DIR}/ALibTools.cmake )
84 # Remember this cmake directory for use inside functions
85 set(ALIB_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR})
87 # --------------------------------------------------------------------------------------------------
88 # Optional install/export infrastructure (package-manager free)
89 # --------------------------------------------------------------------------------------------------
90 include(CMakePackageConfigHelpers)
91 include(GNUInstallDirs)
93 option(ALIB_LOCAL_INSTALL "Install ALib to a user-local cache/prefix by default" ON)
94 set(ALIB_INSTALL_PREFIX_OVERRIDE "" CACHE PATH "Override the computed install prefix (absolute path)")
95 set(ALIB_EXPORT_NAMESPACE "ALib::" CACHE STRING "CMake namespace for exported ALib targets")
96 # Prefer static for the generic alias by default (can be changed by users)
97 set(ALIB_PREFER_SHARED OFF CACHE BOOL "Prefer shared library for ALib::ALib alias (default OFF => static)")
98 # Install only headers needed for the selected modules (recommended)
99 option(ALIB_INSTALL_HEADERS_ONLY_SELECTED "Install only the headers required by the resolved ALibBuild (instead of installing the whole include tree)" ON)
100 # Keep legacy, feature-encoded output filenames or use a stable name and rely on variant directories
101 option(ALIB_STABLE_OUTPUT_NAME "Use a stable output name for binaries (variant separation by install prefix)" OFF)
104 if( NOT DEFINED ALIB_CLANG_USE_LIBCPP )
105 set( ALIB_CLANG_USE_LIBCPP "Off" )
107 CacheAsBool( ALIB_CLANG_USE_LIBCPP
108 "Defaults to false. If set and Clang is used, function ALibSetCompilerAndLinker sets compiler and linker flags to use LLVM libc++ instead of GNU libstdc++." )
109 if( ALIB_CLANG_USE_LIBCPP )
110 message( "Using LLVM libc++ (instead of GNU libstdc++)" )
113 # Single-threaded compilation?
114 if( NOT DEFINED ALIB_SINGLE_THREADED )
115 set( ALIB_SINGLE_THREADED "Off" )
117 CacheAsBool( ALIB_SINGLE_THREADED
118 "Defaults to false. Disables multi-threading functionality in ALib." )
119 if( ALIB_SINGLE_THREADED )
120 message( "Single-threaded library compilation" )
123 # --------------------------------------------------------------------------------------------------
124 # Variant key computation and default install prefix selection
125 # --------------------------------------------------------------------------------------------------
137 # Compiler id/version and short token
138 set(_alib_ccid "${CMAKE_CXX_COMPILER_ID}")
139 set(_alib_ccver "${CMAKE_CXX_COMPILER_VERSION}")
140 if(_alib_ccid STREQUAL "GNU")
142 elseif(_alib_ccid STREQUAL "Clang")
144 elseif(_alib_ccid STREQUAL "MSVC")
147 string(TOLOWER "${_alib_ccid}" shortcc)
150 # stdlib (best effort)
151 set(_alib_stdlib libstdc++)
152 if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
153 if(ALIB_CLANG_USE_LIBCPP)
154 set(_alib_stdlib libc++)
156 set(_alib_stdlib libstdc++)
159 set(_alib_stdlib msvc)
163 string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _alib_arch)
164 if(_alib_arch STREQUAL "")
165 set(_alib_arch unknown)
169 if(CMAKE_BUILD_TYPE STREQUAL "")
170 set(CMAKE_BUILD_TYPE Debug)
172 string(TOLOWER "${CMAKE_BUILD_TYPE}" _alib_bt)
175 if(NOT DEFINED CMAKE_CXX_STANDARD)
176 set(CMAKE_CXX_STANDARD 20)
178 set(_alib_cxx cxx${CMAKE_CXX_STANDARD})
180 # ABI relevant flags (mirror of runtime asserted flags) todo: check for completion
199 # Additional feature/debug flags influencing file naming and potentially ABI
201 ALIB_DEBUG_CRITICAL_SECTIONS
202 ALIB_DEBUG_ALLOCATIONS
204 ALIB_FEAT_SINGLETON_MAPPED
206 ALIB_CHARACTERS_SIZEOF_WCHAR
207 ALIB_FEAT_BOOST_REGEX
208 ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
209 ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
210 ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
212 list(REMOVE_DUPLICATES ALIB_ABI_FLAGS)
214 set(_alib_flags_sig "")
215 foreach(_f IN LISTS ALIB_ABI_FLAGS)
225 string(APPEND _alib_flags_sig "${_f}${_v};")
227 string(SHA1 _alib_flags_hash "${_alib_flags_sig}")
228 string(SUBSTRING "${_alib_flags_hash}" 0 8 _alib_flags_hash8)
230 set(ALIB_VARIANT_KEY "${_alib_os}-${shortcc}-${_alib_ccver}-${_alib_stdlib}-${_alib_cxx}-${_alib_bt}-${_alib_arch}-f${_alib_flags_hash8}")
231 set(ALIB_VARIANT_KEY_OVERRIDE "" CACHE STRING "Override the computed ALIB variant key")
232 if(ALIB_VARIANT_KEY_OVERRIDE)
233 set(ALIB_VARIANT_KEY "${ALIB_VARIANT_KEY_OVERRIDE}")
235 message(STATUS "ALib variant key: ${ALIB_VARIANT_KEY}")
237 # Compose version tag for directory layering from existing version variables
238 # Result example: V2511R0
239 set(_alib_version_tag "V${ALIB_VERSION_NO}R${ALIB_VERSION_REV}")
241 # Default user-local install prefix per platform
243 set(_alib_user_prefix "$ENV{HOME}/Library/ALib/${_alib_version_tag}/${ALIB_VARIANT_KEY}")
245 if(DEFINED ENV{LocalAppData} AND NOT "$ENV{LocalAppData}" STREQUAL "")
246 set(_alib_user_prefix "$ENV{LocalAppData}/ALib/${_alib_version_tag}/${ALIB_VARIANT_KEY}")
248 set(_alib_user_prefix "$ENV{USERPROFILE}/.alib/${_alib_version_tag}/${ALIB_VARIANT_KEY}")
251 set(_alib_user_prefix "$ENV{HOME}/.local/alib/${_alib_version_tag}/${ALIB_VARIANT_KEY}")
254 # Decide final install prefix
255 if(ALIB_INSTALL_PREFIX_OVERRIDE)
256 set(_alib_install_prefix "${ALIB_INSTALL_PREFIX_OVERRIDE}")
257 elseif(ALIB_LOCAL_INSTALL)
258 set(_alib_install_prefix "${_alib_user_prefix}")
259 elseif(DEFINED CMAKE_INSTALL_PREFIX AND NOT "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
260 set(_alib_install_prefix "${CMAKE_INSTALL_PREFIX}")
262 set(_alib_install_prefix "/usr/local")
264 set(CMAKE_INSTALL_PREFIX "${_alib_install_prefix}" CACHE PATH "Install prefix" FORCE)
265 message(STATUS "ALib install prefix: ${CMAKE_INSTALL_PREFIX}")
267 # RPATH defaults for non-Windows
269 set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}")
270 set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
271 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON)
272 if(IS_ABSOLUTE "${CMAKE_INSTALL_PREFIX}")
274 set(CMAKE_MACOSX_RPATH ON)
275 set(CMAKE_INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR};${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
277 set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
282# --------------------------------------------------------------------------------------------------
283# ALib Module Dependency Resolution
284# --------------------------------------------------------------------------------------------------
286 include( ${CMAKE_CURRENT_LIST_DIR}/ALibModules.cmake )
288# --------------------------------------------------------------------------------------------------
289# ALib Cache Variables
290# The variables are only set, if not already predefined prior to invoking this script.
291# --------------------------------------------------------------------------------------------------
293# --------- ALIB_DEBUG, ALIB_DEBUG_GLIB, ALIB_COVERAGE_COMPILE ---------
294if( NOT DEFINED ALIB_DEBUG )
295 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
296 set( ALIB_DEBUG "On" )
298 set( ALIB_DEBUG "Off" )
301CacheAsBool( ALIB_DEBUG
302 "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." )
304if( NOT DEFINED ALIB_DEBUG_GLIB )
305 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
306 set( ALIB_DEBUG_GLIB "Off" )
308 set( ALIB_DEBUG_GLIB "Off" )
311CacheAsBool( ALIB_DEBUG_GLIB
312 "Defaults to false. If true, the configuration macros '_GLIBCXX_DEBUG', '_GLIBCXX_DEBUG_PEDANTIC' and '_GLIBCPP_CONCEPT_CHECKS' are set." )
315if( NOT DEFINED ALIB_COVERAGE_COMPILE )
316 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
317 set( ALIB_COVERAGE_COMPILE "Off" )
319 set( ALIB_COVERAGE_COMPILE "Off" )
322CacheAsBool( ALIB_COVERAGE_COMPILE
323 "Defaults to false. If true, option --coverage is added to GNU compiler command-line.")
324# --------- ALIB_DEBUG_CRITICAL_SECTIONS, ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH ---------
325if (NOT DEFINED ALIB_DEBUG_CRITICAL_SECTIONS)
326 SetToNot(ALIB_DEBUG_CRITICAL_SECTIONS ALIB_SINGLE_THREADED)
328 AND ALIB_SINGLE_THREADED
329 AND ALIB_DEBUG_CRITICAL_SECTIONS )
330 message( "ALIB_DEBUG_CRITICAL_SECTIONS=On given while ALIB_SINGLE_THREADED=On. Disabling ALIB_DEBUG_CRITICAL_SECTIONS " )
331 Set(ALIB_DEBUG_CRITICAL_SECTIONS "Off")
335 if( ${ALIB_DEBUG_CRITICAL_SECTIONS} )
336 message( "ALIB_DEBUG_CRITICAL_SECTIONS=On given while ALIB_DEBUG=off. Disabling ALIB_DEBUG_CRITICAL_SECTIONS " )
337 Set(ALIB_DEBUG_CRITICAL_SECTIONS "Off")
341CacheAsBool( ALIB_DEBUG_CRITICAL_SECTIONS
342 "Defaults to true unless ALIB_SINGLE_THREADED is set.")
344if ( ${ALIB_DEBUG_CRITICAL_SECTIONS} )
345 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_CRITICAL_SECTIONS" )
347 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_CRITICAL_SECTIONS" )
351if( NOT DEFINED ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH )
353 set( ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH "On" )
355 set( ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH ALIB_SINGLE_THREADED )
359CacheAsBool( ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH
360 "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." )
363# --------- Others ---------
364if( NOT DEFINED ALIB_PRECOMPILED_HEADER )
365 set( ALIB_PRECOMPILED_HEADER "Off" CACHE BOOL
366 "If on, header file ’alib_precompile.hpp' will included some default headers, depending on the selected modules. Defaults to off." )
368if ( ${ALIB_PRECOMPILED_HEADER} )
369 list( APPEND ALIB_SYMBOLS "ALIB_PRECOMPILED_HEADER" )
371 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_PRECOMPILED_HEADER" )
374if( NOT DEFINED ALIB_CMAKE_VERBOSE )
375 set( ALIB_CMAKE_VERBOSE "Off" CACHE BOOL
376 "If true, CMake generation runs will provide a detailed report." )
380# --------- ALIB_DEBUG_ALLOCATIONS ---------
381if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
382 CacheAsBool( ALIB_DEBUG_ALLOCATIONS
383 "Adds allocation debug mechanics with lang::HeapAllocator and ALib Monomem allocators. Defaults to false." )
387# --------- Per module values ---------
388if( "SINGLETONS" IN_LIST ALibBuild )
390 set( platformDefaultFor_SINGLETON_MAPPED "On" )
392 set( platformDefaultFor_SINGLETON_MAPPED "Off" )
394 if( NOT DEFINED ALIB_FEAT_SINGLETON_MAPPED )
395 set( ALIB_FEAT_SINGLETON_MAPPED ${platformDefaultFor_SINGLETON_MAPPED} CACHE BOOL
396 "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.")
400if( "BITBUFFER" IN_LIST ALibBuild )
401 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
402 if( NOT DEFINED ALIB_DEBUG_ARRAY_COMPRESSION )
403 set( ALIB_DEBUG_ARRAY_COMPRESSION "On" CACHE BOOL
404 "If true, in debug compilations, compressed arrays are read back to check if result is same. Defaults to true." )
409if( "CONTAINERS" IN_LIST ALibBuild )
410 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
411 if( NOT DEFINED ALIB_DEBUG_CONTAINERS )
412 set( ALIB_DEBUG_CONTAINERS "Off" CACHE BOOL
413 "Adds debug features to module ALib Containers. Defaults to false." )
418if( "MONOMEM" IN_LIST ALibBuild )
419 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
420 if( NOT DEFINED ALIB_DEBUG_MEMORY )
421 set( ALIB_DEBUG_MEMORY "Off" CACHE BOOL
422 "Adds consistency checks and collection of statistics with module ALib Monomem. Defaults to false." )
428if( "BOXING" IN_LIST ALibBuild )
429 if( NOT DEFINED ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS )
430 set( ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS "Off" CACHE BOOL
431 "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.")
434 if( NOT DEFINED ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS )
435 set( ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS "Off" CACHE BOOL
436 "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.")
439 if( NOT DEFINED ALIB_FEAT_BOXING_BIJECTIVE_FLOATS )
440 set( ALIB_FEAT_BOXING_BIJECTIVE_FLOATS "Off" CACHE BOOL
441 "If true, type float will be boxed as float. If false (the default) float will be boxed as double and cannot be unboxed.")
444 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
445 if( NOT DEFINED ALIB_DEBUG_BOXING )
446 set( ALIB_DEBUG_BOXING "Off" CACHE BOOL
447 "Adds collection of statistics and debug methods to module ALib Boxing. Defaults to false." )
454 set( defaultALIB_CHARACTERS_WIDE "On" )
455 set( defaultALIB_CHARACTERS_SIZEOF_WCHAR "2" )
457 set( defaultALIB_CHARACTERS_WIDE "Off" )
458 set( defaultALIB_CHARACTERS_SIZEOF_WCHAR "4" )
461 if( NOT DEFINED ALIB_CHARACTERS_WIDE )
462 set( ALIB_CHARACTERS_WIDE ${defaultALIB_CHARACTERS_WIDE} CACHE BOOL
463 "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.")
466 if( NOT DEFINED ALIB_CHARACTERS_SIZEOF_WCHAR )
467 set( ALIB_CHARACTERS_SIZEOF_WCHAR ${defaultALIB_CHARACTERS_SIZEOF_WCHAR} CACHE STRING
468 "The width of wide characters, maybe 2 or 4. Default value depends on platform/compiler preference.")
472if( "STRINGS" IN_LIST ALibBuild )
473 if( NOT DEFINED ALIB_FEAT_BOOST_REGEX )
474 set( ALIB_FEAT_BOOST_REGEX "Off" CACHE BOOL
475 "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.")
478 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
479 if( NOT DEFINED ALIB_DEBUG_STRINGS )
480 set( ALIB_DEBUG_STRINGS "Off" CACHE BOOL
481 "Defaults to false. Adds consistency checks to ALib string classes. Useful when developing code to manipulate strings externally, i.e AppendableTraits to specializations.")
486if( "CAMP" IN_LIST ALibBuild )
487 if( NOT DEFINED ALIB_CAMP_OMIT_DEFAULT_RESOURCES )
488 set( ALIB_CAMP_OMIT_DEFAULT_RESOURCES "Off" CACHE BOOL
489 "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.")
492 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
493 CacheAsBool( ALIB_DEBUG_RESOURCES
494 "Adds collection of statistics and resource export with module ALib Resources. Defaults to false." )
499if( "FILES" IN_LIST ALibBuild )
500 if( NOT DEFINED ALIB_FILES_FORCE_STD_SCANNER )
501 set( ALIB_FILES_FORCE_STD_SCANNER "Off" CACHE BOOL
502 "If true, file scanning of ALib camp 'Files' falls back to a basic implementation using C++ library std::filesystem.")
506if( "ALOX" IN_LIST ALibBuild )
508 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
509 set( defaultALOX_DBG_LOG "On" )
511 set( defaultALOX_DBG_LOG "Off" )
513 if( NOT DEFINED ALOX_DBG_LOG )
514 set( ALOX_DBG_LOG ${defaultALOX_DBG_LOG} CACHE BOOL
515 "Enable/disable debug log statements. Defaults to true with debug builds, otherwise to false." )
518 if( NOT DEFINED ALOX_DBG_LOG_CI )
519 set( ALOX_DBG_LOG_CI "On" CACHE BOOL
520 "Defaults to true. If set, caller information is used with debug log statements." )
523 if( NOT DEFINED ALOX_REL_LOG )
524 set( ALOX_REL_LOG "On" CACHE BOOL
525 "Enable/disable release log statements. Defaults to true." )
528 if( NOT DEFINED ALOX_REL_LOG_CI )
529 set( ALOX_REL_LOG_CI "Off" CACHE BOOL
530 "Defaults to false. If set, caller information is used even with release log statements (and even in release builds!)" )
534# --------------------------------------------------------------------------------------------------
535# Configuration macros
536# --------------------------------------------------------------------------------------------------
539if( NOT ALibAllModules )
541 LIST( APPEND moduleList "ALOX;APP;BITBUFFER;BOXING;CAMP;CLI;CONTAINERS" )
542 LIST( APPEND moduleList "ENUMRECORDS;EXCEPTIONS;EXPRESSIONS;FILES;FORMAT" )
543 LIST( APPEND moduleList "MONOMEM;RESOURCES;SINGLETONS;STRINGS;SYSTEM" )
544 LIST( APPEND moduleList "THREADMODEL;VARIABLES" )
545 FOREACH( module IN LISTS moduleList )
546 IF( module IN_LIST ALibBuild )
547 list( APPEND ALIB_SYMBOLS "ALIB_${module}" )
554 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG" )
556 if ( ${ALIB_DEBUG_GLIB} )
557 list( APPEND ALIB_SYMBOLS "_GLIBCXX_DEBUG"
558 "_GLIBCXX_DEBUG_PEDANTIC"
559 "_GLIBCPP_CONCEPT_CHECKS" )
561 list( APPEND ALIB_SYMBOLS_UNUSED "_GLIBCXX_DEBUG"
562 "_GLIBCXX_DEBUG_PEDANTIC"
563 "_GLIBCPP_CONCEPT_CHECKS" )
568if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
569 if ( ALIB_DEBUG_ALLOCATIONS )
570 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_ALLOCATIONS" )
572 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_ALLOCATIONS" )
577if( "SINGLETONS" IN_LIST ALibBuild )
578 if (NOT platformDefaultFor_SINGLETON_MAPPED STREQUAL ALIB_FEAT_SINGLETON_MAPPED)
579 if ( ALIB_FEAT_SINGLETON_MAPPED )
580 list( APPEND ALIB_SYMBOLS "ALIB_FEAT_SINGLETON_MAPPED" )
582 list( APPEND ALIB_SYMBOLS "ALIB_FEAT_SINGLETON_MAPPED=0" )
585 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_SINGLETON_MAPPED=0" )
589if( "BITBUFFER" IN_LIST ALibBuild )
590 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
591 if ( ALIB_DEBUG_ARRAY_COMPRESSION )
592 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_ARRAY_COMPRESSION=1" )
594 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_ARRAY_COMPRESSION=0" )
599if( "BOXING" IN_LIST ALibBuild )
600 if ( ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS )
601 list( APPEND ALIB_SYMBOLS "ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS" )
603 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS" )
605 if ( ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS )
606 list( APPEND ALIB_SYMBOLS "ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS" )
608 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS" )
610 if ( ALIB_FEAT_BOXING_BIJECTIVE_FLOATS )
611 list( APPEND ALIB_SYMBOLS "ALIB_FEAT_BOXING_BIJECTIVE_FLOATS" )
613 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOXING_BIJECTIVE_FLOATS" )
615 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
616 if( ALIB_DEBUG_BOXING )
617 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_BOXING" )
619 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_BOXING" )
625 if (NOT (defaultALIB_CHARACTERS_WIDE STREQUAL ALIB_CHARACTERS_WIDE ))
626 if ( ALIB_CHARACTERS_WIDE )
627 list( APPEND ALIB_SYMBOLS "ALIB_CHARACTERS_WIDE" )
629 list( APPEND ALIB_SYMBOLS "ALIB_CHARACTERS_WIDE=0" )
632 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CHARACTERS_WIDE" )
635 if (NOT defaultALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL ALIB_CHARACTERS_SIZEOF_WCHAR)
636 if ( NOT (ALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL "2" OR ALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL "4") )
637 message( FATAL_ERROR "Value of ALIB_CHARACTERS_SIZEOF_WCHAR must be 2 or 4" )
640 list( APPEND ALIB_SYMBOLS "ALIB_CHARACTERS_SIZEOF_WCHAR=${ALIB_CHARACTERS_SIZEOF_WCHAR}" )
642 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CHARACTERS_SIZEOF_WCHAR=${ALIB_CHARACTERS_SIZEOF_WCHAR}" )
646if( "CONTAINERS" IN_LIST ALibBuild
647 AND CMAKE_BUILD_TYPE STREQUAL "Debug" )
648 if ( ALIB_DEBUG_CONTAINERS )
649 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_CONTAINERS" )
651 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_CONTAINERS" )
655if( ALIB_SINGLE_THREADED )
656 list( APPEND ALIB_SYMBOLS "ALIB_SINGLE_THREADED" )
658 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_SINGLE_THREADED" )
660 if( CMAKE_BUILD_TYPE STREQUAL "Debug" )
661 if ( ALIB_DEBUG_CRITICAL_SECTIONS )
662 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_CRITICAL_SECTIONS" )
664 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_CRITICAL_SECTIONS" )
670if( "MONOMEM" IN_LIST ALibBuild )
672 if ( ALIB_DEBUG_MEMORY )
673 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_MEMORY" )
675 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_MEMORY" )
680if( "STRINGS" IN_LIST ALibBuild )
681 if ( ALIB_FEAT_BOOST_REGEX )
682 list( APPEND ALIB_SYMBOLS "ALIB_FEAT_BOOST_REGEX" )
684 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FEAT_BOOST_REGEX" )
688 if ( ALIB_DEBUG_STRINGS )
689 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_STRINGS" )
691 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_STRINGS" )
696if( "CAMP" IN_LIST ALibBuild )
698 if( ALIB_CAMP_OMIT_DEFAULT_RESOURCES )
699 list( APPEND ALIB_SYMBOLS "ALIB_CAMP_OMIT_DEFAULT_RESOURCES" )
701 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_CAMP_OMIT_DEFAULT_RESOURCES" )
705 if( ALIB_DEBUG_RESOURCES )
706 list( APPEND ALIB_SYMBOLS "ALIB_DEBUG_RESOURCES" )
708 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_DEBUG_RESOURCES" )
713if( "FILES" IN_LIST ALibBuild )
714 if ( ALIB_FILES_FORCE_STD_SCANNER )
715 list( APPEND ALIB_SYMBOLS "ALIB_FILES_FORCE_STD_SCANNER" )
717 list( APPEND ALIB_SYMBOLS_UNUSED "ALIB_FILES_FORCE_STD_SCANNER" )
721if( "ALOX" IN_LIST ALibBuild )
723 if (NOT defaultALOX_DBG_LOG STREQUAL ALOX_DBG_LOG)
724 if( NOT ALOX_DBG_LOG )
725 list( APPEND ALIB_SYMBOLS "ALOX_DBG_LOG" )
727 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG" )
730 if ( NOT ${ALOX_DBG_LOG_CI} )
731 list( APPEND ALIB_SYMBOLS "ALOX_DBG_LOG_CI=0" )
733 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG_CI=0" )
736 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG" )
737 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_DBG_LOG_CI" )
740 if ( NOT ALOX_REL_LOG )
741 list( APPEND ALIB_SYMBOLS "ALOX_REL_LOG=0" )
743 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_REL_LOG=0" )
745 if ( ALOX_REL_LOG_CI )
746 list( APPEND ALIB_SYMBOLS "ALOX_REL_LOG_CI" )
748 list( APPEND ALIB_SYMBOLS_UNUSED "ALOX_REL_LOG_CI" )
754# --------------------------------------------------------------------------------------------------
755# ALib Source File Definition
756# --------------------------------------------------------------------------------------------------
757include( ${CMAKE_CURRENT_LIST_DIR}/ALibSources.cmake )
760# --------------------------------------------------------------------------------------------------
762# --------------------------------------------------------------------------------------------------
763if ( NOT ${ALIB_CMAKE_SKIP_THREAD_LIB_SEARCH} )
764 find_package(Threads)
766 list( APPEND ALIB_SYMBOLS "ALIB_EXT_LIB_THREADS_AVAILABLE" )
767 if(CMAKE_USE_PTHREADS_INIT)
768 list( APPEND ALIB_COMPILER_OPTIONS "-pthread" )
772 list( APPEND ALIB_EXTERNAL_LIBS ${CMAKE_THREAD_LIBS_INIT} )
775if ( ${ALIB_FEAT_BOOST_REGEX} )
776 set(Boost_USE_STATIC_LIBS "On" CACHE BOOL "Link boost statically" )
777 if( NOT DEFINED ALIB_SINGLE_THREADED )
778 set(Boost_USE_MULTITHREADED "On" CACHE BOOL "Use multithreaded version of boost")
780 set(Boost_USE_MULTITHREADED "Off" CACHE BOOL "Use single-threaded version of boost")
783 find_package( Boost CONFIG REQUIRED COMPONENTS regex )
786 list( APPEND ALIB_EXTERNAL_LIBS Boost::regex )
787 if(${Boost_USE_STATIC_LIBS})
788 message(STATUS "Found Boost version ${Boost_LIB_VERSION}, linking against boost static libraries")
790 message(STATUS "Found Boost version ${Boost_LIB_VERSION}, linking against boost shared libraries")
793 MESSAGE("Attention: Boost::regex requested, but library not found!")
798 list( APPEND ALIB_EXTERNAL_LIBS "-framework Foundation")
803 list( APPEND ALIB_EXTERNAL_LIBS "m")
810# --------------------------------------------------------------------------------------------------
811# A-Worx compiler features and flags
812# --------------------------------------------------------------------------------------------------
814# Set minimum required standard C++20
815list( APPEND ALIB_COMPILER_FEATURES "cxx_std_20" )
817# if "ALIB_SUPPRESS_COMPILER_WARNINGS" is set prior to invoking this script, this entry is removed
818# and nothing is added.
819if ("ALIB_SUPPRESS_COMPILER_WARNINGS" IN_LIST ALIB_COMPILER_WARNINGS)
820 LIST( REMOVE_ITEM ALIB_COMPILER_WARNINGS "ALIB_SUPPRESS_COMPILER_WARNINGS" )
822 if ( ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" )
823 # add -H to generate output "!/x" for use of precompiled header
824 list( APPEND ALIB_COMPILER_WARNINGS "-Wall" )
825 list( APPEND ALIB_COMPILER_WARNINGS "-Wextra" )
826 #list( APPEND ALIB_COMPILER_WARNINGS "-Weffc++" )
827 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-psabi" )
828 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-misleading-indentation" )
830 # this was "suddenly" needed with GCC 13.2.1 with release compilation
831 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-stringop-overread" )
833 # add coverage flags to GCC
834 if( ${ALIB_COVERAGE_COMPILE} )
835 list( APPEND ALIB_COMPILER_OPTIONS "--coverage" )
836 list( APPEND ALIB_LINKER_OPTIONS "--coverage" )
839 # force unicode (needed for mingw)
841 list( APPEND ALIB_COMPILER_OPTIONS "-municode" )
842 list( APPEND ALIB_COMPILER_OPTIONS "-DUNICODE" )
843 list( APPEND ALIB_COMPILER_OPTIONS "-D_UNICODE" )
847 # Clang: We are using -Weverything, although this is not recommended. We think it should be
848 # recommended. ALib, for example, does not use old-style casts and explicitly cast each
849 # and every type change! The benefit for ALib users is that ALib code can be used in very
850 # strict build environments without using special warning flags.
851 # Of course, some very obvious warnings then have to be removed explicitly:
852 elseif ( ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" )
853 list( APPEND ALIB_COMPILER_WARNINGS "-pedantic" )
854 list( APPEND ALIB_COMPILER_WARNINGS "-Weffc++" )
855 list( APPEND ALIB_COMPILER_WARNINGS "-Weverything" )
856 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-unknown-warning-option" )
857 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++20-extensions" )
858 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++20-compat" )
859 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++98-compat" )
860 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-c++98-compat-pedantic" )
861 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-covered-switch-default" )
862 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-decls-in-multiple-modules" )
863 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-deprecated-declarations" )
864 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-documentation-unknown-command" )
865 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-exit-time-destructors" )
866 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-global-constructors" )
867 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-ms-bitfield-padding" )
868 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-misleading-indentation" )
869 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-padded" )
870 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-weak-vtables" )
871 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-thread-safety-analysis" )
873 # Note: After fighting with this for a while and locally removing the warning in many
874 # places, we gave up with Clang 19 and C++20 module compilation. Strangely, with the
875 # latter activated, Clang became even more suspicious and we decided to switch it off.
876 # It seems that also a bigger part of the community sees it that way. Where is the
877 # point to using a std::array instead of a C-array when std::array does no bounds
879 list( APPEND ALIB_COMPILER_WARNINGS "-Wno-unsafe-buffer-usage" )
881 if( CMAKE_BUILD_TYPE STREQUAL "Debug" )
882 list( APPEND ALIB_COMPILER_OPTIONS "-fno-limit-debug-info" )
886 elseif ( ${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC" )
887 list( APPEND ALIB_COMPILER_WARNINGS "/W4" )
888 list( APPEND ALIB_COMPILER_WARNINGS "/WX" )
889 list( APPEND ALIB_COMPILER_WARNINGS "/EHsc" )
893# --------------------------------------------------------------------------------------------------
894# A-Worx linker features and flags
895# --------------------------------------------------------------------------------------------------
897 list( APPEND ALIB_LINKER_OPTIONS "-lObjc" )
899 list( APPEND ALIB_LINKER_OPTIONS "" )
903# -------------------------------------------------------------------------------------------------
904# Set filename of ALib library (if not given in ALIB_LIBRARY_FILENAME)
905# -------------------------------------------------------------------------------------------------
906# TODO(251204 10:40): Respect module App. What else? Check!
908if ( NOT ALIB_LIBRARY_FILENAME )
909 # Base stable name used when ALIB_STABLE_OUTPUT_NAME is ON
910 set( ALIB_LIBRARY_FILENAME_STABLE "alib_${ALIB_VERSION_NO}R${ALIB_VERSION_REV}" )
911 # Legacy, feature-encoded name (default)
912 set( ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME_STABLE}" )
914 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_DEBUG} )
915 if ( (CMAKE_BUILD_TYPE STREQUAL "Debug") )
916 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}DBG )
918 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}RELDBG )
920 if( DEFINED ALIB_SINGLE_THREADED )
921 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_ST )
923 if ( ALIB_DEBUG_CRITICAL_SECTIONS )
924 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DCS )
926 if ( ALIB_DEBUG_ALLOCATIONS )
927 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DALC )
929 elseif( NOT ALIB_STABLE_OUTPUT_NAME )
930 if ( (CMAKE_BUILD_TYPE STREQUAL "Debug") )
931 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}DBGREL )
936 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_FEAT_SINGLETON_MAPPED} )
937 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_MS )
939 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_CHARACTERS_WIDE} )
940 if ( ALIB_CHARACTERS_SIZEOF_WCHAR STREQUAL "2" )
941 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_WC2 )
943 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_WC4 )
946 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_FEAT_BOOST_REGEX} )
947 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BREGEX )
949 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS} )
950 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BIJCHARS )
952 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_FEAT_BOXING_BIJECTIVE_FLOATS} )
953 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BIJFLOATS )
955 if ( NOT ALIB_STABLE_OUTPUT_NAME AND ${ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS} )
956 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BIJINTS )
959 # Add all module's names, prefixed by "DBG" if special debug flag is set
960 if( NOT ALIB_STABLE_OUTPUT_NAME AND NOT ALibAllModules )
961 FOREACH(modName IN LISTS ALibBuild)
964 IF( modName STREQUAL "BOXING" )
965 if ( ALIB_DEBUG_MEMORY AND ALIB_DEBUG )
966 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGBOXING )
968 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_BOXING )
971 # CONTAINERS debug mode?
972 ELSEIF( modName STREQUAL "CONTAINERS" )
973 if ( ALIB_DEBUG_CONTAINERS AND ALIB_DEBUG )
974 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGCONTAINERS )
976 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_CONTAINERS )
979 # MONOMEM debug mode?
980 ELSEIF( modName STREQUAL "MONOMEM" )
981 if ( ALIB_DEBUG_MEMORY AND ALIB_DEBUG )
982 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGMONOMEM )
984 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_MONOMEM )
987 # STRINGS debug mode?
988 ELSEIF( modName STREQUAL "STRINGS" )
989 if ( ALIB_DEBUG_STRINGS AND ALIB_DEBUG )
990 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGSTRINGS )
992 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_STRINGS )
995 # RESOURCES debug mode?
996 ELSEIF( modName STREQUAL "RESOURCES" )
997 if ( ALIB_DEBUG_RESOURCES AND ALIB_DEBUG )
998 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_DBGRESOURCES )
1000 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_RESOURCES )
1003 # ALOX: add non-default feature s
1004 ELSEIF( modName STREQUAL "ALOX" )
1005 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_ALOX )
1006 if ( (CMAKE_BUILD_TYPE STREQUAL "Debug") AND (NOT ${ALOX_DBG_LOG}) )
1007 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}NDL )
1010 if ( NOT ALOX_REL_LOG )
1011 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}NRL )
1014 set ( ALIB_LIBRARY_FILENAME ${ALIB_LIBRARY_FILENAME}_${modName} )
1020 # Remove all dependent modules from the name, which are not added in a debug version:
1021 list( FIND ALibBuild "BOXING" idx )
1022 if( NOT idx LESS 0 )
1023 STRING(REPLACE "_SINGLETONS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1026 list( FIND ALibBuild "ENUMRECORDS" idx )
1027 if( NOT idx LESS 0 )
1028 STRING(REPLACE "_SINGLETONS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1029 STRING(REPLACE "_STRINGS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1032 list( FIND ALibBuild "BITBUFFER" idx )
1033 if( NOT idx LESS 0 )
1034 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1035 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1038 list( FIND ALibBuild "THREADMODEL" idx )
1039 if( NOT idx LESS 0 )
1040 STRING(REPLACE "_BOXING" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1041 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1042 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1045 list( FIND ALibBuild "SYSTEM" idx )
1046 if( NOT idx LESS 0 )
1047 STRING(REPLACE "_BOXING" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1048 STRING(REPLACE "_ENUMRECORDS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1051 list( FIND ALibBuild "RESOURCES" idx )
1052 if( NOT idx LESS 0 )
1053 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1054 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1055 STRING(REPLACE "_STRINGS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1058 list( FIND ALibBuild "EXCEPTIONS" idx )
1059 if( NOT idx LESS 0 )
1060 STRING(REPLACE "_RESOURCES" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1061 STRING(REPLACE "_BOXING" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1062 STRING(REPLACE "_ENUMRECORDS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1065 list( FIND ALibBuild "VARIABLES" idx )
1066 if( NOT idx LESS 0 )
1067 STRING(REPLACE "_SYSTEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1068 STRING(REPLACE "_CONTAINERS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1069 STRING(REPLACE "_MONOMEM" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1072 list( FIND ALibBuild "FORMAT" idx )
1073 if( NOT idx LESS 0 )
1074 STRING(REPLACE "_EXCEPTIONS" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1078 list( FIND ALibBuild "CAMP" idx )
1079 if( NOT idx LESS 0 )
1080 STRING(REPLACE "_FORMAT" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1081 STRING(REPLACE "_VARIABLES" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1084 list( FIND ALibBuild "ALOX" idx )
1085 if( NOT idx LESS 0 )
1086 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1089 list( FIND ALibBuild "CLI" idx )
1090 if( NOT idx LESS 0 )
1091 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1094 list( FIND ALibBuild "EXPRESSIONS" idx )
1095 if( NOT idx LESS 0 )
1096 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1099 list( FIND ALibBuild "FILES" idx )
1100 if( NOT idx LESS 0 )
1101 STRING(REPLACE "_CAMP" "" ALIB_LIBRARY_FILENAME "${ALIB_LIBRARY_FILENAME}")
1104 endif() # not all modules or stable name enabled
1108# -------------------------------------------------------------------------------------------------
1109# Display result summary
1110# -------------------------------------------------------------------------------------------------
1111message( "ALib CMake Configuration:" )
1112 message( " Modules requested : ${ALIB_BUILD}" )
1113IF( NOT ALibAllModules )
1114 message( " Resulting Selection: ${ALibBuild}" )
1115 message( " Omitted Modules : ${ALibOmittedModules}" )
1117 message( " Resulting Selection: All (${ALibBuild})" )
1120 message( " Single-Threaded : ${ALIB_SINGLE_THREADED}" )
1122 message( " Library filename : ${ALIB_LIBRARY_FILENAME}" )
1123 message( " Compiler ID : ${CMAKE_CXX_COMPILER_ID}" )
1125IF( NOT ALIB_CMAKE_VERBOSE )
1126 message( " (For further details enable CMake variable 'ALIB_CMAKE_VERBOSE')" )
1129 message( " Source folder : ${ALIB_SOURCE_DIR}" )
1130 LIST( LENGTH ALIB_H length)
1131 message( " File types : *.H: ${length} files" )
1132 LIST( LENGTH ALIB_MPP length)
1133 message( " *.mpp: ${length} files" )
1134 LIST( LENGTH ALIB_INL length)
1135 message( " *.inl: ${length} files" )
1136 LIST( LENGTH ALIB_CPP length)
1137 message( " *.cpp: ${length} files" )
1138 LIST( LENGTH ALIB_HPP length)
1139 message( " *.hpp: ${length} files" )
1141 LIST( APPEND result ${ALIB_H} )
1142 LIST( APPEND result ${ALIB_MPP} )
1143 LIST( APPEND result ${ALIB_INL} )
1144 LIST( APPEND result ${ALIB_CPP} )
1145 LIST( APPEND result ${ALIB_HPP} )
1147 LIST( LENGTH result length)
1148 message( " Total: ${length} source files." )
1149 message( "\n List of files:" )
1150 FOREACH( entry IN LISTS result )
1151 STRING(REPLACE "${ALIB_SOURCE_DIR}/" "" entry ${entry} )
1152 message( " ${entry}" )
1156 LIST( APPEND result ${ALIB_SYMBOLS} )
1158 LIST( LENGTH result length)
1159 message( "\n Compiler definitions (${length} items):" )
1160 FOREACH( entry IN LISTS result )
1161 message( " ${entry}" )
1166 LIST( APPEND result ${ALIB_SYMBOLS_UNUSED} )
1168 LIST( LENGTH result length)
1169 message( "\n Compiler definitions NOT given/omitted (${length} items):" )
1170 FOREACH( entry IN LISTS result )
1171 message( " ${entry}" )
1175 LIST( APPEND result ${ALIB_COMPILER_WARNINGS} )
1177 LIST( LENGTH result length)
1178 message( "\n Compiler warnings (${length} items):" )
1179 FOREACH( entry IN LISTS result )
1180 message( " ${entry}" )
1184 LIST( APPEND result ${ALIB_COMPILER_OPTIONS} )
1186 LIST( LENGTH result length)
1187 message( "\n Compiler flags (${length} items):" )
1188 FOREACH( entry IN LISTS result )
1189 message( " ${entry}" )
1193 LIST( APPEND result ${ALIB_COMPILER_FEATURES} )
1195 LIST( LENGTH result length)
1196 message( "\n Compiler features (${length} items):" )
1197 FOREACH( entry IN LISTS result )
1198 message( " ${entry}" )
1202 LIST( APPEND result ${ALIB_EXTERNAL_LIBS} )
1204 LIST( LENGTH result length)
1205 message( "\n External libraries (${length} items):" )
1206 FOREACH( entry IN LISTS result )
1207 message( " ${entry}" )
1211 LIST( APPEND result ${ALIB_LINKER_OPTIONS} )
1213 LIST( LENGTH result length)
1214 message( "\n Linker flags (${length} items):" )
1215 FOREACH( entry IN LISTS result )
1216 message( " ${entry}" )
1223# -------------------------------------------------------------------------------------------------
1224# ALibFilterSupportedCompilerFlags()
1225# Checks the flags in the given list for compatibility with current C/C++ compiler.
1226# -------------------------------------------------------------------------------------------------
1227include(CheckCCompilerFlag)
1228include(CheckCXXCompilerFlag)
1230# filter_supported_flags(<C|CXX> <out-var> <flags...>)
1231macro(ALibFilterSupportedCompilerFlags LANG VAR)
1232 # Short-circuit only in actual try_compile sub-configures
1233 if(DEFINED CMAKE_TRY_COMPILE OR PROJECT_NAME MATCHES "^cmTC_")
1234 set(${VAR} "${ARGN}")
1239 #message(STATUS "filter_supported_flags: LANG=${LANG} input=[${ARGN}]")
1241 set(_saved ${CMAKE_REQUIRED_QUIET})
1242 set(CMAKE_REQUIRED_QUIET ON)
1245 foreach(FLAG ${ARGN}) # classic form—works on all CMake versions
1247 "${CMAKE_${LANG}_COMPILER_ID};${CMAKE_${LANG}_COMPILER_VERSION};${LANG};${FLAG}")
1249 if(${LANG} STREQUAL "C")
1250 check_c_compiler_flag("${FLAG}" _has_${_key})
1252 list(APPEND _supported "${FLAG}")
1254 message("ALib: Dropping compiler flag '${FLAG}' (not supported)")
1256 elseif(${LANG} STREQUAL "CXX")
1257 check_cxx_compiler_flag("${FLAG}" _has_${_key})
1259 list(APPEND _supported "${FLAG}")
1261 message("ALib: Dropping compiler flag '${FLAG}' (not supported)")
1264 message(FATAL_ERROR "filter_supported_flags: LANG must be C or CXX. Given ${LANG}")
1268 set(CMAKE_REQUIRED_QUIET ${_saved})
1269 set(${VAR} "${_supported}") # macro: mutates caller scope
1270 #message(STATUS "filter_supported_flags: output=[${${VAR}}]")
1274# -------------------------------------------------------------------------------------------------
1275# ALibSetCompilerAndLinker(target)
1277# Simple CMake function that sets
1279# - ALIB_COMPILER_FEATURES
1280# - ALIB_COMPILER_OPTIONS
1281# - ALIB_COMPILER_WARNINGS
1282# - ALIB_LINKER_OPTIONS
1284# In addition, position independent compile (-fPic) is enabled (for static libraries its default
1285# is off with CMake).
1286# -------------------------------------------------------------------------------------------------
1287function( ALibSetCompilerAndLinker target )
1288 message("${target}: Applying ALib compiler and linker settings")
1291 ALibFilterSupportedCompilerFlags(CXX ALIB_COMPILER_WARNINGS ${ALIB_COMPILER_WARNINGS})
1292 target_compile_features ( ${target} PRIVATE ${ALIB_COMPILER_FEATURES} )
1293 target_compile_options ( ${target} PRIVATE ${ALIB_COMPILER_OPTIONS} )
1294 target_compile_options ( ${target} PRIVATE ${ALIB_COMPILER_WARNINGS} )
1295 set_property ( TARGET ${target} PROPERTY POSITION_INDEPENDENT_CODE ON )
1296 # Export proper include dirs for build and install; consumers get INSTALL_INTERFACE
1297 # Use absolute source roots to be robust in superbuilds/IDE subprojects
1298 # Add build-interface include dirs in separate calls to avoid list parsing quirks
1299 target_include_directories( ${target} PUBLIC $<BUILD_INTERFACE:${ALIB_BASE_DIR}/src> )
1300 target_include_directories( ${target} PUBLIC $<BUILD_INTERFACE:${ALIB_BASE_DIR}/src/alib> )
1301 target_include_directories( ${target} PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> )
1303 IF(DEFINED ALIB_PRECOMPILED_HEADER)
1304 IF(ALIB_PRECOMPILED_HEADER)
1305 target_precompile_headers( ${target} PRIVATE "${ALIB_SOURCE_DIR}/alib_precompile.hpp" )
1310 target_compile_definitions( ${target} PUBLIC ${ALIB_SYMBOLS} )
1313 IF( NOT "${ALIB_LINKER_OPTIONS}" STREQUAL "" )
1314 set_target_properties ( ${target} PROPERTIES LINK_FLAGS ${ALIB_LINKER_OPTIONS} )
1316 IF( NOT "${ALIB_EXTERNAL_LIBS}" STREQUAL "" )
1317 target_link_libraries ( ${target} PRIVATE ${ALIB_EXTERNAL_LIBS} )
1320 # Use clang's own stdc++ library if requested
1321 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND ALIB_CLANG_USE_LIBCPP )
1322 target_compile_options(${target} PRIVATE -stdlib=libc++)
1323 target_link_libraries( ${target} PRIVATE c++)
1326 # With MSVC force UTF8 encoding of string literals
1328 target_compile_options(${target} PRIVATE /utf-8)
1333# -------------------------------------------------------------------------------------------------
1335# -------------------------------------------------------------------------------------------------
1336function( ALibAddStaticLibrary )
1338 add_library ( ALib_StaticLib STATIC )
1340 target_sources ( ALib_StaticLib PRIVATE ${ALIB_CPP} )
1341 message("ALib_SharedLib target added")
1343 ALibSetCompilerAndLinker ( ALib_StaticLib )
1344 set_target_properties ( ALib_StaticLib PROPERTIES ARCHIVE_OUTPUT_NAME ${ALIB_LIBRARY_FILENAME} )
1346 # Set up install/export after targets exist
1347 ALibSetupInstallAndConfig()
1350function( ALibAddSharedLibrary )
1351 add_library ( ALib_SharedLib SHARED )
1352 target_sources ( ALib_SharedLib PRIVATE ${ALIB_CPP} )
1353 message("ALib_SharedLib target added")
1355 ALibSetCompilerAndLinker ( ALib_SharedLib )
1356 set_target_properties ( ALib_SharedLib PROPERTIES LIBRARY_OUTPUT_NAME ${ALIB_LIBRARY_FILENAME} )
1359 target_compile_definitions(ALib_SharedLib PRIVATE "ALIB_API_IS_DLL" )
1361 # Set up install/export after targets exist
1362 ALibSetupInstallAndConfig()
1365## -------------------------------------------------------------------------------------------------
1366## Install/export rules and package config as a function to run after targets exist
1367## -------------------------------------------------------------------------------------------------
1368function(ALibSetupInstallAndConfig)
1369 if(alib_install_config_done)
1374 set(ALIB_PUBLIC_INCLUDE_DIR "${ALIB_BASE_DIR}/src/alib")
1376 # Provide a real INTERFACE target ALib that links to the preferred lib, exportable for consumers
1378 add_library(ALib INTERFACE)
1379 if(TARGET ALib_StaticLib AND NOT ALIB_PREFER_SHARED)
1380 target_link_libraries(ALib INTERFACE ALib_StaticLib)
1381 elseif(TARGET ALib_SharedLib)
1382 target_link_libraries(ALib INTERFACE ALib_SharedLib)
1386 # Header installation
1387 if(ALIB_INSTALL_HEADERS_ONLY_SELECTED)
1388 # Install only headers that correspond to the resolved module selection
1389 # Ensure ALIB_SOURCE_DIR is set (provided by ALibSources.cmake)
1390 if(NOT DEFINED ALIB_SOURCE_DIR)
1391 set(ALIB_SOURCE_DIR "${ALIB_BASE_DIR}/src")
1394 # 1) Public entry headers (live at src root like ALib.Strings.H)
1395# foreach(_h IN LISTS ALIB_H)
1396# install(FILES "${ALIB_SOURCE_DIR}/${_h}"
1397# DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ALib")
1399 foreach(_p IN LISTS ALIB_H)
1400 # _p is already an absolute path (prepared in ALibSources.cmake). Compute subdirectory
1401 # relative to the ALIB_SOURCE_DIR/alib root to mirror the include layout.
1402 file(RELATIVE_PATH _rel "${ALIB_SOURCE_DIR}/" "${_p}")
1403 get_filename_component(_rel_dir "${_rel}" DIRECTORY)
1404 set(_dst "${CMAKE_INSTALL_INCLUDEDIR}/")
1405 if(NOT _rel_dir STREQUAL "" AND NOT _rel_dir STREQUAL ".")
1406 set(_dst "${_dst}/${_rel_dir}")
1408 install(FILES "${_p}"
1409 DESTINATION "${_dst}")
1412 # 2) Internal headers under src/alib: from ALIB_INL, ALIB_HPP, ALIB_MPP
1413 set(_alib_sel_hdr_lists ${ALIB_INL} ${ALIB_HPP} ${ALIB_MPP})
1414 foreach(_p IN LISTS _alib_sel_hdr_lists)
1415 # _p is already an absolute path (prepared in ALibSources.cmake). Compute subdirectory
1416 # relative to the ALIB_SOURCE_DIR/alib root to mirror the include layout.
1417 file(RELATIVE_PATH _rel "${ALIB_SOURCE_DIR}/alib" "${_p}")
1418 get_filename_component(_rel_dir "${_rel}" DIRECTORY)
1419 set(_dst "${CMAKE_INSTALL_INCLUDEDIR}/alib")
1420 if(NOT _rel_dir STREQUAL "" AND NOT _rel_dir STREQUAL ".")
1421 set(_dst "${_dst}/${_rel_dir}")
1423 install(FILES "${_p}"
1424 DESTINATION "${_dst}")
1428 # Legacy behavior: install whole header tree from src/alib
1429 install(DIRECTORY "${ALIB_PUBLIC_INCLUDE_DIR}/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/alib" FILES_MATCHING
1430 PATTERN "*.h" PATTERN "*.hpp" PATTERN "*.inl" PATTERN "*.def" PATTERN "*.inc")
1433 # Library installation and export
1434 if(TARGET ALib_SharedLib)
1435 install(TARGETS ALib_SharedLib
1437 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1438 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1439 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1440 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1443 if(TARGET ALib_StaticLib)
1444 install(TARGETS ALib_StaticLib
1446 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1447 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1450 # Export the interface umbrella target as well
1452 install(TARGETS ALib EXPORT ALibTargets)
1455 install(EXPORT ALibTargets
1456 NAMESPACE ${ALIB_EXPORT_NAMESPACE}
1457 FILE ALibTargets.cmake
1458 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ALib)
1460 # Public compile definitions to propagate (only those enabled)
1461 set(ALIB_PUBLIC_COMPILE_DEFINITIONS "")
1462 foreach(_f IN LISTS ALIB_ABI_FLAGS)
1463 if(DEFINED ${_f} AND ${_f})
1464 list(APPEND ALIB_PUBLIC_COMPILE_DEFINITIONS ${_f})
1467 list(REMOVE_DUPLICATES ALIB_PUBLIC_COMPILE_DEFINITIONS)
1469 # Export include directories and compile definitions via the ALib interface target,
1470 # so consumers get them from ALibTargets.cmake without extra logic in ALibConfig.cmake
1472 # Provide build- and install-time include directories
1473 target_include_directories(ALib INTERFACE $<BUILD_INTERFACE:${ALIB_BASE_DIR}/src>)
1474 target_include_directories(ALib INTERFACE $<BUILD_INTERFACE:${ALIB_BASE_DIR}/src/alib>)
1475 target_include_directories(ALib INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
1476 # Provide public compile definitions (ABI flags)
1477 if(ALIB_PUBLIC_COMPILE_DEFINITIONS)
1478 target_compile_definitions(ALib INTERFACE ${ALIB_PUBLIC_COMPILE_DEFINITIONS})
1482 # Use ALib version variables if present
1483 # Keep numeric version for CMake package versioning and keep tag format for manifests
1484 if(NOT DEFINED ALIB_VERSION_NUMERIC)
1485 if(DEFINED ALIB_VERSION_NO AND DEFINED ALIB_VERSION_REV)
1486 set(ALIB_VERSION_NUMERIC "${ALIB_VERSION_NO}.${ALIB_VERSION_REV}")
1487 elseif(DEFINED ALIB_VERSION_NO)
1488 set(ALIB_VERSION_NUMERIC "${ALIB_VERSION_NO}")
1492 # Expose ALIB_VERSION as numeric as well (used in ALibConfig.cmake)
1493 if(NOT DEFINED ALIB_VERSION)
1494 set(ALIB_VERSION "${ALIB_VERSION_NUMERIC}")
1497 configure_package_config_file(
1498 "${ALIB_CMAKE_DIR}/ALibConfig.cmake.in"
1499 "${CMAKE_CURRENT_BINARY_DIR}/ALibConfig.cmake"
1500 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ALib
1501 NO_SET_AND_CHECK_MACRO
1502 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
1504 write_basic_package_version_file(
1505 "${CMAKE_CURRENT_BINARY_DIR}/ALibConfigVersion.cmake"
1506 VERSION ${ALIB_VERSION_NUMERIC}
1507 COMPATIBILITY SameMajorVersion)
1510 "${CMAKE_CURRENT_BINARY_DIR}/ALibConfig.cmake"
1511 "${CMAKE_CURRENT_BINARY_DIR}/ALibConfigVersion.cmake"
1512 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ALib)
1514 # Optional: write a simple manifest for debugging
1515 set(_alib_manifest "${CMAKE_CURRENT_BINARY_DIR}/ALibVariant.txt")
1516 file(WRITE "${_alib_manifest}" "ALib Variant\n")
1517 file(APPEND "${_alib_manifest}" "VariantKey: ${ALIB_VARIANT_KEY}\n")
1518 file(APPEND "${_alib_manifest}" "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}\n")
1519 file(APPEND "${_alib_manifest}" "StdLib: ${_alib_stdlib}\n")
1520 file(APPEND "${_alib_manifest}" "CXX Standard: ${CMAKE_CXX_STANDARD}\n")
1521 file(APPEND "${_alib_manifest}" "BuildType: ${CMAKE_BUILD_TYPE}\n")
1522 file(APPEND "${_alib_manifest}" "Arch: ${_alib_arch}\n")
1523 file(APPEND "${_alib_manifest}" "Flags: ${_alib_flags_sig}\n")
1524 file(APPEND "${_alib_manifest}" "VersionTag: ${_alib_version_tag}\n")
1525 install(FILES "${_alib_manifest}" DESTINATION ${CMAKE_INSTALL_DATADIR}/ALib)
1527 set(alib_install_config_done TRUE PARENT_SCOPE)
1528 set(alib_install_config_done TRUE)
1531# --------------------------------------------------------------------------------------------------
1532# CMake debugging Uncomment a line to have CMake summarize information
1533# --------------------------------------------------------------------------------------------------
1534#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} INCLUDE_DIRECTORIES )
1535#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} SOURCES )
1536#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} COMPILE_DEFINITIONS )
1537#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} COMPILE_OPTIONS )
1538#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} COMPILE_FEATURES )
1539#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} AUTOUIC_OPTIONS )
1540#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} POSITION_INDEPENDENT_CODE )
1541#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} CONTAINER_SIZE_REQUIRED )
1542#set(CMAKE_DEBUG_TARGET_PROPERTIES ${CMAKE_DEBUG_TARGET_PROPERTIES} LIB_VERSION )
1544set(CMAKE_VERBOSE_MAKEFILE ON)
1545set(CMAKE_RULE_MESSAGES ON )