Skip to content

Commit

Permalink
Propagate dependencies in CMake configuration file (#377)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
juanjosegarciaripoll and fghoussen committed Oct 27, 2022
1 parent 8ecf1be commit db55a7f
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 37 deletions.
9 changes: 9 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
66 changes: 52 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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})
Expand Down Expand Up @@ -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})
Expand All @@ -796,15 +829,14 @@ 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})
install(FILES "${PROJECT_BINARY_DIR}/parpack${LIBSUFFIX}${ITF64SUFFIX}.pc"
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})
Expand Down Expand Up @@ -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)

Expand Down
38 changes: 25 additions & 13 deletions cmake/arpackng-config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -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()
21 changes: 11 additions & 10 deletions cmake/tstCMakeInstall.sh.in
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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.

Expand Down Expand Up @@ -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

0 comments on commit db55a7f

Please sign in to comment.