diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 3bfec12490..156f08fc3b 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,6 +1,7 @@ # new in 3.25: RUN_OUTPUT_STDOUT_VARIABLE cmake_minimum_required(VERSION 3.25.2) project(DeePMD) +include(CMakePackageConfigHelpers) option(ENABLE_TENSORFLOW "Enable TensorFlow interface" OFF) option(ENABLE_PYTORCH "Enable PyTorch interface" OFF) @@ -584,34 +585,35 @@ add_custom_target(lammps COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_lammps.cmake) # add configure file -if(BUILD_CPP_IF - AND NOT BUILD_PY_IF - AND NOT DEEPMD_C_ROOT) - include(CMakePackageConfigHelpers) +if(BUILD_CPP_IF AND NOT BUILD_PY_IF) set(targets_export_name ${CMAKE_PROJECT_NAME}Targets CACHE INTERNAL "") set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated" CACHE INTERNAL "") - set(cmake_files_install_dir - "${CMAKE_INSTALL_PREFIX}/lib/cmake/${CMAKE_PROJECT_NAME}") + set(cmake_files_install_dir "lib/cmake/${CMAKE_PROJECT_NAME}") set(version_file "${generated_dir}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake") write_basic_package_version_file( ${version_file} VERSION $ COMPATIBILITY AnyNewerVersion) - install( - EXPORT ${targets_export_name} - NAMESPACE ${CMAKE_PROJECT_NAME}:: - DESTINATION ${cmake_files_install_dir}) set(config_file "${generated_dir}/${CMAKE_PROJECT_NAME}Config.cmake") configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in" "${config_file}" INSTALL_DESTINATION ${cmake_files_install_dir}) install(FILES ${version_file} ${config_file} DESTINATION ${cmake_files_install_dir}) -endif( - BUILD_CPP_IF - AND NOT BUILD_PY_IF - AND NOT DEEPMD_C_ROOT) + if(DEEPMD_C_ROOT) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/DeePMDImportedTargets.cmake.in" + "${generated_dir}/${targets_export_name}.cmake" @ONLY) + install(FILES "${generated_dir}/${targets_export_name}.cmake" + DESTINATION ${cmake_files_install_dir}) + else() + install( + EXPORT ${targets_export_name} + NAMESPACE ${CMAKE_PROJECT_NAME}:: + DESTINATION ${cmake_files_install_dir}) + endif() +endif() diff --git a/source/api_c/CMakeLists.txt b/source/api_c/CMakeLists.txt index f0b36a62d7..aca0c96476 100644 --- a/source/api_c/CMakeLists.txt +++ b/source/api_c/CMakeLists.txt @@ -59,6 +59,27 @@ if(PACKAGE_C) install(TARGETS ${libname} DESTINATION ${CMAKE_BINARY_DIR}/libdeepmd_c/lib) install(TARGETS ${LIB_DEEPMD_OP} DESTINATION ${CMAKE_BINARY_DIR}/libdeepmd_c/lib) + + set(cmake_files_install_dir + "${CMAKE_BINARY_DIR}/libdeepmd_c/lib/cmake/${CMAKE_PROJECT_NAME}") + set(targets_export_name ${CMAKE_PROJECT_NAME}Targets) + set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") + set(version_file "${generated_dir}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake") + write_basic_package_version_file( + ${version_file} + VERSION $ + COMPATIBILITY AnyNewerVersion) + set(config_file "${generated_dir}/${CMAKE_PROJECT_NAME}Config.cmake") + configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Config.cmake.in" "${config_file}" + INSTALL_DESTINATION "lib/cmake/${CMAKE_PROJECT_NAME}") + install(FILES ${version_file} ${config_file} + DESTINATION "${cmake_files_install_dir}") + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/DeePMDPackagedTargets.cmake.in" + "${generated_dir}/${targets_export_name}.cmake" @ONLY) + install(FILES "${generated_dir}/${targets_export_name}.cmake" + DESTINATION "${cmake_files_install_dir}") endif() if(CMAKE_TESTING_ENABLED) diff --git a/source/cmake/Config.cmake.in b/source/cmake/Config.cmake.in index 08a8cbfa78..f457e43ce4 100644 --- a/source/cmake/Config.cmake.in +++ b/source/cmake/Config.cmake.in @@ -2,4 +2,4 @@ include(CMakeFindDependencyMacro) include("${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake") -check_required_components("@project_name@") +check_required_components("@CMAKE_PROJECT_NAME@") diff --git a/source/cmake/DeePMDImportedTargets.cmake.in b/source/cmake/DeePMDImportedTargets.cmake.in new file mode 100644 index 0000000000..e599bff983 --- /dev/null +++ b/source/cmake/DeePMDImportedTargets.cmake.in @@ -0,0 +1,7 @@ +if(NOT TARGET @CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@) + add_library(@CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@ SHARED IMPORTED) + set_target_properties( + @CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@ + PROPERTIES IMPORTED_LOCATION "@deepmd_c@" INTERFACE_INCLUDE_DIRECTORIES + "@DEEPMD_INCLUDE_C_DIR@") +endif() diff --git a/source/cmake/DeePMDPackagedTargets.cmake.in b/source/cmake/DeePMDPackagedTargets.cmake.in new file mode 100644 index 0000000000..6a97f72c98 --- /dev/null +++ b/source/cmake/DeePMDPackagedTargets.cmake.in @@ -0,0 +1,9 @@ +if(NOT TARGET @CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@) + add_library(@CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@ SHARED IMPORTED) + set_target_properties( + @CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@ + PROPERTIES + IMPORTED_LOCATION + "${PACKAGE_PREFIX_DIR}/lib/@CMAKE_SHARED_LIBRARY_PREFIX@@LIB_DEEPMD_C@@CMAKE_SHARED_LIBRARY_SUFFIX@" + INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/include") +endif() diff --git a/source/install/build_from_c.sh b/source/install/build_from_c.sh index 903d50bb72..2ec76a46b9 100755 --- a/source/install/build_from_c.sh +++ b/source/install/build_from_c.sh @@ -1,21 +1,44 @@ set -e -SCRIPT_PATH=$(dirname $(realpath -s $0)) -if [ -z "$INSTALL_PREFIX" ]; then - INSTALL_PREFIX=$(realpath -s ${SCRIPT_PATH}/../../dp) +SCRIPT_PATH=$(dirname "$(realpath -s "$0")") +if [ -z "${INSTALL_PREFIX}" ]; then + INSTALL_PREFIX=$(realpath -s "${SCRIPT_PATH}/../../dp") fi -mkdir -p ${INSTALL_PREFIX} +mkdir -p "${INSTALL_PREFIX}" echo "Installing DeePMD-kit to ${INSTALL_PREFIX}" NPROC=$(nproc --all) #------------------ -BUILD_TMP_DIR=${SCRIPT_PATH}/../build -mkdir -p ${BUILD_TMP_DIR} -cd ${BUILD_TMP_DIR} -cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DDEEPMD_C_ROOT=${DEEPMD_C_ROOT} -DLAMMPS_VERSION=stable_22Jul2025_update2 .. -cmake --build . -j${NPROC} +BUILD_TMP_DIR="${SCRIPT_PATH}/../build" +mkdir -p "${BUILD_TMP_DIR}" +cd "${BUILD_TMP_DIR}" +cmake -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" -DDEEPMD_C_ROOT="${DEEPMD_C_ROOT}" -DLAMMPS_VERSION=stable_22Jul2025_update2 .. +cmake --build . -j"${NPROC}" cmake --install . + +CONSUMER_TMP_DIR="${BUILD_TMP_DIR}/cmake-consumer" +rm -rf "${CONSUMER_TMP_DIR}" +mkdir -p "${CONSUMER_TMP_DIR}" +cat >"${CONSUMER_TMP_DIR}/CMakeLists.txt" <<'EOF' +cmake_minimum_required(VERSION 3.25) +project(deepmd_c_consumer LANGUAGES CXX) +find_package(DeePMD REQUIRED CONFIG) +find_package(DeePMD REQUIRED CONFIG) +if(NOT TARGET DeePMD::deepmd_c) + message(FATAL_ERROR "DeePMD::deepmd_c target is missing") +endif() +add_executable(deepmd_c_consumer main.cc) +target_link_libraries(deepmd_c_consumer PRIVATE DeePMD::deepmd_c) +EOF +cat >"${CONSUMER_TMP_DIR}/main.cc" <<'EOF' +#include + +int main() { return 0; } +EOF +cmake -S "${CONSUMER_TMP_DIR}" -B "${CONSUMER_TMP_DIR}/build" -DCMAKE_PREFIX_PATH="${INSTALL_PREFIX}" +cmake --build "${CONSUMER_TMP_DIR}/build" -j"${NPROC}" + cmake --build . --target=lammps #------------------