Skip to content

Commit 4263c83

Browse files
committed
restore separate BLAS/LAPACK CMakeLists
1 parent 3a782fb commit 4263c83

File tree

4 files changed

+168
-154
lines changed

4 files changed

+168
-154
lines changed

cmake/stdlib.cmake

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ function(preprocess preproc preprocopts srcext trgext srcfiles trgfiles)
1212

1313
set(_trgfiles)
1414
foreach(srcfile IN LISTS srcfiles)
15-
string(REGEX REPLACE "\\.${srcext}$" ".${trgext}" trgfile ${srcfile})
15+
get_filename_component(filename ${srcfile} NAME)
16+
string(REGEX REPLACE "\\.${srcext}$" ".${trgext}" trgfile ${filename})
1617
add_custom_command(
1718
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${trgfile}
1819
COMMAND ${preproc} ${preprocopts} ${CMAKE_CURRENT_SOURCE_DIR}/${srcfile} ${CMAKE_CURRENT_BINARY_DIR}/${trgfile}
@@ -47,3 +48,65 @@ function (fypp_f90pp fyppopts fyppfiles F90files)
4748
set(${F90files} ${_F90files} PARENT_SCOPE)
4849
endfunction()
4950

51+
# Helper function to configure stdlib targets
52+
#
53+
# It preprocesses the given fypp and fypp+cpp files, combines them with the
54+
# regular Fortran files, and creates a library target with the given name.
55+
# Args:
56+
# target_name [in]: Name of the library target to create
57+
# regular_sources_var [in]: Regular Fortran sources
58+
# fypp_files_var [in]: Sources to be preprocessed with fypp
59+
# cpp_files_var [in]: Sources to be preprocessed with fypp and cpp
60+
#
61+
function(configure_stdlib_target target_name regular_sources_var fypp_files_var cpp_files_var)
62+
#### Pre-process: .fpp -> .f90 via Fypp
63+
fypp_f90("${fyppFlags}" "${${fypp_files_var}}" ${target_name}_fypp_outFiles)
64+
#### Pre-process: .fypp -> .F90 via Fypp (for C preprocessor directives)
65+
fypp_f90pp("${fyppFlags}" "${${cpp_files_var}}" ${target_name}_cpp_outFiles)
66+
67+
list(APPEND all_sources ${${target_name}_fypp_outFiles})
68+
list(APPEND all_sources ${${target_name}_cpp_outFiles})
69+
list(APPEND all_sources ${${regular_sources_var}})
70+
71+
add_library(${target_name} ${all_sources})
72+
add_library(${PROJECT_NAME}::${target_name} ALIAS ${target_name})
73+
74+
set_target_properties(
75+
${target_name}
76+
PROPERTIES
77+
POSITION_INDEPENDENT_CODE ON
78+
WINDOWS_EXPORT_ALL_SYMBOLS ON
79+
)
80+
81+
if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0)
82+
target_compile_options(
83+
${target_name}
84+
PRIVATE
85+
$<$<COMPILE_LANGUAGE:Fortran>:-fno-range-check>
86+
)
87+
endif()
88+
89+
set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod_files/${target_name}/)
90+
set(INSTALL_MOD_DIR "${CMAKE_INSTALL_MODULEDIR}/${target_name}")
91+
# We need the module directory before we finish the configure stage since the
92+
# build interface might resolve before the module directory is generated by CMake
93+
if(NOT EXISTS "${LIB_MOD_DIR}")
94+
file(MAKE_DIRECTORY "${LIB_MOD_DIR}")
95+
endif()
96+
97+
set_target_properties(${target_name} PROPERTIES
98+
Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR}
99+
)
100+
target_include_directories(${target_name} PUBLIC
101+
$<BUILD_INTERFACE:${LIB_MOD_DIR}>
102+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_MODULEDIR}>
103+
)
104+
105+
install(TARGETS ${target_name}
106+
EXPORT ${PROJECT_NAME}-targets
107+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
108+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
109+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
110+
)
111+
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION "${INSTALL_MOD_DIR}")
112+
endfunction()

src/CMakeLists.txt

Lines changed: 2 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,156 +1,5 @@
1-
# Helper function to configure stdlib targets
2-
function(configure_stdlib_target target_name regular_sources_var fypp_files_var cpp_files_var)
3-
#### Pre-process: .fpp -> .f90 via Fypp
4-
fypp_f90("${fyppFlags}" "${${fypp_files_var}}" ${target_name}_fypp_outFiles)
5-
#### Pre-process: .fypp -> .F90 via Fypp (for C preprocessor directives)
6-
fypp_f90pp("${fyppFlags}" "${${cpp_files_var}}" ${target_name}_cpp_outFiles)
7-
8-
list(APPEND all_sources ${${target_name}_fypp_outFiles})
9-
list(APPEND all_sources ${${target_name}_cpp_outFiles})
10-
list(APPEND all_sources ${${regular_sources_var}})
11-
12-
add_library(${target_name} ${all_sources})
13-
add_library(${PROJECT_NAME}::${target_name} ALIAS ${target_name})
14-
15-
set_target_properties(
16-
${target_name}
17-
PROPERTIES
18-
POSITION_INDEPENDENT_CODE ON
19-
WINDOWS_EXPORT_ALL_SYMBOLS ON
20-
)
21-
22-
if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0)
23-
target_compile_options(
24-
${target_name}
25-
PRIVATE
26-
$<$<COMPILE_LANGUAGE:Fortran>:-fno-range-check>
27-
)
28-
endif()
29-
30-
set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod_files/${target_name}/)
31-
set(INSTALL_MOD_DIR "${CMAKE_INSTALL_MODULEDIR}/${target_name}")
32-
# We need the module directory before we finish the configure stage since the
33-
# build interface might resolve before the module directory is generated by CMake
34-
if(NOT EXISTS "${LIB_MOD_DIR}")
35-
file(MAKE_DIRECTORY "${LIB_MOD_DIR}")
36-
endif()
37-
38-
set_target_properties(${target_name} PROPERTIES
39-
Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR}
40-
)
41-
target_include_directories(${target_name} PUBLIC
42-
$<BUILD_INTERFACE:${LIB_MOD_DIR}>
43-
$<INSTALL_INTERFACE:${CMAKE_INSTALL_MODULEDIR}>
44-
)
45-
46-
install(TARGETS ${target_name}
47-
EXPORT ${PROJECT_NAME}-targets
48-
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
49-
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
50-
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
51-
)
52-
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION "${INSTALL_MOD_DIR}")
53-
endfunction()
54-
55-
set(blas_fppFiles
56-
stdlib_kinds.fypp
57-
blas/stdlib_blas_constants.fypp
58-
blas/stdlib_blas.fypp
59-
blas/stdlib_blas_level1.fypp
60-
blas/stdlib_blas_level2_ban.fypp
61-
blas/stdlib_blas_level2_gen.fypp
62-
blas/stdlib_blas_level2_pac.fypp
63-
blas/stdlib_blas_level2_sym.fypp
64-
blas/stdlib_blas_level2_tri.fypp
65-
blas/stdlib_blas_level3_gen.fypp
66-
blas/stdlib_blas_level3_sym.fypp
67-
blas/stdlib_blas_level3_tri.fypp
68-
blas/stdlib_linalg_blas_aux.fypp
69-
)
70-
set(blas_cppFiles stdlib_linalg_constants.fypp stdlib_linalg_blas.fypp)
71-
72-
configure_stdlib_target(blas "" blas_fppFiles blas_cppFiles)
73-
74-
if(BLAS_FOUND)
75-
target_link_libraries(blas PUBLIC "BLAS::BLAS")
76-
endif()
77-
78-
set(lapack_fppFiles
79-
stdlib_kinds.fypp
80-
stdlib_linalg_state.fypp
81-
stdlib_error.fypp
82-
stdlib_optval.fypp
83-
stdlib_io.fypp
84-
stdlib_ascii.fypp
85-
stdlib_string_type.fypp
86-
lapack/stdlib_lapack_base.fypp
87-
lapack/stdlib_lapack_solve.fypp
88-
lapack/stdlib_lapack_others.fypp
89-
lapack/stdlib_lapack_orthogonal_factors.fypp
90-
lapack/stdlib_lapack_eig_svd_lsq.fypp
91-
lapack/stdlib_linalg_lapack_aux.fypp
92-
lapack/stdlib_lapack_auxiliary.fypp
93-
lapack/stdlib_lapack_blas_like_base.fypp
94-
lapack/stdlib_lapack_blas_like_l1.fypp
95-
lapack/stdlib_lapack_blas_like_l2.fypp
96-
lapack/stdlib_lapack_blas_like_l3.fypp
97-
lapack/stdlib_lapack_blas_like_mnorm.fypp
98-
lapack/stdlib_lapack_blas_like_scalar.fypp
99-
lapack/stdlib_lapack_cosine_sine.fypp
100-
lapack/stdlib_lapack_cosine_sine2.fypp
101-
lapack/stdlib_lapack_eigv_comp.fypp
102-
lapack/stdlib_lapack_eigv_comp2.fypp
103-
lapack/stdlib_lapack_eigv_gen.fypp
104-
lapack/stdlib_lapack_eigv_gen2.fypp
105-
lapack/stdlib_lapack_eigv_gen3.fypp
106-
lapack/stdlib_lapack_eigv_std_driver.fypp
107-
lapack/stdlib_lapack_eigv_svd_bidiag_dc.fypp
108-
lapack/stdlib_lapack_eigv_svd_drivers.fypp
109-
lapack/stdlib_lapack_eigv_svd_drivers2.fypp
110-
lapack/stdlib_lapack_eigv_svd_drivers3.fypp
111-
lapack/stdlib_lapack_eigv_sym_comp.fypp
112-
lapack/stdlib_lapack_eigv_sym.fypp
113-
lapack/stdlib_lapack_eigv_tridiag.fypp
114-
lapack/stdlib_lapack_eigv_tridiag2.fypp
115-
lapack/stdlib_lapack_eigv_tridiag3.fypp
116-
lapack/stdlib_lapack_givens_jacobi_rot.fypp
117-
lapack/stdlib_lapack_householder_reflectors.fypp
118-
lapack/stdlib_lapack_lsq.fypp
119-
lapack/stdlib_lapack_lsq_aux.fypp
120-
lapack/stdlib_lapack_lsq_constrained.fypp
121-
lapack/stdlib_lapack_orthogonal_factors_ql.fypp
122-
lapack/stdlib_lapack_orthogonal_factors_qr.fypp
123-
lapack/stdlib_lapack_orthogonal_factors_rz.fypp
124-
lapack/stdlib_lapack_others_sm.fypp
125-
lapack/stdlib_lapack_solve_aux.fypp
126-
lapack/stdlib_lapack_solve_chol_comp.fypp
127-
lapack/stdlib_lapack_solve_chol.fypp
128-
lapack/stdlib_lapack_solve_ldl_comp.fypp
129-
lapack/stdlib_lapack_solve_ldl_comp2.fypp
130-
lapack/stdlib_lapack_solve_ldl_comp3.fypp
131-
lapack/stdlib_lapack_solve_ldl_comp4.fypp
132-
lapack/stdlib_lapack_solve_ldl.fypp
133-
lapack/stdlib_lapack_solve_lu_comp.fypp
134-
lapack/stdlib_lapack_solve_lu.fypp
135-
lapack/stdlib_lapack_solve_tri_comp.fypp
136-
lapack/stdlib_lapack_svd_bidiag_qr.fypp
137-
lapack/stdlib_lapack_svd_comp.fypp
138-
lapack/stdlib_lapack_svd_comp2.fypp
139-
)
140-
set(lapack_cppFiles
141-
stdlib_linalg_constants.fypp
142-
stdlib_linalg_lapack.fypp
143-
)
144-
set(lapack_f90Files
145-
$<IF:$<BOOL:${f18errorstop}>,f18estop.f90,f08estop.f90>
146-
)
147-
148-
configure_stdlib_target(lapack lapack_f90Files lapack_fppFiles lapack_cppFiles)
149-
150-
if(LAPACK_FOUND)
151-
target_link_libraries(lapack PUBLIC "LAPACK::LAPACK")
152-
endif()
153-
target_link_libraries(lapack PUBLIC blas)
1+
add_subdirectory(blas)
2+
add_subdirectory(lapack)
1543

1554
set(fppFiles
1565
stdlib_ascii.fypp

src/blas/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
set(blas_fppFiles
2+
../stdlib_kinds.fypp
3+
stdlib_blas_constants.fypp
4+
stdlib_blas.fypp
5+
stdlib_blas_level1.fypp
6+
stdlib_blas_level2_ban.fypp
7+
stdlib_blas_level2_gen.fypp
8+
stdlib_blas_level2_pac.fypp
9+
stdlib_blas_level2_sym.fypp
10+
stdlib_blas_level2_tri.fypp
11+
stdlib_blas_level3_gen.fypp
12+
stdlib_blas_level3_sym.fypp
13+
stdlib_blas_level3_tri.fypp
14+
stdlib_linalg_blas_aux.fypp
15+
)
16+
set(blas_cppFiles
17+
../stdlib_linalg_constants.fypp
18+
../stdlib_linalg_blas.fypp
19+
)
20+
21+
configure_stdlib_target(blas "" blas_fppFiles blas_cppFiles)
22+
23+
if(BLAS_FOUND)
24+
target_link_libraries(blas PUBLIC "BLAS::BLAS")
25+
endif()

src/lapack/CMakeLists.txt

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
2+
set(lapack_fppFiles
3+
../stdlib_kinds.fypp
4+
../stdlib_linalg_state.fypp
5+
../stdlib_error.fypp
6+
../stdlib_optval.fypp
7+
../stdlib_io.fypp
8+
../stdlib_ascii.fypp
9+
../stdlib_string_type.fypp
10+
stdlib_lapack_base.fypp
11+
stdlib_lapack_solve.fypp
12+
stdlib_lapack_others.fypp
13+
stdlib_lapack_orthogonal_factors.fypp
14+
stdlib_lapack_eig_svd_lsq.fypp
15+
stdlib_linalg_lapack_aux.fypp
16+
stdlib_lapack_auxiliary.fypp
17+
stdlib_lapack_blas_like_base.fypp
18+
stdlib_lapack_blas_like_l1.fypp
19+
stdlib_lapack_blas_like_l2.fypp
20+
stdlib_lapack_blas_like_l3.fypp
21+
stdlib_lapack_blas_like_mnorm.fypp
22+
stdlib_lapack_blas_like_scalar.fypp
23+
stdlib_lapack_cosine_sine.fypp
24+
stdlib_lapack_cosine_sine2.fypp
25+
stdlib_lapack_eigv_comp.fypp
26+
stdlib_lapack_eigv_comp2.fypp
27+
stdlib_lapack_eigv_gen.fypp
28+
stdlib_lapack_eigv_gen2.fypp
29+
stdlib_lapack_eigv_gen3.fypp
30+
stdlib_lapack_eigv_std_driver.fypp
31+
stdlib_lapack_eigv_svd_bidiag_dc.fypp
32+
stdlib_lapack_eigv_svd_drivers.fypp
33+
stdlib_lapack_eigv_svd_drivers2.fypp
34+
stdlib_lapack_eigv_svd_drivers3.fypp
35+
stdlib_lapack_eigv_sym_comp.fypp
36+
stdlib_lapack_eigv_sym.fypp
37+
stdlib_lapack_eigv_tridiag.fypp
38+
stdlib_lapack_eigv_tridiag2.fypp
39+
stdlib_lapack_eigv_tridiag3.fypp
40+
stdlib_lapack_givens_jacobi_rot.fypp
41+
stdlib_lapack_householder_reflectors.fypp
42+
stdlib_lapack_lsq.fypp
43+
stdlib_lapack_lsq_aux.fypp
44+
stdlib_lapack_lsq_constrained.fypp
45+
stdlib_lapack_orthogonal_factors_ql.fypp
46+
stdlib_lapack_orthogonal_factors_qr.fypp
47+
stdlib_lapack_orthogonal_factors_rz.fypp
48+
stdlib_lapack_others_sm.fypp
49+
stdlib_lapack_solve_aux.fypp
50+
stdlib_lapack_solve_chol_comp.fypp
51+
stdlib_lapack_solve_chol.fypp
52+
stdlib_lapack_solve_ldl_comp.fypp
53+
stdlib_lapack_solve_ldl_comp2.fypp
54+
stdlib_lapack_solve_ldl_comp3.fypp
55+
stdlib_lapack_solve_ldl_comp4.fypp
56+
stdlib_lapack_solve_ldl.fypp
57+
stdlib_lapack_solve_lu_comp.fypp
58+
stdlib_lapack_solve_lu.fypp
59+
stdlib_lapack_solve_tri_comp.fypp
60+
stdlib_lapack_svd_bidiag_qr.fypp
61+
stdlib_lapack_svd_comp.fypp
62+
stdlib_lapack_svd_comp2.fypp
63+
)
64+
set(lapack_cppFiles
65+
../stdlib_linalg_constants.fypp
66+
../stdlib_linalg_lapack.fypp
67+
)
68+
set(lapack_f90Files
69+
$<IF:$<BOOL:${f18errorstop}>,../f18estop.f90,../f08estop.f90>
70+
)
71+
72+
configure_stdlib_target(lapack lapack_f90Files lapack_fppFiles lapack_cppFiles)
73+
74+
if(LAPACK_FOUND)
75+
target_link_libraries(lapack PUBLIC "LAPACK::LAPACK")
76+
endif()
77+
target_link_libraries(lapack PUBLIC blas)

0 commit comments

Comments
 (0)