cp2k/arch/Linux-gnu-aarch64-static.ssmp
Taillefumier Mathieu cbdeaffe0e
Make GRPP an internal dependency
Co-authored-by: Mathieu Taillefumier <mathieu.taillefumier@free.fr>
2025-02-28 09:36:16 +01:00

201 lines
6.6 KiB
Bash

#!/bin/bash
#
# CP2K (GNU aarch64) arch file for a serial static ARM64 binary
#
# Tested with: GNU 14.2.0
#
# Usage: Source this arch file and then run make as instructed.
#
# Last update: 12.02.2025
#
# \
if [[ "${0}" == "${BASH_SOURCE}" ]]; then \
echo "ERROR: Script ${0##*/} must be sourced"; \
echo "Usage: source ${0##*/}"; \
exit 1; \
fi; \
this_file=${BASH_SOURCE##*/}; \
cd tools/toolchain; \
rm -rf build; \
[[ -z "${target_cpu}" ]] && target_cpu="native"; \
./install_cp2k_toolchain.sh -j${maxtasks} --mpi-mode=no --no-arch-files --target-cpu=${target_cpu} --with-gcc --with-dftd4; \
source ./install/setup; \
cd ../..; \
echo; \
echo "Check the output above for error messages and consistency!"; \
echo; \
echo "If everything is OK, you can build a CP2K production binary with"; \
echo " make -j ARCH=${this_file%.*} VERSION=${this_file##*.} TARGET_CPU=${target_cpu}"; \
echo "Further checks are performed, if DO_CHECKS=yes is added."; \
echo; \
return
# Set options
DO_CHECKS := no
TARGET_CPU := native
# Retrieve package versions
GNU_VER := $(shell gcc -dumpfullversion)
USE_DFTD4 := $(DFTD4_VER)
USE_FFTW := $(FFTW_VER)
USE_LIBGRPP := $(LIBGRPP_VER)
USE_LIBINT := $(LIBINT_VER)
USE_LIBVORI := $(LIBVORI_VER)
USE_LIBXC := $(LIBXC_VER)
USE_LIBXSMM := $(LIBXSMM_VER)
USE_OPENBLAS := $(OPENBLAS_VER)
USE_SPGLIB := $(SPGLIB_VER)
LMAX := 5
MAX_CONTR := 4
CC := gcc
CXX := g++
FC := gfortran
LD := gfortran
AR := ar -r
CFLAGS := -O2 -fopenmp -fopenmp-simd -ftree-vectorize -funroll-loops -g -mtune=$(TARGET_CPU)
DFLAGS += -D__MAX_CONTR=$(strip $(MAX_CONTR))
INSTALL_PATH := $(PWD)/tools/toolchain/install
# Settings for regression testing
ifeq ($(DO_CHECKS), yes)
DFLAGS += -D__CHECK_DIAG
# CFLAGS_DEBUG := -fsanitize=address
CFLAGS_DEBUG := -fsanitize=leak
FCFLAGS_DEBUG := -fcheck=bounds,do,recursion,pointer
FCFLAGS_DEBUG += -fcheck=all,no-array-temps
FCFLAGS_DEBUG += -ffpe-trap=invalid,overflow,zero
FCFLAGS_DEBUG += -fimplicit-none
FCFLAGS_DEBUG += -finit-derived
FCFLAGS_DEBUG += -finit-real=snan
FCFLAGS_DEBUG += -finit-integer=-42
FCFLAGS_DEBUG += -finline-matmul-limit=0
WFLAGS := -Werror=aliasing
WFLAGS += -Werror=ampersand
WFLAGS += -Werror=c-binding-type
WFLAGS += -Werror=conversion
WFLAGS += -Werror=intrinsic-shadow
WFLAGS += -Werror=intrinsics-std
WFLAGS += -Werror=line-truncation
WFLAGS += -Wrealloc-lhs
WFLAGS += -Werror=tabs
WFLAGS += -Werror=target-lifetime
WFLAGS += -Werror=underflow
WFLAGS += -Werror=unused-but-set-variable
WFLAGS += -Werror=unused-dummy-argument
WFLAGS += -Werror=unused-variable
endif
ifneq ($(USE_LIBVORI),)
USE_LIBVORI := $(strip $(USE_LIBVORI))
LIBVORI_LIB := $(INSTALL_PATH)/libvori-$(USE_LIBVORI)/lib
DFLAGS += -D__LIBVORI
LIBS += $(LIBVORI_LIB)/libvori.a
endif
ifneq ($(USE_LIBXC),)
USE_LIBXC := $(strip $(USE_LIBXC))
LIBXC_INC := $(INSTALL_PATH)/libxc-$(USE_LIBXC)/include
LIBXC_LIB := $(INSTALL_PATH)/libxc-$(USE_LIBXC)/lib
CFLAGS += -I$(LIBXC_INC)
DFLAGS += -D__LIBXC
LIBS += $(LIBXC_LIB)/libxcf03.a
LIBS += $(LIBXC_LIB)/libxc.a
endif
ifneq ($(USE_DFTD4),)
USE_DFTD4 := $(strip $(USE_DFTD4))
DFTD4_INC := $(INSTALL_PATH)/dftd4-$(USE_DFTD4)/include
DFTD4_LIB := $(INSTALL_PATH)/dftd4-$(USE_DFTD4)/lib
CFLAGS += -I$(DFTD4_INC)/dftd4/GNU-$(GNU_VER)
DFLAGS += -D__DFTD4
LIBS += $(DFTD4_LIB)/libdftd4.a
LIBS += $(DFTD4_LIB)/libmstore.a
LIBS += $(DFTD4_LIB)/libmulticharge.a
LIBS += $(DFTD4_LIB)/libmctc-lib.a
endif
ifneq ($(USE_LIBGRPP),)
USE_LIBGRPP := $(strip $(USE_LIBGRPP))
DFLAGS += -D__LIBGRPP
endif
ifneq ($(USE_LIBINT),)
USE_LIBINT := $(strip $(USE_LIBINT))
LMAX := $(strip $(LMAX))
LIBINT_INC := $(INSTALL_PATH)/libint-v$(USE_LIBINT)-cp2k-lmax-$(LMAX)/include
LIBINT_LIB := $(INSTALL_PATH)/libint-v$(USE_LIBINT)-cp2k-lmax-$(LMAX)/lib
CFLAGS += -I$(LIBINT_INC)
DFLAGS += -D__LIBINT
LIBS += $(LIBINT_LIB)/libint2.a
LIBS += $(LIBINT_LIB)/libint2.a
endif
ifneq ($(USE_SPGLIB),)
USE_SPGLIB := $(strip $(USE_SPGLIB))
SPGLIB_INC := $(INSTALL_PATH)/spglib-$(USE_SPGLIB)/include
SPGLIB_LIB := $(INSTALL_PATH)/spglib-$(USE_SPGLIB)/lib
CFLAGS += -I$(SPGLIB_INC)
DFLAGS += -D__SPGLIB
LIBS += $(SPGLIB_LIB)/libsymspg.a
endif
ifneq ($(USE_LIBXSMM),)
USE_LIBXSMM := $(strip $(USE_LIBXSMM))
LIBXSMM_INC := $(INSTALL_PATH)/libxsmm-$(USE_LIBXSMM)/include
LIBXSMM_LIB := $(INSTALL_PATH)/libxsmm-$(USE_LIBXSMM)/lib
CFLAGS += -I$(LIBXSMM_INC)
DFLAGS += -D__LIBXSMM
ifeq ($(SHARED), yes)
LIBS += -Wl,-rpath=$(LIBXSMM_LIB) -L$(LIBXSMM_LIB) -lxsmmf -lxsmmext -lxsmm
else
LIBS += $(LIBXSMM_LIB)/libxsmmf.a
LIBS += $(LIBXSMM_LIB)/libxsmmext.a
LIBS += $(LIBXSMM_LIB)/libxsmm.a
endif
endif
ifneq ($(USE_FFTW),)
USE_FFTW := $(strip $(USE_FFTW))
FFTW_INC := $(INSTALL_PATH)/fftw-$(USE_FFTW)/include
FFTW_LIB := $(INSTALL_PATH)/fftw-$(USE_FFTW)/lib
CFLAGS += -I$(FFTW_INC)
DFLAGS += -D__FFTW3
LIBS += $(FFTW_LIB)/libfftw3_omp.a
LIBS += $(FFTW_LIB)/libfftw3.a
endif
ifneq ($(USE_OPENBLAS),)
USE_OPENBLAS := $(strip $(USE_OPENBLAS))
OPENBLAS_INC := $(INSTALL_PATH)/openblas-$(USE_OPENBLAS)/include
OPENBLAS_LIB := $(INSTALL_PATH)/openblas-$(USE_OPENBLAS)/lib
CFLAGS += -I$(OPENBLAS_INC)
LIBS += $(OPENBLAS_LIB)/libopenblas.a
endif
CFLAGS += $(DFLAGS) $(CFLAGS_DEBUG)
FCFLAGS := $(CFLAGS) $(FCFLAGS_DEBUG) $(WFLAGS)
ifeq ($(shell [ $(shell gcc -dumpversion | cut -d. -f1) -gt 9 ] && echo yes), yes)
FCFLAGS += -fallow-argument-mismatch
endif
FCFLAGS += -fbacktrace
FCFLAGS += -ffree-form
FCFLAGS += -ffree-line-length-none
FCFLAGS += -fno-omit-frame-pointer
FCFLAGS += -std=f2008
# The LeakSanitizer does not work with static linking
ifeq ($(DO_CHECKS), yes)
LDFLAGS += $(FCFLAGS)
else
LDFLAGS += $(FCFLAGS) -static
endif
LIBS += -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -ldl -lstdc++
# End