Skip to content

Commit 68c9f89

Browse files
sparkleholicmglambda
authored andcommitted
fix: ggml: fix vulkan-shaders-gen build (ggml-org#10448)
* fix: ggml: fix vulkan-shaders-gen build The vulkan-shaders-gen target was not being built correctly in case of cross-compilation. Other outputs need to be built for the cross compile target, but vulkan-shaders-gen needs to be built for the host. * refactor: ggml: Improve vulkan-shaders-gen toolchain setup - Add GGML_SHADERS_GEN_TOOLCHAIN CMake option. - Auto-detect host toolchain if not set. * refactor: ggml: Improve vulkan-shaders-gen toolchain setup Use configure_file to generate host_toolchain.cmake from template * fix: ggml: Fix compile error Fix compile error not finding vulkan-shaders-gen * fix: vulkan-shaders-gen build and path handling Fix build issues with vulkan-shaders-gen: - Add target dependency for correct build order - Use CMAKE_HOST_SYSTEM_NAME for executable suffix - Fix MSVC output directory in host toolchain - Normalize path handling for cross-compilation * fix: improve host compiler detection in vulkan shader build Improve host compiler detection for vulkan shader generation: - Add NO_CMAKE_FIND_ROOT_PATH to all compiler searches - Consolidate compiler detection logic - Fix Windows-specific MSVC detection - Ensure correct compiler search in cross-compilation * refactor: Simplify CMake function for detecting host compiler Simplified the CMake function to improve the process of detecting the host compiler. * fix: Remove unnecessary Vulkan library linkage in CMakeLists.txt Since `vulkan-shader-gen.cpp` only requires the `glslc` executable and not the Vulkan headers or libraries, CMakeLists.txt needs to be corrected. (See: ecc93d0) * refactor: Rename host_toolchain.cmake.in - Rename host_toolchain.cmake.in to cmake/host-toolchain.cmake.in * refactor: GGML_VULKAN_SHADERS_GEN_TOOLCHAIN Rename the macro GGML_SHADERS_GEN_TOOLCHAIN to GGML_VULKAN_SHADERS_GEN_TOOLCHAIN
1 parent be9a78c commit 68c9f89

File tree

5 files changed

+81
-11
lines changed

5 files changed

+81
-11
lines changed

ggml/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ option(GGML_OPENCL_PROFILING "ggml: use OpenCL profiling (increas
185185
option(GGML_OPENCL_EMBED_KERNELS "ggml: embed kernels" ON)
186186
option(GGML_OPENCL_USE_ADRENO_KERNELS "ggml: use optimized kernels for Adreno" ON)
187187

188+
# toolchain for vulkan-shaders-gen
189+
set (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN "" CACHE FILEPATH "ggml: toolchain file for vulkan-shaders-gen")
190+
188191
# extra artifacts
189192
option(GGML_BUILD_TESTS "ggml: build tests" ${GGML_STANDALONE})
190193
option(GGML_BUILD_EXAMPLES "ggml: build examples" ${GGML_STANDALONE})

ggml/src/ggml-vulkan/CMakeLists.txt

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
1+
cmake_minimum_required(VERSION 3.19)
2+
cmake_policy(SET CMP0114 NEW)
3+
14
find_package(Vulkan COMPONENTS glslc REQUIRED)
25

6+
function(detect_host_compiler)
7+
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
8+
find_program(HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH)
9+
find_program(HOST_CXX_COMPILER NAMES cl g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
10+
else()
11+
find_program(HOST_C_COMPILER NAMES gcc clang NO_CMAKE_FIND_ROOT_PATH)
12+
find_program(HOST_CXX_COMPILER NAMES g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
13+
endif()
14+
set(HOST_C_COMPILER "${HOST_C_COMPILER}" PARENT_SCOPE)
15+
set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
16+
endfunction()
17+
318
if (Vulkan_FOUND)
419
message(STATUS "Vulkan found")
520

@@ -73,19 +88,56 @@ if (Vulkan_FOUND)
7388
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
7489
endif()
7590

76-
add_subdirectory(vulkan-shaders)
77-
78-
set (_ggml_vk_genshaders_cmd vulkan-shaders-gen)
91+
if (NOT CMAKE_CROSSCOMPILING)
92+
add_subdirectory(vulkan-shaders)
93+
if (MSVC)
94+
foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
95+
string(TOUPPER ${CONFIG} CONFIG)
96+
set_target_properties(vulkan-shaders-gen PROPERTIES
97+
RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
98+
endforeach()
99+
endif()
100+
else()
101+
if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
102+
set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
103+
else()
104+
detect_host_compiler()
105+
if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER)
106+
message(FATAL_ERROR "Host compiler not found")
107+
else()
108+
message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}")
109+
endif()
110+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
111+
set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
112+
endif()
113+
message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
114+
115+
include(ExternalProject)
116+
# Native build through ExternalProject_Add
117+
ExternalProject_Add(
118+
vulkan-shaders-gen
119+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
120+
CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE}
121+
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
122+
BUILD_COMMAND ${CMAKE_COMMAND} --build .
123+
INSTALL_COMMAND ${CMAKE_COMMAND} --install .
124+
INSTALL_DIR ${CMAKE_BINARY_DIR}
125+
)
126+
ExternalProject_Add_StepTargets(vulkan-shaders-gen build install)
127+
endif()
128+
set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
129+
set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vulkan-shaders-gen${_ggml_vk_host_suffix})
79130
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
80131
set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp)
81132
set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders)
82133
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
83134

84135
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
136+
set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
85137

86-
if (NOT CMAKE_CROSSCOMPILING)
87-
set(_ggml_vk_genshaders_cmd "$<TARGET_FILE_DIR:vulkan-shaders-gen>/${_ggml_vk_genshaders_cmd}")
88-
endif ()
138+
if (CMAKE_CROSSCOMPILING)
139+
set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install)
140+
endif()
89141

90142
add_custom_command(
91143
OUTPUT ${_ggml_vk_header}
@@ -99,7 +151,7 @@ if (Vulkan_FOUND)
99151
--target-cpp ${_ggml_vk_source}
100152
--no-clean
101153

102-
DEPENDS ${_ggml_vk_shader_deps} ${_ggml_vk_genshaders_cmd}
154+
DEPENDS ${_ggml_vk_shader_deps}
103155
COMMENT "Generate vulkan shaders"
104156
)
105157

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
set(CMAKE_BUILD_TYPE Release)
2+
set(CMAKE_C_FLAGS -O2)
3+
set(CMAKE_CXX_FLAGS -O2)
4+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
5+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
6+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
7+
set(CMAKE_C_COMPILER @HOST_C_COMPILER@)
8+
set(CMAKE_CXX_COMPILER @HOST_CXX_COMPILER@)
9+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY @CMAKE_RUNTIME_OUTPUT_DIRECTORY@)
10+
11+
if("@CMAKE_C_COMPILER_ID@" STREQUAL "MSVC")
12+
foreach(CONFIG IN ITEMS DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
13+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
14+
endforeach()
15+
endif()

ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
find_package (Threads REQUIRED)
2-
find_package(Vulkan COMPONENTS glslc REQUIRED)
2+
find_program(GLSLC_EXECUTABLE glslc)
3+
if(NOT GLSLC_EXECUTABLE)
4+
message(FATAL_ERROR "glslc not found.")
5+
endif()
36

47
set(TARGET vulkan-shaders-gen)
58
add_executable(${TARGET} vulkan-shaders-gen.cpp)
69
install(TARGETS ${TARGET} RUNTIME)
710
target_compile_features(${TARGET} PRIVATE cxx_std_17)
811
target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads)
9-
target_link_libraries(vulkan-shaders-gen PRIVATE Vulkan::Vulkan)

ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
#include <fcntl.h>
3131
#endif
3232

33-
#include <vulkan/vulkan_core.h>
34-
3533
#define ASYNCIO_CONCURRENCY 64
3634

3735
std::mutex lock;

0 commit comments

Comments
 (0)