-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[build] Refactored CMakeLists.txt. Added .cmake files for better read…
…ability.
- Loading branch information
Showing
3 changed files
with
193 additions
and
188 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |