From 72c71a78d103b421755e7635ca725958268d4d3f Mon Sep 17 00:00:00 2001
From: Oliver Heidmann <oliver.heidmann@mpimet.mpg.de>
Date: Mon, 3 Mar 2025 12:01:09 +0100
Subject: [PATCH 1/4] if eccodes option enables: make eccodes required, removed
 not reachable else statements

---
 CMakeLists.txt | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 634242393..015d24df8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -50,11 +50,9 @@ endif()
 # ecCodes
 option(CDI_ECCODES "Use the eccodes library [default=ON]" ON)
 if(${CDI_ECCODES} OR eccodes_ROOT)
-  find_package(eccodes)
+  find_package(eccodes REQUIRED)
   if (${eccodes_FOUND})
     list(APPEND cdi_linked_libs eccodes)
-  else()
-    message(WARNING "eccodes not found, compiling without eccodes")
   endif ()
 endif()
 
@@ -69,8 +67,6 @@ if(${CDI_NETCDF} OR netCDF_ROOT )
       HAVE_NETCDF4=${netCDF_FOUND}
     )
     list(APPEND cdi_linked_libs netCDF::netcdf)
-  else()
-    message(WARNING "netcdf target not found, compiling without netcdf")
   endif ()
 endif()
 
-- 
GitLab


From 4c2a5cd9ef642e714e035a56d812e226885e39a5 Mon Sep 17 00:00:00 2001
From: Oliver Heidmann <oliver.heidmann@mpimet.mpg.de>
Date: Mon, 3 Mar 2025 15:15:18 +0100
Subject: [PATCH 2/4] CMake: fixed typo, moved library declaration to main
 CMake file, added compile commands

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

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 015d24df8..fd2272523 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,12 @@
 cmake_minimum_required( VERSION 3.27 FATAL_ERROR )
 
-message(VERBOSE "Entering libcdi")
+message(VERBOSE "Entering cdilib")
 project(cdilib VERSION 2.5.1 LANGUAGES C )
 set(CMAKE_C_STANDARD 11)
+set(CMAKE_EXPORT_COMPILE_COMMANDS YES)
+
+add_library(cdilib)
+add_library(cdilib::cdilib ALIAS cdilib)
 
 include(CTest)
 include(CheckIncludeFile)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 26ea963f1..250f7a928 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -199,16 +199,12 @@ endif ()
 # Support exporting all symbolds on Windows
 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
 
-add_library(cdilib
-  ${cdi_src_files}
-#  INSTALL_HEADERS_LIST  cdi.h
 )
 
 target_include_directories(cdilib PRIVATE "${PROJECT_BINARY_DIR}/src/config.h")
 target_link_libraries(cdilib ${cdi_linked_libs})
 target_compile_definitions(cdilib PRIVATE PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}" ${cdi_compile_defs})
 
-add_library(cdilib::cdilib ALIAS cdilib)
 
 include(GNUInstallDirs)
 install(FILES cdi.h calendar.h cdi_datetime.h julian_date.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
-- 
GitLab


From 0e8861e086a535cc6bb2cfedb29794dc618f1ed2 Mon Sep 17 00:00:00 2001
From: Oliver Heidmann <oliver.heidmann@mpimet.mpg.de>
Date: Mon, 3 Mar 2025 15:16:28 +0100
Subject: [PATCH 3/4] removed usage of lists and replaced it by target specific
 cmake routines

---
 CMakeLists.txt     |  24 +++++-----
 src/CMakeLists.txt | 114 ++++++++++++++++++++++++---------------------
 2 files changed, 74 insertions(+), 64 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index fd2272523..0f2fd15fc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,36 +19,34 @@ if(${CDI_PTHREAD})
   include(FindThreads)
   find_package(Threads REQUIRED)
   set_target_properties(Threads::Threads PROPERTIES THREADS_PREFER_PTHREAD_FLAG TRUE)
-  list(APPEND cdi_compile_defs HAVE_PTHREAD=1)
-  list(APPEND cdi_linked_libs pthread)
+  target_compile_definitions(cdilib PRIVATE HAVE_PTHREAD=1)
+  target_link_libraries(cdilib pthread)
 endif()
 
 # enable default internal libs
 option(CDI_LIBGRIB "GRIB support [default=ON]" ON)
 if(${CDI_LIBGRIB})
-  list(APPEND cdi_compile_defs
-       HAVE_LIBGRIB=1
-       HAVE_LIBGRIB_API=1)
+  target_compile_definitions(cdilib PRIVATE HAVE_LIBGRIB=1 HAVE_LIBGRIB_API=1)
 endif()
 
 option(CDI_LIBGRIBEX "Use the CGRIBEX library [default=ON]" ON)
 if(${CDI_LIBGRIBEX})
-  list(APPEND cdi_compile_defs LIBCGRIBEX=1)
+  target_compile_definitions(cdilib PRIVATE LIBCGRIBEX=1)
 endif()
 
 option(CDI_EXTRA "Use the extra library [default=ON]" ON)
 if(${CDI_EXTRA})
-  list(APPEND cdi_compile_defs HAVE_LIBEXTRA=1)
+  target_compile_definitions(cdilib PRIVATE HAVE_LIBEXTRA=1)
 endif()
 
 option(CDI_IEG "Use the extra library [default=ON]" ON)
 if(${CDI_IEG})
-  list(APPEND cdi_compile_defs HAVE_LIBIEG=1)
+  target_compile_definitions(cdilib PRIVATE HAVE_LIBIEG=1)
 endif()
 
 option(CDI_SERVICE "Use the extra library [default=ON]" ON)
 if(${CDI_SERVICE})
-  list(APPEND cdi_compile_defs HAVE_LIBSERVICE=1)
+  target_compile_definitions(cdilib PRIVATE HAVE_LIBSERVICE=1)
 endif()
 
 # ecCodes
@@ -56,7 +54,9 @@ option(CDI_ECCODES "Use the eccodes library [default=ON]" ON)
 if(${CDI_ECCODES} OR eccodes_ROOT)
   find_package(eccodes REQUIRED)
   if (${eccodes_FOUND})
-    list(APPEND cdi_linked_libs eccodes)
+    target_compile_definitions(cdilib PRIVATE HAVE_LIBGRIB_API=${eccodes_FOUND})
+    message(VERBOSE "added compile definition HAVE_LIBGRIB_API=${eccodes_FOUND}")
+    target_link_libraries(cdilib eccodes)
   endif ()
 endif()
 
@@ -70,7 +70,7 @@ if(${CDI_NETCDF} OR netCDF_ROOT )
       HAVE_LIBNC_DAP=${netCDF_FOUND}
       HAVE_NETCDF4=${netCDF_FOUND}
     )
-    list(APPEND cdi_linked_libs netCDF::netcdf)
+    target_link_libraries(cdilib netCDF::netcdf)
   endif ()
 endif()
 
@@ -78,7 +78,7 @@ message(VERBOSE "looking for config.h in: ${PROJECT_BINARY_DIR}/src")
 
 #adding subdirectories
 ## lib and general files
-list(APPEND cdi_compile_defs CDI=1 CDI_SIZE_TYPE=size_t PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}")
+target_compile_definitions(cdilib PRIVATE CDI=1 CDI_SIZE_TYPE=size_t PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}")
 add_subdirectory(src)
 
 #app
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 250f7a928..1fc148b5e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,5 @@
-list( APPEND cdi_src_files
+
+target_sources(cdilib PRIVATE
   async_worker.c
   async_worker.h
   basetime.c
@@ -139,69 +140,78 @@ list( APPEND cdi_src_files
   zaxis.c
   zaxis.h
 )
-list( APPEND cdi_pio_files
-  cdipio.h
-  pio.c
-  pio.h
-  pio_cdf_int.c
-  pio_cdf_int.h
-  pio_client.c
-  pio_client.h
-  pio_comm.c
-  pio_comm.h
-  pio_conf.c
-  pio_conf.h
-  pio_dbuffer.c
-  pio_dbuffer.h
-  pio_dist_grid.c
-  pio_dist_grid.h
-  pio_id_set.h
-  pio_idxlist_cache.c
-  pio_idxlist_cache.h
-  pio_impl.h
-  pio_interface.c
-  pio_interface.h
-  pio_mpi_fw_at_all.c
-  pio_mpi_fw_at_reblock.c
-  pio_mpi_fw_ordered.c
-  pio_mpinonb.c
-  pio_posixasynch.c
-  pio_posixfpguardsendrecv.c
-  pio_posixnonb.c
-  pio_record_send.c
-  pio_roles.c
-  pio_rpc.c
-  pio_rpc.h
-  pio_serialize.c
-  pio_serialize.h
-  pio_server.c
-  pio_server.h
-  pio_util.c
-  pio_util.h
-  pio_xmap_cache.c
-  pio_xmap_cache.h
-)
 
-list( APPEND cdi_unknown
-  cfortran.h
-  getline.c
-  make_fint.c
-  resource_unpack.c
-  resource_unpack.h
-)
+option(CDI_BUILD_PIO "Build unknown sources in libcdi" OFF)
+mark_as_advanced(CDI_BUILD_PIO)
+if (CDI_BUILD_PIO)
+  target_sources(cdilib PRIVATE
+    cdipio.h
+    pio.c
+    pio.h
+    pio_cdf_int.c
+    pio_cdf_int.h
+    pio_client.c
+    pio_client.h
+    pio_comm.c
+    pio_comm.h
+    pio_conf.c
+    pio_conf.h
+    pio_dbuffer.c
+    pio_dbuffer.h
+    pio_dist_grid.c
+    pio_dist_grid.h
+    pio_id_set.h
+    pio_idxlist_cache.c
+    pio_idxlist_cache.h
+    pio_impl.h
+    pio_interface.c
+    pio_interface.h
+    pio_mpi_fw_at_all.c
+    pio_mpi_fw_at_reblock.c
+    pio_mpi_fw_ordered.c
+    pio_mpinonb.c
+    pio_posixasynch.c
+    pio_posixfpguardsendrecv.c
+    pio_posixnonb.c
+    pio_record_send.c
+    pio_roles.c
+    pio_rpc.c
+    pio_rpc.h
+    pio_serialize.c
+    pio_serialize.h
+    pio_server.c
+    pio_server.h
+    pio_util.c
+    pio_util.h
+    pio_xmap_cache.c
+    pio_xmap_cache.h
+  )
+endif()
 
 option(CDI_BUILD_UNKNOWN "Build unknown sources in libcdi" ON)
 mark_as_advanced(CDI_BUILD_UNKNOWN)
 if (CDI_BUILD_UNKNOWN)
-  list(APPEND cdi_src_files ${cdi_unknown})
+  target_sources( cdilib PRIVATE
+    cfortran.h
+    getline.c
+    make_fint.c
+    resource_unpack.c
+    resource_unpack.h
+  )
 endif ()
 
-# Support exporting all symbolds on Windows
+# Support exporting all symbols on Windows
 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
 
+set_property(TARGET cdilib PROPERTY CDI_INSTALL_HEADERS
+  ${CMAKE_CURRENT_SOURCE_DIR}/cdi.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/calendar.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/cdi_datetime.h
+  ${CMAKE_CURRENT_SOURCE_DIR}/julian_date.h
 )
 
 target_include_directories(cdilib PRIVATE "${PROJECT_BINARY_DIR}/src/config.h")
+
 target_link_libraries(cdilib ${cdi_linked_libs})
 target_compile_definitions(cdilib PRIVATE PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}" ${cdi_compile_defs})
 
-- 
GitLab


From 29485a63f474d1a12adaebcb1cf7952ba9832f32 Mon Sep 17 00:00:00 2001
From: Oliver Heidmann <oliver.heidmann@mpimet.mpg.de>
Date: Mon, 3 Mar 2025 15:18:27 +0100
Subject: [PATCH 4/4] moved install logic into main file

---
 CMakeLists.txt     | 30 ++++++++++++++++++++++++++++++
 src/CMakeLists.txt | 21 ---------------------
 2 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0f2fd15fc..2623232a7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -91,3 +91,33 @@ endif ()
 if (BUILD_TESTING)
   add_subdirectory(tests)
 endif ()
+
+# --- Installation
+# packages required for installation
+include(GNUInstallDirs)
+include(CMakePackageConfigHelpers)
+
+install(TARGETS cdilib
+  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+
+get_target_property(cdi_install_files cdilib CDI_INSTALL_HEADERS)
+install(FILES ${cdi_install_files} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+
+# -- create configuration files
+configure_package_config_file(
+  "${CMAKE_CURRENT_SOURCE_DIR}/src/cmake/cdi/cdi-config.cmake.in" "${CMAKE_BINARY_DIR}/cmake/cdi-config.cmake"
+  INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cdi")
+write_basic_package_version_file(
+  "${CMAKE_BINARY_DIR}/cmake/cdi-config-version.cmake"
+  VERSION "${PACKAGE_VERSION}"
+  COMPATIBILITY SameMajorVersion)
+
+#Install CMake configuration files to 
+install(
+  FILES
+  "${CMAKE_BINARY_DIR}/cmake/cdi-config.cmake"
+  "${CMAKE_BINARY_DIR}/cmake/cdi-config-version.cmake"
+  DESTINATION
+  "${CMAKE_INSTALL_LIBDIR}/cmake/cdi")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1fc148b5e..e64b8de1a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -216,24 +216,3 @@ target_link_libraries(cdilib ${cdi_linked_libs})
 target_compile_definitions(cdilib PRIVATE PACKAGE_NAME="${PROJECT_NAME}" VERSION="${CMAKE_PROJECT_VERSION}" ${cdi_compile_defs})
 
 
-include(GNUInstallDirs)
-install(FILES cdi.h calendar.h cdi_datetime.h julian_date.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
-install(TARGETS cdilib
-  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
-  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
-  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
-
-include(CMakePackageConfigHelpers)
-configure_package_config_file(
-  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cdi/cdi-config.cmake.in" "${CMAKE_BINARY_DIR}/cmake/cdi-config.cmake"
-  INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/cdi")
-write_basic_package_version_file(
-  "${CMAKE_BINARY_DIR}/cmake/cdi-config-version.cmake"
-  VERSION "${PACKAGE_VERSION}"
-  COMPATIBILITY SameMajorVersion)
-install(
-  FILES
-    "${CMAKE_BINARY_DIR}/cmake/cdi-config.cmake"
-    "${CMAKE_BINARY_DIR}/cmake/cdi-config-version.cmake"
-  DESTINATION
-    "${CMAKE_INSTALL_LIBDIR}/cmake/cdi")
-- 
GitLab