207 lines
9.1 KiB
CMake
207 lines
9.1 KiB
CMake
# 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()
|