cmake_minimum_required(VERSION 3.10) project(vksdlproj VERSION 0.1.0 LANGUAGES C CXX) SET(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) set(EXE_NAME project) set(PROGRAM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/vulkanapp.cc) # Get our GLSL shaders set(SHADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shaders) set(SHADER_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}) file(GLOB SHADERS ${SHADER_DIR}/*.vert ${SHADER_DIR}/*.frag ${SHADER_DIR}/*.comp ${SHADER_DIR}/*.geom ${SHADER_DIR}/*.tesc ${SHADER_DIR}/*.tese ${SHADER_DIR}/*.mesh ${SHADER_DIR}/*.task ${SHADER_DIR}/*.rgen ${SHADER_DIR}/*.rchit ${SHADER_DIR}/*.rmiss ) option(SDL2_NONSYSTEM "Use SDL2 from folder in source tree" OFF) if(SDL2_NONSYSTEM) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/SDL ${CMAKE_CURRENT_BINARY_DIR}/SDL2 EXCLUDE_FROM_ALL) else() find_package(SDL2 REQUIRED CONFIG REQUIRED COMPONENTS SDL2) if(WIN32) find_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2main) endif() endif() find_package(Vulkan REQUIRED COMPONENTS glslc) # Compile each shader foreach(SHADER IN LISTS SHADERS) get_filename_component(FILENAME ${SHADER} NAME) add_custom_command(OUTPUT ${SHADER_BIN_DIR}/${FILENAME}.spv COMMAND ${Vulkan_GLSLC_EXECUTABLE} ${SHADER} -o ${SHADER_BIN_DIR}/${FILENAME}.spv DEPENDS ${SHADER} COMMENT "Compiling Shader ${FILENAME}") list(APPEND SPV_SHADERS ${SHADER_BIN_DIR}/${FILENAME}.spv) endForeach() # Shader target add_custom_target(shaders ALL DEPENDS ${SPV_SHADERS}) add_executable(${EXE_NAME} ${CMAKE_SOURCE_DIR}/src/main.cc ${PROGRAM_SOURCES} ${SHADERS}) set_target_properties(${EXE_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) target_include_directories(${EXE_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include) add_dependencies(${EXE_NAME} shaders) if(CMAKE_COMPILER_IS_GNUCC) target_compile_options(${EXE_NAME} PRIVATE -Wall -Wextra) elseif(MSVC) target_compile_options(${EXE_NAME} PRIVATE /W4) endif() # Windows specific if(TARGET SDL2::SDL2main) target_link_libraries(${EXE_NAME} PRIVATE SDL2::SDL2main) endif() # Linking target_link_libraries(${EXE_NAME} PRIVATE SDL2::SDL2) target_link_libraries(${EXE_NAME} PRIVATE Vulkan::Vulkan)