|
| 1 | +cmake_minimum_required(VERSION 3.22.1) |
| 2 | + |
| 3 | +project(vulkan_tutorial_android) |
| 4 | + |
| 5 | +# Set the path to the main CMakeLists.txt relative to this file |
| 6 | +set(MAIN_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../CMakeLists.txt") |
| 7 | + |
| 8 | +# Find the Vulkan package |
| 9 | +find_package(Vulkan REQUIRED) |
| 10 | + |
| 11 | +# Find the tinyobjloader package |
| 12 | +find_package(tinyobjloader REQUIRED) |
| 13 | + |
| 14 | +# Find the glm package |
| 15 | +find_package(glm REQUIRED) |
| 16 | + |
| 17 | +# Find the stb_image.h header |
| 18 | +find_path(STB_INCLUDEDIR stb_image.h PATH_SUFFIXES stb) |
| 19 | +if (NOT STB_INCLUDEDIR) |
| 20 | + message(FATAL_ERROR "stb_image.h not found") |
| 21 | +endif() |
| 22 | + |
| 23 | +# Set up shader compilation tools |
| 24 | +add_executable(glslang::validator IMPORTED) |
| 25 | +find_program(GLSLANG_VALIDATOR "glslangValidator" HINTS $ENV{VULKAN_SDK}/bin REQUIRED) |
| 26 | +set_property(TARGET glslang::validator PROPERTY IMPORTED_LOCATION "${GLSLANG_VALIDATOR}") |
| 27 | + |
| 28 | +# Define shader building function |
| 29 | +function(add_shaders_target TARGET) |
| 30 | + cmake_parse_arguments("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN}) |
| 31 | + set(SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders) |
| 32 | + add_custom_command( |
| 33 | + OUTPUT ${SHADERS_DIR} |
| 34 | + COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR} |
| 35 | + ) |
| 36 | + add_custom_command( |
| 37 | + OUTPUT ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv |
| 38 | + COMMAND glslang::validator |
| 39 | + ARGS --target-env vulkan1.0 ${SHADER_SOURCES} --quiet |
| 40 | + WORKING_DIRECTORY ${SHADERS_DIR} |
| 41 | + DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES} |
| 42 | + COMMENT "Compiling Shaders" |
| 43 | + VERBATIM |
| 44 | + ) |
| 45 | + add_custom_target(${TARGET} DEPENDS ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv) |
| 46 | +endfunction() |
| 47 | + |
| 48 | +# Include the game-activity library |
| 49 | +find_package(game-activity REQUIRED CONFIG) |
| 50 | +include_directories(${ANDROID_NDK}/sources/android/game-activity/include) |
| 51 | + |
| 52 | +# Set C++ standard to match the main project |
| 53 | +set(CMAKE_CXX_STANDARD 20) |
| 54 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 55 | + |
| 56 | +# Add the Vulkan C++ module |
| 57 | +add_library(VulkanCppModule SHARED) |
| 58 | +target_compile_definitions(VulkanCppModule |
| 59 | + PUBLIC VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1 VULKAN_HPP_NO_STRUCT_CONSTRUCTORS=1 |
| 60 | +) |
| 61 | +target_include_directories(VulkanCppModule |
| 62 | + PRIVATE |
| 63 | + "${Vulkan_INCLUDE_DIR}" |
| 64 | +) |
| 65 | +target_link_libraries(VulkanCppModule |
| 66 | + PUBLIC |
| 67 | + ${Vulkan_LIBRARIES} |
| 68 | +) |
| 69 | +set_target_properties(VulkanCppModule PROPERTIES CXX_STANDARD 20) |
| 70 | + |
| 71 | +# Set up the C++ module file set |
| 72 | +target_sources(VulkanCppModule |
| 73 | + PUBLIC |
| 74 | + FILE_SET cxx_modules TYPE CXX_MODULES |
| 75 | + BASE_DIRS |
| 76 | + "${Vulkan_INCLUDE_DIR}" |
| 77 | + FILES |
| 78 | + "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" |
| 79 | +) |
| 80 | + |
| 81 | +# Set up shader compilation for 34_android |
| 82 | +set(SHADER_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments") |
| 83 | +set(SHADER_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/shaders") |
| 84 | +file(MAKE_DIRECTORY ${SHADER_OUTPUT_DIR}) |
| 85 | + |
| 86 | +# Copy shader source files to the build directory |
| 87 | +configure_file( |
| 88 | + "${SHADER_SOURCE_DIR}/27_shader_depth.frag" |
| 89 | + "${SHADER_OUTPUT_DIR}/27_shader_depth.frag" |
| 90 | + COPYONLY |
| 91 | +) |
| 92 | +configure_file( |
| 93 | + "${SHADER_SOURCE_DIR}/27_shader_depth.vert" |
| 94 | + "${SHADER_OUTPUT_DIR}/27_shader_depth.vert" |
| 95 | + COPYONLY |
| 96 | +) |
| 97 | + |
| 98 | +# Compile shaders |
| 99 | +set(SHADER_SOURCES "${SHADER_OUTPUT_DIR}/27_shader_depth.frag" "${SHADER_OUTPUT_DIR}/27_shader_depth.vert") |
| 100 | +add_shaders_target(android_shaders CHAPTER_NAME "${SHADER_OUTPUT_DIR}" SOURCES ${SHADER_SOURCES}) |
| 101 | + |
| 102 | +# Add the main native library |
| 103 | +add_library(vulkan_tutorial_android SHARED |
| 104 | + ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/34_android.cpp |
| 105 | + game_activity_bridge.cpp |
| 106 | +) |
| 107 | + |
| 108 | +# Add dependency on shader compilation |
| 109 | +add_dependencies(vulkan_tutorial_android android_shaders) |
| 110 | + |
| 111 | +# Set include directories |
| 112 | +target_include_directories(vulkan_tutorial_android PRIVATE |
| 113 | + ${CMAKE_CURRENT_SOURCE_DIR} |
| 114 | + ${Vulkan_INCLUDE_DIR} |
| 115 | + ${ANDROID_NDK}/sources/android/game-activity/include |
| 116 | + ${STB_INCLUDEDIR} |
| 117 | +) |
| 118 | + |
| 119 | +# Link against libraries |
| 120 | +target_link_libraries(vulkan_tutorial_android |
| 121 | + VulkanCppModule |
| 122 | + game-activity::game-activity |
| 123 | + android |
| 124 | + log |
| 125 | + ${Vulkan_LIBRARIES} |
| 126 | + tinyobjloader::tinyobjloader |
| 127 | + glm::glm |
| 128 | +) |
0 commit comments