diff --git a/CMakeLists.txt b/CMakeLists.txt index ad5f358..4c8c49c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,8 @@ -cmake_minimum_required(VERSION 3.16 FATAL_ERROR) +cmake_minimum_required(VERSION 3.28 FATAL_ERROR) + +include(cmake/SetCompilerSettings.cmake) +include(cmake/SetupVulkan.cmake) +include(cmake/Filter.cmake) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) @@ -7,53 +11,29 @@ if(LINUX) 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) +if(NOT IOS) + SetOutputDirs("${CMAKE_SOURCE_DIR}/bin") +endif() +SetOptimisationSettings() -file(GLOB_RECURSE sources CONFIGURE_DEPENDS "openVulkanoCpp/*.c" "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/*.c" "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() + file(GLOB_RECURSE sources CONFIGURE_DEPENDS "openVulkanoCpp/*.c" "openVulkanoCpp/*.cpp") add_executable(openVulkanoCpp openVulkanoCpp/main.cpp ${resources}) endif() +FilterPlatformPaths(sources) +SetWarningSettings(openVulkanoCpp) -#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_sources(openVulkanoCpp PRIVATE ${sources}) target_include_directories(openVulkanoCpp PUBLIC openVulkanoCpp) # Setup IOS @@ -66,13 +46,13 @@ if(IOS) 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 CoreFoundation" PRIVATE "-framework Foundation" PRIVATE "-framework CoreImage" PRIVATE "-framework CoreVideo" PRIVATE "-framework Metal" PRIVATE "-framework MetalPerformanceShaders" - PUBLIC "-framework ARKit" + PRIVATE "-framework ARKit" PRIVATE "-lstdc++" PRIVATE c++ PRIVATE c @@ -95,47 +75,11 @@ if(IOS) 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() +SetupVulkan(openVulkanoCpp) 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) target_include_directories(openVulkanoCpp PRIVATE ${OpenCV_INCLUDE_DIRS}) target_link_libraries(openVulkanoCpp PRIVATE glfw ${OpenCV_LIBS} pugixml) diff --git a/cmake/Filter.cmake b/cmake/Filter.cmake new file mode 100644 index 0000000..47289c6 --- /dev/null +++ b/cmake/Filter.cmake @@ -0,0 +1,16 @@ +function(FilterPlatformPaths sourcesVar) + + if (IOS) + list(FILTER ${sourcesVar} EXCLUDE REGEX ".*GLFW.*") + else () + list(FILTER ${sourcesVar} EXCLUDE REGEX ".*[\\/]Host[\\/]iOS[\\/].*") + endif () + if (NOT LINUX) + list(FILTER ${sourcesVar} EXCLUDE REGEX ".*[\\/]Host[\\/]Linux[\\/].*") + endif () + if (NOT WIN32) + list(FILTER ${sourcesVar} EXCLUDE REGEX ".*[\\/]Host[\\/]Windows[\\/].*") + endif () + + list(FILTER sources EXCLUDE REGEX "main\.(m|mm|c|cpp)") +endfunction() \ No newline at end of file diff --git a/cmake/SetCompilerSettings.cmake b/cmake/SetCompilerSettings.cmake new file mode 100644 index 0000000..aa17352 --- /dev/null +++ b/cmake/SetCompilerSettings.cmake @@ -0,0 +1,31 @@ +function(SetOptimisationSettings) + + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + + if (LINUX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native" PARENT_SCOPE) + elseif (APPLE) + add_compile_options("$<$:-O3>$<$:-O0>$<$:-Os>$<$:-O2>") + set(CMAKE_Swift_FLAGS_DEBUG "-Onone" PARENT_SCOPE) + set(CMAKE_Swift_FLAGS_RELEASE "-O" PARENT_SCOPE) + set(CMAKE_Swift_FLAGS_MINSIZEREL "-Osize" PARENT_SCOPE) + endif () +endfunction() + +function(SetWarningSettings TARGET) + if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunknown-pragmas" PARENT_SCOPE) + endif () + if (LINUX) + #target_compile_options(${TARGET} PRIVATE -Wall) + endif() +endfunction() + +function(SetOutputDirs BASE_DIR) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BASE_DIR}" PARENT_SCOPE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${BASE_DIR}/release" PARENT_SCOPE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${BASE_DIR}/minsizerel" PARENT_SCOPE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BASE_DIR}/relwithdebinfo" PARENT_SCOPE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${BASE_DIR}/debug" PARENT_SCOPE) + set(CMAKE_DEBUG_POSTFIX "d" PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/cmake/SetupVulkan.cmake b/cmake/SetupVulkan.cmake new file mode 100644 index 0000000..b4a0276 --- /dev/null +++ b/cmake/SetupVulkan.cmake @@ -0,0 +1,29 @@ +function(SetupVulkan TARGET) + 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(MadVoxel_Scan PRIVATE "${MoltenVK_XC_path}/ios-arm64/libMoltenVK.a") + message("Found MoltenVK xcframework: ${MoltenVK_XC_path}") + endif() + else () + find_package(Vulkan REQUIRED) + target_link_libraries(TARGET PRIVATE Vulkan::Vulkan) + endif () + target_include_directories(TARGET 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) + target_link_libraries(TARGET PRIVATE ${XCB_LIBRARIES}) + endif() +endfunction() \ No newline at end of file