From a7d18f6e2bf284b4a8f614e7936d5639a730ab77 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 13:43:17 +0100
Subject: [PATCH 01/15] Get the headers right

---
 src/CMakeLists.txt                            |  6 +++--
 src/util_arithmetic_expr.c                    |  2 +-
 ...hmetic_expr.hpp => util_arithmetic_expr.h} | 20 ++++++++++++++---
 src/util_arithmetic_expr.rl                   |  2 +-
 src/util_file.h                               | 16 ++++++++++++++
 src/util_hash.c                               |  2 ++
 src/util_hash.h                               | 16 ++++++++++++++
 .../c_test/ctest_util_arithmetic_expr.cpp     |  3 +--
 test/googletest/c_test/ctest_util_file.cpp    |  2 +-
 test/googletest/c_test/ctest_util_hash.cpp    |  2 +-
 test/googletest/include/external_function.hpp | 22 -------------------
 11 files changed, 60 insertions(+), 33 deletions(-)
 rename src/{util_arithmetic_expr.hpp => util_arithmetic_expr.h} (71%)
 create mode 100644 src/util_file.h
 create mode 100644 src/util_hash.h
 delete mode 100644 test/googletest/include/external_function.hpp

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d7db70a..0156a68 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -31,16 +31,18 @@ add_library(fortran-support
   mo_util_timer.f90
   nml_annotate.c
   util_arithmetic_expr.c
+  util_arithmetic_expr.h
   util_backtrace.c
+  util_backtrace.h
   util_file.c
+  util_file.h
   util_hash.c
+  util_hash.h
   util_stride.c
   util_string_parse.c
   util_sysinfo.c
   util_system.c
   util_timer.c
-  util_arithmetic_expr.hpp
-  util_backtrace.h
   ${CMAKE_CURRENT_BINARY_DIR}/config.h
 )
 
diff --git a/src/util_arithmetic_expr.c b/src/util_arithmetic_expr.c
index 01cf6b5..411944b 100644
--- a/src/util_arithmetic_expr.c
+++ b/src/util_arithmetic_expr.c
@@ -13,7 +13,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
-#include "util_arithmetic_expr.hpp"
+#include "util_arithmetic_expr.h"
 
 const char*  const priorities = "(;><;+-;/*;^";
 const char*  const left_assoc = "><+-/*^";
diff --git a/src/util_arithmetic_expr.hpp b/src/util_arithmetic_expr.h
similarity index 71%
rename from src/util_arithmetic_expr.hpp
rename to src/util_arithmetic_expr.h
index 8aa75f7..b3f3f5d 100644
--- a/src/util_arithmetic_expr.hpp
+++ b/src/util_arithmetic_expr.h
@@ -1,5 +1,9 @@
-#ifndef UTIL_ARITHMETIC_EXPR_HPP
-#define UTIL_ARITHMETIC_EXPR_HPP
+#ifndef UTIL_ARITHMETIC_EXPR_H
+#define UTIL_ARITHMETIC_EXPR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 #define MAX_BUF_LEN 1024
 #define NUM_FCT 9
@@ -42,4 +46,14 @@ int do_parse_infix(const char *in_parse_line, struct t_list *data);
 /* accessor function for function name strings */
 int get_fctname(const int id, char *string);
 
-#endif /* UTIL_ARITHMETIC_EXPR_HPP */
+/* returns the priority of an arithmetic operator */
+int priority(char op);
+
+/* returns the associativity of an arithmetic operator */
+int left_associative(char op);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // UTIL_ARITHMETIC_EXPR_H
diff --git a/src/util_arithmetic_expr.rl b/src/util_arithmetic_expr.rl
index 7bbfe6a..d2c8db6 100644
--- a/src/util_arithmetic_expr.rl
+++ b/src/util_arithmetic_expr.rl
@@ -11,7 +11,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
-#include "util_arithmetic_expr.hpp"
+#include "util_arithmetic_expr.h"
 
 const char*  const priorities = "(;><;+-;/*;^";
 const char*  const left_assoc = "><+-/*^";
diff --git a/src/util_file.h b/src/util_file.h
new file mode 100644
index 0000000..669a603
--- /dev/null
+++ b/src/util_file.h
@@ -0,0 +1,16 @@
+#ifndef UTIL_FILE_H
+#define UTIL_FILE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int util_islink(char *path);
+long int util_filesize(char *filename);
+int util_file_is_writable(char *filename);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // UTIL_FILE_H
diff --git a/src/util_hash.c b/src/util_hash.c
index 503723e..3105a8a 100644
--- a/src/util_hash.c
+++ b/src/util_hash.c
@@ -88,6 +88,8 @@
 
 #endif
 
+#include "util_hash.h"
+
 #define rot(x, k) (((x) << (k)) | ((x) >> (32 - (k))))
 
 /*
diff --git a/src/util_hash.h b/src/util_hash.h
new file mode 100644
index 0000000..f99f18b
--- /dev/null
+++ b/src/util_hash.h
@@ -0,0 +1,16 @@
+#ifndef UTIL_HASH_H
+#define UTIL_HASH_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+uint32_t util_hashword(const void *key, size_t length, uint32_t initval);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // UTIL_HASH_H
diff --git a/test/googletest/c_test/ctest_util_arithmetic_expr.cpp b/test/googletest/c_test/ctest_util_arithmetic_expr.cpp
index 922104d..401c815 100644
--- a/test/googletest/c_test/ctest_util_arithmetic_expr.cpp
+++ b/test/googletest/c_test/ctest_util_arithmetic_expr.cpp
@@ -1,7 +1,6 @@
 #include <gtest/gtest.h>
 
-#include <external_function.hpp>
-#include <util_arithmetic_expr.hpp>
+#include <util_arithmetic_expr.h>
 
 class UtilArithmeticExprTest : public ::testing::Test {
   protected:
diff --git a/test/googletest/c_test/ctest_util_file.cpp b/test/googletest/c_test/ctest_util_file.cpp
index 65ad9e2..bac068b 100644
--- a/test/googletest/c_test/ctest_util_file.cpp
+++ b/test/googletest/c_test/ctest_util_file.cpp
@@ -2,8 +2,8 @@
 
 #include <string>
 #include <path_config.h>
-#include <external_function.hpp>
 
+#include <util_file.h>
 
 class UtilFileTest : public ::testing::Test {};
 
diff --git a/test/googletest/c_test/ctest_util_hash.cpp b/test/googletest/c_test/ctest_util_hash.cpp
index 0d8cc05..eb128cc 100644
--- a/test/googletest/c_test/ctest_util_hash.cpp
+++ b/test/googletest/c_test/ctest_util_hash.cpp
@@ -3,7 +3,7 @@
 #include <stdexcept>
 #include <string>
 
-#include <external_function.hpp>
+#include <util_hash.h>
 
 class UtilHashCTest : public ::testing::Test {};
 
diff --git a/test/googletest/include/external_function.hpp b/test/googletest/include/external_function.hpp
deleted file mode 100644
index 85c4687..0000000
--- a/test/googletest/include/external_function.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef EXTERNAL_FUNCTION_HPP_
-#define EXTERNAL_FUNCTION_HPP_
-
-
-extern "C" {
-// util_arithmetic_expr.c
-int priority(char op);
-int left_associative(char op);
-int do_parse_infix(const char *in_parse_line, struct t_list *queue);
-int get_fctname(const int id, char *string);
-
-// util_file.c
-int util_islink(const char *path);
-long int util_filesize(char *filename);
-int util_file_is_writable(char *filename);
-
-// util_hash.c
-uint32_t util_hashword(const void *, size_t, uint32_t);
-}
-
-
-#endif  // EXTERNAL_FUNCTION_HPP_
\ No newline at end of file
-- 
GitLab


From 3811d48c8900b3161f6e14e890e8193402074097 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 15:01:04 +0100
Subject: [PATCH 02/15] Drop path_config.h.in

---
 test/googletest/c_test/CMakeLists.txt      |  2 --
 test/googletest/c_test/ctest_util_file.cpp | 28 +++++++++++++++-------
 test/googletest/c_test/path_config.h.in    |  1 -
 3 files changed, 19 insertions(+), 12 deletions(-)
 delete mode 100644 test/googletest/c_test/path_config.h.in

diff --git a/test/googletest/c_test/CMakeLists.txt b/test/googletest/c_test/CMakeLists.txt
index 598c2ee..e27f010 100644
--- a/test/googletest/c_test/CMakeLists.txt
+++ b/test/googletest/c_test/CMakeLists.txt
@@ -1,8 +1,6 @@
 add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp)
 add_icon_c_test(UtilHashTest ctest_util_hash.cpp)
 
-set(CurrentPath ${CMAKE_CURRENT_BINARY_DIR})
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/path_config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/path_config.h")
 file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/test.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
 file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/test.txt" "${CMAKE_CURRENT_BINARY_DIR}/link.txt" SYMBOLIC)
 add_icon_c_test(UtilFileTest ctest_util_file.cpp)
diff --git a/test/googletest/c_test/ctest_util_file.cpp b/test/googletest/c_test/ctest_util_file.cpp
index bac068b..a81b883 100644
--- a/test/googletest/c_test/ctest_util_file.cpp
+++ b/test/googletest/c_test/ctest_util_file.cpp
@@ -1,18 +1,18 @@
 #include <gtest/gtest.h>
 
 #include <string>
-#include <path_config.h>
 
 #include <util_file.h>
 
+static std::string working_dir = ".";
+
 class UtilFileTest : public ::testing::Test {};
 
 
 TEST_F(UtilFileTest, FileIsLink) {
-    std::string path = current_path;
-    std::string file_notlink = path + "/test.txt";
-    std::string file_islink = path + "/link.txt";
-    std::string file_error = "./something.txt";
+    std::string file_notlink = working_dir + "/test.txt";
+    std::string file_islink = working_dir + "/link.txt";
+    std::string file_error = working_dir + "/something.txt";
     char *file_cstr;
 
     file_cstr = &file_notlink[0];
@@ -25,8 +25,7 @@ TEST_F(UtilFileTest, FileIsLink) {
 
 
 TEST_F(UtilFileTest, CanGetFileSize) {
-    std::string path = current_path;
-    std::string file = path + "/test.txt";
+    std::string file = working_dir + "/test.txt";
 
     char *file_cstr;
     file_cstr = &file[0];
@@ -36,11 +35,22 @@ TEST_F(UtilFileTest, CanGetFileSize) {
 
 
 TEST_F(UtilFileTest, CheckFileWritable) {
-    std::string path = current_path;
-    std::string file = path + "/test.txt";
+    std::string file = working_dir + "/test.txt";
 
     char *file_cstr;
     file_cstr = &file[0];
 
     EXPECT_EQ(util_file_is_writable(file_cstr), 1);
 }
+
+int main(int argc, char** argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  if (argc > 1) {
+    working_dir = argv[1];
+  }
+
+  std::cout << "Working directory: " << working_dir << std::endl;
+
+  return RUN_ALL_TESTS();
+}
diff --git a/test/googletest/c_test/path_config.h.in b/test/googletest/c_test/path_config.h.in
deleted file mode 100644
index a3b62bb..0000000
--- a/test/googletest/c_test/path_config.h.in
+++ /dev/null
@@ -1 +0,0 @@
-#define current_path "@CurrentPath@"
-- 
GitLab


From 31400f1bb7c4021d297c9e8f47afc7433736c6d3 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 15:14:50 +0100
Subject: [PATCH 03/15] Avoid keeping a file in the repo

---
 test/googletest/c_test/CMakeLists.txt | 6 ++++--
 test/googletest/c_test/test.txt       | 1 -
 2 files changed, 4 insertions(+), 3 deletions(-)
 delete mode 100644 test/googletest/c_test/test.txt

diff --git a/test/googletest/c_test/CMakeLists.txt b/test/googletest/c_test/CMakeLists.txt
index e27f010..9e9351f 100644
--- a/test/googletest/c_test/CMakeLists.txt
+++ b/test/googletest/c_test/CMakeLists.txt
@@ -1,6 +1,8 @@
 add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp)
 add_icon_c_test(UtilHashTest ctest_util_hash.cpp)
 
-file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/test.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
-file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/test.txt" "${CMAKE_CURRENT_BINARY_DIR}/link.txt" SYMBOLIC)
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.txt"
+     "This is a test file for unit tests for util_file.c\n")
+file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/test.txt"
+     "${CMAKE_CURRENT_BINARY_DIR}/link.txt" SYMBOLIC)
 add_icon_c_test(UtilFileTest ctest_util_file.cpp)
diff --git a/test/googletest/c_test/test.txt b/test/googletest/c_test/test.txt
deleted file mode 100644
index 4b34f50..0000000
--- a/test/googletest/c_test/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a test file for unit tests for util_file.c
-- 
GitLab


From 93d22a17078efa901abf33a3e856bb874128ea0a Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 15:18:38 +0100
Subject: [PATCH 04/15] Clearer test file naming

---
 test/googletest/c_test/CMakeLists.txt      |  6 +++---
 test/googletest/c_test/ctest_util_file.cpp | 10 +++++-----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/test/googletest/c_test/CMakeLists.txt b/test/googletest/c_test/CMakeLists.txt
index 9e9351f..a58e99c 100644
--- a/test/googletest/c_test/CMakeLists.txt
+++ b/test/googletest/c_test/CMakeLists.txt
@@ -1,8 +1,8 @@
 add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp)
 add_icon_c_test(UtilHashTest ctest_util_hash.cpp)
 
-file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test.txt"
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/util_file_test.txt"
      "This is a test file for unit tests for util_file.c\n")
-file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/test.txt"
-     "${CMAKE_CURRENT_BINARY_DIR}/link.txt" SYMBOLIC)
+file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/util_file_test.txt"
+     "${CMAKE_CURRENT_BINARY_DIR}/util_file_link.txt" SYMBOLIC)
 add_icon_c_test(UtilFileTest ctest_util_file.cpp)
diff --git a/test/googletest/c_test/ctest_util_file.cpp b/test/googletest/c_test/ctest_util_file.cpp
index a81b883..6cef0e3 100644
--- a/test/googletest/c_test/ctest_util_file.cpp
+++ b/test/googletest/c_test/ctest_util_file.cpp
@@ -10,9 +10,9 @@ class UtilFileTest : public ::testing::Test {};
 
 
 TEST_F(UtilFileTest, FileIsLink) {
-    std::string file_notlink = working_dir + "/test.txt";
-    std::string file_islink = working_dir + "/link.txt";
-    std::string file_error = working_dir + "/something.txt";
+    std::string file_notlink = working_dir + "/util_file_test.txt";
+    std::string file_islink = working_dir + "/util_file_link.txt";
+    std::string file_error = working_dir + "/util_file_noexist.txt";
     char *file_cstr;
 
     file_cstr = &file_notlink[0];
@@ -25,7 +25,7 @@ TEST_F(UtilFileTest, FileIsLink) {
 
 
 TEST_F(UtilFileTest, CanGetFileSize) {
-    std::string file = working_dir + "/test.txt";
+    std::string file = working_dir + "/util_file_test.txt";
 
     char *file_cstr;
     file_cstr = &file[0];
@@ -35,7 +35,7 @@ TEST_F(UtilFileTest, CanGetFileSize) {
 
 
 TEST_F(UtilFileTest, CheckFileWritable) {
-    std::string file = working_dir + "/test.txt";
+    std::string file = working_dir + "/util_file_test.txt";
 
     char *file_cstr;
     file_cstr = &file[0];
-- 
GitLab


From c858dd81d46a0720e227b69642430b1c0bb27c27 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 15:23:59 +0100
Subject: [PATCH 05/15] Remove yet unused CMake macros

---
 cmake/gtest_helper.cmake | 18 ------------------
 1 file changed, 18 deletions(-)

diff --git a/cmake/gtest_helper.cmake b/cmake/gtest_helper.cmake
index bcd4c73..cec3143 100644
--- a/cmake/gtest_helper.cmake
+++ b/cmake/gtest_helper.cmake
@@ -6,21 +6,3 @@ macro(add_icon_c_test test_name file_name)
     set_property(TEST "CTest_${test_name}"
         PROPERTY LABELS C)
 endmacro()
-
-macro(add_icon_fortran_test test_name file_name)
-    add_executable("FTest_${test_name}" ${file_name})
-    target_include_directories("FTest_${test_name}" SYSTEM AFTER PUBLIC "${PROJECT_SOURCE_DIR}/test/googletest/include")
-    target_link_libraries("FTest_${test_name}" PRIVATE FTest_C_Binding fortran-support gtest gtest_main)
-    add_test(NAME "FTest_${test_name}" COMMAND "FTest_${test_name}")
-    set_property(TEST "FTest_${test_name}"
-        PROPERTY LABELS Fortran)
-endmacro()
-
-macro(add_icon_fortran_c_test test_name file_name)
-    add_executable("FCTest_${test_name}" ${file_name})
-    target_include_directories("FCTest_${test_name}" SYSTEM AFTER PUBLIC "${PROJECT_SOURCE_DIR}/test/googletest/include")
-    target_link_libraries("FCTest_${test_name}" PRIVATE FTest_C_Binding fortran-support gtest gtest_main)
-    add_test(NAME "FCTest_${test_name}" COMMAND "FCTest_${test_name}")
-    set_property(TEST "FCTest_${test_name}"
-        PROPERTY LABELS Fortran/C)
-endmacro()
-- 
GitLab


From d680b0d7ae3a8f4a93e7b162c879e51438561cc5 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 15:25:30 +0100
Subject: [PATCH 06/15] Get test dependencies right

---
 cmake/gtest_helper.cmake | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/cmake/gtest_helper.cmake b/cmake/gtest_helper.cmake
index cec3143..9c11d98 100644
--- a/cmake/gtest_helper.cmake
+++ b/cmake/gtest_helper.cmake
@@ -1,8 +1,6 @@
 macro(add_icon_c_test test_name file_name)
     add_executable("CTest_${test_name}" ${file_name})
-    target_include_directories("CTest_${test_name}" SYSTEM AFTER PUBLIC "${PROJECT_SOURCE_DIR}/test/googletest/include" ${CMAKE_CURRENT_BINARY_DIR})
-    target_link_libraries("CTest_${test_name}" PRIVATE fortran-support gtest gtest_main)
+    target_link_libraries("CTest_${test_name}" PRIVATE fortran-support::fortran-support GTest::gtest_main)
     add_test(NAME "CTest_${test_name}" COMMAND "CTest_${test_name}")
-    set_property(TEST "CTest_${test_name}"
-        PROPERTY LABELS C)
+    set_property(TEST "CTest_${test_name}" PROPERTY LABELS C)
 endmacro()
-- 
GitLab


From 1fbcbb6527257190599b698a509ef747e1f0199c Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 15:39:06 +0100
Subject: [PATCH 07/15] Set C++ standard for the tests

---
 cmake/gtest_helper.cmake | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cmake/gtest_helper.cmake b/cmake/gtest_helper.cmake
index 9c11d98..f5a061d 100644
--- a/cmake/gtest_helper.cmake
+++ b/cmake/gtest_helper.cmake
@@ -3,4 +3,5 @@ macro(add_icon_c_test test_name file_name)
     target_link_libraries("CTest_${test_name}" PRIVATE fortran-support::fortran-support GTest::gtest_main)
     add_test(NAME "CTest_${test_name}" COMMAND "CTest_${test_name}")
     set_property(TEST "CTest_${test_name}" PROPERTY LABELS C)
+    set_target_properties("CTest_${test_name}" PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)
 endmacro()
-- 
GitLab


From f9cc3bd6fe4e24e8464f059b49cb0a9fe8bfe5c9 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 17:47:04 +0100
Subject: [PATCH 08/15] CMake script formatting

---
 test/fortran/CMakeLists.txt    | 15 +++++++--------
 test/googletest/CMakeLists.txt |  2 +-
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/test/fortran/CMakeLists.txt b/test/fortran/CMakeLists.txt
index 9ea9900..eb911f3 100644
--- a/test/fortran/CMakeLists.txt
+++ b/test/fortran/CMakeLists.txt
@@ -10,16 +10,15 @@ FetchContent_Declare(fortutf
 FetchContent_MakeAvailable(fortutf)
 message(CHECK_PASS "done")
 
-SET(FORTUTF_PROJECT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR})
-SET(FORTUTF_PROJECT_SRC_LIBRARY ${PROJECT_NAME}::fortran-support)
-SET(FORTUTF_PROJECT_SRC_FILES helpers.f90)
+set(FORTUTF_PROJECT_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(FORTUTF_PROJECT_SRC_LIBRARY fortran-support::fortran-support)
+set(FORTUTF_PROJECT_SRC_FILES helpers.f90)
 
-INCLUDE(${fortutf_SOURCE_DIR}/cmake/fortutf.cmake)
+include("${fortutf_SOURCE_DIR}/cmake/fortutf.cmake")
 
 # We have to prevent FortUTF from generating invalid Fortran code:
-SET(project_name ${PROJECT_NAME})
+set(project_name ${PROJECT_NAME})
 string(REPLACE "-" "_" PROJECT_NAME ${PROJECT_NAME})
 FortUTF_Find_Tests()
-SET(PROJECT_NAME ${project_name})
-add_test(NAME FortUTF_UnitTest
-    COMMAND fortran_support_Tests)
+set(PROJECT_NAME ${project_name})
+add_test(NAME FortUTF_UnitTest COMMAND fortran_support_Tests)
diff --git a/test/googletest/CMakeLists.txt b/test/googletest/CMakeLists.txt
index c9e00d0..dabc9d5 100644
--- a/test/googletest/CMakeLists.txt
+++ b/test/googletest/CMakeLists.txt
@@ -1,3 +1,3 @@
-include(${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake)
+include("${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake")
 
 add_subdirectory(c_test)
-- 
GitLab


From 3df48ac04a6dbc2e2282d31b50297c9fbb62b350 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 17:49:46 +0100
Subject: [PATCH 09/15] Rename test/googletest/c_test to test/c

---
 test/CMakeLists.txt                                          | 2 +-
 test/{googletest/c_test => c}/CMakeLists.txt                 | 2 ++
 test/{googletest/c_test => c}/ctest_util_arithmetic_expr.cpp | 0
 test/{googletest/c_test => c}/ctest_util_file.cpp            | 0
 test/{googletest/c_test => c}/ctest_util_hash.cpp            | 0
 test/googletest/CMakeLists.txt                               | 3 ---
 6 files changed, 3 insertions(+), 4 deletions(-)
 rename test/{googletest/c_test => c}/CMakeLists.txt (87%)
 rename test/{googletest/c_test => c}/ctest_util_arithmetic_expr.cpp (100%)
 rename test/{googletest/c_test => c}/ctest_util_file.cpp (100%)
 rename test/{googletest/c_test => c}/ctest_util_hash.cpp (100%)
 delete mode 100644 test/googletest/CMakeLists.txt

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index b66ae95..4d4b8f6 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -17,4 +17,4 @@ if(NOT GTest_FOUND)
 endif()
 
 add_subdirectory(fortran)
-add_subdirectory(googletest)
+add_subdirectory(c)
diff --git a/test/googletest/c_test/CMakeLists.txt b/test/c/CMakeLists.txt
similarity index 87%
rename from test/googletest/c_test/CMakeLists.txt
rename to test/c/CMakeLists.txt
index a58e99c..dd62743 100644
--- a/test/googletest/c_test/CMakeLists.txt
+++ b/test/c/CMakeLists.txt
@@ -1,3 +1,5 @@
+include("${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake")
+
 add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp)
 add_icon_c_test(UtilHashTest ctest_util_hash.cpp)
 
diff --git a/test/googletest/c_test/ctest_util_arithmetic_expr.cpp b/test/c/ctest_util_arithmetic_expr.cpp
similarity index 100%
rename from test/googletest/c_test/ctest_util_arithmetic_expr.cpp
rename to test/c/ctest_util_arithmetic_expr.cpp
diff --git a/test/googletest/c_test/ctest_util_file.cpp b/test/c/ctest_util_file.cpp
similarity index 100%
rename from test/googletest/c_test/ctest_util_file.cpp
rename to test/c/ctest_util_file.cpp
diff --git a/test/googletest/c_test/ctest_util_hash.cpp b/test/c/ctest_util_hash.cpp
similarity index 100%
rename from test/googletest/c_test/ctest_util_hash.cpp
rename to test/c/ctest_util_hash.cpp
diff --git a/test/googletest/CMakeLists.txt b/test/googletest/CMakeLists.txt
deleted file mode 100644
index dabc9d5..0000000
--- a/test/googletest/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-include("${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake")
-
-add_subdirectory(c_test)
-- 
GitLab


From 52566e0461efffbd1f93f91f7f76b72ecfda38f9 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 17:54:09 +0100
Subject: [PATCH 10/15] Check and fetch GTest where needed

---
 test/CMakeLists.txt   | 18 ------------------
 test/c/CMakeLists.txt | 18 ++++++++++++++++++
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 4d4b8f6..6eadca6 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,20 +1,2 @@
-include(FetchContent)
-enable_language(CXX)
-
-find_package(GTest 1.13)
-if(NOT GTest_FOUND)
-  message(CHECK_START "Fetching external GTest")
-  if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24")
-    cmake_policy(SET CMP0135 NEW)
-  endif()
-  FetchContent_Declare(googletest
-    URL https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz
-    URL_HASH MD5=95b29f0038ec84a611df951d74d99897
-  )
-  set(INSTALL_GTEST OFF CACHE BOOL "Do not install GTest")
-  FetchContent_MakeAvailable(googletest)
-  message(CHECK_PASS "done")
-endif()
-
 add_subdirectory(fortran)
 add_subdirectory(c)
diff --git a/test/c/CMakeLists.txt b/test/c/CMakeLists.txt
index dd62743..5926488 100644
--- a/test/c/CMakeLists.txt
+++ b/test/c/CMakeLists.txt
@@ -1,3 +1,21 @@
+enable_language(CXX)
+
+find_package(GTest 1.13)
+if(NOT GTest_FOUND)
+  message(CHECK_START "Fetching external GTest")
+  if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.24")
+    cmake_policy(SET CMP0135 NEW)
+  endif()
+  include(FetchContent)
+  FetchContent_Declare(googletest
+    URL https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz
+    URL_HASH MD5=95b29f0038ec84a611df951d74d99897
+  )
+  set(INSTALL_GTEST OFF CACHE BOOL "Do not install GTest")
+  FetchContent_MakeAvailable(googletest)
+  message(CHECK_PASS "done")
+endif()
+
 include("${PROJECT_SOURCE_DIR}/cmake/gtest_helper.cmake")
 
 add_icon_c_test(UtilArithmeticExprTest ctest_util_arithmetic_expr.cpp)
-- 
GitLab


From 539825fe1f1207321eb09a245dba07fcb3c308bd Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 19:18:46 +0100
Subject: [PATCH 11/15] Fix 'make test' when -DBUILD_TESTING=OFF

---
 CMakeLists.txt | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 95b1272..d7da026 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.18)
 project(fortran-support VERSION 0.1.0 LANGUAGES Fortran C)
 
 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
-option(BUILD_TESTING "Generate build files for unit tests" ON)
+option(BUILD_TESTING "Build tests" ON)
 
 if(NOT CMAKE_BUILD_TYPE)
   set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
@@ -12,10 +12,17 @@ if(NOT CMAKE_BUILD_TYPE)
 endif(NOT CMAKE_BUILD_TYPE)
 
 include(GNUInstallDirs)
-include(CTest)
 
 add_subdirectory(src)
 
+include(CTest)
+if(BUILD_TESTING)
+  add_subdirectory(test)
+else()
+  # Allow for 'make test' even if the tests are disabled:
+  enable_testing()
+endif()
+
 export(
   EXPORT "${PROJECT_NAME}-targets"
   FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake"
@@ -49,11 +56,6 @@ install(
     "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake"
 )
 
-if(BUILD_TESTING)
-  enable_testing()
-  add_subdirectory(test)
-endif()
-
 include("${PROJECT_SOURCE_DIR}/cmake/list_sources.cmake")
 
 # Collect source files of the project:
-- 
GitLab


From c26c782ebf62670445c1e9be1129476b4c51104a Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 20:08:21 +0100
Subject: [PATCH 12/15] Avoid building libFortUTF

---
 test/fortran/CMakeLists.txt | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/test/fortran/CMakeLists.txt b/test/fortran/CMakeLists.txt
index eb911f3..ce45562 100644
--- a/test/fortran/CMakeLists.txt
+++ b/test/fortran/CMakeLists.txt
@@ -7,7 +7,13 @@ FetchContent_Declare(fortutf
   URL https://github.com/artemis-beta/FortUTF/archive/10ea512e4b21fe9157ed838b037210874fbe92eb.tar.gz
   URL_HASH MD5=f1a5f9733553b32f2c6297c45b7c3f13
 )
-FetchContent_MakeAvailable(fortutf)
+# We do not need libFortUTF and want to avoid the redundant building of the
+# library. Therefore, we do not call FetchContent_MakeAvailable(fortutf), which
+# adds ${fortutf_SOURCE_DIR} as a subdirectory:
+FetchContent_GetProperties(fortutf)
+if(NOT fortutf_POPULATED)
+  FetchContent_Populate(fortutf)
+endif()
 message(CHECK_PASS "done")
 
 set(FORTUTF_PROJECT_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
-- 
GitLab


From ae897cbc6d2351e099396b0ec5e08098de773ff4 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Mon, 23 Oct 2023 20:43:00 +0200
Subject: [PATCH 13/15] Targeted header and module search path flags

---
 src/CMakeLists.txt | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0156a68..f44d1e8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -62,12 +62,17 @@ set_target_properties(fortran-support
 
 target_include_directories(fortran-support
   PUBLIC
-    $<BUILD_INTERFACE:${Fortran_MODULE_DIRECTORY}>
-    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+# Path to the Fortran modules:
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${Fortran_MODULE_DIRECTORY}>>
+    $<INSTALL_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${CMAKE_INSTALL_INCLUDEDIR}>>
   INTERFACE
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+# Path to the internal C/C++ headers (for testing):
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_SOURCE_DIR}>>
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}>>
   PRIVATE
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
+# Path to config.h (for C and C++ only):
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_BINARY_DIR}>>
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_BINARY_DIR}>>
 )
 
 install(
-- 
GitLab


From 56ff1ec3f21ac85cd956ae1de888aa19ebb75d0c Mon Sep 17 00:00:00 2001
From: Terry Cojean <terry.cojean@kit.edu>
Date: Thu, 26 Oct 2023 08:59:54 +0000
Subject: [PATCH 14/15] Collapse the generator expressions

---
 src/CMakeLists.txt | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f44d1e8..bedf0a3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -67,12 +67,10 @@ target_include_directories(fortran-support
     $<INSTALL_INTERFACE:$<$<COMPILE_LANGUAGE:Fortran>:${CMAKE_INSTALL_INCLUDEDIR}>>
   INTERFACE
 # Path to the internal C/C++ headers (for testing):
-    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_SOURCE_DIR}>>
-    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}>>
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_SOURCE_DIR}>>
   PRIVATE
 # Path to config.h (for C and C++ only):
-    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_BINARY_DIR}>>
-    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_BINARY_DIR}>>
+    $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C,CXX>:${CMAKE_CURRENT_BINARY_DIR}>>
 )
 
 install(
-- 
GitLab


From 182493be190c665660aa18717b07bc5662059ab6 Mon Sep 17 00:00:00 2001
From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de>
Date: Tue, 7 Nov 2023 20:43:39 +0100
Subject: [PATCH 15/15] Prevent GTest from polluting the top build directory

---
 test/c/CMakeLists.txt | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/test/c/CMakeLists.txt b/test/c/CMakeLists.txt
index 5926488..953f455 100644
--- a/test/c/CMakeLists.txt
+++ b/test/c/CMakeLists.txt
@@ -11,8 +11,19 @@ if(NOT GTest_FOUND)
     URL https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz
     URL_HASH MD5=95b29f0038ec84a611df951d74d99897
   )
-  set(INSTALL_GTEST OFF CACHE BOOL "Do not install GTest")
+  set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest")
+  set(BUILD_GMOCK OFF CACHE BOOL "Do not build the googlemock subproject")
   FetchContent_MakeAvailable(googletest)
+  # GTest puts its build artifacts to ${CMAKE_BINARY_DIR} instead of
+  # ${CMAKE_CURRENT_BINARY_DIR}. Therefore, we have to make it behave:
+  set_target_properties(gtest_main gtest
+    PROPERTIES
+      RUNTIME_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin"
+      LIBRARY_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
+      ARCHIVE_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
+      PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/bin"
+      COMPILE_PDB_OUTPUT_DIRECTORY "${googletest_BINARY_DIR}/lib"
+  )
   message(CHECK_PASS "done")
 endif()
 
-- 
GitLab