From 807d660883ce3e645f24b317f2e126c3a49fa6a5 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 9 May 2023 23:55:46 +0200 Subject: [PATCH] Add CMake macro's Macro's performing project wide, and common operations. Crafted for r5sdk, but it is still partially incomplete. --- r5dev/cmake/Configure.cmake | 7 +++ r5dev/cmake/Macros.cmake | 54 +++++++++++++++++++++ r5dev/cmake/Options.cmake | 94 +++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 r5dev/cmake/Configure.cmake create mode 100644 r5dev/cmake/Macros.cmake create mode 100644 r5dev/cmake/Options.cmake diff --git a/r5dev/cmake/Configure.cmake b/r5dev/cmake/Configure.cmake new file mode 100644 index 00000000..78666953 --- /dev/null +++ b/r5dev/cmake/Configure.cmake @@ -0,0 +1,7 @@ + +# ----------------------------------------------------------------------------- +# Set global configuration types +# ----------------------------------------------------------------------------- +macro( setup_build_configurations ) +set( CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" CACHE STRING "" FORCE ) +endmacro() diff --git a/r5dev/cmake/Macros.cmake b/r5dev/cmake/Macros.cmake new file mode 100644 index 00000000..70a10ea4 --- /dev/null +++ b/r5dev/cmake/Macros.cmake @@ -0,0 +1,54 @@ +# ----------------------------------------------------------------------------- +# Start the source file list +# ----------------------------------------------------------------------------- +macro( start_sources ) + add_sources( SOURCE_GROUP "" + # Add the CMakeLists file to the project filter root + "CMakeLists.txt" +) +endmacro() + +# ----------------------------------------------------------------------------- +# Add source files to target within a project filter +# ----------------------------------------------------------------------------- +macro( add_sources ) + set( options ) + set( oneValueArgs SOURCE_GROUP ) + set( multiValueArgs ) + + cmake_parse_arguments( ADD_SOURCES + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" ${ARGN} + ) + + if( NOT ADD_SOURCES_SOURCE_GROUP ) + message( FATAL_ERROR "SOURCE_GROUP must be provided" ) + endif() + + source_group( "${ADD_SOURCES_SOURCE_GROUP}" FILES ${ADD_SOURCES_UNPARSED_ARGUMENTS} ) + target_sources( ${PROJECT_NAME} PRIVATE ${ADD_SOURCES_UNPARSED_ARGUMENTS} ) +endmacro() + +# ----------------------------------------------------------------------------- +# End the source file list +# ----------------------------------------------------------------------------- +macro( end_sources ) + get_property( SRCS_LIST GLOBAL PROPERTY SRCS_LIST ) + set_target_output_dirs( ${PROJECT_NAME} ) +endmacro() + +# ----------------------------------------------------------------------------- +# Initialize global compiler defines +# ----------------------------------------------------------------------------- +macro( define_compiler_variables ) + if( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" ) + add_definitions( -DCOMPILER_MSVC ) + elseif( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) + add_definitions( -DCOMPILER_CLANG ) + elseif( CMAKE_CXX_COMPILER_ID MATCHES "GNU" ) + add_definitions( -DCOMPILER_GCC ) + else() + message( FATAL_ERROR "Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}" ) + endif() +endmacro() diff --git a/r5dev/cmake/Options.cmake b/r5dev/cmake/Options.cmake new file mode 100644 index 00000000..47e4e9d8 --- /dev/null +++ b/r5dev/cmake/Options.cmake @@ -0,0 +1,94 @@ +# ----------------------------------------------------------------------------- +# Setup each build configuration +# ----------------------------------------------------------------------------- +macro( apply_project_settings ) + # Set common settings for all configurations + add_compile_options( + $<$:/permissive-> + $<$:/MP> + $<$:/W4> + $<$:/GR> + $<$:/D_UNICODE> + $<$:/DUNICODE> + ) + + # Set common defines + add_compile_definitions( + "_CRT_SECURE_NO_WARNINGS" + "SPDLOG_COMPILED_LIB" + "SPDLOG_NO_EXCEPTIONS" + "CURL_STATICLIB" + ) + + # Set settings for Debug configuration + add_compile_options( + $<$,$>:/MTd> + ) + + # Set settings for Profile configuration + add_compile_options( + $<$,$>:/Ox> + $<$,$>:/GF> + $<$,$>:/MT> + ) + set( CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_PROFILE} /PROFILE" ) + + # Set settings for Release configuration + add_compile_options( + $<$,$>:/Ob2> + $<$,$>:/Oi> + $<$,$>:/Ot> + $<$,$>:/GF> + $<$,$>:/MT> + $<$,$>:/GS-> + $<$,$>:/Gy> + $<$,$>:/fp:fast> + ) + + set( CMAKE_EXE_LINKER_FLAGS_RELEASE + "${CMAKE_EXE_LINKER_FLAGS_RELEASE} + /OPT:REF + /OPT:ICF + /RELEASE + /SAFESEH:NO + /DEBUG" + ) + + # Commonly used directories accross libraries. + include_directories( + "${ENGINE_SOURCE_DIR}/" + "${ENGINE_SOURCE_DIR}/public/" + "${ENGINE_SOURCE_DIR}/thirdparty/" + "${ENGINE_SOURCE_DIR}/thirdparty/imgui/" + "${ENGINE_SOURCE_DIR}/thirdparty/recast/" + ) +endmacro() + +# ----------------------------------------------------------------------------- +# Setup build output directories for target +# ----------------------------------------------------------------------------- +macro( set_target_output_dirs TARGET ) + # Set abs PDB path + get_filename_component( OUTPUT_DIR_ABSOLUTE "${CMAKE_SOURCE_DIR}/game/" ABSOLUTE ) + set( PDB_FULL_PATH "${OUTPUT_DIR_ABSOLUTE}/${PROJECT_NAME}.pdb" ) + + # Set output directories + set_target_properties( ${TARGET} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/game/" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/game/" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/game/" + RUNTIME_OUTPUT_DIRECTORY_PROFILE "${CMAKE_SOURCE_DIR}/game/" + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib/${TARGET}" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib/${TARGET}" + ) + + # Set output directories for each configuration + foreach( CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES} ) + set_target_properties( ${TARGET} PROPERTIES + "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_TYPE}" "${CMAKE_SOURCE_DIR}/game/" + "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_TYPE}" "${CMAKE_SOURCE_DIR}/lib/${TARGET}/${CONFIG_TYPE}" + "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_TYPE}" "${CMAKE_SOURCE_DIR}/lib/${TARGET}/${CONFIG_TYPE}" + "LINK_FLAGS_${CONFIG_TYPE}" "/PDB:${PDB_FULL_PATH}" + ) + endforeach() +endmacro()