Skip to content

Commit

Permalink
[build] Refactored CMakeLists.txt. Added .cmake files for better read…
Browse files Browse the repository at this point in the history
…ability.
  • Loading branch information
rtryan98 committed Sep 11, 2023
1 parent 67d64b5 commit dc6e089
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 188 deletions.
191 changes: 3 additions & 188 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
94 changes: 94 additions & 0 deletions cmake/owge_general.cmake
Original file line number Diff line number Diff line change
@@ -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()
96 changes: 96 additions & 0 deletions cmake/owge_shaders.cmake
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit dc6e089

Please sign in to comment.