Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 155 additions & 17 deletions .cmake/slakos.cmake
Original file line number Diff line number Diff line change
@@ -1,28 +1,166 @@
include(FetchContent)
set(
PQ_SLAKOS_SOURCE_DIR
""
CACHE PATH
"Path to preseeded 3ob and matsci directories for offline builds"
)

function(CloneRepository repositoryURL sourceDir)
#Commands are left empty so that we only checkout the source and no not perform any kind of build
if (EXISTS ${sourceDir})
message("Directory ${sourceDir} already exists. Skipping cloning of ${repositoryURL}")
return()
function(ValidateSlakosSet source_dir set_name)
foreach(required_path IN ITEMS
LICENSE
README
RELEASE.md
CHANGELOG.md
)
if(NOT EXISTS "${source_dir}/${required_path}")
message(
FATAL_ERROR
"${set_name} data is missing ${source_dir}/${required_path}"
)
endif()
endforeach()

if(NOT IS_DIRECTORY "${source_dir}/skfiles")
message(
FATAL_ERROR
"${set_name} data is missing ${source_dir}/skfiles"
)
endif()

file(GLOB slakos_files "${source_dir}/skfiles/*.skf")
if(NOT slakos_files)
message(FATAL_ERROR "${set_name} contains no Slater-Koster files")
endif()
endfunction()

function(CheckoutRepository repository_url source_dir revision)
if(NOT EXISTS "${source_dir}/.git")
if(EXISTS "${source_dir}")
message(
FATAL_ERROR
"${source_dir} exists but is not a Git checkout"
)
endif()

execute_process(
COMMAND
"${GIT_EXECUTABLE}" clone --no-checkout
"${repository_url}" "${source_dir}"
RESULT_VARIABLE clone_result
)
if(NOT clone_result EQUAL 0)
message(FATAL_ERROR "Failed to clone ${repository_url}")
endif()
endif()

message("Starting to clone ${repositoryURL} into ${sourceDir}")
execute_process(
COMMAND git clone ${repositoryURL} ${sourceDir}
RESULT_VARIABLE result
COMMAND
"${GIT_EXECUTABLE}" -C "${source_dir}"
cat-file -e "${revision}^{commit}"
RESULT_VARIABLE revision_available
OUTPUT_QUIET
ERROR_QUIET
)
if(NOT revision_available EQUAL 0)
execute_process(
COMMAND
"${GIT_EXECUTABLE}" -C "${source_dir}"
fetch --depth 1 origin "${revision}"
RESULT_VARIABLE fetch_result
)
if(NOT fetch_result EQUAL 0)
message(
FATAL_ERROR
"Failed to fetch ${revision} from ${repository_url}"
)
endif()
endif()

if(NOT ${result} EQUAL 0)
message(FATAL_ERROR "Failed to clone from ${repositoryURL}")
execute_process(
COMMAND
"${GIT_EXECUTABLE}" -C "${source_dir}"
checkout --detach "${revision}"
RESULT_VARIABLE checkout_result
OUTPUT_QUIET
ERROR_QUIET
)
if(NOT checkout_result EQUAL 0)
message(FATAL_ERROR "Failed to checkout ${revision} in ${source_dir}")
endif()
endfunction(CloneRepository)

# fetch 3ob slakos files
CloneRepository("https://github.com/dftbparams/3ob.git" "${CMAKE_BINARY_DIR}/external/slakos/3ob")
execute_process(
COMMAND "${GIT_EXECUTABLE}" -C "${source_dir}" rev-parse HEAD
RESULT_VARIABLE revision_result
OUTPUT_VARIABLE actual_revision
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT revision_result EQUAL 0 OR
NOT "${actual_revision}" STREQUAL "${revision}")
message(
FATAL_ERROR
"Expected ${revision} in ${source_dir}, found ${actual_revision}"
)
endif()

# fetch matsci files
CloneRepository("https://github.com/dftbparams/matsci.git" "${CMAKE_BINARY_DIR}/external/slakos/matsci")
execute_process(
COMMAND "${GIT_EXECUTABLE}" -C "${source_dir}" status --porcelain
RESULT_VARIABLE status_result
OUTPUT_VARIABLE checkout_status
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT status_result EQUAL 0 OR NOT "${checkout_status}" STREQUAL "")
message(
FATAL_ERROR
"${source_dir} contains uncommitted or untracked files"
)
endif()
endfunction()

set(SLAKOS_3OB_REVISION "c5e165cb65f80f6b4e054c99e3f770ac3b8a4ecc")
set(SLAKOS_MATSCI_REVISION "57016b4363fd6180f6edff662e5fbaa95276b4bd")

if(PQ_SLAKOS_SOURCE_DIR)
get_filename_component(
SLAKOS_SOURCE_DIR
"${PQ_SLAKOS_SOURCE_DIR}"
ABSOLUTE
BASE_DIR "${CMAKE_SOURCE_DIR}"
)
message(STATUS "Using preseeded Slater-Koster data: ${SLAKOS_SOURCE_DIR}")
else()
find_package(Git REQUIRED)
set(SLAKOS_SOURCE_DIR "${CMAKE_BINARY_DIR}/external/slakos")
CheckoutRepository(
"https://github.com/dftbparams/3ob.git"
"${SLAKOS_SOURCE_DIR}/3ob"
"${SLAKOS_3OB_REVISION}"
)
CheckoutRepository(
"https://github.com/dftbparams/matsci.git"
"${SLAKOS_SOURCE_DIR}/matsci"
"${SLAKOS_MATSCI_REVISION}"
)
endif()

ValidateSlakosSet("${SLAKOS_SOURCE_DIR}/3ob" "3ob")
ValidateSlakosSet("${SLAKOS_SOURCE_DIR}/matsci" "matsci")

# define directory for 3ob and matsci for preprocessor
add_compile_definitions(__SLAKOS_DIR__="${CMAKE_BINARY_DIR}/external/slakos/")
add_compile_definitions(__SLAKOS_DIR__="${SLAKOS_SOURCE_DIR}/")

foreach(slakos_set IN ITEMS 3ob matsci)
install(
DIRECTORY "${SLAKOS_SOURCE_DIR}/${slakos_set}/skfiles"
DESTINATION "share/PQ/slakos/${slakos_set}"
COMPONENT slakos
)
install(
FILES
"${SLAKOS_SOURCE_DIR}/${slakos_set}/LICENSE"
"${SLAKOS_SOURCE_DIR}/${slakos_set}/README"
"${SLAKOS_SOURCE_DIR}/${slakos_set}/RELEASE.md"
"${SLAKOS_SOURCE_DIR}/${slakos_set}/CHANGELOG.md"
DESTINATION "share/PQ/slakos/${slakos_set}"
COMPONENT slakos
)
endforeach()
8 changes: 5 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ else()
# *****************
# set install rpath
# *****************
SET(CMAKE_INSTALL_RPATH
"${CMAKE_INSTALL_PREFIX}/lib/;${CMAKE_INSTALL_PREFIX}/lib/tools/;"
)
if(APPLE)
set(CMAKE_INSTALL_RPATH "@loader_path/../lib;@loader_path")
else()
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib;$ORIGIN")
endif()
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()

Expand Down
73 changes: 72 additions & 1 deletion apps/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,29 @@
add_executable(PQ
PQ.cpp
capabilities.cpp
validation.cpp
)

target_include_directories(PQ
PUBLIC ${CODE_INCLUDE_DIR}
)

if(NOT DEFINED BUILD_WITH_PYBIND11)
set(BUILD_WITH_PYBIND11 OFF)
endif()

target_compile_definitions(PQ
PRIVATE
PQ_BUILD_WITH_ASE=$<BOOL:${BUILD_WITH_ASE}>
PQ_BUILD_WITH_MPI=$<BOOL:${BUILD_WITH_MPI}>
PQ_BUILD_WITH_KOKKOS=$<BOOL:${BUILD_WITH_KOKKOS}>
PQ_BUILD_WITH_PYTHON_BINDINGS=$<BOOL:${BUILD_WITH_PYTHON_BINDINGS}>
PQ_BUILD_WITH_PYTHON_EMBEDDING=$<BOOL:${BUILD_WITH_PYBIND11}>
PQ_BUILD_SHARED=$<BOOL:${BUILD_SHARED_LIBS}>
PQ_BUILD_STATIC=$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>
PQ_BUILD_WITH_SINGULARITY=$<BOOL:${BUILD_WITH_SINGULARITY}>
)

target_link_libraries(PQ
PUBLIC
PQ_input
Expand All @@ -30,5 +48,58 @@ if(BUILD_WITH_PYBIND11)
endif()

install(TARGETS PQ
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
DESTINATION bin
)

if(BUILD_WITH_TESTS)
add_test(
NAME testPQCli
COMMAND
${CMAKE_COMMAND}
-DPQ_EXECUTABLE=$<TARGET_FILE:PQ>
-DEXPECTED_VERSION=${GIT_VERSION}
-DEXPECTED_ASE=${BUILD_WITH_ASE}
-DEXPECTED_MPI=${BUILD_WITH_MPI}
-DEXPECTED_KOKKOS=${BUILD_WITH_KOKKOS}
-DEXPECTED_PYTHON_BINDINGS=${BUILD_WITH_PYTHON_BINDINGS}
-DEXPECTED_PYTHON_EMBEDDING=${BUILD_WITH_PYBIND11}
-DEXPECTED_SHARED=${BUILD_SHARED_LIBS}
-DEXPECTED_SINGULARITY=${BUILD_WITH_SINGULARITY}
-P ${PROJECT_SOURCE_DIR}/tests/cmake/testPQCli.cmake
)
set_property(TEST testPQCli PROPERTY LABELS input)

add_test(
NAME testPQValidation
COMMAND
${CMAKE_COMMAND}
-DPQ_EXECUTABLE=$<TARGET_FILE:PQ>
-DEXPECTED_ASE=${BUILD_WITH_ASE}
-DEXPECTED_SHARED=${BUILD_SHARED_LIBS}
-DEXPECTED_SINGULARITY=${BUILD_WITH_SINGULARITY}
-DVALIDATION_FIXTURE_DIR=${PROJECT_SOURCE_DIR}/tests/regression/fixtures/mm-md-smoke
-DVALIDATION_WORK_DIR=${CMAKE_CURRENT_BINARY_DIR}/pq-cli-validation
-P ${PROJECT_SOURCE_DIR}/tests/cmake/testPQValidation.cmake
)
set_property(TEST testPQValidation PROPERTY LABELS input)
set_property(
TEST testPQValidation
PROPERTY ENVIRONMENT
"GMON_OUT_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/pq-validation-gmon"
)

if(BUILD_WITH_ASE)
add_test(
NAME testPQSlakosInstall
COMMAND
${CMAKE_COMMAND}
-DPQ_EXECUTABLE=$<TARGET_FILE:PQ>
-DBUILD_DIR=${CMAKE_BINARY_DIR}
-DSLAKOS_SOURCE_DIR=${SLAKOS_SOURCE_DIR}
-DSTAGING_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/pq-slakos-install
-DMM_FIXTURE_DIR=${PROJECT_SOURCE_DIR}/tests/regression/fixtures/mm-md-smoke
-P ${PROJECT_SOURCE_DIR}/tests/cmake/testPQSlakosInstall.cmake
)
set_property(TEST testPQSlakosInstall PROPERTY LABELS input)
endif()
endif()
Loading
Loading