Propagate dependencies in CMake configuration file (#377)
* Propagate dependencies in CMake configuration file * Test that CMake find_package(arpackng) finds arpack in standard locations Co-authored-by: Franck HOUSSEN <fghoussen@users.noreply.github.com>
This commit is contained in:
committed by
Franck HOUSSEN
co-authored by
Franck HOUSSEN
parent
8ecf1be713
commit
db55a7ff41
@@ -49,6 +49,15 @@ arpack-ng - 3.9.0
|
||||
[ Juan José García-Ripoll ]
|
||||
* Adapt the C/C++ interface to accept also MSVC's non-standard complex types.
|
||||
|
||||
[ Juan José García Ripoll ]
|
||||
* Propagate dependencies to CMake targets that use arpack-ng:
|
||||
- Create CMake-generated targets and configuration files that keep track of
|
||||
arpack's dependencies (libraries, directories) and expose them to users.
|
||||
- Install those files under ${prefix}/lib/cmake/arpackng* so that arpack can be
|
||||
found using 'find_package(arpackng)' from CMake files.
|
||||
- Add code to the arpackng-config.cmake to find required dependencies when this
|
||||
module is loaded by find_package(arpackng).
|
||||
|
||||
-- Sylvestre Ledru <sylvestre@debian.org> Mon, 07 Dec 2020 11:37:40 +0100
|
||||
|
||||
arpack-ng - 3.8.0
|
||||
|
||||
+52
-14
@@ -41,6 +41,12 @@ set(SYMBOLSUFFIX ""
|
||||
CACHE STRING "suffix to add to ARPACK, BLAS and LAPACK function names")
|
||||
option(INTERFACE64 "use the 64-bit integer interface (ILP64) for ARPACK, BLAS and LAPACK")
|
||||
|
||||
# 'make install' to the correct location, and also define
|
||||
# paths for target_include_directories and target_link_libraries
|
||||
include(GNUInstallDirs)
|
||||
set(ARPACK_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/arpack-ng${ITF64SUFFIX}")
|
||||
set(ARPACK_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/arpackng${LIBSUFFIX}${ITF64SUFFIX}")
|
||||
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
|
||||
function(prefixlist list_name prefix)
|
||||
@@ -377,18 +383,37 @@ endif()
|
||||
# use -DBUILD_SHARED_LIBS=ON|OFF to control static/shared
|
||||
add_library(arpack ${arpackutil_STAT_SRCS} ${arpacksrc_STAT_SRCS} ${arpacksrc_ICB})
|
||||
|
||||
target_link_libraries(arpack BLAS::BLAS)
|
||||
target_link_libraries(arpack LAPACK::LAPACK ${EXTRA_LDFLAGS})
|
||||
target_link_libraries(arpack
|
||||
PUBLIC
|
||||
$<INSTALL_INTERFACE:$<IF:$<BOOL:${BUILD_SHARED_LIBS}>,,BLAS::BLAS>>
|
||||
$<INSTALL_INTERFACE:$<IF:$<BOOL:${BUILD_SHARED_LIBS}>,,LAPACK::LAPACK>>
|
||||
$<BUILD_INTERFACE:BLAS::BLAS>
|
||||
$<BUILD_INTERFACE:LAPACK::LAPACK>
|
||||
)
|
||||
target_link_options(arpack PUBLIC "${EXTRA_LDFLAGS}")
|
||||
set_target_properties(arpack PROPERTIES OUTPUT_NAME arpack${LIBSUFFIX}${ITF64SUFFIX})
|
||||
set_target_properties(arpack PROPERTIES VERSION 2.1.0)
|
||||
set_target_properties(arpack PROPERTIES SOVERSION 2)
|
||||
target_include_directories(arpack
|
||||
PUBLIC
|
||||
# Exported location of headers
|
||||
$<INSTALL_INTERFACE:${ARPACK_INSTALL_INCLUDEDIR}>
|
||||
# Find arpackdef.h, arpackicb.h, stat*.h, debug*.h at build time
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
|
||||
# For ICB interface
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/ICB>
|
||||
)
|
||||
|
||||
if (MPI)
|
||||
# use -DBUILD_SHARED_LIBS=ON|OFF to control static/shared
|
||||
add_library(parpack ${parpacksrc_STAT_SRCS} ${parpackutil_STAT_SRCS} ${parpacksrc_ICB})
|
||||
|
||||
target_link_libraries(parpack MPI::MPI_Fortran)
|
||||
target_link_libraries(parpack arpack)
|
||||
target_link_libraries(parpack
|
||||
PUBLIC
|
||||
arpack
|
||||
$<INSTALL_INTERFACE:$<IF:$<BOOL:${BUILD_SHARED_LIBS}>,,MPI::MPI_Fortran>>
|
||||
$<BUILD_INTERFACE:MPI::MPI_Fortran>
|
||||
)
|
||||
set_target_properties(parpack PROPERTIES OUTPUT_NAME parpack${LIBSUFFIX}${ITF64SUFFIX})
|
||||
set_target_properties(parpack PROPERTIES VERSION 2.1.0)
|
||||
set_target_properties(parpack PROPERTIES SOVERSION 2)
|
||||
@@ -681,9 +706,18 @@ if(ICB)
|
||||
|
||||
if (PYTHON3)
|
||||
python_add_module(pyarpack ${arpackutil_STAT_SRCS} ${arpacksrc_STAT_SRCS} ${arpacksrc_ICB} ${PROJECT_SOURCE_DIR}/EXAMPLES/PYARPACK/pyarpack.cpp)
|
||||
set(pyarpack_HDR ${PROJECT_SOURCE_DIR}/ICB ${PROJECT_SOURCE_DIR}/EXAMPLES/MATRIX_MARKET ${PROJECT_SOURCE_DIR}/EXAMPLES/PYARPACK)
|
||||
target_include_directories(pyarpack PUBLIC ${pyarpack_HDR} ${EIGEN3_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
|
||||
target_link_libraries(pyarpack BLAS::BLAS LAPACK::LAPACK ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
|
||||
target_include_directories(pyarpack
|
||||
PRIVATE
|
||||
${PROJECT_BINARY_DIR}
|
||||
${PROJECT_SOURCE_DIR}
|
||||
${PROJECT_SOURCE_DIR}/ICB
|
||||
${PROJECT_SOURCE_DIR}/EXAMPLES/MATRIX_MARKET
|
||||
${PROJECT_SOURCE_DIR}/EXAMPLES/PYARPACK
|
||||
${EIGEN3_INCLUDE_DIR}
|
||||
${Boost_INCLUDE_DIRS}
|
||||
${PYTHON_INCLUDE_DIRS})
|
||||
target_link_libraries(pyarpack
|
||||
BLAS::BLAS LAPACK::LAPACK ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
|
||||
install(TARGETS pyarpack
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/pyarpack
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/pyarpack)
|
||||
@@ -752,8 +786,6 @@ endif()
|
||||
############################
|
||||
# install
|
||||
############################
|
||||
# 'make install' to the correct location
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# Convert variable names to those expected by the .pc file.
|
||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
@@ -788,6 +820,7 @@ configure_file(pkg-config/arpackSolver.pc.in "${PROJECT_BINARY_DIR}/arpackSolver
|
||||
|
||||
|
||||
install(TARGETS arpack
|
||||
EXPORT arpackngTargets
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
@@ -796,6 +829,7 @@ install(FILES "${PROJECT_BINARY_DIR}/arpack${LIBSUFFIX}${ITF64SUFFIX}.pc"
|
||||
|
||||
if (MPI)
|
||||
install(TARGETS parpack
|
||||
EXPORT arpackngTargets
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
@@ -803,8 +837,6 @@ if (MPI)
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
endif ()
|
||||
|
||||
set(ARPACK_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/arpack-ng${ITF64SUFFIX}")
|
||||
|
||||
if(ICB)
|
||||
install(FILES ICB/arpack.h DESTINATION "${ARPACK_INSTALL_INCLUDEDIR}")
|
||||
install(FILES ICB/arpack.hpp DESTINATION ${ARPACK_INSTALL_INCLUDEDIR})
|
||||
@@ -838,11 +870,17 @@ install(FILES "${PROJECT_BINARY_DIR}/arpackdef.h" DESTINATION ${ARPACK_INSTALL_I
|
||||
configure_file(arpackicb.h.in "${PROJECT_BINARY_DIR}/arpackicb.h" @ONLY)
|
||||
install(FILES "${PROJECT_BINARY_DIR}/arpackicb.h" DESTINATION ${ARPACK_INSTALL_INCLUDEDIR})
|
||||
|
||||
install(EXPORT arpackngTargets
|
||||
DESTINATION "${ARPACK_INSTALL_CMAKEDIR}"
|
||||
)
|
||||
# Provide find_package for arpack-ng to users.
|
||||
configure_file(cmake/arpackng-config.cmake.in "${PROJECT_BINARY_DIR}/arpackng-config.cmake" @ONLY)
|
||||
install(FILES "${PROJECT_BINARY_DIR}/arpackng-config.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/arpack-ng${LIBSUFFIX}${ITF64SUFFIX}) # find_package(arpackng)
|
||||
configure_file(cmake/arpackng-config-version.cmake.in "${PROJECT_BINARY_DIR}/arpackng-config-version.cmake" @ONLY)
|
||||
install(FILES "${PROJECT_BINARY_DIR}/arpackng-config-version.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/arpack-ng${LIBSUFFIX}${ITF64SUFFIX})
|
||||
install(
|
||||
FILES
|
||||
"${PROJECT_BINARY_DIR}/arpackng-config.cmake"
|
||||
"${PROJECT_BINARY_DIR}/arpackng-config-version.cmake"
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/arpackng${LIBSUFFIX}${ITF64SUFFIX}) # find_package(arpackng)
|
||||
|
||||
configure_file(cmake/tstCMakeInstall.sh.in ${PROJECT_BINARY_DIR}/tstCMakeInstall.sh @ONLY)
|
||||
|
||||
|
||||
@@ -12,17 +12,29 @@
|
||||
# target_include_directories(main INTERFACE PARPACK::PARPACK)
|
||||
# target_link_libraries(main PARPACK::PARPACK)
|
||||
|
||||
# Create arpack targets.
|
||||
add_library(ARPACK::ARPACK INTERFACE IMPORTED)
|
||||
set_target_properties(ARPACK::ARPACK PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/arpack-ng@ITF64SUFFIX@")
|
||||
set_target_properties(ARPACK::ARPACK PROPERTIES INTERFACE_LINK_DIRECTORIES "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@")
|
||||
set_target_properties(ARPACK::ARPACK PROPERTIES INTERFACE_LINK_LIBRARIES "arpack@LIBSUFFIX@@ITF64SUFFIX@")
|
||||
if (NOT @BUILD_SHARED_LIBS@)
|
||||
include(CMakeFindDependencyMacro)
|
||||
# Find dependencies
|
||||
if (NOT TARGET BLAS::BLAS)
|
||||
find_dependency(BLAS REQUIRED)
|
||||
endif()
|
||||
if (NOT TARGET LAPACK::LAPACK)
|
||||
find_dependency(LAPACK REQUIRED)
|
||||
endif()
|
||||
if (@ICB@)
|
||||
enable_language(Fortran)
|
||||
endif()
|
||||
if (@MPI@)
|
||||
include(FindMPI)
|
||||
if (NOT TARGET MPI::Fortran)
|
||||
find_dependency(MPI REQUIRED COMPONENTS Fortran)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Create parpack targets.
|
||||
set(MPI "@MPI@")
|
||||
if (MPI)
|
||||
add_library(PARPACK::PARPACK INTERFACE IMPORTED)
|
||||
set_target_properties(PARPACK::PARPACK PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/arpack-ng@ITF64SUFFIX@")
|
||||
set_target_properties(PARPACK::PARPACK PROPERTIES INTERFACE_LINK_DIRECTORIES "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@")
|
||||
set_target_properties(PARPACK::PARPACK PROPERTIES INTERFACE_LINK_LIBRARIES "parpack@LIBSUFFIX@@ITF64SUFFIX@")
|
||||
endif ()
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/arpackngTargets.cmake")
|
||||
|
||||
add_library(ARPACK::ARPACK ALIAS arpack)
|
||||
if (TARGET parpack)
|
||||
add_library(PARPACK::PARPACK ALIAS parpack)
|
||||
endif()
|
||||
|
||||
+11
-10
@@ -1,7 +1,6 @@
|
||||
#!/bin/bash -eu
|
||||
# Testing that find_package works.
|
||||
# Note: this script must not be added to the test suite as it will change cmake options.
|
||||
|
||||
echo "***************************************************************************************"
|
||||
|
||||
# 1. Define temporary directory.
|
||||
@@ -28,9 +27,11 @@ cd "${TMP_DIR}"
|
||||
export PKG_CONFIG_PATH="$(find ${TMP_PREFIX} -name arpack${LIBSUFFIX}${ITF64SUFFIX}.pc)"
|
||||
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH%/*}" # Same as dirname.
|
||||
echo "PKG_CONFIG_PATH: $PKG_CONFIG_PATH"
|
||||
export arpackng_DIR="$(find ${TMP_PREFIX} -name arpackng-config.cmake)"
|
||||
export arpackng_DIR="${arpackng_DIR%/*}" # Same as dirname.
|
||||
echo "arpackng_DIR: $arpackng_DIR"
|
||||
# find the prefix directory where CMake files are installed
|
||||
# this way we test find_package(arpackng) finds arpack in standard locations
|
||||
arpack_cmake_dir="$(find ${TMP_PREFIX} -name arpackng-config.cmake)"
|
||||
arpack_cmake_dir="${arpack_cmake_dir%/*}" # Same as dirname
|
||||
CMAKE_PREFIX_PATH="${arpack_cmake_dir%/*}" # cmake directory
|
||||
|
||||
# 4. Create new cmake project, in temporary directory, with files from arpack-ng.
|
||||
|
||||
@@ -101,10 +102,10 @@ echo "target_link_libraries(pdndrv3 PkgConfig::PARPACK)" >> CMake
|
||||
mkdir -p build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
make all VERBOSE=1
|
||||
cmake .. -DCMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH" || exit 1
|
||||
make all VERBOSE=1 || exit 1
|
||||
|
||||
./dnbdr1
|
||||
mpirun -n 2 ./pdndrv1
|
||||
./dnbdr3
|
||||
mpirun -n 2 ./pdndrv3
|
||||
./dnbdr1 || exit 1
|
||||
mpirun -n 2 ./pdndrv1 || exit 1
|
||||
./dnbdr3 || exit 1
|
||||
mpirun -n 2 ./pdndrv3 || exit 1
|
||||
|
||||
Reference in New Issue
Block a user