Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
226 changes: 158 additions & 68 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,157 @@
#### Pre-process: .fpp -> .f90 via Fypp
# Helper function to configure stdlib targets
function(configure_stdlib_target target_name regular_sources_var fypp_files_var cpp_files_var)
#### Pre-process: .fpp -> .f90 via Fypp
fypp_f90("${fyppFlags}" "${${fypp_files_var}}" ${target_name}_fypp_outFiles)
#### Pre-process: .fypp -> .F90 via Fypp (for C preprocessor directives)
fypp_f90pp("${fyppFlags}" "${${cpp_files_var}}" ${target_name}_cpp_outFiles)

list(APPEND all_sources ${${target_name}_fypp_outFiles})
list(APPEND all_sources ${${target_name}_cpp_outFiles})
list(APPEND all_sources ${${regular_sources_var}})

add_library(${target_name} ${all_sources})
add_library(${PROJECT_NAME}::${target_name} ALIAS ${target_name})

set_target_properties(
${target_name}
PROPERTIES
POSITION_INDEPENDENT_CODE ON
WINDOWS_EXPORT_ALL_SYMBOLS ON
)

if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0)
target_compile_options(
${target_name}
PRIVATE
$<$<COMPILE_LANGUAGE:Fortran>:-fno-range-check>
)
endif()

set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod_files/${target_name}/)
set(INSTALL_MOD_DIR "${CMAKE_INSTALL_MODULEDIR}/${target_name}")
# We need the module directory before we finish the configure stage since the
# build interface might resolve before the module directory is generated by CMake
if(NOT EXISTS "${LIB_MOD_DIR}")
file(MAKE_DIRECTORY "${LIB_MOD_DIR}")
endif()

set_target_properties(${target_name} PROPERTIES
Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR}
)
target_include_directories(${target_name} PUBLIC
$<BUILD_INTERFACE:${LIB_MOD_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_MODULEDIR}>
)

install(TARGETS ${target_name}
EXPORT ${PROJECT_NAME}-targets
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION "${INSTALL_MOD_DIR}")
endfunction()

set(blas_fppFiles
stdlib_kinds.fypp
blas/stdlib_blas_constants.fypp
blas/stdlib_blas.fypp
blas/stdlib_blas_level1.fypp
blas/stdlib_blas_level2_ban.fypp
blas/stdlib_blas_level2_gen.fypp
blas/stdlib_blas_level2_pac.fypp
blas/stdlib_blas_level2_sym.fypp
blas/stdlib_blas_level2_tri.fypp
blas/stdlib_blas_level3_gen.fypp
blas/stdlib_blas_level3_sym.fypp
blas/stdlib_blas_level3_tri.fypp
blas/stdlib_linalg_blas_aux.fypp
)
set(blas_cppFiles stdlib_linalg_constants.fypp stdlib_linalg_blas.fypp)

configure_stdlib_target(blas "" blas_fppFiles blas_cppFiles)

if(BLAS_FOUND)
target_link_libraries(blas PUBLIC "BLAS::BLAS")
endif()

set(lapack_fppFiles
stdlib_kinds.fypp
stdlib_linalg_state.fypp
stdlib_error.fypp
stdlib_optval.fypp
stdlib_io.fypp
stdlib_ascii.fypp
stdlib_string_type.fypp
lapack/stdlib_lapack_base.fypp
lapack/stdlib_lapack_solve.fypp
lapack/stdlib_lapack_others.fypp
lapack/stdlib_lapack_orthogonal_factors.fypp
lapack/stdlib_lapack_eig_svd_lsq.fypp
lapack/stdlib_linalg_lapack_aux.fypp
lapack/stdlib_lapack_auxiliary.fypp
lapack/stdlib_lapack_blas_like_base.fypp
lapack/stdlib_lapack_blas_like_l1.fypp
lapack/stdlib_lapack_blas_like_l2.fypp
lapack/stdlib_lapack_blas_like_l3.fypp
lapack/stdlib_lapack_blas_like_mnorm.fypp
lapack/stdlib_lapack_blas_like_scalar.fypp
lapack/stdlib_lapack_cosine_sine.fypp
lapack/stdlib_lapack_cosine_sine2.fypp
lapack/stdlib_lapack_eigv_comp.fypp
lapack/stdlib_lapack_eigv_comp2.fypp
lapack/stdlib_lapack_eigv_gen.fypp
lapack/stdlib_lapack_eigv_gen2.fypp
lapack/stdlib_lapack_eigv_gen3.fypp
lapack/stdlib_lapack_eigv_std_driver.fypp
lapack/stdlib_lapack_eigv_svd_bidiag_dc.fypp
lapack/stdlib_lapack_eigv_svd_drivers.fypp
lapack/stdlib_lapack_eigv_svd_drivers2.fypp
lapack/stdlib_lapack_eigv_svd_drivers3.fypp
lapack/stdlib_lapack_eigv_sym_comp.fypp
lapack/stdlib_lapack_eigv_sym.fypp
lapack/stdlib_lapack_eigv_tridiag.fypp
lapack/stdlib_lapack_eigv_tridiag2.fypp
lapack/stdlib_lapack_eigv_tridiag3.fypp
lapack/stdlib_lapack_givens_jacobi_rot.fypp
lapack/stdlib_lapack_householder_reflectors.fypp
lapack/stdlib_lapack_lsq.fypp
lapack/stdlib_lapack_lsq_aux.fypp
lapack/stdlib_lapack_lsq_constrained.fypp
lapack/stdlib_lapack_orthogonal_factors_ql.fypp
lapack/stdlib_lapack_orthogonal_factors_qr.fypp
lapack/stdlib_lapack_orthogonal_factors_rz.fypp
lapack/stdlib_lapack_others_sm.fypp
lapack/stdlib_lapack_solve_aux.fypp
lapack/stdlib_lapack_solve_chol_comp.fypp
lapack/stdlib_lapack_solve_chol.fypp
lapack/stdlib_lapack_solve_ldl_comp.fypp
lapack/stdlib_lapack_solve_ldl_comp2.fypp
lapack/stdlib_lapack_solve_ldl_comp3.fypp
lapack/stdlib_lapack_solve_ldl_comp4.fypp
lapack/stdlib_lapack_solve_ldl.fypp
lapack/stdlib_lapack_solve_lu_comp.fypp
lapack/stdlib_lapack_solve_lu.fypp
lapack/stdlib_lapack_solve_tri_comp.fypp
lapack/stdlib_lapack_svd_bidiag_qr.fypp
lapack/stdlib_lapack_svd_comp.fypp
lapack/stdlib_lapack_svd_comp2.fypp
)
set(lapack_cppFiles
stdlib_linalg_constants.fypp
stdlib_linalg_lapack.fypp
)
set(lapack_f90Files
$<IF:$<BOOL:${f18errorstop}>,f18estop.f90,f08estop.f90>
)

configure_stdlib_target(lapack lapack_f90Files lapack_fppFiles lapack_cppFiles)

if(LAPACK_FOUND)
target_link_libraries(lapack PUBLIC "LAPACK::LAPACK")
endif()
target_link_libraries(lapack PUBLIC blas)

# Create a list of the files to be preprocessed
set(fppFiles
stdlib_ascii.fypp
stdlib_bitsets.fypp
Expand Down Expand Up @@ -89,21 +240,8 @@ set(fppFiles
stdlib_strings.fypp
stdlib_version.fypp
)

# Preprocessed files to contain preprocessor directives -> .F90
set(cppFiles
stdlib_linalg_constants.fypp
stdlib_linalg_blas.fypp
stdlib_linalg_lapack.fypp
)

add_subdirectory(blas)
add_subdirectory(lapack)

fypp_f90("${fyppFlags}" "${fppFiles}" outFiles)
fypp_f90pp("${fyppFlags}" "${cppFiles}" outPreprocFiles)

set(SRC
set(cppFiles stdlib_linalg_constants.fypp)
set(f90Files
stdlib_ansi.f90
stdlib_ansi_operator.f90
stdlib_ansi_to_string.f90
Expand All @@ -124,57 +262,9 @@ set(SRC
stdlib_specialfunctions_legendre.f90
stdlib_quadrature_gauss.f90
stdlib_stringlist_type.f90
${outFiles}
${outPreprocFiles}
)

add_library(${PROJECT_NAME} ${SRC})

# Link to BLAS and LAPACK
if(BLAS_FOUND AND LAPACK_FOUND)
target_link_libraries(${PROJECT_NAME} "BLAS::BLAS")
target_link_libraries(${PROJECT_NAME} "LAPACK::LAPACK")
endif()

set_target_properties(
${PROJECT_NAME}
PROPERTIES
POSITION_INDEPENDENT_CODE ON
WINDOWS_EXPORT_ALL_SYMBOLS ON
)

if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0)
target_compile_options(
${PROJECT_NAME}
PRIVATE
$<$<COMPILE_LANGUAGE:Fortran>:-fno-range-check>
)
endif()

set(LIB_MOD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod_files/)
# We need the module directory before we finish the configure stage since the
# build interface might resolve before the module directory is generated by CMake
if(NOT EXISTS "${LIB_MOD_DIR}")
file(MAKE_DIRECTORY "${LIB_MOD_DIR}")
endif()

set_target_properties(${PROJECT_NAME} PROPERTIES
Fortran_MODULE_DIRECTORY ${LIB_MOD_DIR})
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${LIB_MOD_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_MODULEDIR}>
$<IF:$<BOOL:${f18errorstop}>,f18estop.f90,f08estop.f90>
)

if(f18errorstop)
target_sources(${PROJECT_NAME} PRIVATE f18estop.f90)
else()
target_sources(${PROJECT_NAME} PRIVATE f08estop.f90)
endif()
configure_stdlib_target(${PROJECT_NAME} f90Files fppFiles cppFiles)

install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)
install(DIRECTORY ${LIB_MOD_DIR} DESTINATION "${CMAKE_INSTALL_MODULEDIR}")
target_link_libraries(${PROJECT_NAME} PUBLIC blas lapack)
20 changes: 0 additions & 20 deletions src/blas/CMakeLists.txt

This file was deleted.

58 changes: 0 additions & 58 deletions src/lapack/CMakeLists.txt

This file was deleted.

Loading