diff --git a/CMakeLists.txt b/CMakeLists.txt index 6342423936b32275cef3d88b671e28ec67739e03..2623232a7bbda553d3180fcdf13cc9e34ff99aea 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) @@ -15,46 +19,44 @@ 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 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") + 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() @@ -68,9 +70,7 @@ if(${CDI_NETCDF} OR netCDF_ROOT ) HAVE_LIBNC_DAP=${netCDF_FOUND} HAVE_NETCDF4=${netCDF_FOUND} ) - list(APPEND cdi_linked_libs netCDF::netcdf) - else() - message(WARNING "netcdf target not found, compiling without 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 @@ -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 26ea963f1b0e27f9204c6cf8a2473d665a556bda..e64b8de1af1b794fdc5e2b9d7876ec37f26044c9 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,95 +140,79 @@ 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) -add_library(cdilib - ${cdi_src_files} -# INSTALL_HEADERS_LIST cdi.h +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}) -add_library(cdilib::cdilib ALIAS cdilib) - -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")