Skip to content

Commit 016141f

Browse files
authored
fix(cmake): install DeePMD config for C library builds (#5475)
Problem - Installing DeePMD-kit against a precompiled `libdeepmd_c` skipped CMake package config generation. - LAMMPS built-in mode then failed at `find_package(DeePMD)` because no `DeePMDConfig.cmake`/`DeePMDTargets.cmake` was installed. Change - Generate `DeePMDConfig.cmake` for `DEEPMD_C_ROOT` builds. - Install an imported `DeePMD::deepmd_c` target pointing at the imported C library. - Include equivalent package metadata in the packaged `libdeepmd_c` tarball. Verification - `git diff --check` - Configured a fake precompiled C-library prefix and verified `find_package(DeePMD REQUIRED CONFIG)` exposes `DeePMD::deepmd_c` with the expected imported library/include paths. Fixes #5035 Authored by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Improved C API packaging and CMake config for more reliable discovery and linking. * Standardized install layout under lib/cmake/<project> and added packaged/imported targets for consistent consumption. * Enhanced package/version file generation to support builds that include only the C interface. * **Tests** * Added a consumer build step to validate the installed package and linking experience. <!-- review_stack_entry_start --> [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/deepmodeling/deepmd-kit/pull/5475?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent ccaa551 commit 016141f

6 files changed

Lines changed: 86 additions & 24 deletions

File tree

source/CMakeLists.txt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# new in 3.25: RUN_OUTPUT_STDOUT_VARIABLE
22
cmake_minimum_required(VERSION 3.25.2)
33
project(DeePMD)
4+
include(CMakePackageConfigHelpers)
45

56
option(ENABLE_TENSORFLOW "Enable TensorFlow interface" OFF)
67
option(ENABLE_PYTORCH "Enable PyTorch interface" OFF)
@@ -584,34 +585,35 @@ add_custom_target(lammps COMMAND ${CMAKE_COMMAND} -P
584585
${CMAKE_CURRENT_BINARY_DIR}/cmake_lammps.cmake)
585586

586587
# add configure file
587-
if(BUILD_CPP_IF
588-
AND NOT BUILD_PY_IF
589-
AND NOT DEEPMD_C_ROOT)
590-
include(CMakePackageConfigHelpers)
588+
if(BUILD_CPP_IF AND NOT BUILD_PY_IF)
591589
set(targets_export_name
592590
${CMAKE_PROJECT_NAME}Targets
593591
CACHE INTERNAL "")
594592
set(generated_dir
595593
"${CMAKE_CURRENT_BINARY_DIR}/generated"
596594
CACHE INTERNAL "")
597-
set(cmake_files_install_dir
598-
"${CMAKE_INSTALL_PREFIX}/lib/cmake/${CMAKE_PROJECT_NAME}")
595+
set(cmake_files_install_dir "lib/cmake/${CMAKE_PROJECT_NAME}")
599596
set(version_file "${generated_dir}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake")
600597
write_basic_package_version_file(
601598
${version_file}
602599
VERSION $<IF:${GIT_SUMM}?${GIT_SUMM}:0.0.0>
603600
COMPATIBILITY AnyNewerVersion)
604-
install(
605-
EXPORT ${targets_export_name}
606-
NAMESPACE ${CMAKE_PROJECT_NAME}::
607-
DESTINATION ${cmake_files_install_dir})
608601
set(config_file "${generated_dir}/${CMAKE_PROJECT_NAME}Config.cmake")
609602
configure_package_config_file(
610603
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in" "${config_file}"
611604
INSTALL_DESTINATION ${cmake_files_install_dir})
612605
install(FILES ${version_file} ${config_file}
613606
DESTINATION ${cmake_files_install_dir})
614-
endif(
615-
BUILD_CPP_IF
616-
AND NOT BUILD_PY_IF
617-
AND NOT DEEPMD_C_ROOT)
607+
if(DEEPMD_C_ROOT)
608+
configure_file(
609+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/DeePMDImportedTargets.cmake.in"
610+
"${generated_dir}/${targets_export_name}.cmake" @ONLY)
611+
install(FILES "${generated_dir}/${targets_export_name}.cmake"
612+
DESTINATION ${cmake_files_install_dir})
613+
else()
614+
install(
615+
EXPORT ${targets_export_name}
616+
NAMESPACE ${CMAKE_PROJECT_NAME}::
617+
DESTINATION ${cmake_files_install_dir})
618+
endif()
619+
endif()

source/api_c/CMakeLists.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,27 @@ if(PACKAGE_C)
5959
install(TARGETS ${libname} DESTINATION ${CMAKE_BINARY_DIR}/libdeepmd_c/lib)
6060
install(TARGETS ${LIB_DEEPMD_OP}
6161
DESTINATION ${CMAKE_BINARY_DIR}/libdeepmd_c/lib)
62+
63+
set(cmake_files_install_dir
64+
"${CMAKE_BINARY_DIR}/libdeepmd_c/lib/cmake/${CMAKE_PROJECT_NAME}")
65+
set(targets_export_name ${CMAKE_PROJECT_NAME}Targets)
66+
set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
67+
set(version_file "${generated_dir}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake")
68+
write_basic_package_version_file(
69+
${version_file}
70+
VERSION $<IF:${GIT_SUMM}?${GIT_SUMM}:0.0.0>
71+
COMPATIBILITY AnyNewerVersion)
72+
set(config_file "${generated_dir}/${CMAKE_PROJECT_NAME}Config.cmake")
73+
configure_package_config_file(
74+
"${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Config.cmake.in" "${config_file}"
75+
INSTALL_DESTINATION "lib/cmake/${CMAKE_PROJECT_NAME}")
76+
install(FILES ${version_file} ${config_file}
77+
DESTINATION "${cmake_files_install_dir}")
78+
configure_file(
79+
"${CMAKE_CURRENT_SOURCE_DIR}/../cmake/DeePMDPackagedTargets.cmake.in"
80+
"${generated_dir}/${targets_export_name}.cmake" @ONLY)
81+
install(FILES "${generated_dir}/${targets_export_name}.cmake"
82+
DESTINATION "${cmake_files_install_dir}")
6283
endif()
6384

6485
if(CMAKE_TESTING_ENABLED)

source/cmake/Config.cmake.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
include(CMakeFindDependencyMacro)
33

44
include("${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake")
5-
check_required_components("@project_name@")
5+
check_required_components("@CMAKE_PROJECT_NAME@")
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
if(NOT TARGET @CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@)
2+
add_library(@CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@ SHARED IMPORTED)
3+
set_target_properties(
4+
@CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@
5+
PROPERTIES IMPORTED_LOCATION "@deepmd_c@" INTERFACE_INCLUDE_DIRECTORIES
6+
"@DEEPMD_INCLUDE_C_DIR@")
7+
endif()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
if(NOT TARGET @CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@)
2+
add_library(@CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@ SHARED IMPORTED)
3+
set_target_properties(
4+
@CMAKE_PROJECT_NAME@::@LIB_DEEPMD_C@
5+
PROPERTIES
6+
IMPORTED_LOCATION
7+
"${PACKAGE_PREFIX_DIR}/lib/@CMAKE_SHARED_LIBRARY_PREFIX@@LIB_DEEPMD_C@@CMAKE_SHARED_LIBRARY_SUFFIX@"
8+
INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/include")
9+
endif()

source/install/build_from_c.sh

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,44 @@
11
set -e
22

3-
SCRIPT_PATH=$(dirname $(realpath -s $0))
4-
if [ -z "$INSTALL_PREFIX" ]; then
5-
INSTALL_PREFIX=$(realpath -s ${SCRIPT_PATH}/../../dp)
3+
SCRIPT_PATH=$(dirname "$(realpath -s "$0")")
4+
if [ -z "${INSTALL_PREFIX}" ]; then
5+
INSTALL_PREFIX=$(realpath -s "${SCRIPT_PATH}/../../dp")
66
fi
7-
mkdir -p ${INSTALL_PREFIX}
7+
mkdir -p "${INSTALL_PREFIX}"
88
echo "Installing DeePMD-kit to ${INSTALL_PREFIX}"
99
NPROC=$(nproc --all)
1010

1111
#------------------
1212

13-
BUILD_TMP_DIR=${SCRIPT_PATH}/../build
14-
mkdir -p ${BUILD_TMP_DIR}
15-
cd ${BUILD_TMP_DIR}
16-
cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DDEEPMD_C_ROOT=${DEEPMD_C_ROOT} -DLAMMPS_VERSION=stable_22Jul2025_update2 ..
17-
cmake --build . -j${NPROC}
13+
BUILD_TMP_DIR="${SCRIPT_PATH}/../build"
14+
mkdir -p "${BUILD_TMP_DIR}"
15+
cd "${BUILD_TMP_DIR}"
16+
cmake -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" -DDEEPMD_C_ROOT="${DEEPMD_C_ROOT}" -DLAMMPS_VERSION=stable_22Jul2025_update2 ..
17+
cmake --build . -j"${NPROC}"
1818
cmake --install .
19+
20+
CONSUMER_TMP_DIR="${BUILD_TMP_DIR}/cmake-consumer"
21+
rm -rf "${CONSUMER_TMP_DIR}"
22+
mkdir -p "${CONSUMER_TMP_DIR}"
23+
cat >"${CONSUMER_TMP_DIR}/CMakeLists.txt" <<'EOF'
24+
cmake_minimum_required(VERSION 3.25)
25+
project(deepmd_c_consumer LANGUAGES CXX)
26+
find_package(DeePMD REQUIRED CONFIG)
27+
find_package(DeePMD REQUIRED CONFIG)
28+
if(NOT TARGET DeePMD::deepmd_c)
29+
message(FATAL_ERROR "DeePMD::deepmd_c target is missing")
30+
endif()
31+
add_executable(deepmd_c_consumer main.cc)
32+
target_link_libraries(deepmd_c_consumer PRIVATE DeePMD::deepmd_c)
33+
EOF
34+
cat >"${CONSUMER_TMP_DIR}/main.cc" <<'EOF'
35+
#include <deepmd/c_api.h>
36+
37+
int main() { return 0; }
38+
EOF
39+
cmake -S "${CONSUMER_TMP_DIR}" -B "${CONSUMER_TMP_DIR}/build" -DCMAKE_PREFIX_PATH="${INSTALL_PREFIX}"
40+
cmake --build "${CONSUMER_TMP_DIR}/build" -j"${NPROC}"
41+
1942
cmake --build . --target=lammps
2043

2144
#------------------

0 commit comments

Comments
 (0)