diff --git a/cmake/SpecMiCPDepends.cmake b/cmake/SpecMiCPDepends.cmake index 88dbfad..f040af6 100644 --- a/cmake/SpecMiCPDepends.cmake +++ b/cmake/SpecMiCPDepends.cmake @@ -1,31 +1,42 @@ # Eigen # ----- find_package(Eigen3 REQUIRED) # This module comes from the Eigen3 Package message(STATUS "Eigen3 version ${EIGEN3_VERSION}") # optional find_package(Eigen3Unsupported) add_library(Eigen::eigen INTERFACE IMPORTED) set_property(TARGET Eigen::eigen PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${EIGEN3_INCLUDE_DIR}) # HDF5 # ---- # HDF5 is required and used by all modules for output # # Only the C serial API is used find_package(HDF5 REQUIRED COMPONENTS C) add_library(HDF5::hdf5 UNKNOWN IMPORTED) set_property(TARGET HDF5::hdf5 PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${HDF5_INCLUDE_DIRS} ) set_property(TARGET HDF5::hdf5 PROPERTY IMPORTED_LOCATION ${HDF5_C_LIBRARY_hdf5} ) + +# Yaml-cpp +# -------- + +# YAML-cpp library is required and used by all modules for configuration +# and data storage + +# YAML-CPP does not provide a CMake find module. +# Instead, we use pkgconfig +include(FindPkgConfig) +pkg_check_modules(YAML REQUIRED IMPORTED_TARGET yaml-cpp>=0.5) diff --git a/cmake/SpecMiCPDependsInternal.cmake b/cmake/SpecMiCPDependsInternal.cmake index d6adbbb..b4e1cb1 100644 --- a/cmake/SpecMiCPDependsInternal.cmake +++ b/cmake/SpecMiCPDependsInternal.cmake @@ -1,74 +1,63 @@ # This file contains internal dependancy that are not needed by projects using # the library # OpenMP #------- # not required but recommended in release mode if(SPECMICP_USE_OPENMP) find_package(OpenMP) if (OPENMP_FOUND) set(SPECMICP_HAVE_OPENMP ON CACHE BOOL "True if SpecMiCP uses openmp") endif(OPENMP_FOUND) endif() -# Yaml-cpp -# -------- - -# YAML-cpp library is required and used by all modules for configuration -# and data storage - -# YAML-CPP does not provide a CMake find module. -# Instead, we use pkgconfig -include(FindPkgConfig) -pkg_check_modules(YAML REQUIRED IMPORTED_TARGET yaml-cpp>=0.5) - # libc functions required # ----------------------- # note : most of this functions are required by specmicp_common/filesystem.cpp # just a friendly warning if(NOT UNIX) message(WARNING "Not tested on non linux platform ! Probably won't work") endif() include(CheckIncludeFile) include(CheckFunctionExists) # just a quick macro to check if a required include exist macro(check_required_include name var) CHECK_INCLUDE_FILE( ${name} ${var} ) if (NOT ${var}) message(SEND_ERROR "Missing required include ${name}") endif() endmacro(check_required_include) macro(check_required_function name var) CHECK_FUNCTION_EXISTS( ${name} ${var} ) if (NOT ${var}) message(SEND_ERROR "Missing required function ${name}") endif() endmacro(check_required_function) check_required_include( "string.h" HAVE_STRING_H ) check_required_include( "dirent.h" HAVE_DIRENT_H ) check_required_include( "unistd.h" HAVE_UNISTD_H ) check_required_include( "sys/stat.h" HAVE_SYS_STAT_H ) check_required_include( "limits.h" HAVE_LIMITS_H ) check_required_include( "stdlib.h" HAVE_STDLIB_H ) check_required_include("time.h" HAVE_NOTSYS_TIME_H ) check_required_function("strptime" HAVE_STRPTIME ) # These includes are optional CHECK_INCLUDE_FILE( "sys/time.h" HAVE_TIME_H ) CHECK_INCLUDE_FILE( "sys/resource.h" HAVE_RESOURCE_H ) if (${HAVE_TIME_H} AND ${HAVE_RESOURCE_H}) CHECK_FUNCTION_EXISTS("getrusage" SPECMICP_HAVE_GETRUSAGE) endif() CHECK_FUNCTION_EXISTS( "secure_getenv" SPECMICP_HAVE_SECURE_GETENV ) diff --git a/src/specmicp_common/CMakeLists.txt b/src/specmicp_common/CMakeLists.txt index 28ed409..0eadf66 100644 --- a/src/specmicp_common/CMakeLists.txt +++ b/src/specmicp_common/CMakeLists.txt @@ -1,181 +1,186 @@ # Main # ==== # var to store the files set(specmicp_common_srcs "" CACHE INTERNAL "specmicp_common files" FORCE) set(specmicp_common_headers "" CACHE INTERNAL "specmicp_common headers" FORCE ) # macro to add to vars macro(add_to_main_srcs_list LIST_NAME) set(tmp "") foreach (src ${${LIST_NAME}}) list(APPEND tmp ${CMAKE_CURRENT_SOURCE_DIR}/${src}) endforeach(src) set(specmicp_common_srcs "${specmicp_common_srcs};${tmp}" CACHE INTERNAL "specmicp common files" FORCE) endmacro(add_to_main_srcs_list) macro(add_to_main_headers_list LIST_NAME) set( tmp "") foreach(header ${${LIST_NAME}}) LIST(APPEND tmp ${CMAKE_CURRENT_SOURCE_DIR}/${header}) endforeach(header) set(specmicp_common_headers "${specmicp_common_headers};${tmp}" CACHE INTERNAL "headers for specmicp common" FORCE) endmacro(add_to_main_headers_list) # set( specmicp_common_main_srcs dateandtime.cpp filesystem.cpp log.cpp moving_average.cpp openmp_support.cpp string_algorithms.cpp timer.cpp ) add_to_main_srcs_list( specmicp_common_main_srcs ) set( specmicp_common_main_headers cached_vector.hpp compat.hpp dateandtime.hpp filesystem.hpp log_impl.hpp log.hpp macros.hpp moving_average.hpp openmp_support.hpp options_handler.hpp perfs_handler.hpp pimpl_ptr.hpp range_iterator.hpp range_iterator.inl scope_guard.hpp string_algorithms.hpp timer.hpp types.hpp ) add_to_main_headers_list( specmicp_common_main_headers ) INSTALL(FILES ${specmicp_common_headers} DESTINATION ${INCLUDE_INSTALL_DIR}/specmicp_common ) add_subdirectory(cli) add_subdirectory(eigen) add_subdirectory(io) add_subdirectory(micpsolver) add_subdirectory(odeint) add_subdirectory(physics) add_subdirectory(plugins) add_subdirectory(sparse_solvers) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS config.h.in) add_custom_target(config_h SOURCES config.h.in) configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h ) # build library # ============= set_pgo_flag(${specmicp_common_srcs}) add_library(objspecmicp_common OBJECT ${specmicp_common_srcs} ${specmicp_common_headers} ) set_property(TARGET objspecmicp_common PROPERTY POSITION_INDEPENDENT_CODE 1) target_include_directories(objspecmicp_common PUBLIC ${EIGEN3_INCLUDE_DIR} ${HDF5_INCLUDE_DIRS}) -target_include_directories(objspecmicp_common PRIVATE ${YAML_INCLUDE_DIRS}) +target_include_directories(objspecmicp_common PUBLIC ${YAML_INCLUDE_DIRS}) if(EIGEN3_UNSUPPORTED_FOUND) set_property(TARGET objspecmicp_common APPEND PROPERTY COMPILE_DEFINITIONS EIGEN3_UNSUPPORTED_FOUND) target_include_directories(objspecmicp_common PRIVATE ${EIGEN3_UNSUPPORTED_INCLUDE_DIR}) # added after endif(EIGEN3_UNSUPPORTED_FOUND) set_property(TARGET objspecmicp_common PROPERTY CXX_STANDARD ${SPECMICP_CXX_STANDARD}) set_property(TARGET objspecmicp_common PROPERTY CXX_STANDARD_REQUIRED ON) add_library(specmicp_common SHARED $) if (UNIX) LIST(APPEND specmicp_common_link_libraries dl) else() message(FATAL_ERROR "Plugin system only for POSIX at this time !") endif() install(TARGETS specmicp_common EXPORT ${SPECMICP_TARGET} LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR} ) # static libraries # ---------------- if(SPECMICP_BUILD_STATIC) add_library(specmicp_common_static STATIC $ ) install(TARGETS specmicp_common_static EXPORT ${SPECMICP_TARGET} ARCHIVE DESTINATION ${STATIC_LIBRARY_INSTALL_DIR} ) else() add_library(specmicp_common_static EXCLUDE_FROM_ALL STATIC $ ) endif() set_target_properties(specmicp_common_static PROPERTIES OUTPUT_NAME specmicp_common) # link libraries and include directories # --------------------------------------- foreach(libtarget specmicp_common specmicp_common_static) target_link_libraries(${libtarget} PRIVATE ${specmicp_common_link_libraries}) - target_link_libraries(${libtarget} PRIVATE PkgConfig::YAML) + target_link_libraries(${libtarget} PUBLIC PkgConfig::YAML) target_link_libraries(${libtarget} PUBLIC HDF5::hdf5) get_property(eigen_include_dirs TARGET Eigen::eigen PROPERTY INTERFACE_INCLUDE_DIRECTORIES) get_property(hdf5_include_dirs TARGET HDF5::hdf5 PROPERTY INTERFACE_INCLUDE_DIRECTORIES) + get_property(yaml_include_dirs TARGET PkgConfig::YAML PROPERTY INTERFACE_INCLUDE_DIRECTORIES) + target_include_directories(${libtarget} PUBLIC $ $ ) target_include_directories(${libtarget} INTERFACE ${eigen_include_dirs} ) target_include_directories(${libtarget} INTERFACE ${hdf5_include_dirs} ) + target_include_directories(${libtarget} INTERFACE + ${yaml_include_dirs} + ) # if(EIGEN3_UNSUPPORTED_FOUND) set_property(TARGET ${libtarget} APPEND PROPERTY COMPILE_DEFINITIONS EIGEN3_UNSUPPORTED_FOUND) target_include_directories(${libtarget} INTERFACE ${EIGEN3_UNSUPPORTED_INCLUDE_DIR}) # added after endif(EIGEN3_UNSUPPORTED_FOUND) spc_set_cxx_version_interface(${libtarget}) endforeach(libtarget) diff --git a/src/specmicp_database/CMakeLists.txt b/src/specmicp_database/CMakeLists.txt index da1c858..ef481bb 100644 --- a/src/specmicp_database/CMakeLists.txt +++ b/src/specmicp_database/CMakeLists.txt @@ -1,138 +1,138 @@ # The database # ============ # var to store the files set(specmicp_database_srcs "" CACHE INTERNAL "specmicp_database files" FORCE) set(specmicp_database_headers "" CACHE INTERNAL "specmicp_database headers" FORCE ) # macro to add to vars macro(add_to_database_srcs_list LIST_NAME) set(tmp "") foreach (src ${${LIST_NAME}}) list(APPEND tmp ${CMAKE_CURRENT_SOURCE_DIR}/${src}) endforeach(src) set(specmicp_database_srcs "${specmicp_database_srcs};${tmp}" CACHE INTERNAL "specmicp_database files" FORCE) endmacro(add_to_database_srcs_list) macro(add_to_database_headers_list LIST_NAME) set( tmp "") foreach(header ${${LIST_NAME}}) LIST(APPEND tmp ${CMAKE_CURRENT_SOURCE_DIR}/${header}) endforeach(header) set(specmicp_database_headers "${specmicp_database_headers};${tmp}" CACHE INTERNAL "specmicp_database headers" FORCE) endmacro(add_to_database_headers_list) # database libraries # ------------------ set(specmicp_database_main_srcs appender.cpp aqueous_selector.cpp data_container.cpp database.cpp mineral_selector.cpp module.cpp oxydo_selector.cpp reader_common.cpp selector.cpp switch_basis.cpp unknown_class.cpp yaml_reader.cpp yaml_writer.cpp ) set(specmicp_database_main_headers appender.hpp aqueous_selector.hpp config_database.hpp data_container.hpp database.hpp database_fwd.hpp database_holder.hpp errors.hpp mineral_selector.hpp module.hpp oxydo_selector.hpp reader_common.hpp section_name.hpp selector.hpp switch_basis.hpp unknown_class.hpp yaml_reader.hpp yaml_writer.hpp ) add_to_database_srcs_list(specmicp_database_main_srcs) add_to_database_headers_list(specmicp_database_main_headers) INSTALL(FILES ${specmicp_database_main_headers} DESTINATION ${INCLUDE_INSTALL_DIR}/specmicp_database ) # add_subdirectory(io) add_subdirectory(species) # build library # ============= set_visibility_flag(${specmicp_database_srcs}) set_pgo_flag(${specmicp_database_srcs}) add_library(objspecmicp_database OBJECT ${specmicp_database_srcs} ${specmicp_database_headers} ) -target_include_directories(objspecmicp_database PUBLIC ${EIGEN3_INCLUDE_DIR} ${HDF5_INCLUDE_DIRS}) +target_include_directories(objspecmicp_database PUBLIC ${EIGEN3_INCLUDE_DIR} ${HDF5_INCLUDE_DIRS} ${YAML_INCLUDE_DIRS}) set_property(TARGET objspecmicp_database PROPERTY POSITION_INDEPENDENT_CODE 1) set_property(TARGET objspecmicp_database PROPERTY CXX_STANDARD ${SPECMICP_CXX_STANDARD}) set_property(TARGET objspecmicp_database PROPERTY CXX_STANDARD_REQUIRED ON) add_library(specmicp_database SHARED $) target_link_libraries(specmicp_database PUBLIC specmicp_common) target_link_libraries(specmicp_database PRIVATE ${YAML_LIBRARIES}) spc_set_cxx_version_interface(specmicp_database) install(TARGETS specmicp_database EXPORT ${SPECMICP_TARGET} LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR} ) # static libraries # ---------------- if(SPECMICP_BUILD_STATIC) add_library(specmicp_database_static STATIC $ ) install(TARGETS specmicp_database_static EXPORT ${SPECMICP_TARGET} ARCHIVE DESTINATION ${STATIC_LIBRARY_INSTALL_DIR} ) else() add_library(specmicp_database_static EXCLUDE_FROM_ALL STATIC $ ) endif() set_target_properties(specmicp_database_static PROPERTIES OUTPUT_NAME specmicp_database ) spc_set_cxx_version_interface(specmicp_database_static) target_link_libraries(specmicp_database_static PUBLIC specmicp_common_static) -target_link_libraries(specmicp_database_static PRIVATE ${YAML_LIBRARIES}) +target_link_libraries(specmicp_database_static PUBLIC ${YAML_LIBRARIES})