Skip to content

Commit d8640f4

Browse files
Add sync_directory function and post-build asset synchronization for chapters in Visual Studio generator and Ninja Multi-Config generator
1 parent 6fd7883 commit d8640f4

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

attachments/CMakeLists.txt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,24 @@ function (add_slang_shader_target TARGET)
125125
add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/slang.spv)
126126
endfunction()
127127

128+
function(sync_directory SRC_DIR DST_DIR TARGET_NAME LABEL)
129+
file(GLOB_RECURSE FILES "${SRC_DIR}/*")
130+
131+
foreach(FILE IN LISTS FILES)
132+
file(RELATIVE_PATH REL_PATH "${SRC_DIR}" "${FILE}")
133+
set(DST_FILE "${DST_DIR}/${REL_PATH}")
134+
get_filename_component(DST_DIR_PATH "${DST_FILE}" DIRECTORY)
135+
136+
add_custom_command(
137+
TARGET ${TARGET_NAME}
138+
POST_BUILD
139+
COMMAND ${CMAKE_COMMAND} -E make_directory "${DST_DIR_PATH}"
140+
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FILE}" "${DST_FILE}"
141+
COMMENT "${LABEL}: Syncing ${REL_PATH}"
142+
)
143+
endforeach()
144+
endfunction()
145+
128146
function (add_chapter CHAPTER_NAME)
129147
cmake_parse_arguments (CHAPTER "" "SHADER" "LIBS;TEXTURES;MODELS" ${ARGN})
130148
add_executable (${CHAPTER_NAME} ${CHAPTER_NAME}.cpp)
@@ -172,6 +190,46 @@ function (add_chapter CHAPTER_NAME)
172190
list(TRANSFORM CHAPTER_TEXTURES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/assets/")
173191
file (COPY ${CHAPTER_TEXTURES} DESTINATION ${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/textures)
174192
endif ()
193+
194+
# Post-build step to copy assets to executable directory
195+
if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*" OR
196+
${CMAKE_GENERATOR} MATCHES "Ninja Multi-Config")
197+
198+
set(EXECUTABLE_DIR $<TARGET_FILE_DIR:${CHAPTER_NAME}>)
199+
200+
add_custom_target(${CHAPTER_NAME}_postbuild ALL
201+
COMMENT "${CHAPTER_NAME}: Post-build asset sync"
202+
)
203+
204+
add_dependencies(${CHAPTER_NAME}_postbuild ${CHAPTER_NAME})
205+
206+
if(DEFINED CHAPTER_SHADER)
207+
sync_directory(
208+
"${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/shaders"
209+
"${EXECUTABLE_DIR}/shaders"
210+
${CHAPTER_NAME}
211+
"${CHAPTER_NAME}: Shaders"
212+
)
213+
endif()
214+
215+
if(DEFINED CHAPTER_MODELS)
216+
sync_directory(
217+
"${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/models"
218+
"${EXECUTABLE_DIR}/models"
219+
${CHAPTER_NAME}
220+
"${CHAPTER_NAME}: Models"
221+
)
222+
endif()
223+
224+
if(DEFINED CHAPTER_TEXTURES)
225+
sync_directory(
226+
"${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/textures"
227+
"${EXECUTABLE_DIR}/textures"
228+
${CHAPTER_NAME}
229+
"${CHAPTER_NAME}: Textures"
230+
)
231+
endif()
232+
endif()
175233
endfunction ()
176234

177235
add_chapter (00_base_code)

0 commit comments

Comments
 (0)