function(compile_glsl_to_spv target shader_src_dir shader_out_dir out_var) find_program(GLSLC glslc REQUIRED) file(GLOB_RECURSE SHADERS "${shader_src_dir}/*.vert" "${shader_src_dir}/*.frag" "${shader_src_dir}/*.comp" ) set(SPV_OUTPUTS "") foreach(shader ${SHADERS}) file(RELATIVE_PATH rel "${shader_src_dir}" "${shader}") set(out "${shader_out_dir}/${rel}.spv") add_custom_command( OUTPUT "${out}" COMMAND ${CMAKE_COMMAND} -E make_directory "$" COMMAND ${GLSLC} -o "${out}" "${shader}" DEPENDS "${shader}" VERBATIM ) list(APPEND SPV_OUTPUTS "${out}") endforeach() add_custom_target(${target}_shaders ALL DEPENDS ${SPV_OUTPUTS}) set(${out_var} ${SPV_OUTPUTS} PARENT_SCOPE) endfunction()