From dc6e0899b0753b450b9b4454f9b3b636989d747b Mon Sep 17 00:00:00 2001 From: Robert <33040161+rtryan98@users.noreply.github.com> Date: Mon, 11 Sep 2023 11:08:45 +0200 Subject: [PATCH] [build] Refactored CMakeLists.txt. Added .cmake files for better readability. --- CMakeLists.txt | 191 +-------------------------------------- cmake/owge_general.cmake | 94 +++++++++++++++++++ cmake/owge_shaders.cmake | 96 ++++++++++++++++++++ 3 files changed, 193 insertions(+), 188 deletions(-) create mode 100644 cmake/owge_general.cmake create mode 100644 cmake/owge_shaders.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ef2377..d830ca7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,195 +10,10 @@ set(CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo;Release" CACHE STRING "" FOR include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/NvPerfConfig.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/NvPerfUtilityConfig.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/owge_general.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/owge_shaders.cmake) -# Helpers. -macro(download_extract URL DST_FOLDER FOLDER_NAME) - if(NOT EXISTS ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip) - message(STATUS "Downloading ${URL} and unpacking to ${DST_FOLDER}/${FOLDER_NAME} .") - file( - DOWNLOAD - ${URL} - ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip - ) - else() - message(STATUS "${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip already exists. No download required.") - endif() - if(NOT EXISTS ${DST_FOLDER}/${FOLDER_NAME}) - message(STATUS "Extracting ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip to ${DST_FOLDER}/${FOLDER_NAME} .") - file( - ARCHIVE_EXTRACT - INPUT ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip - DESTINATION ${DST_FOLDER}/${FOLDER_NAME} - ) - else() - message(STATUS "${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip is already extracted to ${DST_FOLDER}/${FOLDER_NAME} .") - endif() -endmacro() - -macro(copy_if_not_exist SRC DST) - if(NOT EXISTS ${DST}) # Should check for contents in case of directory. - message(STATUS "Copying ${SRC} to ${DST} .") - file(COPY ${SRC} DESTINATION ${DST}) - else() - message(STATUS "${SRC} already exists at ${DST} .") - endif() -endmacro() - -macro(copy_dll_if_not_exist SRC DST) - foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) - copy_if_not_exist(${SRC} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${OUTPUTCONFIG}/${DST}) - endforeach() -endmacro() - -macro(set_target_default_properties TARGET) - set_target_properties(${TARGET} PROPERTIES CXX_STANDARD 23) - if(MSVC) - target_compile_options( - ${TARGET} PRIVATE - "/wd26812" # The enum type 'type-name' is unscoped. Prefer 'enum class' over 'enum' - "/WX" - "/W4" - "/MP" - ) - set_target_properties( - ${TARGET} PROPERTIES - VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - target_compile_definitions( - ${TARGET} PRIVATE - NOMINMAX - WIN32_LEAN_AND_MEAN - ) - endif() -endmacro() - -macro(group_file_tree FILES DUPE_FILTER) - foreach(ITEM IN ITEMS ${FILES}) - get_filename_component(SRC_PATH "${ITEM}" PATH) - string(REPLACE "${CMAKE_SOURCE_DIR}" "" GROUP_PATH "${SRC_PATH}") - string(REPLACE "${DUPE_FILTER}/${DUPE_FILTER}" "${DUPE_FILTER}" GROUP_PATH "${GROUP_PATH}") - string(REPLACE "/" "\\" GROUP_PATH "${GROUP_PATH}") - source_group("${GROUP_PATH}" FILES ${ITEM}) - endforeach() -endmacro() - -macro(target_group_file_tree TARGET) - get_target_property(${TARGET}_SOURCES ${TARGET} SOURCES) - group_file_tree("${${TARGET}_SOURCES}" "${TARGET}") -endmacro() - -macro(setup_owge_target TARGET) - set_target_default_properties(${TARGET}) - add_subdirectory(${TARGET}) - target_group_file_tree(${TARGET}) - target_include_directories( - ${TARGET} PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET} - ) -endmacro() - -macro(add_owge_lib TARGET) - add_library(${TARGET}) - setup_owge_target(${TARGET}) -endmacro() - -macro(add_owge_exe TARGET) - add_executable(${TARGET}) - setup_owge_target(${TARGET}) -endmacro() - -# Shader compilation. -add_custom_target(owge_shaders) -set(DXC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/dxc_2023_03_01/bin/x64/dxc.exe") # Change path depending on OS. -set(SHADER_COMPILE_PARAMS -HV 2021 -Zpr -no-legacy-cbuf-layout -enable-16bit-types -I "${CMAKE_CURRENT_SOURCE_DIR}/owge_shaders/") -macro(compile_hlsl SHADER MODEL ENTRYPOINT OUTFILE) - string(REPLACE ".hlsl" ".json" SHADER_PERMUTATIONS ${SHADER}) - if(EXISTS ${SHADER_PERMUTATIONS}) - file(READ ${SHADER_PERMUTATIONS} SHADER_PERMUTATIONS) - set(SHADER_COMPILE_COMMANDS) - set(SHADER_COMPILE_OUTFILES) - string(JSON SHADER_PERMUTATIONS GET ${SHADER_PERMUTATIONS} "permutations") - string(JSON SHADER_PERMUHTATION_COUNT LENGTH ${SHADER_PERMUTATIONS}) - foreach(SHADER_PERMUTATION_ITER RANGE ${SHADER_PERMUHTATION_COUNT}) - set(SHADER_PERMUTATION_DEFINE_LIST) - if(${SHADER_PERMUTATION_ITER} EQUAL ${SHADER_PERMUHTATION_COUNT}) - break() - endif() # CMake includes the last element, we don't want that however. - string(JSON SHADER_PERMUTATION GET ${SHADER_PERMUTATIONS} ${SHADER_PERMUTATION_ITER}) - string(JSON SHADER_PERMUTATION_DEFINES GET ${SHADER_PERMUTATION} "defines") - string(JSON SHADER_PERMUTATION_DEFINE_COUNT LENGTH ${SHADER_PERMUTATION_DEFINES}) - string(JSON SHADER_PERMUTATION_NAME GET ${SHADER_PERMUTATION} "name") - foreach(SHADER_PERMUTATION_DEFINE_ITER RANGE 0 ${SHADER_PERMUTATION_DEFINE_COUNT}) - if(${SHADER_PERMUTATION_DEFINE_ITER} EQUAL ${SHADER_PERMUTATION_DEFINE_COUNT}) - break() - endif() - string(JSON SHADER_PERMUTATION_DEFINE GET ${SHADER_PERMUTATION_DEFINES} ${SHADER_PERMUTATION_DEFINE_ITER}) - string(JSON SHADER_PERMUTATION_DEFINE_NAME MEMBER ${SHADER_PERMUTATION_DEFINE} 0) - string(JSON SHADER_PERMUTATION_DEFINE_VALUE GET ${SHADER_PERMUTATION_DEFINE} ${SHADER_PERMUTATION_DEFINE_NAME}) - set(SHADER_PERMUTATION_DEFINE_LIST ${SHADER_PERMUTATION_DEFINE_LIST} -D \ ${SHADER_PERMUTATION_DEFINE_NAME}=${SHADER_PERMUTATION_DEFINE_VALUE}) - endforeach() - get_filename_component(SHADER_PERMUTATION_OUTFILE ${OUTFILE} NAME_WE) - get_filename_component(SHADER_PERMUTATION_EXT ${OUTFILE} EXT) - get_filename_component(SHADER_PERMUTATION_DIR ${OUTFILE} PATH) - string(APPEND SHADER_PERMUTATION_OUTFILE "_${SHADER_PERMUTATION_NAME}") - string(APPEND SHADER_PERMUTATION_OUTFILE "${SHADER_PERMUTATION_EXT}") - string(PREPEND SHADER_PERMUTATION_OUTFILE "${SHADER_PERMUTATION_DIR}/") - set(SHADER_COMPILE_OUTFILES ${SHADER_COMPILE_OUTFILES} "${SHADER_PERMUTATION_OUTFILE} ") - set(SHADER_COMPILE_COMMANDS ${SHADER_COMPILE_COMMANDS} ${DXC_PATH} -T ${MODEL} -E ${ENTRYPOINT} ${SHADER_PERMUTATION_DEFINE_LIST} ${SHADER_COMPILE_PARAMS} -Fo ${SHADER_PERMUTATION_OUTFILE} ${SHADER} && ) - endforeach() - set(SHADER_COMPILE_COMMANDS ${SHADER_COMPILE_COMMANDS} echo on) # Hacky but gets the job done. No string post processing which confuses CMake. - add_custom_command( - OUTPUT ${SHADER_COMPILE_OUTFILES} - COMMAND ${SHADER_COMPILE_COMMANDS} - MAIN_DEPENDENCY ${SHADER} - COMMENT "Compiling ${SHADER} with permutations." - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - VERBATIM - ) - else() - add_custom_command( - OUTPUT ${OUTFILE} - COMMAND ${DXC_PATH} -T ${MODEL} -E ${ENTRYPOINT} ${SHADER_COMPILE_PARAMS} -Fo ${OUTFILE} ${SHADER} - MAIN_DEPENDENCY ${SHADER} - COMMENT "Compiling ${SHADER}." - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - VERBATIM - ) - endif() -endmacro() - -macro(compile_hlsl_profile SHADER PROFILE) - string(REPLACE ".hlsl" ".bin" COMPILE_SHADER_OUT ${SHADER}) - if(${SHADER} MATCHES "owge_shaders/owge_shaders") - string(REPLACE "owge_shaders/owge_shaders" "res/builtin/shader" COMPILE_SHADER_OUT ${COMPILE_SHADER_OUT}) - endif() - compile_hlsl(${SHADER} ${PROFILE}_6_6 "${PROFILE}_main" ${COMPILE_SHADER_OUT}) -endmacro() - -add_subdirectory(owge_shaders) -target_group_file_tree(owge_shaders) -get_target_property(owge_shaders_SOURCES owge_shaders SOURCES) -foreach(ITEM IN ITEMS ${owge_shaders_SOURCES}) - if(${ITEM} MATCHES "\.vs\.hlsl") - compile_hlsl_profile(${ITEM} vs) - elseif(${ITEM} MATCHES "\.ps\.hlsl") - compile_hlsl_profile(${ITEM} ps) - elseif(${ITEM} MATCHES "\.cs\.hlsl") - compile_hlsl_profile(${ITEM} cs) - elseif(${ITEM} MATCHES "\.gs\.hlsl") - compile_hlsl_profile(${ITEM} gs) - elseif(${ITEM} MATCHES "\.ds\.hlsl") - compile_hlsl_profile(${ITEM} ds) - elseif(${ITEM} MATCHES "\.hs\.hlsl") - compile_hlsl_profile(${ITEM} hs) - elseif(${ITEM} MATCHES "\.lib\.hlsl") - compile_hlsl_profile(${ITEM} lib) - elseif(${ITEM} MATCHES "\.as\.hlsl") - compile_hlsl_profile(${ITEM} as) - elseif(${ITEM} MATCHES "\.ms\.hlsl") - compile_hlsl_profile(${ITEM} ms) - endif() -endforeach() +add_owge_shader_lib(owge_shaders) # Dependencies. download_extract( diff --git a/cmake/owge_general.cmake b/cmake/owge_general.cmake new file mode 100644 index 0000000..084094e --- /dev/null +++ b/cmake/owge_general.cmake @@ -0,0 +1,94 @@ +function(download_extract URL DST_FOLDER FOLDER_NAME) + if(NOT EXISTS ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip) + message(STATUS "Downloading ${URL} and unpacking to ${DST_FOLDER}/${FOLDER_NAME} .") + file( + DOWNLOAD + ${URL} + ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip + ) + else() + message(STATUS "${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip already exists. No download required.") + endif() + if(NOT EXISTS ${DST_FOLDER}/${FOLDER_NAME}) + message(STATUS "Extracting ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip to ${DST_FOLDER}/${FOLDER_NAME} .") + file( + ARCHIVE_EXTRACT + INPUT ${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip + DESTINATION ${DST_FOLDER}/${FOLDER_NAME} + ) + else() + message(STATUS "${CMAKE_BINARY_DIR}/download/${FOLDER_NAME}.zip is already extracted to ${DST_FOLDER}/${FOLDER_NAME} .") + endif() +endfunction() + +function(copy_if_not_exist SRC DST) + if(NOT EXISTS ${DST}) # Should check for contents in case of directory. + message(STATUS "Copying ${SRC} to ${DST} .") + file(COPY ${SRC} DESTINATION ${DST}) + else() + message(STATUS "${SRC} already exists at ${DST} .") + endif() +endfunction() + +function(copy_dll_if_not_exist SRC DST) + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + copy_if_not_exist(${SRC} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${OUTPUTCONFIG}/${DST}) + endforeach() +endfunction() + +function(set_target_default_properties TARGET) + set_target_properties(${TARGET} PROPERTIES CXX_STANDARD 23) + if(MSVC) + target_compile_options( + ${TARGET} PRIVATE + "/wd26812" # The enum type 'type-name' is unscoped. Prefer 'enum class' over 'enum' + "/WX" + "/W4" + "/MP" + ) + set_target_properties( + ${TARGET} PROPERTIES + VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + target_compile_definitions( + ${TARGET} PRIVATE + NOMINMAX + WIN32_LEAN_AND_MEAN + ) + endif() +endfunction() + +function(group_file_tree FILES DUPE_FILTER) + foreach(ITEM IN ITEMS ${FILES}) + get_filename_component(SRC_PATH "${ITEM}" PATH) + string(REPLACE "${CMAKE_SOURCE_DIR}" "" GROUP_PATH "${SRC_PATH}") + string(REPLACE "${DUPE_FILTER}/${DUPE_FILTER}" "${DUPE_FILTER}" GROUP_PATH "${GROUP_PATH}") + string(REPLACE "/" "\\" GROUP_PATH "${GROUP_PATH}") + source_group("${GROUP_PATH}" FILES ${ITEM}) + endforeach() +endfunction() + +function(target_group_file_tree TARGET) + get_target_property(${TARGET}_SOURCES ${TARGET} SOURCES) + group_file_tree("${${TARGET}_SOURCES}" "${TARGET}") +endfunction() + +function(setup_owge_target TARGET) + set_target_default_properties(${TARGET}) + add_subdirectory(${TARGET}) + target_group_file_tree(${TARGET}) + target_include_directories( + ${TARGET} PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET} + ) +endfunction() + +function(add_owge_lib TARGET) + add_library(${TARGET}) + setup_owge_target(${TARGET}) +endfunction() + +function(add_owge_exe TARGET) + add_executable(${TARGET}) + setup_owge_target(${TARGET}) +endfunction() diff --git a/cmake/owge_shaders.cmake b/cmake/owge_shaders.cmake new file mode 100644 index 0000000..169392d --- /dev/null +++ b/cmake/owge_shaders.cmake @@ -0,0 +1,96 @@ +# add_custom_target(owge_shaders) +include(${CMAKE_CURRENT_LIST_DIR}/owge_general.cmake) + +set(DXC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/dxc_2023_03_01/bin/x64/dxc.exe") # Change path depending on OS. +set(SHADER_COMPILE_PARAMS -HV 2021 -Zpr -no-legacy-cbuf-layout -enable-16bit-types -I "${CMAKE_CURRENT_SOURCE_DIR}/owge_shaders/") +function(compile_hlsl SHADER MODEL ENTRYPOINT OUTFILE) + string(REPLACE ".hlsl" ".json" SHADER_PERMUTATIONS ${SHADER}) + if(EXISTS ${SHADER_PERMUTATIONS}) + file(READ ${SHADER_PERMUTATIONS} SHADER_PERMUTATIONS) + set(SHADER_COMPILE_COMMANDS) + set(SHADER_COMPILE_OUTFILES) + string(JSON SHADER_PERMUTATIONS GET ${SHADER_PERMUTATIONS} "permutations") + string(JSON SHADER_PERMUHTATION_COUNT LENGTH ${SHADER_PERMUTATIONS}) + foreach(SHADER_PERMUTATION_ITER RANGE ${SHADER_PERMUHTATION_COUNT}) + set(SHADER_PERMUTATION_DEFINE_LIST) + if(${SHADER_PERMUTATION_ITER} EQUAL ${SHADER_PERMUHTATION_COUNT}) + break() + endif() # CMake includes the last element, we don't want that however. + string(JSON SHADER_PERMUTATION GET ${SHADER_PERMUTATIONS} ${SHADER_PERMUTATION_ITER}) + string(JSON SHADER_PERMUTATION_DEFINES GET ${SHADER_PERMUTATION} "defines") + string(JSON SHADER_PERMUTATION_DEFINE_COUNT LENGTH ${SHADER_PERMUTATION_DEFINES}) + string(JSON SHADER_PERMUTATION_NAME GET ${SHADER_PERMUTATION} "name") + foreach(SHADER_PERMUTATION_DEFINE_ITER RANGE 0 ${SHADER_PERMUTATION_DEFINE_COUNT}) + if(${SHADER_PERMUTATION_DEFINE_ITER} EQUAL ${SHADER_PERMUTATION_DEFINE_COUNT}) + break() + endif() + string(JSON SHADER_PERMUTATION_DEFINE GET ${SHADER_PERMUTATION_DEFINES} ${SHADER_PERMUTATION_DEFINE_ITER}) + string(JSON SHADER_PERMUTATION_DEFINE_NAME MEMBER ${SHADER_PERMUTATION_DEFINE} 0) + string(JSON SHADER_PERMUTATION_DEFINE_VALUE GET ${SHADER_PERMUTATION_DEFINE} ${SHADER_PERMUTATION_DEFINE_NAME}) + set(SHADER_PERMUTATION_DEFINE_LIST ${SHADER_PERMUTATION_DEFINE_LIST} -D \ ${SHADER_PERMUTATION_DEFINE_NAME}=${SHADER_PERMUTATION_DEFINE_VALUE}) + endforeach() + get_filename_component(SHADER_PERMUTATION_OUTFILE ${OUTFILE} NAME_WE) + get_filename_component(SHADER_PERMUTATION_EXT ${OUTFILE} EXT) + get_filename_component(SHADER_PERMUTATION_DIR ${OUTFILE} PATH) + string(APPEND SHADER_PERMUTATION_OUTFILE "_${SHADER_PERMUTATION_NAME}") + string(APPEND SHADER_PERMUTATION_OUTFILE "${SHADER_PERMUTATION_EXT}") + string(PREPEND SHADER_PERMUTATION_OUTFILE "${SHADER_PERMUTATION_DIR}/") + set(SHADER_COMPILE_OUTFILES ${SHADER_COMPILE_OUTFILES} "${SHADER_PERMUTATION_OUTFILE} ") + set(SHADER_COMPILE_COMMANDS ${SHADER_COMPILE_COMMANDS} ${DXC_PATH} -T ${MODEL} -E ${ENTRYPOINT} ${SHADER_PERMUTATION_DEFINE_LIST} ${SHADER_COMPILE_PARAMS} -Fo ${SHADER_PERMUTATION_OUTFILE} ${SHADER} && ) + endforeach() + set(SHADER_COMPILE_COMMANDS ${SHADER_COMPILE_COMMANDS} echo on) # Hacky but gets the job done. No string post processing which confuses CMake. + add_custom_command( + OUTPUT ${SHADER_COMPILE_OUTFILES} + COMMAND ${SHADER_COMPILE_COMMANDS} + MAIN_DEPENDENCY ${SHADER} + COMMENT "Compiling ${SHADER} with permutations." + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM + ) + else() + add_custom_command( + OUTPUT ${OUTFILE} + COMMAND ${DXC_PATH} -T ${MODEL} -E ${ENTRYPOINT} ${SHADER_COMPILE_PARAMS} -Fo ${OUTFILE} ${SHADER} + MAIN_DEPENDENCY ${SHADER} + COMMENT "Compiling ${SHADER}." + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM + ) + endif() +endfunction() + +function(compile_hlsl_profile SHADER PROFILE) + string(REPLACE ".hlsl" ".bin" COMPILE_SHADER_OUT ${SHADER}) + if(${SHADER} MATCHES "owge_shaders/owge_shaders") + string(REPLACE "owge_shaders/owge_shaders" "res/builtin/shader" COMPILE_SHADER_OUT ${COMPILE_SHADER_OUT}) + endif() + compile_hlsl(${SHADER} ${PROFILE}_6_6 "${PROFILE}_main" ${COMPILE_SHADER_OUT}) +endfunction() + +function(add_owge_shader_lib TARGET) + add_custom_target(${TARGET}) + add_subdirectory(${TARGET}) + target_group_file_tree(${TARGET}) + get_target_property(${TARGET}_SOURCES owge_shaders SOURCES) + foreach(ITEM IN ITEMS ${${TARGET}_SOURCES}) + if(${ITEM} MATCHES "\.vs\.hlsl") + compile_hlsl_profile(${ITEM} vs) + elseif(${ITEM} MATCHES "\.ps\.hlsl") + compile_hlsl_profile(${ITEM} ps) + elseif(${ITEM} MATCHES "\.cs\.hlsl") + compile_hlsl_profile(${ITEM} cs) + elseif(${ITEM} MATCHES "\.gs\.hlsl") + compile_hlsl_profile(${ITEM} gs) + elseif(${ITEM} MATCHES "\.ds\.hlsl") + compile_hlsl_profile(${ITEM} ds) + elseif(${ITEM} MATCHES "\.hs\.hlsl") + compile_hlsl_profile(${ITEM} hs) + elseif(${ITEM} MATCHES "\.lib\.hlsl") + compile_hlsl_profile(${ITEM} lib) + elseif(${ITEM} MATCHES "\.as\.hlsl") + compile_hlsl_profile(${ITEM} as) + elseif(${ITEM} MATCHES "\.ms\.hlsl") + compile_hlsl_profile(${ITEM} ms) + endif() + endforeach() +endfunction()