cmake_minimum_required(VERSION 3.16 FATAL_ERROR) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) if(LINUX) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) endif() if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunknown-pragmas") endif() add_subdirectory(3rdParty) #set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/bin/release") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/bin/debug") set(CMAKE_DEBUG_POSTFIX "d") if(LINUX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native") endif() project (openVulkanoCpp VERSION 1.0 LANGUAGES C CXX) file(GLOB_RECURSE sources CONFIGURE_DEPENDS "openVulkanoCpp/*.cpp") if(IOS) add_compile_options("$<$:-O3>$<$:-O0>$<$:-Os>$<$:-O2>") set(CMAKE_Swift_LANGUAGE_VERSION 5.0) enable_language(Swift) file(GLOB_RECURSE sources CONFIGURE_DEPENDS "openVulkanoCpp/*.mm" "openVulkanoCpp/*.m" "openVulkanoCpp/*.cpp" "openVulkanoCpp/*.swift") list(FILTER sources EXCLUDE REGEX ".*GLFW.*") list(FILTER sources EXCLUDE REGEX "main\.cpp") file(GLOB_RECURSE resources CONFIGURE_DEPENDS "openVulkanoCpp/*.storyboard" "openVulkanoCpp/*.xib") add_executable(openVulkanoCpp openVulkanoCpp/main.m ${resources}) else() add_executable(openVulkanoCpp openVulkanoCpp/main.cpp ${resources}) endif() #region Exclude platform files if (NOT IOS) list(FILTER sources EXCLUDE REGEX ".*[\\/]Host[\\/]iOS[\\/].*") endif () if (NOT LINUX) list(FILTER sources EXCLUDE REGEX ".*[\\/]Host[\\/]Linux[\\/].*") endif () if (NOT WIN32) list(FILTER sources EXCLUDE REGEX ".*[\\/]Host[\\/]Windows[\\/].*") endif () #endregion target_sources(openVulkanoCpp PRIVATE ${sources} openVulkanoCpp/Shader/Shaders.c) target_include_directories(openVulkanoCpp PUBLIC openVulkanoCpp) # Setup IOS if(IOS) set(APP_BUNDLE_IDENTIFIER "eu.georgh93.openVulkano") set(MACOSX_BUNDLE_INFO_STRING ${APP_BUNDLE_IDENTIFIER}) set(MACOSX_BUNDLE_GUI_IDENTIFIER ${APP_BUNDLE_IDENTIFIER}) set(MACOSX_BUNDLE_BUNDLE_NAME ${APP_BUNDLE_IDENTIFIER}) set(CMAKE_OSX_DEPLOYMENT_TARGET "14.1") # The used ARKit features are only available starting with iOS 14 target_link_libraries(openVulkanoCpp PUBLIC "-framework CoreFoundation" PRIVATE "-framework Foundation" PRIVATE "-framework CoreImage" PRIVATE "-framework CoreVideo" PRIVATE "-framework Metal" PRIVATE "-framework MetalPerformanceShaders" PUBLIC "-framework ARKit" PRIVATE "-lstdc++" PRIVATE c++ PRIVATE c ) # Locate system libraries on iOS find_library(UIKIT UIKit) find_library(FOUNDATION Foundation) find_library(MOBILECORESERVICES MobileCoreServices) find_library(CFNETWORK CFNetwork) find_library(SYSTEMCONFIGURATION SystemConfiguration) # link the frameworks located above target_link_libraries(openVulkanoCpp PRIVATE ${UIKIT}) target_link_libraries(openVulkanoCpp PRIVATE ${FOUNDATION}) target_link_libraries(openVulkanoCpp PRIVATE ${MOBILECORESERVICES}) target_link_libraries(openVulkanoCpp PRIVATE ${CFNETWORK}) target_link_libraries(openVulkanoCpp PRIVATE ${SYSTEMCONFIGURATION}) endif () #Setup Vulkan if (APPLE) # Try to find xcframework of MoltenVK cmake_path(SET MoltenVK_path NORMALIZE "$ENV{VULKAN_SDK}/../MoltenVK/") cmake_path(SET MoltenVK_XC_path NORMALIZE "$ENV{VULKAN_SDK}/../MoltenVK/MoltenVK.xcframework") if (EXISTS "${MoltenVK_path}" AND EXISTS "${MoltenVK_XC_path}") if (EXISTS "${MoltenVK_path}/include") set(Vulkan_INCLUDE_DIR "${MoltenVK_path}/include") endif() target_link_libraries(openVulkanoCpp PRIVATE "${MoltenVK_XC_path}/ios-arm64/libMoltenVK.a") message("Found MoltenVK xcframework: ${MoltenVK_XC_path}") endif() if (NOT ${Vulkan_INCLUDE_DIR}) #find_package(Vulkan REQUIRED COMPONENTS MoltenVK) #target_link_libraries(openVulkanoCpp PRIVATE Vulkan::MoltenVK) endif() else () find_package(Vulkan REQUIRED) target_link_libraries(openVulkanoCpp PRIVATE Vulkan::Vulkan) endif() target_include_directories(openVulkanoCpp PUBLIC ${Vulkan_INCLUDE_DIR}) if (ANDROID) add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR) elseif (WIN32) add_definitions(-DVK_USE_PLATFORM_WIN32_KHR) elseif (LINUX) add_definitions(-DVK_USE_PLATFORM_XCB_KHR) find_package(XCB REQUIRED) link_libraries(${XCB_LIBRARIES}) endif() set_property(TARGET openVulkanoCpp PROPERTY CXX_STANDARD 17) if (LINUX) target_compile_options(openVulkanoCpp PRIVATE -Wall) endif() if (NOT ANDROID AND NOT IOS) Find_Package(OpenCV) Find_Package(libjpeg-turbo) Find_Package(Open3D) target_include_directories(openVulkanoCpp PRIVATE ${OpenCV_INCLUDE_DIRS}) target_link_libraries(openVulkanoCpp PRIVATE glfw ${OpenCV_LIBS} pugixml) if (libjpeg-turbo_FOUND) target_link_libraries(openVulkanoCpp PRIVATE libjpeg-turbo::turbojpeg) endif() target_link_libraries(openVulkanoCpp PRIVATE Open3D::Open3D) target_link_libraries(openVulkanoCpp PRIVATE assimp) add_compile_definitions(GLM_FORCE_AVX2) target_link_libraries(openVulkanoCpp PRIVATE ftxui::screen ftxui::dom ftxui::component) endif() list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/deps/INSTALL) if (IOS) target_link_libraries(openVulkanoCpp PRIVATE "/opt/libjpeg-turbo-ios/lib/libturbojpeg.a") target_include_directories(openVulkanoCpp PRIVATE "/opt/libjpeg-turbo-ios/include") endif () if (LINUX) find_package(spdlog) find_package(fmt) find_package(yaml-cpp) target_link_libraries(openVulkanoCpp PRIVATE fmt) endif() find_package(LibArchive REQUIRED) set(ZLIB_USE_STATIC_LIBS ON) find_package(ZLIB REQUIRED) target_include_directories(openVulkanoCpp PRIVATE ${LibArchive_INCLUDE_DIR}) target_link_libraries(openVulkanoCpp PRIVATE magic_enum yaml-cpp spdlog glm pugixml ${LibArchive_LIBRARIES} ${ZLIB_LIBRARIES} stb eigen utf8cpp imgui_internal TracyClient) add_compile_definitions(GLM_FORCE_INTRINSICS) add_compile_definitions(GLM_FORCE_SILENT_WARNINGS) add_compile_definitions(LIBARCHIVE_STATIC) if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_compile_definitions(DEBUG) endif()