Skip to content

Commit 571e819

Browse files
fix(cmake): harden exported OpenBLAS package
1 parent ebf8ff6 commit 571e819

4 files changed

Lines changed: 160 additions & 35 deletions

File tree

CMakeLists.txt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,12 @@ target_compile_definitions(TensorToolkit
147147
)
148148

149149
if (QLTEN_HP_NUMERIC_PUBLIC_INCLUDE_DIRS)
150-
target_include_directories(TensorToolkit
151-
INTERFACE
152-
$<BUILD_INTERFACE:${QLTEN_HP_NUMERIC_PUBLIC_INCLUDE_DIRS}>
153-
)
150+
foreach(_qlten_hp_numeric_include_dir IN LISTS QLTEN_HP_NUMERIC_PUBLIC_INCLUDE_DIRS)
151+
target_include_directories(TensorToolkit
152+
INTERFACE
153+
$<BUILD_INTERFACE:${_qlten_hp_numeric_include_dir}>
154+
)
155+
endforeach ()
154156
endif ()
155157

156158
target_link_libraries(TensorToolkit
@@ -238,23 +240,16 @@ else ()
238240
set(_qlten_hptt_include_dirs "${hptt_INCLUDE_DIR}")
239241
endif ()
240242

241-
if (NOT TARGET qlten_external_hptt)
242-
add_library(qlten_external_hptt UNKNOWN IMPORTED)
243-
set_target_properties(qlten_external_hptt PROPERTIES
243+
if (NOT TARGET qlten_build_hptt)
244+
add_library(qlten_build_hptt UNKNOWN IMPORTED)
245+
set_target_properties(qlten_build_hptt PROPERTIES
244246
IMPORTED_LOCATION "${hptt_LIBRARY}"
245247
INTERFACE_INCLUDE_DIRECTORIES "${_qlten_hptt_include_dirs}")
246248
endif ()
247249

248-
if (_qlten_hptt_include_dirs)
249-
target_include_directories(TensorToolkit
250-
INTERFACE
251-
$<BUILD_INTERFACE:${_qlten_hptt_include_dirs}>
252-
)
253-
endif ()
254-
255250
target_link_libraries(TensorToolkit
256251
INTERFACE
257-
qlten_external_hptt
252+
$<BUILD_INTERFACE:qlten_build_hptt>
258253
)
259254
endif ()
260255
endif ()

cmake/TensorToolkitConfig.cmake.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ if (TARGET qlten_external_lapacke)
1414
INTERFACE_LINK_LIBRARIES qlten_external_lapacke)
1515
endif ()
1616

17+
if (TARGET qlten_external_hptt)
18+
set_property(TARGET TensorToolkit::TensorToolkit APPEND PROPERTY
19+
INTERFACE_LINK_LIBRARIES qlten_external_hptt)
20+
endif ()
21+
1722
if (TARGET qlten_hptt_runtime AND TARGET TensorToolkit::hptt)
1823
set_property(TARGET TensorToolkit::hptt APPEND PROPERTY
1924
INTERFACE_LINK_LIBRARIES qlten_hptt_runtime)

cmake/TensorToolkitDependencies.cmake.in

Lines changed: 134 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,60 @@ function(_qlten_reset_var _name _was_defined _value)
99
endif ()
1010
endfunction()
1111

12+
function(_qlten_list_entries_exist _out_var)
13+
set(_qlten_all_exist TRUE)
14+
foreach(_qlten_entry IN LISTS ARGN)
15+
if (_qlten_entry STREQUAL ""
16+
OR _qlten_entry MATCHES "^-"
17+
OR _qlten_entry MATCHES "^\\$<")
18+
continue ()
19+
endif ()
20+
21+
if (NOT EXISTS "${_qlten_entry}")
22+
set(_qlten_all_exist FALSE)
23+
break ()
24+
endif ()
25+
endforeach ()
26+
27+
set(${_out_var} "${_qlten_all_exist}" PARENT_SCOPE)
28+
endfunction()
29+
1230
function(_qlten_collect_cpu_backend_details _vendor _include_out _lapacke_out)
1331
set(_qlten_include_dirs "")
1432
set(_qlten_search_roots "")
33+
set(_qlten_recorded_blas_include_dirs "@QLTEN_HP_NUMERIC_BLAS_INCLUDE_DIRS@")
34+
set(_qlten_recorded_lapacke_include_dir "@QLTEN_HP_NUMERIC_LAPACKE_INCLUDE_DIR@")
35+
set(_qlten_recorded_lapacke_library "@QLTEN_HP_NUMERIC_LAPACKE_LIBRARY@")
36+
37+
foreach(_qlten_recorded_include_dir IN LISTS _qlten_recorded_blas_include_dirs)
38+
if (_qlten_recorded_include_dir)
39+
list(APPEND _qlten_search_roots "${_qlten_recorded_include_dir}")
40+
get_filename_component(_qlten_recorded_prefix1 "${_qlten_recorded_include_dir}/.." ABSOLUTE)
41+
get_filename_component(_qlten_recorded_prefix2 "${_qlten_recorded_include_dir}/../.." ABSOLUTE)
42+
list(APPEND _qlten_search_roots
43+
"${_qlten_recorded_prefix1}"
44+
"${_qlten_recorded_prefix2}")
45+
endif ()
46+
endforeach ()
47+
if (_qlten_recorded_lapacke_include_dir)
48+
list(APPEND _qlten_search_roots "${_qlten_recorded_lapacke_include_dir}")
49+
get_filename_component(_qlten_recorded_lapacke_prefix1 "${_qlten_recorded_lapacke_include_dir}/.." ABSOLUTE)
50+
get_filename_component(_qlten_recorded_lapacke_prefix2 "${_qlten_recorded_lapacke_include_dir}/../.." ABSOLUTE)
51+
list(APPEND _qlten_search_roots
52+
"${_qlten_recorded_lapacke_prefix1}"
53+
"${_qlten_recorded_lapacke_prefix2}")
54+
endif ()
55+
if (_qlten_recorded_lapacke_library)
56+
get_filename_component(_qlten_recorded_lapacke_lib_dir "${_qlten_recorded_lapacke_library}" DIRECTORY)
57+
if (_qlten_recorded_lapacke_lib_dir)
58+
get_filename_component(_qlten_recorded_lapacke_root1 "${_qlten_recorded_lapacke_lib_dir}/.." ABSOLUTE)
59+
get_filename_component(_qlten_recorded_lapacke_root2 "${_qlten_recorded_lapacke_lib_dir}/../.." ABSOLUTE)
60+
list(APPEND _qlten_search_roots
61+
"${_qlten_recorded_lapacke_lib_dir}"
62+
"${_qlten_recorded_lapacke_root1}"
63+
"${_qlten_recorded_lapacke_root2}")
64+
endif ()
65+
endif ()
1566
1667
foreach(_qlten_lib IN LISTS BLAS_LIBRARIES LAPACK_LIBRARIES)
1768
get_filename_component(_qlten_lib_dir "${_qlten_lib}" DIRECTORY)
@@ -30,10 +81,19 @@ function(_qlten_collect_cpu_backend_details _vendor _include_out _lapacke_out)
3081
if (DEFINED ENV{MKLROOT} AND NOT "$ENV{MKLROOT}" STREQUAL "")
3182
list(APPEND _qlten_search_roots "$ENV{MKLROOT}")
3283
endif ()
33-
find_path(_qlten_mkl_include_dir
34-
NAMES mkl.h
35-
HINTS ${_qlten_search_roots}
36-
PATH_SUFFIXES include include/oneapi)
84+
set(_qlten_mkl_include_dir "")
85+
foreach(_qlten_recorded_include_dir IN LISTS _qlten_recorded_blas_include_dirs)
86+
if (EXISTS "${_qlten_recorded_include_dir}/mkl.h")
87+
set(_qlten_mkl_include_dir "${_qlten_recorded_include_dir}")
88+
break ()
89+
endif ()
90+
endforeach ()
91+
if (NOT _qlten_mkl_include_dir)
92+
find_path(_qlten_mkl_include_dir
93+
NAMES mkl.h
94+
HINTS ${_qlten_search_roots}
95+
PATH_SUFFIXES include include/oneapi)
96+
endif ()
3797
if (NOT _qlten_mkl_include_dir)
3898
message(FATAL_ERROR "TensorToolkit requires mkl.h for the installed MKL-backed variant.")
3999
endif ()
@@ -53,14 +113,51 @@ function(_qlten_collect_cpu_backend_details _vendor _include_out _lapacke_out)
53113
endif ()
54114
55115
if (NOT _vendor STREQUAL "Intel10_64lp")
56-
find_path(_qlten_cblas_include_dir
57-
NAMES cblas.h
58-
HINTS ${_qlten_search_roots}
59-
PATH_SUFFIXES include include/openblas)
60-
find_path(_qlten_lapacke_include_dir
61-
NAMES lapacke.h
62-
HINTS ${_qlten_search_roots}
63-
PATH_SUFFIXES include include/openblas)
116+
set(_qlten_cblas_include_dir "")
117+
if (_vendor STREQUAL "OpenBLAS")
118+
foreach(_qlten_recorded_include_dir IN LISTS _qlten_recorded_blas_include_dirs)
119+
if (EXISTS "${_qlten_recorded_include_dir}/cblas.h"
120+
AND EXISTS "${_qlten_recorded_include_dir}/openblas_config.h")
121+
set(_qlten_cblas_include_dir "${_qlten_recorded_include_dir}")
122+
break ()
123+
endif ()
124+
endforeach ()
125+
if (NOT _qlten_cblas_include_dir)
126+
find_path(_qlten_cblas_include_dir
127+
NAMES openblas_config.h
128+
HINTS ${_qlten_search_roots}
129+
PATH_SUFFIXES include include/openblas)
130+
if (_qlten_cblas_include_dir
131+
AND NOT EXISTS "${_qlten_cblas_include_dir}/cblas.h")
132+
unset(_qlten_cblas_include_dir CACHE)
133+
unset(_qlten_cblas_include_dir)
134+
endif ()
135+
endif ()
136+
else ()
137+
foreach(_qlten_recorded_include_dir IN LISTS _qlten_recorded_blas_include_dirs)
138+
if (EXISTS "${_qlten_recorded_include_dir}/cblas.h")
139+
set(_qlten_cblas_include_dir "${_qlten_recorded_include_dir}")
140+
break ()
141+
endif ()
142+
endforeach ()
143+
if (NOT _qlten_cblas_include_dir)
144+
find_path(_qlten_cblas_include_dir
145+
NAMES cblas.h
146+
HINTS ${_qlten_search_roots}
147+
PATH_SUFFIXES include include/openblas)
148+
endif ()
149+
endif ()
150+
151+
set(_qlten_lapacke_include_dir "")
152+
if (_qlten_recorded_lapacke_include_dir
153+
AND EXISTS "${_qlten_recorded_lapacke_include_dir}/lapacke.h")
154+
set(_qlten_lapacke_include_dir "${_qlten_recorded_lapacke_include_dir}")
155+
else ()
156+
find_path(_qlten_lapacke_include_dir
157+
NAMES lapacke.h
158+
HINTS ${_qlten_search_roots}
159+
PATH_SUFFIXES include include/openblas)
160+
endif ()
64161
65162
if (NOT _qlten_cblas_include_dir OR NOT _qlten_lapacke_include_dir)
66163
message(FATAL_ERROR
@@ -71,12 +168,17 @@ function(_qlten_collect_cpu_backend_details _vendor _include_out _lapacke_out)
71168
"${_qlten_cblas_include_dir}"
72169
"${_qlten_lapacke_include_dir}")
73170
74-
unset(_qlten_lapacke_library CACHE)
75-
unset(_qlten_lapacke_library)
76-
find_library(_qlten_lapacke_library
77-
NAMES lapacke
78-
HINTS ${_qlten_search_roots}
79-
PATH_SUFFIXES lib lib64 lib/x86_64-linux-gnu)
171+
set(_qlten_lapacke_library "")
172+
if (_qlten_recorded_lapacke_library AND EXISTS "${_qlten_recorded_lapacke_library}")
173+
set(_qlten_lapacke_library "${_qlten_recorded_lapacke_library}")
174+
else ()
175+
unset(_qlten_lapacke_library CACHE)
176+
unset(_qlten_lapacke_library)
177+
find_library(_qlten_lapacke_library
178+
NAMES lapacke
179+
HINTS ${_qlten_search_roots}
180+
PATH_SUFFIXES lib lib64 lib/x86_64-linux-gnu)
181+
endif ()
80182
if (_vendor STREQUAL "OpenBLAS" AND NOT _qlten_lapacke_library)
81183
message(FATAL_ERROR
82184
"TensorToolkit requires a LAPACKE library for the installed OpenBLAS variant.")
@@ -184,6 +286,8 @@ find_dependency(MPI REQUIRED)
184286
185287
set(_qlten_package_bla_vendor "@QLTEN_HP_NUMERIC_BLA_VENDOR@")
186288
if (_qlten_package_bla_vendor)
289+
set(_qlten_recorded_blas_libraries "@BLAS_LIBRARIES@")
290+
set(_qlten_recorded_lapack_libraries "@LAPACK_LIBRARIES@")
187291
set(_qlten_had_bla_vendor FALSE)
188292
set(_qlten_saved_bla_vendor "")
189293
if (DEFINED BLA_VENDOR)
@@ -202,8 +306,18 @@ if (_qlten_package_bla_vendor)
202306
set(BLA_VENDOR "${_qlten_package_bla_vendor}")
203307
endif ()
204308
205-
find_dependency(BLAS REQUIRED)
206-
find_dependency(LAPACK REQUIRED)
309+
_qlten_list_entries_exist(_qlten_recorded_blas_exist ${_qlten_recorded_blas_libraries})
310+
_qlten_list_entries_exist(_qlten_recorded_lapack_exist ${_qlten_recorded_lapack_libraries})
311+
312+
# Reuse the producer-resolved libraries when they remain valid so external
313+
# consumers do not depend on host-specific FindBLAS/FindLAPACK rediscovery.
314+
if (_qlten_recorded_blas_exist AND _qlten_recorded_lapack_exist)
315+
set(BLAS_LIBRARIES "${_qlten_recorded_blas_libraries}")
316+
set(LAPACK_LIBRARIES "${_qlten_recorded_lapack_libraries}")
317+
else ()
318+
find_dependency(BLAS REQUIRED)
319+
find_dependency(LAPACK REQUIRED)
320+
endif ()
207321
208322
_qlten_reset_var(BLA_VENDOR _qlten_had_bla_vendor "${_qlten_saved_bla_vendor}")
209323

tests/package_consumer/verify_install_cpu.cmake

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ set(_qlten_verify_root "/tmp/qlten-verify-cpu-${_qlten_verify_suffix}")
1616
set(package_build_dir "${_qlten_verify_root}/package-build")
1717
set(package_prefix "${_qlten_verify_root}/prefix")
1818
set(consumer_build_dir "${_qlten_verify_root}/consumer-build")
19+
get_filename_component(_qlten_source_root "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
1920

2021
message(STATUS "TensorToolkit CPU package verification root: ${_qlten_verify_root}")
2122

@@ -89,6 +90,16 @@ if (NOT install_result EQUAL 0)
8990
message(FATAL_ERROR "TensorToolkit CPU package install failed: ${install_result}")
9091
endif ()
9192

93+
set(_qlten_installed_targets_file
94+
"${package_prefix}/lib/cmake/TensorToolkit/TensorToolkitTargets.cmake")
95+
file(READ "${_qlten_installed_targets_file}" _qlten_installed_targets)
96+
string(FIND "${_qlten_installed_targets}" "${_qlten_source_root}" _qlten_source_root_pos)
97+
if (NOT _qlten_source_root_pos EQUAL -1)
98+
message(FATAL_ERROR
99+
"TensorToolkit CPU package export leaked the source tree into "
100+
"${_qlten_installed_targets_file}.")
101+
endif ()
102+
92103
set(_qlten_consumer_configure_args
93104
-S "${CMAKE_CURRENT_LIST_DIR}"
94105
-B "${consumer_build_dir}"

0 commit comments

Comments
 (0)