Echo Writes Code

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
cmake_minimum_required(VERSION 3.23 FATAL_ERROR)

project(Crucible
  DESCRIPTION "Crucible is an all-in-one framework for building cross-platform applications."
  LANGUAGES CXX
  VERSION 1.0.0)

list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")

set(BUILD_SHARED_LIBS ON CACHE BOOL "Build a shared library instead of a static library [default: ON]")

set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type (see https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) [default: RelWithDebInfo]")

set(CRUCIBLE_ENABLE_ADDRESS_SANITIZER FALSE CACHE BOOL "Enable AddressSanitizer if supported [default: OFF]")
set(CRUCIBLE_ENABLE_COMPILER_WARNINGS TRUE CACHE BOOL "Enable warnings on supported compilers [default: ON]")
set(CRUCIBLE_ENABLE_THREAD_SANITIZER FALSE CACHE BOOL "Enable ThreadSanitizer if supported [default: OFF]")
set(CRUCIBLE_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER FALSE CACHE BOOL "Enable UndefinedBehaviorSanitizer if supported [default: OFF]")
set(CRUCIBLE_ENABLE_SANITIZER_RECOVERY FALSE CACHE BOOL "Attempt to recover from sanitizer errors if supported [default: OFF]")

set(CRUCIBLE_BUILD_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/output" CACHE PATH "The directory to place the build output [default: ${PROJECT_BINARY_DIR}/output]")

message(NOTICE)
message(NOTICE "╭───────────────────────────────────────╮")
message(NOTICE "│         PROJECT CONFIGURATION         │")
message(NOTICE "╰───────────────────────────────────────╯")
message(NOTICE)
message(NOTICE "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
message(NOTICE "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(NOTICE "CRUCIBLE_ENABLE_ADDRESS_SANITIZER: ${CRUCIBLE_ENABLE_ADDRESS_SANITIZER}")
message(NOTICE "CRUCIBLE_ENABLE_COMPILER_WARNINGS: ${CRUCIBLE_ENABLE_COMPILER_WARNINGS}")
message(NOTICE "CRUCIBLE_ENABLE_THREAD_SANITIZER: ${CRUCIBLE_ENABLE_THREAD_SANITIZER}")
message(NOTICE "CRUCIBLE_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER: ${CRUCIBLE_ENABLE_UNDEFINED_BEHAVIOR_SANITIZER}")
message(NOTICE "CRUCIBLE_ENABLE_SANITIZER_RECOVERY: ${CRUCIBLE_ENABLE_SANITIZER_RECOVERY}")
message(NOTICE "CRUCIBLE_BUILD_OUTPUT_DIRECTORY: ${CRUCIBLE_BUILD_OUTPUT_DIRECTORY}")

include(CTest)

message(NOTICE)
message(NOTICE "╭─────────────────────────────────────────╮")
message(NOTICE "│         TOOLCHAIN CONFIGURATION         │")
message(NOTICE "╰─────────────────────────────────────────╯")
message(NOTICE)
message(NOTICE "CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
message(NOTICE "CMAKE_CXX_COMPILER_VERSION: ${CMAKE_CXX_COMPILER_VERSION}")
message(NOTICE)

include(CrucibleConfigure)

crucible_configure_address_sanitizer()
crucible_configure_exception_handling()
crucible_configure_language_standards()
crucible_configure_optimizations()
crucible_configure_output_directory()
crucible_configure_preprocessor_definitions()
crucible_configure_sanitizer_recovery_policy()
crucible_configure_symbol_export_behavior()
crucible_configure_text_encoding()
crucible_configure_thread_sanitizer()
crucible_configure_undefined_behavior_sanitizer()
crucible_configure_warning_level()

message(NOTICE)
message(NOTICE "╭───────────────────────────────────────╮")
message(NOTICE "│        PLATFORM IDENTIFICATION        │")
message(NOTICE "╰───────────────────────────────────────╯")
message(NOTICE)
message(NOTICE "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
message(NOTICE "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
message(NOTICE "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
message(NOTICE "CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}")
message(NOTICE "CMAKE_HOST_SYSTEM_VERSION: ${CMAKE_HOST_SYSTEM_VERSION}")
message(NOTICE "CMAKE_HOST_SYSTEM_PROCESSOR: ${CMAKE_HOST_SYSTEM_PROCESSOR}")
message(NOTICE)

include(CrucibleCheck)

crucible_check_platform_is_64_bit()
crucible_check_platform_is_posix_like()
crucible_check_platform_is_windows_like()
crucible_check_platform_has_dirent_d_namlen()
crucible_check_platform_path_separator()

message(NOTICE)
message(NOTICE "╭───────────────────────────────────╮")
message(NOTICE "│         TARGET DEFINITION         │")
message(NOTICE "╰───────────────────────────────────╯")
message(NOTICE)

include(CrucibleAdd)

add_subdirectory(executables)
add_subdirectory(libraries)

message(NOTICE)
message(NOTICE "╭──────────────────────────╮")
message(NOTICE "│         COMPLETE         │")
message(NOTICE "╰──────────────────────────╯")
message(NOTICE)