aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-05-30 16:38:45 -0700
committerrtk0c <[email protected]>2022-05-30 16:38:45 -0700
commit366ef5a5450c6e0e680c924c3454943a9ae9814d (patch)
tree87ef5741bae89aaac6f502130b339fa7cd7be525
parent66ee4d47d55516ff55f72dfe2de1fb16c04dcb5b (diff)
Changeset: 55 Buildsystem cleanup: add "projectized" targets
-rw-r--r--CMakeLists.txt141
-rw-r--r--buildtools/cmake/Exceptions.cmake31
-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.inl2
-rw-r--r--buildtools/codegen/main.cpp8
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;
}