# Copyright (c) 2019-2024, Arm Limited and Contributors # # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 the "License"; # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # cmake_minimum_required(VERSION 3.16) include(android_package) # create sample app project project(vulkan_samples LANGUAGES C CXX) if(IOS AND CMAKE_VERSION VERSION_LESS 3.20) message(FATAL_ERROR "Configuring iOS apps requires a minimum CMake version of 3.20") elseif(APPLE AND NOT IOS AND CMAKE_VERSION VERSION_LESS 3.17) message(FATAL_ERROR "Configuring Xcode for macOS requires a minimum CMake version of 3.17") endif() add_subdirectory(plugins) add_subdirectory(apps) set(SRC main.cpp ) source_group("\\" FILES ${SRC}) # select target type based on platform if(ANDROID) if(CMAKE_VS_NsightTegra_VERSION) list(APPEND SRC ${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml) endif() add_library(${PROJECT_NAME} SHARED ${SRC}) elseif(IOS) list(REMOVE_AT SRC 0) list(APPEND SRC ${CMAKE_CURRENT_SOURCE_DIR}/ios/main.mm ${CMAKE_CURRENT_SOURCE_DIR}/ios/AppDelegate.h ${CMAKE_CURRENT_SOURCE_DIR}/ios/AppDelegate.m ${CMAKE_CURRENT_SOURCE_DIR}/ios/ViewController.h ${CMAKE_CURRENT_SOURCE_DIR}/ios/ViewController.mm ) add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SRC}) else() add_executable(${PROJECT_NAME} WIN32 ${SRC}) endif() target_link_libraries(${PROJECT_NAME} PRIVATE vkb__core vkb__filesystem apps plugins) # Create android project if(ANDROID) if(CMAKE_VS_NsightTegra_VERSION) set_property(TARGET ${PROJECT_NAME} PROPERTY ANDROID_GUI ON) set_property(TARGET ${PROJECT_NAME} PROPERTY ANDROID_ASSETS_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/../assets) set_property(TARGET ${PROJECT_NAME} PROPERTY ANDROID_JAVA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../bldsys/android/java) endif() # Add packaging project only if not using CMake's toolchain if(CMAKE_SYSTEM_VERSION GREATER 1) add_android_package_project( NAME ${PROJECT_NAME}_package DEPENDS ${PROJECT_NAME} ASSET_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../assets JAVA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android/java RES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android/res MANIFEST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml) endif() # Sync assets and shaders android_sync_folder(PATH ${CMAKE_CURRENT_SOURCE_DIR}/../assets) android_sync_folder(PATH ${CMAKE_CURRENT_SOURCE_DIR}/../shaders) endif() # Create MSVC project if(MSVC) # Set VS startup project, working directory to project root, and command line arguments to default sample set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME}) set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "sample hello_triangle") #Configure output paths foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${CONFIG_TYPE} SUFFIX) string(TOLOWER ${CONFIG_TYPE} CONFIG_DIR) set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${SUFFIX} ${CMAKE_CURRENT_BINARY_DIR}/bin/${CONFIG_DIR}/${TARGET_ARCH}) set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${SUFFIX} ${CMAKE_CURRENT_BINARY_DIR}/lib/${CONFIG_DIR}/${TARGET_ARCH}) set_target_properties(${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${SUFFIX} ${CMAKE_CURRENT_BINARY_DIR}/lib/${CONFIG_DIR}/${TARGET_ARCH}) endforeach() endif() # Enable building from XCode for IOS if(IOS) set(CMAKE_MACOSX_BUNDLE YES) if(NOT DEFINED MACOSX_BUNDLE_GUI_IDENTIFIER) if(${CMAKE_OSX_SYSROOT} STREQUAL "iphoneos" AND DEFINED CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM) message(FATAL_ERROR "Building for iOS device with a specified development team requires setting MACOSX_BUNDLE_GUI_IDENTIFIER") else() set(MACOSX_BUNDLE_GUI_IDENTIFIER com.khronos.vulkansamples) endif() endif() if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM) if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED) if(${CMAKE_OSX_SYSROOT} STREQUAL "iphoneos") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES") else() set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO") endif() endif() if(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED) message(FATAL_ERROR "Building for iOS with code signing requires setting CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM; note it is safe to build for iOS Simulator without code signing") else() message(STATUS "Building for iOS device or iOS Simulator without a code signing identity; turning off code signing") set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO" XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "NO" ) endif () else() message(STATUS "Building for iOS device or iOS Simulator with a code signing identity; turning on code signing") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES") set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "YES" XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "YES" ) endif () # No need to search for Vulkan package or MoltenVK library, Vulkan cache variables already defined on Apple platforms by global_options.cmake if(Vulkan_LIBRARY AND ${Vulkan_VERSION} VERSION_GREATER_EQUAL 1.3.278) target_sources(${PROJECT_NAME} PRIVATE ${Vulkan_Target_SDK}/iOS/share/vulkan ) set_source_files_properties( ${Vulkan_Target_SDK}/iOS/share/vulkan PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) endif () target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../assets ${CMAKE_CURRENT_SOURCE_DIR}/../shaders ${CMAKE_CURRENT_SOURCE_DIR}/ios/launch.storyboard ${CMAKE_CURRENT_SOURCE_DIR}/ios/Storyboard.storyboard ) set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/ios/launch.storyboard ${CMAKE_CURRENT_SOURCE_DIR}/ios/Storyboard.storyboard ${CMAKE_CURRENT_SOURCE_DIR}/../assets ${CMAKE_CURRENT_SOURCE_DIR}/../shaders PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) set(FRAMEWORKS_TO_EMBED) if(Vulkan_MoltenVK_LIBRARY) list(APPEND FRAMEWORKS_TO_EMBED "${Vulkan_MoltenVK_LIBRARY};") else() message(FATAL_ERROR "Can't find MoltenVK library. Please install the Vulkan SDK or MoltenVK project and set VULKAN_SDK.") endif() if(Vulkan_LIBRARY) list(APPEND FRAMEWORKS_TO_EMBED "${Vulkan_LIBRARY};") endif() if(Vulkan_Layer_VALIDATION) # trouble is can't turn this on/off if XCode decides to build debug and we're configured for release. Need to revist # note the Vulkan validation layer must be present and enabled even in release mode for the shader_debugprintf sample #if(("${VKB_DEBUG}" STREQUAL "ON") OR ("${VKB_VALIDATION_LAYERS}" STREQUAL "ON")) list(APPEND FRAMEWORKS_TO_EMBED "${Vulkan_Layer_VALIDATION}") #endif() endif() set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/ios/Info.plist # These are already defined by the ios Info.plist file specified above #MACOSX_BUNDLE_SHORT_VERSION_STRING 1.0.0 #MACOSX_BUNDLE_BUNDLE_VERSION 1.0.0 #MACOSX_BUNDLE_BUNDLE_NAME "vulkan samples" ) set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER ${MACOSX_BUNDLE_GUI_IDENTIFIER} XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES" XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks" XCODE_ATTRIBUTE_CODE_SIGN_STYLE "Automatic" # already default value XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer" XCODE_EMBED_FRAMEWORKS "${FRAMEWORKS_TO_EMBED}" XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES" XCODE_ATTRIBUTE_SKIP_INSTALL NO XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)" XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING NO XCODE_SCHEME_ARGUMENTS "sample hello_triangle" ) elseif(APPLE) # Set Xcode working directory to project root, and command line arguments to default sample set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_SCHEME_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" XCODE_SCHEME_ARGUMENTS "sample hello_triangle" ) endif()