From b9da3089cfd6fdec6dc425cbd5f4d4453e3a63ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Sch=C3=BCtt?= Date: Thu, 2 Oct 2025 13:44:02 +0200 Subject: [PATCH] Move __DATA_DIR to C code to avoid Fortran's line length limit --- cmake/CompilerConfiguration.cmake | 2 +- src/CMakeLists.txt | 9 +++++++- src/common/cp_data_dir.c | 26 ++++++++++++++++++++++ src/common/cp_files.F | 36 +++++++++++++++++++++---------- 4 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 src/common/cp_data_dir.c diff --git a/cmake/CompilerConfiguration.cmake b/cmake/CompilerConfiguration.cmake index 6469558f56..1a5631d954 100644 --- a/cmake/CompilerConfiguration.cmake +++ b/cmake/CompilerConfiguration.cmake @@ -35,7 +35,7 @@ endif() # Baseline add_compile_options( - "$<$:-std=f2008;-ffree-form;-ffree-line-length-none;-fimplicit-none>" + "$<$:-std=f2008;-ffree-form;-fimplicit-none>" "$<$:-g;-fno-omit-frame-pointer;-fbacktrace>" "$<$:$<$:-fallow-argument-mismatch>>" "$<$:-Wno-deprecated-declarations;-Wno-maybe-uninitialized;-Wuninitialized;-Wuse-without-only>" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d2baf2a32b..227091d670 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1385,7 +1385,14 @@ list( xc/xc_xpbe_hole_t_c_lr.F xc/xc_xwpbe.F) -list(APPEND CP2K_SRCS_C sockets.c base/machine_cpuid.c base/openmp_trace.c) +list( + APPEND + CP2K_SRCS_C + sockets.c + base/machine_cpuid.c + base/openmp_trace.c + base/openmp_trace.c + common/cp_data_dir.c) set(CP2K_OFFLOAD_SRCS_C offload/offload_buffer.c offload/offload_library.c offload/offload_mempool.c) diff --git a/src/common/cp_data_dir.c b/src/common/cp_data_dir.c new file mode 100644 index 0000000000..955888bfba --- /dev/null +++ b/src/common/cp_data_dir.c @@ -0,0 +1,26 @@ +/*----------------------------------------------------------------------------*/ +/* CP2K: A general program to perform molecular dynamics simulations */ +/* Copyright 2000-2025 CP2K developers group */ +/* */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/*----------------------------------------------------------------------------*/ + +#include + +// Since __DATA_DIR can be arbitrarily long we must not let the preprocessor +// expand that macro in Fortran code as it could exceed the line length limit. +static const char *data_dir = __DATA_DIR; + +/******************************************************************************* + * \brief Returns path of data directory if set, otherwise an empty string. + * \author Ole Schuett + ******************************************************************************/ +const char *get_data_dir() { + const char *overwrite = getenv("CP2K_DATA_DIR"); + if (overwrite != NULL) { + return overwrite; + } + return data_dir; +} + +// EOF diff --git a/src/common/cp_files.F b/src/common/cp_files.F index 1de58f7994..f01746636e 100644 --- a/src/common/cp_files.F +++ b/src/common/cp_files.F @@ -14,7 +14,10 @@ !> \author Matthias Krack (MK) ! ************************************************************************************************** MODULE cp_files - + USE ISO_C_BINDING, ONLY: C_CHAR,& + C_F_POINTER,& + C_NULL_CHAR,& + C_PTR USE kinds, ONLY: default_path_length USE machine, ONLY: default_input_unit,& default_output_unit,& @@ -551,19 +554,30 @@ CONTAINS !> \return ... !> \author Ole Schuett ! ************************************************************************************************** - FUNCTION get_data_dir() RESULT(data_dir_path) - CHARACTER(LEN=default_path_length) :: data_dir_path + FUNCTION get_data_dir() RESULT(res) + CHARACTER(len=default_path_length) :: res - INTEGER :: stat + CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(:), & + POINTER :: path_f + INTEGER :: i + TYPE(C_PTR) :: path_c + INTERFACE + FUNCTION get_data_dir_c() BIND(C, name="get_data_dir") + IMPORT :: C_PTR + TYPE(C_PTR) :: get_data_dir_c + END FUNCTION get_data_dir_c + END INTERFACE - CALL GET_ENVIRONMENT_VARIABLE("CP2K_DATA_DIR", data_dir_path, status=stat) - IF (stat == 0) RETURN + path_c = get_data_dir_c() + CALL C_F_POINTER(path_c, path_f, shape=(/default_path_length/)) -#if defined(__DATA_DIR) - data_dir_path = __DATA_DIR -#else - data_dir_path = "" !data-dir not set -#endif + res = "" + DO i = 1, default_path_length + IF (path_f(i) == C_NULL_CHAR) RETURN + res(i:i) = path_f(i) + END DO + + CPABORT("CP2K_DATA_DIR path is too long") END FUNCTION get_data_dir