Skip to content

Commit 94a49a6

Browse files
committed
modularize BLAS and LAPACK
1 parent 21c65ab commit 94a49a6

File tree

3 files changed

+193
-91
lines changed

3 files changed

+193
-91
lines changed

src/CMakeLists.txt

Lines changed: 193 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,197 @@
11
#### Pre-process: .fpp -> .f90 via Fypp
22

33
# Create a list of the files to be preprocessed
4+
set(blas_fppFiles
5+
stdlib_kinds.fypp
6+
blas/stdlib_blas_constants.fypp
7+
blas/stdlib_blas.fypp
8+
blas/stdlib_blas_level1.fypp
9+
blas/stdlib_blas_level2_ban.fypp
10+
blas/stdlib_blas_level2_gen.fypp
11+
blas/stdlib_blas_level2_pac.fypp
12+
blas/stdlib_blas_level2_sym.fypp
13+
blas/stdlib_blas_level2_tri.fypp
14+
blas/stdlib_blas_level3_gen.fypp
15+
blas/stdlib_blas_level3_sym.fypp
16+
blas/stdlib_blas_level3_tri.fypp
17+
blas/stdlib_linalg_blas_aux.fypp
18+
)
19+
set(blas_cppFiles stdlib_linalg_constants.fypp stdlib_linalg_blas.fypp)
20+
21+
fypp_f90("${fyppFlags}" "${blas_fppFiles}" blas_outFiles)
22+
fypp_f90pp("${fyppFlags}" "${blas_cppFiles}" blas_outPreprocFiles)
23+
24+
add_library(stdlib_blas ${blas_outFiles} ${blas_outPreprocFiles})
25+
26+
if(BLAS_FOUND)
27+
target_link_libraries(stdlib_blas PUBLIC "BLAS::BLAS")
28+
endif()
29+
30+
set_target_properties(
31+
stdlib_blas
32+
PROPERTIES POSITION_INDEPENDENT_CODE ON WINDOWS_EXPORT_ALL_SYMBOLS ON
33+
)
34+
35+
if(
36+
CMAKE_Fortran_COMPILER_ID STREQUAL GNU
37+
AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0
38+
)
39+
target_compile_options(
40+
stdlib_blas
41+
PRIVATE $<$<COMPILE_LANGUAGE:Fortran>:-fno-range-check>
42+
)
43+
endif()
44+
45+
set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod_files/blas/)
46+
# We need the module directory before we finish the configure stage since the
47+
# build interface might resolve before the module directory is generated by CMake
48+
if(NOT EXISTS "${LIB_MOD_DIR}")
49+
file(MAKE_DIRECTORY "${LIB_MOD_DIR}")
50+
endif()
51+
52+
set_target_properties(
53+
stdlib_blas
54+
PROPERTIES Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR}
55+
)
56+
target_include_directories(
57+
stdlib_blas
58+
PUBLIC
59+
$<BUILD_INTERFACE:${LIB_MOD_DIR}>
60+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_MODULEDIR}>
61+
)
62+
63+
install(
64+
TARGETS stdlib_blas
65+
EXPORT ${PROJECT_NAME}-targets
66+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
67+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
68+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
69+
)
70+
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION "${CMAKE_INSTALL_MODULEDIR}/blas")
71+
72+
set(lapack_fppFiles
73+
stdlib_kinds.fypp
74+
stdlib_linalg_state.fypp
75+
stdlib_error.fypp
76+
stdlib_optval.fypp
77+
stdlib_io.fypp
78+
stdlib_ascii.fypp
79+
stdlib_string_type.fypp
80+
lapack/stdlib_lapack_base.fypp
81+
lapack/stdlib_lapack_solve.fypp
82+
lapack/stdlib_lapack_others.fypp
83+
lapack/stdlib_lapack_orthogonal_factors.fypp
84+
lapack/stdlib_lapack_eig_svd_lsq.fypp
85+
lapack/stdlib_linalg_lapack_aux.fypp
86+
lapack/stdlib_lapack_auxiliary.fypp
87+
lapack/stdlib_lapack_blas_like_base.fypp
88+
lapack/stdlib_lapack_blas_like_l1.fypp
89+
lapack/stdlib_lapack_blas_like_l2.fypp
90+
lapack/stdlib_lapack_blas_like_l3.fypp
91+
lapack/stdlib_lapack_blas_like_mnorm.fypp
92+
lapack/stdlib_lapack_blas_like_scalar.fypp
93+
lapack/stdlib_lapack_cosine_sine.fypp
94+
lapack/stdlib_lapack_cosine_sine2.fypp
95+
lapack/stdlib_lapack_eigv_comp.fypp
96+
lapack/stdlib_lapack_eigv_comp2.fypp
97+
lapack/stdlib_lapack_eigv_gen.fypp
98+
lapack/stdlib_lapack_eigv_gen2.fypp
99+
lapack/stdlib_lapack_eigv_gen3.fypp
100+
lapack/stdlib_lapack_eigv_std_driver.fypp
101+
lapack/stdlib_lapack_eigv_svd_bidiag_dc.fypp
102+
lapack/stdlib_lapack_eigv_svd_drivers.fypp
103+
lapack/stdlib_lapack_eigv_svd_drivers2.fypp
104+
lapack/stdlib_lapack_eigv_svd_drivers3.fypp
105+
lapack/stdlib_lapack_eigv_sym_comp.fypp
106+
lapack/stdlib_lapack_eigv_sym.fypp
107+
lapack/stdlib_lapack_eigv_tridiag.fypp
108+
lapack/stdlib_lapack_eigv_tridiag2.fypp
109+
lapack/stdlib_lapack_eigv_tridiag3.fypp
110+
lapack/stdlib_lapack_givens_jacobi_rot.fypp
111+
lapack/stdlib_lapack_householder_reflectors.fypp
112+
lapack/stdlib_lapack_lsq.fypp
113+
lapack/stdlib_lapack_lsq_aux.fypp
114+
lapack/stdlib_lapack_lsq_constrained.fypp
115+
lapack/stdlib_lapack_orthogonal_factors_ql.fypp
116+
lapack/stdlib_lapack_orthogonal_factors_qr.fypp
117+
lapack/stdlib_lapack_orthogonal_factors_rz.fypp
118+
lapack/stdlib_lapack_others_sm.fypp
119+
lapack/stdlib_lapack_solve_aux.fypp
120+
lapack/stdlib_lapack_solve_chol_comp.fypp
121+
lapack/stdlib_lapack_solve_chol.fypp
122+
lapack/stdlib_lapack_solve_ldl_comp.fypp
123+
lapack/stdlib_lapack_solve_ldl_comp2.fypp
124+
lapack/stdlib_lapack_solve_ldl_comp3.fypp
125+
lapack/stdlib_lapack_solve_ldl_comp4.fypp
126+
lapack/stdlib_lapack_solve_ldl.fypp
127+
lapack/stdlib_lapack_solve_lu_comp.fypp
128+
lapack/stdlib_lapack_solve_lu.fypp
129+
lapack/stdlib_lapack_solve_tri_comp.fypp
130+
lapack/stdlib_lapack_svd_bidiag_qr.fypp
131+
lapack/stdlib_lapack_svd_comp.fypp
132+
lapack/stdlib_lapack_svd_comp2.fypp
133+
)
134+
set(lapack_cppFiles stdlib_linalg_constants.fypp stdlib_linalg_lapack.fypp)
135+
136+
fypp_f90("${fyppFlags}" "${lapack_fppFiles}" lapack_outFiles)
137+
fypp_f90pp("${fyppFlags}" "${lapack_cppFiles}" lapack_outPreprocFiles)
138+
139+
add_library(stdlib_lapack ${lapack_outFiles} ${lapack_outPreprocFiles})
140+
141+
if(LAPACK_FOUND)
142+
target_link_libraries(stdlib_lapack PUBLIC "LAPACK::LAPACK")
143+
endif()
144+
target_link_libraries(stdlib_lapack PUBLIC stdlib_blas)
145+
146+
set_target_properties(
147+
stdlib_lapack
148+
PROPERTIES POSITION_INDEPENDENT_CODE ON WINDOWS_EXPORT_ALL_SYMBOLS ON
149+
)
150+
151+
if(
152+
CMAKE_Fortran_COMPILER_ID STREQUAL GNU
153+
AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0
154+
)
155+
target_compile_options(
156+
stdlib_lapack
157+
PRIVATE $<$<COMPILE_LANGUAGE:Fortran>:-fno-range-check>
158+
)
159+
endif()
160+
161+
set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod_files/lapack/)
162+
# We need the module directory before we finish the configure stage since the
163+
# build interface might resolve before the module directory is generated by CMake
164+
if(NOT EXISTS "${LIB_MOD_DIR}")
165+
file(MAKE_DIRECTORY "${LIB_MOD_DIR}")
166+
endif()
167+
168+
set_target_properties(
169+
stdlib_lapack
170+
PROPERTIES Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR}
171+
)
172+
173+
if(f18errorstop)
174+
target_sources(stdlib_lapack PRIVATE f18estop.f90)
175+
else()
176+
target_sources(stdlib_lapack PRIVATE f08estop.f90)
177+
endif()
178+
179+
target_include_directories(
180+
stdlib_lapack
181+
PUBLIC
182+
$<BUILD_INTERFACE:${LIB_MOD_DIR}>
183+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_MODULEDIR}>
184+
)
185+
186+
install(
187+
TARGETS stdlib_lapack
188+
EXPORT ${PROJECT_NAME}-targets
189+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
190+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
191+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
192+
)
193+
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION "${CMAKE_INSTALL_MODULEDIR}")
194+
4195
set(fppFiles
5196
stdlib_ascii.fypp
6197
stdlib_bitsets.fypp
@@ -91,14 +282,7 @@ set(fppFiles
91282
)
92283

93284
# Preprocessed files to contain preprocessor directives -> .F90
94-
set(cppFiles
95-
stdlib_linalg_constants.fypp
96-
stdlib_linalg_blas.fypp
97-
stdlib_linalg_lapack.fypp
98-
)
99-
100-
add_subdirectory(blas)
101-
add_subdirectory(lapack)
285+
set(cppFiles stdlib_linalg_constants.fypp)
102286

103287
fypp_f90("${fyppFlags}" "${fppFiles}" outFiles)
104288
fypp_f90pp("${fyppFlags}" "${cppFiles}" outPreprocFiles)
@@ -130,11 +314,7 @@ set(SRC
130314

131315
add_library(${PROJECT_NAME} ${SRC})
132316

133-
# Link to BLAS and LAPACK
134-
if(BLAS_FOUND AND LAPACK_FOUND)
135-
target_link_libraries(${PROJECT_NAME} "BLAS::BLAS")
136-
target_link_libraries(${PROJECT_NAME} "LAPACK::LAPACK")
137-
endif()
317+
target_link_libraries(${PROJECT_NAME} PUBLIC stdlib_blas stdlib_lapack)
138318

139319
set_target_properties(
140320
${PROJECT_NAME}

src/blas/CMakeLists.txt

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/lapack/CMakeLists.txt

Lines changed: 0 additions & 58 deletions
This file was deleted.

0 commit comments

Comments
 (0)