+cmake_minimum_required(VERSION 3.19)
+cmake_policy(SET CMP0114 NEW)
+
find_package(Vulkan COMPONENTS glslc REQUIRED)
+function(detect_host_compiler)
+ if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
+ find_program(HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH)
+ find_program(HOST_CXX_COMPILER NAMES cl g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
+ else()
+ find_program(HOST_C_COMPILER NAMES gcc clang NO_CMAKE_FIND_ROOT_PATH)
+ find_program(HOST_CXX_COMPILER NAMES g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
+ endif()
+ set(HOST_C_COMPILER "${HOST_C_COMPILER}" PARENT_SCOPE)
+ set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
+endfunction()
+
if (Vulkan_FOUND)
message(STATUS "Vulkan found")
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
endif()
- add_subdirectory(vulkan-shaders)
-
- set (_ggml_vk_genshaders_cmd vulkan-shaders-gen)
+ if (NOT CMAKE_CROSSCOMPILING)
+ add_subdirectory(vulkan-shaders)
+ if (MSVC)
+ foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
+ string(TOUPPER ${CONFIG} CONFIG)
+ set_target_properties(vulkan-shaders-gen PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+ endforeach()
+ endif()
+ else()
+ if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
+ set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
+ else()
+ detect_host_compiler()
+ if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER)
+ message(FATAL_ERROR "Host compiler not found")
+ else()
+ message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}")
+ endif()
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
+ set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
+ endif()
+ message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
+
+ include(ExternalProject)
+ # Native build through ExternalProject_Add
+ ExternalProject_Add(
+ vulkan-shaders-gen
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
+ CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE}
+ -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build .
+ INSTALL_COMMAND ${CMAKE_COMMAND} --install .
+ INSTALL_DIR ${CMAKE_BINARY_DIR}
+ )
+ ExternalProject_Add_StepTargets(vulkan-shaders-gen build install)
+ endif()
+ set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
+ set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vulkan-shaders-gen${_ggml_vk_host_suffix})
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp)
set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders)
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
+ set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
- if (NOT CMAKE_CROSSCOMPILING)
- set(_ggml_vk_genshaders_cmd "$<TARGET_FILE_DIR:vulkan-shaders-gen>/${_ggml_vk_genshaders_cmd}")
- endif ()
+ if (CMAKE_CROSSCOMPILING)
+ set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install)
+ endif()
add_custom_command(
OUTPUT ${_ggml_vk_header}
--target-cpp ${_ggml_vk_source}
--no-clean
- DEPENDS ${_ggml_vk_shader_deps} ${_ggml_vk_genshaders_cmd}
+ DEPENDS ${_ggml_vk_shader_deps}
COMMENT "Generate vulkan shaders"
)
--- /dev/null
+set(CMAKE_BUILD_TYPE Release)
+set(CMAKE_C_FLAGS -O2)
+set(CMAKE_CXX_FLAGS -O2)
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
+set(CMAKE_C_COMPILER @HOST_C_COMPILER@)
+set(CMAKE_CXX_COMPILER @HOST_CXX_COMPILER@)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY @CMAKE_RUNTIME_OUTPUT_DIRECTORY@)
+
+if("@CMAKE_C_COMPILER_ID@" STREQUAL "MSVC")
+ foreach(CONFIG IN ITEMS DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+ endforeach()
+endif()