aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt141
1 files changed, 105 insertions, 36 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ac88ec..a418491 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,6 +4,7 @@ project(ProjectBrussel LANGUAGES C CXX)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
+include(buildtools/cmake/Exceptions.cmake)
include(buildtools/cmake/RTTI.cmake)
include(buildtools/cmake/Win32Subsystem.cmake)
@@ -15,6 +16,7 @@ add_subdirectory(3rdparty/imguicolortextedit)
add_subdirectory(3rdparty/tracy)
# ==============================================================================
+# Standalone library things
file(GLOB_RECURSE things_common_SOURCES source-common/*.c source-common/*.cpp)
add_library(things_common OBJECT ${things_common_SOURCES})
@@ -36,6 +38,7 @@ target_link_libraries(things_common PUBLIC
)
# ==============================================================================
+# Codegen
# NOTE: delibrately not recursive, see README.md in the folder for details
file(GLOB codegen_SOURCES buildtools/codegen/*.c buildtools/codegen/*.cpp)
@@ -56,6 +59,7 @@ target_link_libraries(codegen PRIVATE
things_common
)
+target_flag_exceptions(codegen ON)
target_flag_rtti(codegen OFF)
option(BRUSSEL_CODEGEN_DEBUG_PRINT "Enable debug printing in the code generator or not." OFF)
@@ -63,17 +67,17 @@ if(BRUSSEL_CODEGEN_DEBUG_PRINT)
target_compile_definitions(codegen PRIVATE CODEGEN_DEBUG_PRINT=1)
endif()
-file(GLOB_RECURSE things_codegen_base_SOURCES source-codegen-base/*.c source-codegen-base/*.cpp)
-add_library(things_codegen_base OBJECT ${things_codegen_base_SOURCES})
+file(GLOB_RECURSE things_codegen_companion_SOURCES buildtools/codegen-companion/*.c buildtools/codegen-companion/*.cpp)
+add_library(things_codegen_companion OBJECT ${things_codegen_companion_SOURCES})
-set_target_properties(things_codegen_base PROPERTIES
+set_target_properties(things_codegen_companion PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
)
-target_include_directories(things_codegen_base PUBLIC source-codegen-base)
-target_link_libraries(things_codegen_base PUBLIC
+target_include_directories(things_codegen_companion PUBLIC buildtools/codegen-companion)
+target_link_libraries(things_codegen_companion PUBLIC
# External dependencies
${CONAN_LIBS}
@@ -81,49 +85,109 @@ target_link_libraries(things_codegen_base PUBLIC
things_common
)
-# TODO support reading all files from the target, instead of manually supplying a search dir
-function(target_gen_metadata TARGET_NAME SEARCH_DIR)
- get_target_property(TARGET_SOURCES ${TARGET_NAME} SOURCES)
+# ==============================================================================
+# Target creation code
+
+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})
- set(OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated/${TARGET_NAME})
- set(OUTPUT_FILES
- ${OUTPUT_DIR}/generated/GeneratedCode.hpp
- ${OUTPUT_DIR}/generated/GeneratedCode.cpp
+ file(GLOB_RECURSE var_HEADERS
+ ${arg_TARGET_SOURCE_DIR}/*.h
+ ${arg_TARGET_SOURCE_DIR}/*.hh
+ ${arg_TARGET_SOURCE_DIR}/*.hpp
)
- add_custom_command(
- OUTPUT ${OUTPUT_FILES}
- COMMAND codegen ${OUTPUT_DIR}/generated rec:${SEARCH_DIR}
- DEPENDS ${TARGET_SOURCES}
+ 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(${TARGET_NAME} PRIVATE ${OUTPUT_DIR})
- target_sources(${TARGET_NAME} PRIVATE ${OUTPUT_FILES})
+ target_include_directories(${arg_TARGET_NAME} PRIVATE
+ ${arg_TARGET_SOURCE_DIR}
+ )
+
+ target_link_libraries(${arg_TARGET_NAME} PRIVATE
+ things_common
+ )
+
+ set_target_properties(brussel 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 things_codegen_companion)
+
+ 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}.gs.cpp
+ )
+
+ # Generate the files
+ add_custom_command(
+ OUTPUT ${var_OUTPUT_HEADERS} ${var_OUTPUT_SOURCES}
+ COMMAND codegen ${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()
# ==============================================================================
+# The main game
-file(GLOB_RECURSE brussel_SOURCES source/*.h source/*.c source/*.hpp source/*.cpp)
-add_executable(brussel ${brussel_SOURCES})
+add_projectized_executable(
+ TARGET_NAME brussel
+ TARGET_SOURCE_DIR source/
+ ENABLE_CODEGEN ON
+)
-set_target_properties(brussel PROPERTIES
- UNITY_BUILD_MODE BATCH
- UNITY_BUILD_UNIQUE_ID "ProjectBrussel_UNITY_ID"
+set_source_files_properties(
+ source/main.cpp
+TARGET_DIRECTORY brussel
+PROPERTIES
+ SKIP_UNITY_BUILD_INCLUSION ON
)
set_target_properties(brussel PROPERTIES
- CXX_STANDARD 20
- CXX_STANDARD_REQUIRED ON
- CXX_EXTENSIONS OFF
+ UNITY_BUILD_MODE BATCH
+ UNITY_BUILD_UNIQUE_ID "ProjectBrussel_UNITY_ID"
)
target_compile_definitions(brussel PRIVATE
RAPIDJSON_HAS_STDSTRING=1
IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- BRUSSEL_DEV_ENV=1
-)
-
-target_include_directories(brussel PRIVATE
- sources
)
target_link_libraries(brussel PRIVATE
@@ -137,15 +201,12 @@ target_link_libraries(brussel PRIVATE
tracy
# Project internal components
- things_common
- things_codegen_base
)
+target_flag_exceptions(brussel ON)
+target_flag_rtti(brussel ON)
target_use_windows_subsystem(brussel)
-get_filename_component(METADATA_INP_DIR "source" ABSOLUTE)
-target_gen_metadata(brussel ${METADATA_INP_DIR})
-
option(BRUSSEL_ENABLE_PROFILING "Whether profiling support is enabled or not." OFF)
if(BRUSSEL_ENABLE_PROFILING)
target_compile_definitions(brussel
@@ -154,6 +215,14 @@ if(BRUSSEL_ENABLE_PROFILING)
)
endif()
+option(BRUSSEL_ENABLE_DEV_ENC "Enable dev environment features or not." ON)
+if(BRUSSEL_ENABLE_DEV_ENC)
+ target_compile_definitions(brussel
+ PRIVATE
+ BRUSSEL_DEV_ENV=1
+ )
+endif()
+
option(BRUSSEL_ENABLE_EDITOR "Enable editor support or not." ON)
if(BRUSSEL_ENABLE_EDITOR)
target_compile_definitions(brussel