cmake_minimum_required(VERSION 2.8 FATAL_ERROR) cmake_policy(VERSION 2.8) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(NAME vulkanExamples) project(${NAME}) include_directories(external) include_directories(external/glm) include_directories(external/gli) include_directories(external/assimp) include_directories(external/imgui) include_directories(base) OPTION(USE_D2D_WSI "Build the project using Direct to Display swapchain" OFF) OPTION(USE_WAYLAND_WSI "Build the project using Wayland swapchain" OFF) set(RESOURCE_INSTALL_DIR "" CACHE PATH "Path to install resources to (leave empty for running uninstalled)") # Use FindVulkan module added with CMAKE 3.7 if (NOT CMAKE_VERSION VERSION_LESS 3.7.0) message(STATUS "Using module to find Vulkan") find_package(Vulkan) endif() IF(WIN32) IF (NOT Vulkan_FOUND) find_library(Vulkan_LIBRARY NAMES vulkan-1 vulkan PATHS ${CMAKE_SOURCE_DIR}/libs/vulkan) IF (Vulkan_LIBRARY) set(Vulkan_FOUND ON) MESSAGE("Using bundled Vulkan library version") ENDIF() ENDIF() find_library(ASSIMP_LIBRARIES NAMES assimp libassimp.dll.a PATHS ${CMAKE_SOURCE_DIR}/libs/assimp) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_WIN32_KHR") ELSE(WIN32) IF (NOT Vulkan_FOUND) find_library(Vulkan_LIBRARY NAMES vulkan HINTS "$ENV{VULKAN_SDK}/lib" "${CMAKE_SOURCE_DIR}/libs/vulkan" REQUIRED) IF (Vulkan_LIBRARY) set(Vulkan_FOUND ON) MESSAGE("Using bundled Vulkan library version") ENDIF() ENDIF() find_package(ASSIMP REQUIRED) find_package(Threads REQUIRED) IF(USE_D2D_WSI) MESSAGE("Using direct to display extension...") add_definitions(-D_DIRECT2DISPLAY) ELSEIF(USE_WAYLAND_WSI) find_package(Wayland REQUIRED) if (NOT WAYLAND_FOUND) message(FATAL_ERROR "Wayland development package not found") endif () set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_WAYLAND_KHR") include_directories(${WAYLAND_INCLUDE_DIR}) ELSE(USE_D2D_WSI) find_package(XCB REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_XCB_KHR") ENDIF(USE_D2D_WSI) # Todo : android? ENDIF(WIN32) IF (NOT Vulkan_FOUND) message(FATAL_ERROR "Could not find Vulkan library!") ELSE() message(STATUS ${Vulkan_LIBRARY}) ENDIF() # Set preprocessor defines set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX -D_USE_MATH_DEFINES") # Clang specific stuff if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-switch-enum") endif() # Debug flags set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wextra -Wundef") endif(CMAKE_COMPILER_IS_GNUCXX) add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-std=c++11) file(GLOB SOURCE *.cpp ) # Function for building single example function(buildExample EXAMPLE_NAME) # Main file(GLOB SOURCE *.cpp ${BASE_HEADERS} ${EXAMPLE_NAME}/*.cpp) SET(MAIN_CPP ${EXAMPLE_NAME}/${EXAMPLE_NAME}.cpp) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${EXAMPLE_NAME}/main.cpp) SET(MAIN_CPP ${EXAMPLE_NAME}/main.cpp) ENDIF() # imgui example requires additional source files IF(${EXAMPLE_NAME} STREQUAL "imgui") file(GLOB ADD_SOURCE external/imgui/*.cpp) SET(SOURCE ${SOURCE} ${ADD_SOURCE}) ENDIF() # Add shaders set(SHADER_DIR data/shaders/${EXAMPLE_NAME}) file(GLOB SHADERS "${SHADER_DIR}/*.vert" "${SHADER_DIR}/*.frag" "${SHADER_DIR}/*.geom" "${SHADER_DIR}/*.tesc" "${SHADER_DIR}/*.tese") source_group("Shaders" FILES ${SHADERS}) if(WIN32) add_executable(${EXAMPLE_NAME} WIN32 ${MAIN_CPP} ${SOURCE} ${SHADERS}) target_link_libraries(${EXAMPLE_NAME} base ${Vulkan_LIBRARY} ${ASSIMP_LIBRARIES} ${WINLIBS}) else(WIN32) add_executable(${EXAMPLE_NAME} ${MAIN_CPP} ${SOURCE} ${SHADERS}) target_link_libraries(${EXAMPLE_NAME} base ) endif(WIN32) if(RESOURCE_INSTALL_DIR) install(TARGETS ${EXAMPLE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() endfunction(buildExample) # Build all examples function(buildExamples) foreach(EXAMPLE ${EXAMPLES}) buildExample(${EXAMPLE}) endforeach(EXAMPLE) endfunction(buildExamples) if(RESOURCE_INSTALL_DIR) add_definitions(-DVK_EXAMPLE_DATA_DIR=\"${RESOURCE_INSTALL_DIR}/\") install(DIRECTORY data/ DESTINATION ${RESOURCE_INSTALL_DIR}/) else() add_definitions(-DVK_EXAMPLE_DATA_DIR=\"${CMAKE_SOURCE_DIR}/data/\") endif() # Compiler specific stuff IF(MSVC) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") ENDIF(MSVC) IF(WIN32) # Nothing here (yet) ELSE(WIN32) link_libraries(${XCB_LIBRARIES} ${Vulkan_LIBRARY} ${Vulkan_LIBRARY} ${ASSIMP_LIBRARIES} ${WAYLAND_CLIENT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) ENDIF(WIN32) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/") add_subdirectory(base) add_subdirectory(examples)