mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-29 06:35:28 -04:00
Toolchain: Replace "scripts/generate_cmake_options.sh" with "build_cp2k.sh" (#5080)
Co-authored-by: HE Zilong <159878975+he-zilong@users.noreply.github.com>
This commit is contained in:
parent
c92e8381f7
commit
f577188f47
49 changed files with 408 additions and 396 deletions
|
|
@ -1,240 +0,0 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
# TODO: Review and if possible fix shellcheck errors.
|
||||
# shellcheck disable=all
|
||||
|
||||
[ "${BASH_SOURCE[0]}" ] && SCRIPT_NAME="${BASH_SOURCE[0]}" || SCRIPT_NAME=$0
|
||||
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_NAME")" && pwd -P)"
|
||||
|
||||
source "${SCRIPT_DIR}"/common_vars.sh
|
||||
source "${SCRIPT_DIR}"/tool_kit.sh
|
||||
source "${SCRIPT_DIR}"/signal_trap.sh
|
||||
source "${INSTALLDIR}"/toolchain.conf
|
||||
source "${INSTALLDIR}"/toolchain.env
|
||||
|
||||
# This script assumes a working environment as follows:
|
||||
# cp2k <- variable ${CP2K_ROOT}; CMake option -S
|
||||
# ├── CMakeLists.txt <- * file to be parsed in this script
|
||||
# ├── data <- CP2K data directory; CMake option -DCP2K_DATA_DIR
|
||||
# ├── build <- to-be-created; CMake option -B
|
||||
# ├── install <- to-be-created; CMake option -DCMAKE_INSTALL_PREFIX
|
||||
# ├── src <- CP2K source code directory
|
||||
# └── tools
|
||||
# └── toolchain <- working directory; variable ${ROOTDIR}
|
||||
# ├── install_cp2k_toolchain.sh <- script being executed calling this script
|
||||
# ├── scripts <- variable ${SCRIPT_DIR}
|
||||
# │ ├── common_vars.sh
|
||||
# │ ├── tool_kit.sh
|
||||
# │ └── generate_cmake_options.sh <- this script
|
||||
# └── install <- variable ${INSTALLDIR}
|
||||
# ├── setup <- * file to be parsed in this script
|
||||
# ├── toolchain.conf <- * file to be parsed in this script
|
||||
# └── toolchain.env <- * file to be parsed in this script
|
||||
#
|
||||
# First, validate completion of relevant upper-level directory and file
|
||||
printf "\n========================== %s =========================\n" \
|
||||
"Generating CMake options for building CP2K"
|
||||
CP2K_ROOT=$(cd "${ROOTDIR}/../.." && pwd)
|
||||
if [ -d "${CP2K_ROOT}/src" ]; then
|
||||
cat << EOF
|
||||
Root directory of CP2K with source code is found as ${CP2K_ROOT}
|
||||
(path is exported to variable \${CP2K_ROOT}).
|
||||
Build directory will be \${CP2K_ROOT}/build.
|
||||
Install directory will be \${CP2K_ROOT}/install.
|
||||
EOF
|
||||
CMAKE_OPTIONS="-DCMAKE_INSTALL_PREFIX=./install"
|
||||
else
|
||||
report_error ${LINENO} "\${CP2K_ROOT} does not have subdirectory src."
|
||||
return 1
|
||||
fi
|
||||
if [ -f "${CP2K_ROOT}/CMakeLists.txt" ] && [ -r "${CP2K_ROOT}/CMakeLists.txt" ]; then
|
||||
echo "\${CP2K_ROOT}/CMakeLists.txt exists; will be parsed for CMake options."
|
||||
else
|
||||
report_error ${LINENO} "\${CP2K_ROOT}/CMakeLists.txt cannot be found or read."
|
||||
return 1
|
||||
fi
|
||||
if [ -d "${CP2K_ROOT}/data" ]; then
|
||||
echo "Data directory ${CP2K_ROOT}/data is found and set as CP2K_DATA_DIR."
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_DATA_DIR=${CP2K_ROOT}/data"
|
||||
else
|
||||
report_error ${LINENO} "Data directory \${CP2K_ROOT}/data cannot be found."
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# generate cmake options for compiling cp2k
|
||||
# ------------------------------------------------------------------------
|
||||
# Build the program in source tree for convenience
|
||||
if [ -n "$(grep -- "--install-all" ${INSTALLDIR}/setup)" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_EVERYTHING=ON -DCP2K_USE_DLAF=OFF -DCP2K_USE_PEXSI=OFF"
|
||||
# Since "--install-all" can be used together with "--with-PKG=no", an extra safeguard is added here
|
||||
for toolchain_option in $(grep -i "dontuse" ${INSTALLDIR}/toolchain.conf | grep -vi "gcc" | cut -d'_' -f2 | cut -d'=' -f1); do
|
||||
if [ $(eval echo "$with_"'$toolchain_option') != "__DONTUSE__" ]; then
|
||||
ADDED_CMAKE_OPTION=$(sed -n '/option(/,/)/p' ${CP2K_ROOT}/CMakeLists.txt | grep -i $toolchain_option | awk '{print $1}' | cut -d'(' -f2 | head -n 1)
|
||||
# Use "if-then" below can avoid generating empty "-D=OFF" options
|
||||
if [ -n "${ADDED_CMAKE_OPTION}" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -D${ADDED_CMAKE_OPTION}=OFF"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
else
|
||||
# If MPI is used, set "CP2K_USE_MPI" to "ON"
|
||||
if [ "${MPI_MODE}" != "no" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_MPI=ON"
|
||||
if [ -n "$(grep "MPI_F08" "${INSTALLDIR}"/toolchain.env)" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_MPI_F08=ON"
|
||||
fi
|
||||
fi
|
||||
# If GPU acceleration is used, add the option about GPU acceleration
|
||||
if [ "${ENABLE_CUDA}" = "__TRUE__" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_ACCEL=CUDA -DCP2K_WITH_GPU=${GPUVER}"
|
||||
elif [ "${ENABLE_HIP}" = "__TRUE__" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_ACCEL=HIP -DCP2K_WITH_GPU=${GPUVER}"
|
||||
elif [ "${ENABLE_OPENCL}" = "__TRUE__" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_ACCEL=OPENCL"
|
||||
fi
|
||||
# Some options that should be specially considered:
|
||||
# Intel MKL includes FFTW
|
||||
if [ "${with_fftw}" != "__DONTUSE__" ] || [ "${MATH_MODE}" = "mkl" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_FFTW3=ON"
|
||||
fi
|
||||
# There is only MCL (MiMiC Communication Library) and no MiMiC that can be installed via toolchain, but if one chooses to install MCL then MiMiC should have been installed?
|
||||
if [ "${with_mcl}" != "__DONTUSE__" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCP2K_USE_MIMIC=ON"
|
||||
fi
|
||||
# Detect if any other dependencies is used and add the proper cmake option. Since "pugixml" and "gsl" are not mentioned in CMakeLists.txt, they will not be considered.
|
||||
for toolchain_option in $(grep -vi "dry\|list\|dontuse\|gcc\|cmake\|fftw\|mkl\|dbcsr" ${INSTALLDIR}/toolchain.conf | cut -d'_' -f2 | cut -d'=' -f1); do
|
||||
if [ $(eval echo "$with_"'$toolchain_option') != "__DONTUSE__" ]; then
|
||||
ADDED_CMAKE_OPTION=$(sed -n '/option(/,/)/p' ${CP2K_ROOT}/CMakeLists.txt | grep -i $toolchain_option | awk '{print $1}' | cut -d'(' -f2 | head -n 1)
|
||||
# Use "if-then" below can avoid generating empty "-D=ON" options
|
||||
if [ -n "${ADDED_CMAKE_OPTION}" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -D${ADDED_CMAKE_OPTION}=ON"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Export variable for CMake options to setup file
|
||||
cat << EOF >> "${SETUPFILE}"
|
||||
# ==================== Setup for CP2K ==================== #
|
||||
export CP2K_ROOT="${CP2K_ROOT}"
|
||||
export CP2K_CMAKE_OPTIONS="${CMAKE_OPTIONS}"
|
||||
prepend_path PATH "${CP2K_ROOT}/install/bin"
|
||||
prepend_path LD_LIBRARY_PATH "${CP2K_ROOT}/install/lib"
|
||||
prepend_path PKG_CONFIG_PATH "${CP2K_ROOT}/install/lib/pkgconfig"
|
||||
EOF
|
||||
if [ "${dry_run}" = "__TRUE__" ]; then
|
||||
cat << EOF
|
||||
|
||||
Suggested cmake command if toolchain is built with your options:
|
||||
|
||||
cmake ${CMAKE_OPTIONS}
|
||||
EOF
|
||||
else
|
||||
cat << EOF
|
||||
|
||||
Suggested CMake options are collected in the variable \${CP2K_CMAKE_OPTIONS} that is
|
||||
exported at the end of setup file ${SETUPFILE}.
|
||||
EOF
|
||||
fi
|
||||
|
||||
# -------------------------
|
||||
# print out user instructions
|
||||
# -------------------------
|
||||
if [ "${dry_run}" != "__TRUE__" ]; then
|
||||
echo
|
||||
cat << EOF
|
||||
========================== Epilogue =========================
|
||||
Toolchain is now ready for building CP2K!
|
||||
|
||||
To use the installed tools and libraries and cp2k version compiled with it you
|
||||
will first need to execute at the prompt:
|
||||
|
||||
source ${SETUPFILE}
|
||||
|
||||
Then it's recommended for you to build and install CP2K with following commands:
|
||||
|
||||
cd ${CP2K_ROOT}
|
||||
cmake -S . -B build ${CMAKE_OPTIONS}
|
||||
cmake --build build --target install -j $(get_nprocs)
|
||||
|
||||
For more information about available build options, see:
|
||||
https://manual.cp2k.org/trunk/getting-started/build-from-source.html
|
||||
|
||||
For detailed explanation of above steps of building CP2K, see:
|
||||
${INSTALLDIR}/cp2k_installation_guide.md
|
||||
|
||||
EOF
|
||||
cat << EOF > ${INSTALLDIR}/cp2k_installation_guide.md
|
||||
## Building CP2K with dependencies installed in toolchain
|
||||
|
||||
Here is a detailed instruction of building CP2K with dependencies installed via toolchain.
|
||||
|
||||
### Required - commands you must execute or the building fails
|
||||
|
||||
1. Source setup file to activate toolchain-configured dependencies:
|
||||
|
||||
\`\`\`bash
|
||||
source ${SETUPFILE}
|
||||
\`\`\`
|
||||
|
||||
This setup file **MUST** also be sourced whenever CP2K built with this toolchain is executed.
|
||||
If modules have been used to estabilish environment variables and paths, remember to load
|
||||
these modules prior to sourcing setup file.
|
||||
|
||||
2. Go to root directory of CP2K and configure CMake with corresponding options:
|
||||
|
||||
\`\`\`bash
|
||||
cd ${CP2K_ROOT}
|
||||
cmake -S . -B build ${CMAKE_OPTIONS}
|
||||
\`\`\`
|
||||
|
||||
Other commands from \`${CP2K_ROOT}/CMakeLists.txt\` can also be added. For more information
|
||||
about available build options, see documentation:
|
||||
<https://manual.cp2k.org/trunk/getting-started/build-from-source.html>.
|
||||
|
||||
Alternative to copy-paste long lines in terminal is to use a variable from setup file for
|
||||
CMake options, which is not to be quoted so that whitespace delimiters allow it to expand
|
||||
to command options in shell:
|
||||
|
||||
\`\`\`bash
|
||||
cmake -S . -B build \${CP2K_CMAKE_OPTIONS}
|
||||
\`\`\`
|
||||
|
||||
3. Build and install CP2K with command:
|
||||
|
||||
\`\`\`bash
|
||||
cmake --build build --target install -j $(get_nprocs)
|
||||
\`\`\`
|
||||
|
||||
It may be helpful to also save a copy of command line messages to log files:
|
||||
|
||||
\`\`\`bash
|
||||
cmake --build build --target install -j $(get_nprocs) 2>&1 | tee install.log
|
||||
\`\`\`
|
||||
|
||||
If you want another build of CP2K without changing toolchain configuration, simply change
|
||||
the building directory set by \`-B <dirname>\` in the cmake command above.
|
||||
|
||||
### Optional but recommended
|
||||
|
||||
At the ending of the output of step 3, CP2K will give you a command that can be used to
|
||||
do regtests, which can further ensure if you have built CP2K correctly. You can perform
|
||||
the regtests with that command. You can run
|
||||
\`${CP2K_ROOT}/tests/do_regtest.py --help\`
|
||||
to see available options. For a detailed instruction of how to run regtests (especially
|
||||
on HPC clusters), see:
|
||||
<https://www.cp2k.org/dev:regtesting>.
|
||||
|
||||
### Other optional behaviors
|
||||
|
||||
Both for toolchain buildings and CP2K building: once build is completed, the \`build\`
|
||||
directory can be safely deleted. However, you **MUST** keep the \`install\` directory
|
||||
as is.
|
||||
|
||||
Especially, if you want to save disk space but at the same time keep the cached CMake
|
||||
files, you can run \`cmake --build build --target clean\` alternatively after installing
|
||||
successfully.
|
||||
EOF
|
||||
fi
|
||||
|
||||
#EOF
|
||||
|
|
@ -44,10 +44,7 @@ case "${with_dbcsr}" in
|
|||
if [ "${MPI_MODE}" == "no" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DUSE_MPI=OFF"
|
||||
else
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DUSE_MPI=ON"
|
||||
if [ -n "$(grep "MPI_F08" "${INSTALLDIR}"/toolchain.env)" ]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DUSE_MPI_F08=ON"
|
||||
fi
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DUSE_MPI=ON -DUSE_MPI_F08=ON"
|
||||
fi
|
||||
cmake \
|
||||
-DCMAKE_INSTALL_PREFIX=${pkg_install_dir} \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue