cmake_minimum_required(VERSION 3.13) 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) find_package(OpenGL REQUIRED) add_subdirectory(3rdparty/glfw) add_subdirectory(3rdparty/glm) add_subdirectory(3rdparty/imgui) 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}) 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 ) # ============================================================================== # Codegen # 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_exceptions(codegen ON) 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_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_companion PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) target_include_directories(things_codegen_companion PUBLIC buildtools/codegen-companion) target_link_libraries(things_codegen_companion PUBLIC # External dependencies ${CONAN_LIBS} # Project internal components things_common ) # ============================================================================== # 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} ) 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 add_projectized_executable( TARGET_NAME brussel TARGET_SOURCE_DIR source/ ENABLE_CODEGEN ON ) set_source_files_properties( source/main.cpp TARGET_DIRECTORY brussel PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON ) set_target_properties(brussel PROPERTIES UNITY_BUILD_MODE BATCH UNITY_BUILD_UNIQUE_ID "ProjectBrussel_UNITY_ID" ) target_compile_definitions(brussel PRIVATE RAPIDJSON_HAS_STDSTRING=1 IMGUI_DISABLE_OBSOLETE_FUNCTIONS ) target_link_libraries(brussel PRIVATE # External dependencies ${CONAN_LIBS} OpenGL::GL glfw glm::glm imgui ImGuiColorTextEdit tracy # Project internal components ) target_flag_exceptions(brussel ON) target_flag_rtti(brussel ON) target_use_windows_subsystem(brussel) option(BRUSSEL_ENABLE_PROFILING "Whether profiling support is enabled or not." OFF) if(BRUSSEL_ENABLE_PROFILING) target_compile_definitions(brussel PRIVATE TRACY_ENABLE ) 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 PRIVATE BRUSSEL_ENABLE_EDITOR=1 ) endif() option(BRUSSEL_ENABLE_ASAN "Enable AddressSanitizer or not." OFF) if(BRUSSEL_ENABLE_ASAN) target_compile_options(brussel PRIVATE -fsanitize=address -fno-omit-frame-pointer ) target_link_options(brussel PRIVATE -fsanitize=address -fno-omit-frame-pointer ) endif()