|
1 | 1 | #### Pre-process: .fpp -> .f90 via Fypp
|
2 | 2 |
|
3 | 3 | # 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 | + |
4 | 195 | set(fppFiles
|
5 | 196 | stdlib_ascii.fypp
|
6 | 197 | stdlib_bitsets.fypp
|
@@ -91,14 +282,7 @@ set(fppFiles
|
91 | 282 | )
|
92 | 283 |
|
93 | 284 | # 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) |
102 | 286 |
|
103 | 287 | fypp_f90("${fyppFlags}" "${fppFiles}" outFiles)
|
104 | 288 | fypp_f90pp("${fyppFlags}" "${cppFiles}" outPreprocFiles)
|
@@ -130,11 +314,7 @@ set(SRC
|
130 | 314 |
|
131 | 315 | add_library(${PROJECT_NAME} ${SRC})
|
132 | 316 |
|
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) |
138 | 318 |
|
139 | 319 | set_target_properties(
|
140 | 320 | ${PROJECT_NAME}
|
|
0 commit comments