cmake_minimum_required(VERSION 3.10) project(renderer LANGUAGES C) macro(configure_target target) set_property(TARGET ${target} PROPERTY C_STANDARD 23) set_property(TARGET ${target} PROPERTY C_EXTENSIONS OFF) target_compile_options(${target} PRIVATE -Wall -Wextra -pedantic) endmacro() find_program(glslc glslc) function(add_shaders target) set(bin_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}") foreach(src ${ARGN}) get_filename_component(stage ${src} NAME_WLE) set(bin "${bin_dir}/${stage}.spv") list(APPEND bins ${bin}) add_custom_command( OUTPUT ${bin} COMMAND ${glslc} -fshader-stage=${stage} ${CMAKE_CURRENT_SOURCE_DIR}/${src} -o ${bin} DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${src}" ) endforeach() add_custom_target(${target}-spirv DEPENDS ${bins}) add_library(${target} INTERFACE) target_compile_definitions(${target} INTERFACE VERT_SHADER_SPV="${bin_dir}/vert.spv" FRAG_SHADER_SPV="${bin_dir}/frag.spv") add_dependencies(${target} ${target}-spirv) endfunction() add_shaders(shaders vert.glsl frag.glsl ) add_executable(demo gpu.c linear_alg.c main.c model.c model_format_glb.c model_format_utah.c ) configure_target(demo) target_include_directories(demo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") target_link_libraries(demo PRIVATE glfw m vulkan shaders)