aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt99
1 files changed, 98 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6720e77..7d4ecf6 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/RTTI.cmake)
include(buildtools/cmake/Win32Subsystem.cmake)
find_package(OpenGL REQUIRED)
@@ -13,6 +14,94 @@ add_subdirectory(3rdparty/imgui)
add_subdirectory(3rdparty/imguicolortextedit)
add_subdirectory(3rdparty/tracy)
+# ==============================================================================
+
+file(GLOB_RECURSE things_common_SOURCES source-common/*.c source-common/*.cpp)
+add_library(things_common OBJECT ${things_common_SOURCES})
+
+set_target_properties(things_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_include_directories(things_common PUBLIC source-common)
+target_link_libraries(things_common PUBLIC
+ # External dependencies
+ ${CONAN_LIBS}
+ glm::glm
+)
+
+# ==============================================================================
+
+# NOTE: delibrately not recursive, see README.md in the folder for details
+file(GLOB codegen_SOURCES buildtools/codegen/*.c buildtools/codegen/*.cpp)
+add_executable(codegen ${codegen_SOURCES})
+
+set_target_properties(codegen PROPERTIES
+ CXX_STANDARD 20
+ CXX_STANDARD_REQUIRED ON
+ CXX_EXTENSIONS OFF
+ UNITY_BUILD OFF
+)
+
+target_link_libraries(codegen PRIVATE
+ # External dependencies
+ ${CONAN_LIBS}
+
+ # Project internal components
+ things_common
+)
+
+target_flag_rtti(codegen OFF)
+
+option(BRUSSEL_CODEGEN_DEBUG_PRINT "Enable debug printing in the code generator or not." OFF)
+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})
+
+set_target_properties(things_codegen_base 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
+ # External dependencies
+ ${CONAN_LIBS}
+
+ # Project internal components
+ 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)
+
+ set(OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated/${TARGET_NAME})
+ set(OUTPUT_FILES
+ ${OUTPUT_DIR}/generated/GeneratedCode.hpp
+ ${OUTPUT_DIR}/generated/GeneratedCode.cpp
+ )
+ add_custom_command(
+ OUTPUT ${OUTPUT_FILES}
+ COMMAND codegen ${OUTPUT_DIR}/generated rec:${SEARCH_DIR}
+ DEPENDS ${TARGET_SOURCES}
+ )
+
+ target_include_directories(${TARGET_NAME} PRIVATE ${OUTPUT_DIR})
+ target_sources(${TARGET_NAME} PRIVATE ${OUTPUT_FILES})
+endfunction()
+
+# ==============================================================================
+
# add_executable requires at least one source file
add_executable(${PROJECT_NAME} dummy.c)
add_subdirectory(source)
@@ -22,8 +111,8 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
UNITY_BUILD_UNIQUE_ID "${PROJECT_NAME}_UNITY_ID"
)
-target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
set_target_properties(${PROJECT_NAME} PROPERTIES
+ CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
)
@@ -39,6 +128,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE
)
target_link_libraries(${PROJECT_NAME} PRIVATE
+ # External dependencies
${CONAN_LIBS}
OpenGL::GL
glfw
@@ -46,6 +136,10 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
imgui
ImGuiColorTextEdit
tracy
+
+ # Project internal components
+ things_common
+ things_codegen_base
)
target_use_windows_subsystem(${PROJECT_NAME})
@@ -79,3 +173,6 @@ if(BRUSSEL_ENABLE_ASAN)
-fno-omit-frame-pointer
)
endif()
+
+get_filename_component(METADATA_INP_DIR "source" ABSOLUTE)
+target_gen_metadata(${PROJECT_NAME} ${METADATA_INP_DIR})