Skip to content

Instantly share code, notes, and snippets.

@mrtrizer
Created October 26, 2020 08:56
Show Gist options
  • Save mrtrizer/8047a79294e59cd2a1f8aa06795e756a to your computer and use it in GitHub Desktop.
Save mrtrizer/8047a79294e59cd2a1f8aa06795e756a to your computer and use it in GitHub Desktop.
CMake Vulkan build shaders. Tested in Visual Studio, but should also work under Linux and MacOS
cmake_minimum_required (VERSION 3.8)
set(PROJECT_NAME SimpleVulkan)
add_executable (${PROJECT_NAME} "main.c")
find_package(Vulkan REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE "./")
target_link_libraries(${PROJECT_NAME} Vulkan::Vulkan)
target_compile_definitions(${PROJECT_NAME} PRIVATE VK_USE_PLATFORM_WIN32_KHR)
set(GLSLC "${Vulkan_INCLUDE_DIR}/../Bin/glslc.exe")
message("CMAKE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}")
set(SHADERS_IN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/shaders")
set(SHADERS_OUT_DIR "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/shaders")
file(GLOB SHADERS "${SHADERS_IN_DIR}/*.vert" "${SHADERS_IN_DIR}/*.frag")
file(MAKE_DIRECTORY ${SHADERS_OUT_DIR})
foreach(SHADER ${SHADERS})
get_filename_component(SHADER_NAME ${SHADER} NAME)
set(SHADER_OUT_NAME "${SHADERS_OUT_DIR}/${SHADER_NAME}.spv")
list(APPEND SHADER_OUT_NAMES ${SHADER_OUT_NAME})
add_custom_command(
MAIN_DEPENDENCY ${SHADER}
OUTPUT ${SHADER_OUT_NAME}
COMMAND ${GLSLC} ${SHADER} "-o" ${SHADER_OUT_NAME}
VERBATIM)
endforeach()
add_custom_target(build_shaders DEPENDS ${SHADER_OUT_NAMES})
add_dependencies(${PROJECT_NAME} build_shaders)
@aaronaanderson
Copy link

Thank you; this helped me a lot!

Changing the command on line 33 from ${GLSLC} to ${Vulkan_GLSLC_EXECUTABLE} is enough to make this work cross platform. This feature is apparently new to CMake 3.19.

Thanks again!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment