Skip to content

Commit 4df311b

Browse files
committed
scripts: Fix PccDiscovery for plain PATH resolution
1 parent 6acb230 commit 4df311b

File tree

1 file changed

+38
-20
lines changed

1 file changed

+38
-20
lines changed

cmake/Modules/VulkanSCPccDiscovery.cmake

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,26 @@ find_program(VulkanSC_PCCTOOL_EXECUTABLE
1212
"$ENV{VULKANSC_SDK}/bin"
1313
)
1414

15+
function(resolve_vksc_pcc_executable PCC_EXECUTABLE PCC_JSON_PATH OUT_VAR)
16+
if(WIN32)
17+
set(NATIVE_PATH_SEPARATOR_REGEX [[\\]])
18+
else()
19+
set(NATIVE_PATH_SEPARATOR_REGEX [[/]])
20+
endif()
21+
if(NOT PCC_EXECUTABLE MATCHES ${NATIVE_PATH_SEPARATOR_REGEX})
22+
separate_arguments(PCC_EXECUTABLE NATIVE_COMMAND PROGRAM "${PCC_EXECUTABLE}")
23+
else()
24+
cmake_path(IS_RELATIVE PCC_EXECUTABLE PCC_EXECUTABLE_IS_RELATIVE)
25+
if(PCC_EXECUTABLE_IS_RELATIVE)
26+
cmake_path(GET PCC_JSON_PATH PARENT_PATH PCC_JSON_PARENT_PATH)
27+
cmake_path(ABSOLUTE_PATH PCC_EXECUTABLE BASE_DIRECTORY "${PCC_JSON_PARENT_PATH}" NORMALIZE)
28+
else()
29+
cmake_path(NORMAL_PATH PCC_EXECUTABLE)
30+
endif()
31+
endif()
32+
set(${OUT_VAR} "${PCC_EXECUTABLE}" PARENT_SCOPE)
33+
endfunction()
34+
1535
# If a PCC executable is set manually then do not perform the PCC discovery
1636
if(NOT "${VulkanSC_PCC_EXECUTABLE}")
1737
if(WIN32)
@@ -22,9 +42,12 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
2242
RESULT PCC_PROP_NAMES
2343
QUERY WINDOWS_REGISTRY "${HIVE}/SOFTWARE/Khronos/VulkanSC/PCC" VALUE_NAMES
2444
)
25-
if(PCC_PROP_NAMES)
26-
list(APPEND PCC_JSON_PATHS "${PCC_PROP_NAMES}")
27-
endif()
45+
foreach(PCC_PROP_NAME IN LISTS PCC_PROP_NAMES)
46+
file(REAL_PATH "${PCC_PROP_NAME}" PCC_PROP_NAME)
47+
if(NOT PCC_PROP_NAME IN_LIST PCC_JSON_PATHS)
48+
list(APPEND PCC_JSON_PATHS "${PCC_PROP_NAME}")
49+
endif()
50+
endforeach()
2851
endforeach()
2952
else()
3053
message(FATAL_ERROR "PCC (pipeline cache compiler) discovery on Windows requires CMake 3.24 or newer")
@@ -42,9 +65,12 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
4265
/etc/xdg/vulkansc/pcc.d
4366
)
4467
file(GLOB PCC_GLOBBED_PATHS "${MANIFEST_DIR}/*.json")
45-
if(PCC_GLOBBED_PATHS)
46-
list(APPEND PCC_JSON_PATHS "${PCC_GLOBBED_PATHS}")
47-
endif()
68+
foreach(PCC_GLOBBED_PATH IN LISTS PCC_GLOBBED_PATHS)
69+
file(REAL_PATH "${PCC_GLOBBED_PATH}" PCC_GLOBBED_PATH)
70+
if(NOT PCC_GLOBBED_PATH IN_LIST PCC_JSON_PATHS)
71+
list(APPEND PCC_JSON_PATHS "${PCC_GLOBBED_PATH}")
72+
endif()
73+
endforeach()
4874
endforeach()
4975
endif()
5076
foreach(PCC_JSON_PATH IN LISTS PCC_JSON_PATHS)
@@ -59,13 +85,9 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
5985
foreach(ARCH_INDEX RANGE ${ARCH_LENGTH_STOP})
6086
string(JSON ARCH_NAME MEMBER "${PCC_JSON}" "architectures" ${ARCH_INDEX})
6187
string(JSON PCC_EXECUTABLE GET "${PCC_JSON}" "architectures" ${ARCH_NAME} "pipeline_cache_compiler")
62-
cmake_path(IS_RELATIVE PCC_EXECUTABLE PCC_EXECUTABLE_IS_RELATIVE)
63-
if(PCC_EXECUTABLE_IS_RELATIVE)
64-
cmake_path(GET PCC_JSON_PATH PARENT_PATH PCC_JSON_PARENT_PATH)
65-
cmake_path(ABSOLUTE_PATH PCC_EXECUTABLE BASE_DIRECTORY "${PCC_JSON_PARENT_PATH}" NORMALIZE)
66-
else()
67-
cmake_path(NORMAL_PATH PCC_EXECUTABLE)
68-
endif()
88+
message(DEBUG "PCC entry: ${PCC_EXECUTABLE}")
89+
resolve_vksc_pcc_executable("${PCC_EXECUTABLE}" "${PCC_JSON_PATH}" PCC_EXECUTABLE)
90+
message(DEBUG "PCC resolved: ${PCC_EXECUTABLE}")
6991
string(JSON FLAGS GET "${PCC_JSON}" "architectures" ${ARCH_NAME} "pipeline_cache_flags")
7092
string(JSON DEBUG_FLAG GET "${PCC_JSON}" "architectures" ${ARCH_NAME} "pipeline_cache_debug_flag")
7193
string(JSON VENDOR_ID_FILTER ERROR_VARIABLE VENDOR_ID_FILTER_ERROR GET "${PCC_JSON}" "architectures" ${ARCH_NAME} "vendor_id_filter")
@@ -129,13 +151,9 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
129151
set(DEVICE_ID "${CMAKE_MATCH_1}")
130152
set(DEVICE_NAME "${CMAKE_MATCH_2}")
131153
string(JSON PCC_EXECUTABLE GET "${PCC_JSON}" "devices" ${DEV_INDEX} "pipeline_cache_compiler")
132-
cmake_path(IS_RELATIVE PCC_EXECUTABLE PCC_EXECUTABLE_IS_RELATIVE)
133-
if(PCC_EXECUTABLE_IS_RELATIVE)
134-
cmake_path(GET PCC_JSON_PATH PARENT_PATH PCC_JSON_PARENT_PATH)
135-
cmake_path(ABSOLUTE_PATH PCC_EXECUTABLE BASE_DIRECTORY "${PCC_JSON_PARENT_PATH}" NORMALIZE)
136-
else()
137-
cmake_path(NORMAL_PATH PCC_EXECUTABLE)
138-
endif()
154+
message(DEBUG "PCC entry: ${PCC_EXECUTABLE}")
155+
resolve_vksc_pcc_executable("${PCC_EXECUTABLE}" "${PCC_JSON_PATH}" PCC_EXECUTABLE)
156+
message(DEBUG "PCC resolved to: ${PCC_EXECUTABLE}")
139157
string(JSON DEVICE_FLAG GET "${PCC_JSON}" "devices" ${DEV_INDEX} "pipeline_cache_device_flag")
140158
string(JSON DEBUG_FLAG GET "${PCC_JSON}" "devices" ${DEV_INDEX} "pipeline_cache_debug_flag")
141159

0 commit comments

Comments
 (0)