aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt205
1 files changed, 186 insertions, 19 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ad2bf16..ca9c541 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,6 +4,10 @@ project(ProjectBrussel LANGUAGES C CXX)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
+include(cmake/Exceptions.cmake)
+include(cmake/RTTI.cmake)
+include(cmake/Win32Subsystem.cmake)
+
find_package(OpenGL REQUIRED)
add_subdirectory(3rdparty/glfw)
add_subdirectory(3rdparty/glm)
@@ -11,32 +15,181 @@ add_subdirectory(3rdparty/imgui)
add_subdirectory(3rdparty/imguicolortextedit)
add_subdirectory(3rdparty/tracy)
-# add_executable requires at least one source file
-add_executable(${PROJECT_NAME} dummy.c)
-add_subdirectory(source)
+# ==============================================================================
+# Layer 10 (standalone, throw-into-the-buildsystem style)
-set_target_properties(${PROJECT_NAME} PROPERTIES
- UNITY_BUILD_MODE BATCH
- UNITY_BUILD_UNIQUE_ID "${PROJECT_NAME}_UNITY_ID"
+file(GLOB_RECURSE 10-common_SOURCES
+ source/10-common/*.c
+ source/10-common/*.cpp
)
+add_library(10-common OBJECT ${10-common_SOURCES})
-target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
-set_target_properties(${PROJECT_NAME} PROPERTIES
+set_target_properties(10-common PROPERTIES
+ CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
+
+ # Many files include platform headers, we don't want to leak them - it's just simpler to disable unity build for everything
+ UNITY_BUILD OFF
)
-target_compile_definitions(${PROJECT_NAME} PRIVATE
- RAPIDJSON_HAS_STDSTRING=1
- IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- BRUSSEL_DEV_ENV=1
+target_include_directories(10-common PUBLIC source/10-common)
+target_link_libraries(10-common PUBLIC
+ # External dependencies
+ ${CONAN_LIBS}
+ glm::glm
+)
+
+# ==============================================================================
+# Layer 20 (building tools)
+
+file(GLOB_RECURSE 20-codegen-runtime_SOURCES
+ source/20-codegen-runtime/*.c
+ source/20-codegen-runtime/*.cpp
+)
+add_library(20-codegen-runtime OBJECT ${20-codegen-runtime_SOURCES})
+
+set_target_properties(20-codegen-runtime PROPERTIES
+ CXX_STANDARD 20
+ CXX_STANDARD_REQUIRED ON
+ CXX_EXTENSIONS OFF
+)
+
+target_include_directories(20-codegen-runtime PUBLIC source/20-codegen-runtime)
+target_link_libraries(20-codegen-runtime PUBLIC
+ # External dependencies
+ ${CONAN_LIBS}
+
+ # Project internal components
+ 10-common
+)
+
+# NOTE: delibrately not recursive, because this target can contain non-source files with .cpp extensions in the folder
+file(GLOB 20-codegen-compiler_SOURCES
+ source/20-codegen-compiler/*.c
+ source/20-codegen-compiler/*.cpp
)
+add_executable(20-codegen-compiler ${20-codegen-compiler_SOURCES})
-target_include_directories(${PROJECT_NAME} PRIVATE
- sources
+set_target_properties(20-codegen-compiler PROPERTIES
+ CXX_STANDARD 20
+ CXX_STANDARD_REQUIRED ON
+ CXX_EXTENSIONS OFF
)
-target_link_libraries(${PROJECT_NAME} PRIVATE
+target_link_libraries(20-codegen-compiler PRIVATE
+ # External dependencies
+ ${CONAN_LIBS}
+
+ # Project internal components
+ 10-common
+)
+
+target_flag_exceptions(20-codegen-compiler ON)
+target_flag_rtti(20-codegen-compiler OFF)
+
+option(BRUSSEL_CODEGEN_DEBUG_PRINT "Enable debug printing in the code generator or not." OFF)
+if(BRUSSEL_CODEGEN_DEBUG_PRINT)
+ target_compile_definitions(20-codegen-compiler PRIVATE CODEGEN_DEBUG_PRINT=1)
+endif()
+
+# ==============================================================================
+# Layer 30 (final products)
+
+function(add_projectized_executable)
+ # Add a library target
+ #
+ # Arguments
+ # TARGET_NAME
+ # TARGET_SOURCE_DIR
+ # EXTRA_SOURCES
+ # ENABLE_CODEGEN
+
+ set(one_value_args TARGET_NAME TARGET_SOURCE_DIR ENABLE_CODEGEN)
+ set(multi_value_args EXTRA_SOURCES)
+ cmake_parse_arguments(arg "" "${one_value_args}" "${multi_value_args}" ${ARGN})
+
+ file(GLOB_RECURSE var_HEADERS
+ ${arg_TARGET_SOURCE_DIR}/*.h
+ ${arg_TARGET_SOURCE_DIR}/*.hh
+ ${arg_TARGET_SOURCE_DIR}/*.hpp
+ )
+ file(GLOB_RECURSE var_SOURCES
+ ${arg_TARGET_SOURCE_DIR}/*.c
+ ${arg_TARGET_SOURCE_DIR}/*.cc
+ ${arg_TARGET_SOURCE_DIR}/*.cpp
+ )
+ add_executable(${arg_TARGET_NAME}
+ ${var_SOURCES}
+ ${arg_EXTRA_SOURCES}
+ )
+
+ target_include_directories(${arg_TARGET_NAME} PRIVATE
+ ${arg_TARGET_SOURCE_DIR}
+ )
+
+ target_link_libraries(${arg_TARGET_NAME} PRIVATE
+ 10-common
+ )
+
+ set_target_properties(${arg_TARGET_NAME} PROPERTIES
+ CXX_STANDARD 20
+ CXX_STANDARD_REQUIRED ON
+ CXX_EXTENSIONS OFF
+ )
+
+ if(arg_ENABLE_CODEGEN)
+ set(var_OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated/${arg_TARGET_NAME})
+ target_include_directories(${arg_TARGET_NAME} PRIVATE ${var_OUTPUT_DIR})
+ target_link_libraries(${arg_TARGET_NAME} PRIVATE 20-codegen-runtime)
+
+ foreach(var_HEADER IN LISTS var_HEADERS)
+ get_filename_component(var_HEADER_ABS "${var_HEADER}" ABSOLUTE)
+ get_filename_component(var_HEADER_NAME "${var_HEADER}" NAME_WLE)
+
+ # Things that are included by other TUs
+ set(var_OUTPUT_HEADERS
+ ${var_OUTPUT_DIR}/generated/${var_HEADER_NAME}.gh.inl
+ ${var_OUTPUT_DIR}/generated/${var_HEADER_NAME}.gs.inl
+ )
+
+ # Things that needs to be compiled
+ # NOTE: we need at least one of this to make sure the target is rebuilt if the generated files changes
+ set(var_OUTPUT_SOURCES
+ ${var_OUTPUT_DIR}/generated/${var_HEADER_NAME}.g.cpp
+ )
+
+ # Generate the files
+ add_custom_command(
+ OUTPUT ${var_OUTPUT_HEADERS} ${var_OUTPUT_SOURCES}
+ COMMAND 20-codegen-compiler ${var_OUTPUT_DIR}/generated single:${var_HEADER}
+ DEPENDS ${var_HEADER}
+ )
+
+ # Add generated TUs to the target
+ target_sources(${arg_TARGET_NAME} PRIVATE ${var_OUTPUT_SOURCES})
+ endforeach()
+ endif()
+endfunction()
+
+add_projectized_executable(
+ TARGET_NAME 30-game
+ TARGET_SOURCE_DIR source/30-game/
+ ENABLE_CODEGEN ON
+)
+
+set_target_properties(30-game PROPERTIES
+ UNITY_BUILD_MODE BATCH
+ UNITY_BUILD_UNIQUE_ID "ProjectBrussel_UNITY_ID"
+)
+
+target_compile_definitions(30-game PRIVATE
+ RAPIDJSON_HAS_STDSTRING=1
+ IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+)
+
+target_link_libraries(30-game PRIVATE
+ # External dependencies
${CONAN_LIBS}
OpenGL::GL
glfw
@@ -44,19 +197,33 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
imgui
ImGuiColorTextEdit
tracy
+
+ # Project internal components
)
+target_flag_exceptions(30-game ON)
+target_flag_rtti(30-game ON)
+target_use_windows_subsystem(30-game)
+
option(BRUSSEL_ENABLE_PROFILING "Whether profiling support is enabled or not." OFF)
if(BRUSSEL_ENABLE_PROFILING)
- target_compile_definitions(${PROJECT_NAME}
+ target_compile_definitions(30-game
PRIVATE
TRACY_ENABLE
)
endif()
+option(BRUSSEL_ENABLE_DEV_ENC "Enable dev environment features or not." ON)
+if(BRUSSEL_ENABLE_DEV_ENC)
+ target_compile_definitions(30-game
+ PRIVATE
+ BRUSSEL_DEV_ENV=1
+ )
+endif()
+
option(BRUSSEL_ENABLE_EDITOR "Enable editor support or not." ON)
if(BRUSSEL_ENABLE_EDITOR)
- target_compile_definitions(${PROJECT_NAME}
+ target_compile_definitions(30-game
PRIVATE
BRUSSEL_ENABLE_EDITOR=1
)
@@ -64,12 +231,12 @@ endif()
option(BRUSSEL_ENABLE_ASAN "Enable AddressSanitizer or not." OFF)
if(BRUSSEL_ENABLE_ASAN)
- target_compile_options(${PROJECT_NAME}
+ target_compile_options(30-game
PRIVATE
-fsanitize=address
-fno-omit-frame-pointer
)
- target_link_options(${PROJECT_NAME}
+ target_link_options(30-game
PRIVATE
-fsanitize=address
-fno-omit-frame-pointer