diff options
author | rtk0c <[email protected]> | 2022-05-30 16:38:45 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-05-30 16:38:45 -0700 |
commit | 366ef5a5450c6e0e680c924c3454943a9ae9814d (patch) | |
tree | 87ef5741bae89aaac6f502130b339fa7cd7be525 | |
parent | 66ee4d47d55516ff55f72dfe2de1fb16c04dcb5b (diff) |
Changeset: 55 Buildsystem cleanup: add "projectized" targets
-rw-r--r-- | CMakeLists.txt | 141 | ||||
-rw-r--r-- | buildtools/cmake/Exceptions.cmake | 31 | ||||
-rw-r--r-- | buildtools/codegen-companion/MacrosCodegen.hpp (renamed from source-codegen-base/MacrosCodegen.hpp) | 0 | ||||
-rw-r--r-- | buildtools/codegen-companion/Metadata.cpp (renamed from source-codegen-base/Metadata.cpp) | 0 | ||||
-rw-r--r-- | buildtools/codegen-companion/Metadata.hpp (renamed from source-codegen-base/Metadata.hpp) | 0 | ||||
-rw-r--r-- | buildtools/codegen-companion/MetadataBase.cpp (renamed from source-codegen-base/MetadataBase.cpp) | 0 | ||||
-rw-r--r-- | buildtools/codegen-companion/MetadataBase.hpp (renamed from source-codegen-base/MetadataBase.hpp) | 0 | ||||
-rw-r--r-- | buildtools/codegen/CodegenUtils.inl | 2 | ||||
-rw-r--r-- | buildtools/codegen/main.cpp | 8 |
9 files changed, 143 insertions, 39 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 diff --git a/buildtools/cmake/Exceptions.cmake b/buildtools/cmake/Exceptions.cmake new file mode 100644 index 0000000..89e7e69 --- /dev/null +++ b/buildtools/cmake/Exceptions.cmake @@ -0,0 +1,31 @@ +function(target_flag_exceptions_msvc TARGET_NAME ENABLED) + if(ENABLED) + target_compile_options(${TARGET_NAME} PRIVATE /EHsc) + else() + target_compile_options(${TARGET_NAME} PRIVATE /EH-) + endif() +endfunction() + +function(target_flag_exceptions_gcc TARGET_NAME ENABLED) + if(ENABLED) + target_compile_options(${TARGET_NAME} PRIVATE -fexceptions) + else() + target_compile_options(${TARGET_NAME} PRIVATE -fno-exceptions) + endif() +endfunction() + +function(target_flag_exceptions TARGET_NAME ENABLED) + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + target_flag_exceptions_msvc(${TARGET_NAME} ${ENABLED}) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "MSVC") + target_flag_exceptions_msvc(${TARGET_NAME} ${ENABLED}) + elseif(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "GNU") + target_flag_exceptions_gcc(${TARGET_NAME} ${ENABLED}) + endif() + elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + target_flag_exceptions_gcc(${TARGET_NAME} ${ENABLED}) + else() + message(FATAL "target_flag_exceptions(): Unknown compiler ${CMAKE_CXX_COMPILER_ID}") + endif() +endfunction() diff --git a/source-codegen-base/MacrosCodegen.hpp b/buildtools/codegen-companion/MacrosCodegen.hpp index 6803023..6803023 100644 --- a/source-codegen-base/MacrosCodegen.hpp +++ b/buildtools/codegen-companion/MacrosCodegen.hpp diff --git a/source-codegen-base/Metadata.cpp b/buildtools/codegen-companion/Metadata.cpp index ee32054..ee32054 100644 --- a/source-codegen-base/Metadata.cpp +++ b/buildtools/codegen-companion/Metadata.cpp diff --git a/source-codegen-base/Metadata.hpp b/buildtools/codegen-companion/Metadata.hpp index a038c15..a038c15 100644 --- a/source-codegen-base/Metadata.hpp +++ b/buildtools/codegen-companion/Metadata.hpp diff --git a/source-codegen-base/MetadataBase.cpp b/buildtools/codegen-companion/MetadataBase.cpp index 3ccf870..3ccf870 100644 --- a/source-codegen-base/MetadataBase.cpp +++ b/buildtools/codegen-companion/MetadataBase.cpp diff --git a/source-codegen-base/MetadataBase.hpp b/buildtools/codegen-companion/MetadataBase.hpp index 8be668d..8be668d 100644 --- a/source-codegen-base/MetadataBase.hpp +++ b/buildtools/codegen-companion/MetadataBase.hpp diff --git a/buildtools/codegen/CodegenUtils.inl b/buildtools/codegen/CodegenUtils.inl index f9d913e..6feb654 100644 --- a/buildtools/codegen/CodegenUtils.inl +++ b/buildtools/codegen/CodegenUtils.inl @@ -90,9 +90,9 @@ void ProduceGeneratedHeaderFileHeader(CodegenOutput& output) { void ProduceGeneratedSourceFileHeader(CodegenOutput& output) { output.AddOutputThing(CodegenOutputThing{ + // TODO we need to get the header name .text = &R"""( // This file is generated. Any changes will be overidden when building. -#include "GeneratedCode.hpp" #include <cstddef> #include <cstdint> diff --git a/buildtools/codegen/main.cpp b/buildtools/codegen/main.cpp index 2c259a4..b139515 100644 --- a/buildtools/codegen/main.cpp +++ b/buildtools/codegen/main.cpp @@ -642,6 +642,9 @@ void HandleInputFile(AppState& state, std::string_view filenameStem, std::string Utils::WriteOutputFile(cgHeaderOutput, state.outputDir, filenameStem, ".gh.inl"sv); Utils::WriteOutputFile(cgSourceOutput, state.outputDir, filenameStem, ".gs.inl"sv); + + // TODO see CMakeLists.txt for rationale, clean this up to be a proper citizen + Utils::WriteOutputFile(CodegenOutput{}, state.outputDir, filenameStem, ".gs.cpp"sv); } enum InputOpcode { @@ -750,8 +753,9 @@ where <output path>: the directory to write generated contents to. This will N } } - Utils::WriteOutputFile(state.mainHeaderOutput, state.outputDir, "GeneratedCode.hpp"sv); - Utils::WriteOutputFile(state.mainSourceOutput, state.outputDir, "GeneratedCode.cpp"sv); + // TODO do we even need these? + // Utils::WriteOutputFile(state.mainHeaderOutput, state.outputDir, "GeneratedCode.hpp"sv); + // Utils::WriteOutputFile(state.mainSourceOutput, state.outputDir, "GeneratedCode.cpp"sv); return 0; } |