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