From 366ef5a5450c6e0e680c924c3454943a9ae9814d Mon Sep 17 00:00:00 2001 From: rtk0c Date: Mon, 30 May 2022 16:38:45 -0700 Subject: Changeset: 55 Buildsystem cleanup: add "projectized" targets --- CMakeLists.txt | 141 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 36 deletions(-) (limited to 'CMakeLists.txt') 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}) + + 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} + ) - set(OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated/${TARGET_NAME}) - set(OUTPUT_FILES - ${OUTPUT_DIR}/generated/GeneratedCode.hpp - ${OUTPUT_DIR}/generated/GeneratedCode.cpp + target_include_directories(${arg_TARGET_NAME} PRIVATE + ${arg_TARGET_SOURCE_DIR} ) - add_custom_command( - OUTPUT ${OUTPUT_FILES} - COMMAND codegen ${OUTPUT_DIR}/generated rec:${SEARCH_DIR} - DEPENDS ${TARGET_SOURCES} + + target_link_libraries(${arg_TARGET_NAME} PRIVATE + things_common + ) + + set_target_properties(brussel PROPERTIES + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF ) - target_include_directories(${TARGET_NAME} PRIVATE ${OUTPUT_DIR}) - target_sources(${TARGET_NAME} PRIVATE ${OUTPUT_FILES}) + 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 -- cgit v1.2.3-70-g09d2