Skip to content

Commit e60e850

Browse files
Merge pull request #25 from rbberger/cmake_install
cmake: improve installation so it can be consumed
2 parents e2d9412 + 30a42b2 commit e60e850

File tree

4 files changed

+152
-31
lines changed

4 files changed

+152
-31
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/ML-PACE/cnpy

CMakeLists.txt

Lines changed: 113 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,134 @@
11
cmake_minimum_required(VERSION 3.10)
22

3-
project(libpace CXX)
4-
5-
# set policy to silence warnings about ignoring <PackageName>_ROOT but use it
6-
if(POLICY CMP0074)
7-
cmake_policy(SET CMP0074 NEW)
8-
endif()
9-
# set policy to silence warnings about missing executable permissions in
10-
# pythonx.y-config when cross-compiling. review occasionally if it may be set to NEW
11-
if(POLICY CMP0109)
12-
cmake_policy(SET CMP0109 OLD)
13-
endif()
3+
project(libpace VERSION 20240911 LANGUAGES CXX)
144

5+
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
156

167
##yaml
17-
# enforce building libyaml-cpp as static library and turn off optional features
18-
set(YAML_BUILD_SHARED_LIBS OFF)
19-
set(YAML_CPP_BUILD_CONTRIB OFF)
20-
set(YAML_CPP_BUILD_TOOLS OFF)
21-
add_subdirectory(yaml-cpp build-yaml-cpp)
22-
set(YAML_CPP_INCLUDE_DIR yaml-cpp/include)
8+
find_package(yaml-cpp QUIET)
9+
10+
if(NOT yaml-cpp_FOUND)
11+
# enforce building libyaml-cpp as static library and turn off optional features
12+
set(YAML_BUILD_SHARED_LIBS OFF)
13+
set(YAML_CPP_BUILD_CONTRIB OFF)
14+
set(YAML_CPP_BUILD_TOOLS OFF)
15+
add_subdirectory(yaml-cpp build-yaml-cpp)
16+
add_library(yaml-cpp::yaml-cpp ALIAS yaml-cpp-pace)
17+
18+
install(DIRECTORY yaml-cpp/include/yaml-cpp
19+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
20+
FILES_MATCHING
21+
PATTERN *.h
22+
)
23+
set(BUILD_YAML_CPP TRUE)
24+
else()
25+
find_package(yaml-cpp REQUIRED)
26+
set(BUILD_YAML_CPP FALSE)
27+
endif()
2328

2429
## cnpy
25-
set(CNPY_PATH cnpy)
26-
set(CNPY_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
27-
set(CNPY_SRC ${CNPY_PATH}/cnpy.cpp)
28-
add_library(cnpy-static STATIC ${CNPY_SRC})
29-
set_target_properties(cnpy-static PROPERTIES LINKER_LANGUAGE CXX)
30+
find_package(cnpy QUIET)
31+
32+
if(NOT cnpy_FOUND)
33+
add_library(cnpy-static STATIC cnpy/cnpy.cpp)
34+
target_include_directories(cnpy-static PUBLIC
35+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
36+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/pace>
37+
)
38+
set_target_properties(cnpy-static PROPERTIES LINKER_LANGUAGE CXX OUTPUT_NAME cnpy)
39+
add_library(cnpy::cnpy ALIAS cnpy-static)
40+
41+
install(DIRECTORY cnpy
42+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pace
43+
FILES_MATCHING
44+
PATTERN *.h
45+
)
46+
set(BUILD_CNPY TRUE)
47+
else()
48+
find_package(cnpy REQUIRED)
49+
set(BUILD_CNPY FALSE)
50+
endif()
3051

3152
## winger-cpp
3253
# this is header-only library
3354
set(WIGNER_PATH wigner-cpp)
3455
set(WIGNER_INCLUDE_PATH ${WIGNER_PATH}/include)
3556

36-
# ML-PACE includes
37-
file(GLOB PACE_INCLUDE_DIR ML-PACE)
57+
install(DIRECTORY wigner
58+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pace
59+
FILES_MATCHING
60+
PATTERN *.hpp
61+
)
3862

3963
# ML-PACE sources
4064
file(GLOB PACE_EVALUATOR_SOURCES ML-PACE/ace-evaluator/*.cpp)
4165
file(GLOB PACE_SOURCES ML-PACE/ace/*.cpp)
42-
list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace*.cpp)
43-
list(FILTER PACE_SOURCES EXCLUDE REGEX pair_pace*.cpp)
4466

4567
add_library(pace STATIC ${PACE_EVALUATOR_SOURCES} ${PACE_SOURCES})
46-
#set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE})
47-
target_include_directories(pace PUBLIC ${PACE_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR})
48-
target_include_directories(pace PRIVATE ${CNPY_INCLUDE_PATH} ${WIGNER_INCLUDE_PATH})
68+
target_include_directories(pace PRIVATE ${WIGNER_INCLUDE_PATH})
4969
target_compile_definitions(pace PUBLIC EXTRA_C_PROJECTIONS) # important for B-projections and extrapolation grade calculations
5070
target_compile_definitions(pace PUBLIC COMPUTE_B_GRAD) # important for gradients of B-projections and ctilde functions
51-
target_link_libraries(pace PRIVATE yaml-cpp-pace cnpy-static)
52-
install(TARGETS pace LIBRARY DESTINATION lib)
71+
target_link_libraries(pace PUBLIC yaml-cpp::yaml-cpp cnpy::cnpy)
72+
73+
set(deps_targets "")
74+
75+
if(BUILD_YAML_CPP)
76+
list(APPEND deps_targets yaml-cpp-pace)
77+
else()
78+
target_compile_definitions(pace PUBLIC YAML_PACE=YAML)
79+
set_target_properties(pace PROPERTIES
80+
CXX_STANDARD 17
81+
CXX_STANDARD_REQUIRED ON
82+
CXX_EXTENSIONS OFF
83+
)
84+
endif()
85+
86+
if(BUILD_CNPY)
87+
list(APPEND deps_targets cnpy-static)
88+
else()
89+
file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/ML-PACE/cnpy)
90+
file(WRITE ${PROJECT_SOURCE_DIR}/ML-PACE/cnpy/cnpy.h "#include <cnpy.h>")
91+
endif()
92+
93+
94+
95+
include(GNUInstallDirs)
96+
97+
# ML-PACE includes
98+
target_include_directories(pace
99+
PUBLIC
100+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/ML-PACE>
101+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/pace>
102+
)
103+
104+
install(DIRECTORY ML-PACE/ace ML-PACE/ace-evaluator
105+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pace
106+
FILES_MATCHING
107+
PATTERN *.h
108+
)
109+
110+
install(TARGETS pace ${deps_targets} EXPORT pace_Targets
111+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
112+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
113+
install(EXPORT pace_Targets FILE pace-targets.cmake
114+
NAMESPACE pace:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pace
115+
)
116+
117+
include(CMakePackageConfigHelpers)
118+
119+
configure_package_config_file(
120+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/pace-config.cmake.in
121+
${CMAKE_CURRENT_BINARY_DIR}/pace-config.cmake
122+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pace
123+
)
124+
125+
write_basic_package_version_file("pace-config-version.cmake"
126+
VERSION ${PROJECT_VERSION} COMPATIBILITY ExactVersion)
127+
128+
install(FILES
129+
"${CMAKE_CURRENT_BINARY_DIR}/pace-config.cmake"
130+
"${CMAKE_CURRENT_BINARY_DIR}/pace-config-version.cmake"
131+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Findcnpy.cmake"
132+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pace)
133+
134+
add_library(pace::pace ALIAS pace)

cmake/Findcnpy.cmake

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
find_path(CNPY_INCLUDE_DIR cnpy.h PATH_SUFFIXES include)
2+
find_library(CNPY_LIBRARY NAMES cnpy PATH_SUFFIXES lib)
3+
4+
include(FindPackageHandleStandardArgs)
5+
find_package_handle_standard_args(cnpy REQUIRED_VARS CNPY_LIBRARY CNPY_INCLUDE_DIR)
6+
7+
if(cnpy_FOUND)
8+
set(CNPY_LIBRARIES ${CNPY_LIBRARY})
9+
set(CNPY_INCLUDE_DIRS ${CNPY_INCLUDE_DIR})
10+
11+
mark_as_advanced(CNPY_LIBRARIES CNPY_INCLUDE_DIRS)
12+
13+
if(NOT TARGET cnpy::cnpy)
14+
add_library(cnpy::cnpy UNKNOWN IMPORTED)
15+
set_target_properties(cnpy::cnpy PROPERTIES
16+
INTERFACE_INCLUDE_DIRECTORIES "${CNPY_INCLUDE_DIR}")
17+
18+
set_property(TARGET cnpy::cnpy APPEND PROPERTY
19+
IMPORTED_LOCATION "${CNPY_LIBRARY}")
20+
endif()
21+
endif()

cmake/pace-config.cmake.in

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
@PACKAGE_INIT@
2+
3+
include(CMakeFindDependencyMacro)
4+
5+
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
6+
7+
if(NOT @BUILD_YAML_CPP@)
8+
find_dependency(yaml-cpp REQUIRED)
9+
endif()
10+
11+
if(NOT @BUILD_CNPY@)
12+
find_dependency(cnpy REQUIRED)
13+
endif()
14+
15+
include(${CMAKE_CURRENT_LIST_DIR}/pace-targets.cmake)
16+
17+
check_required_components("pace")

0 commit comments

Comments
 (0)