# CMAKE_MSVC_RUNTIME_LIBRARY requires 3.15 cmake_minimum_required(VERSION 3.15) project (IPhreeqc CXX C) # check if this is the root project if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) set(STANDALONE_BUILD 1) else() set(STANDALONE_BUILD 0) endif() # overide docdir on windows if (WIN32 AND NOT CMAKE_INSTALL_DOCDIR) set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (doc)") set(CMAKE_INSTALL_DOCDIR "doc") endif() # set standard directory locations include(GNUInstallDirs) if (STANDALONE_BUILD AND MSVC) option (IPHREEQC_STATIC_RUNTIME "Build with a static runtime" OFF) if (IPHREEQC_STATIC_RUNTIME) # compile with static runtime set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() endif() # Fortran option (IPHREEQC_ENABLE_MODULE "Enable Fortran module" ON) if (STANDALONE_BUILD) if (IPHREEQC_FORTRAN_TESTING) enable_language(Fortran) else() if (CMAKE_Fortran_COMPILER) option (IPHREEQC_FORTRAN_TESTING "Build Fortran test" ON) else() option (IPHREEQC_FORTRAN_TESTING "Build Fortran test" OFF) endif() endif() endif() SET(IPhreeqc_SOURCES src/CSelectedOutput.cpp src/CSelectedOutput.hxx src/CVar.hxx src/Debug.h src/ErrorReporter.hxx src/IPhreeqc.cpp src/IPhreeqc.h src/IPhreeqc.hpp src/IPhreeqc_interface_F.cpp src/IPhreeqcCallbacks.h src/IPhreeqcLib.cpp src/phreeqcpp/advection.cpp src/phreeqcpp/basicsubs.cpp src/phreeqcpp/ChartHandler.cpp src/phreeqcpp/ChartHandler.h src/phreeqcpp/ChartObject.cpp src/phreeqcpp/ChartObject.h src/phreeqcpp/cl1.cpp src/phreeqcpp/common/Parser.cxx src/phreeqcpp/common/Parser.h src/phreeqcpp/common/PHRQ_base.cxx src/phreeqcpp/common/PHRQ_base.h src/phreeqcpp/common/PHRQ_io.cpp src/phreeqcpp/common/PHRQ_io.h src/phreeqcpp/common/phrqtype.h src/phreeqcpp/common/Utils.cxx src/phreeqcpp/common/Utils.h src/phreeqcpp/CurveObject.cpp src/phreeqcpp/CurveObject.h src/phreeqcpp/cvdense.cpp src/phreeqcpp/cvdense.h src/phreeqcpp/cvode.cpp src/phreeqcpp/cvode.h src/phreeqcpp/cxxKinetics.cxx src/phreeqcpp/cxxKinetics.h src/phreeqcpp/cxxMix.cxx src/phreeqcpp/cxxMix.h src/phreeqcpp/dense.cpp src/phreeqcpp/dense.h src/phreeqcpp/Dictionary.cpp src/phreeqcpp/Dictionary.h src/phreeqcpp/dumper.cpp src/phreeqcpp/dumper.h src/phreeqcpp/Exchange.cxx src/phreeqcpp/Exchange.h src/phreeqcpp/ExchComp.cxx src/phreeqcpp/ExchComp.h src/phreeqcpp/GasComp.cxx src/phreeqcpp/GasComp.h src/phreeqcpp/gases.cpp src/phreeqcpp/GasPhase.cxx src/phreeqcpp/GasPhase.h src/phreeqcpp/global_structures.h src/phreeqcpp/input.cpp src/phreeqcpp/integrate.cpp src/phreeqcpp/inverse.cpp src/phreeqcpp/ISolution.cxx src/phreeqcpp/ISolution.h src/phreeqcpp/ISolutionComp.cxx src/phreeqcpp/ISolutionComp.h src/phreeqcpp/isotopes.cpp src/phreeqcpp/kinetics.cpp src/phreeqcpp/KineticsComp.cxx src/phreeqcpp/KineticsComp.h src/phreeqcpp/mainsubs.cpp src/phreeqcpp/model.cpp src/phreeqcpp/NA.h src/phreeqcpp/NameDouble.cxx src/phreeqcpp/NameDouble.h src/phreeqcpp/NumKeyword.cxx src/phreeqcpp/NumKeyword.h src/phreeqcpp/nvector.cpp src/phreeqcpp/nvector.h src/phreeqcpp/nvector_serial.cpp src/phreeqcpp/nvector_serial.h src/phreeqcpp/parse.cpp src/phreeqcpp/PBasic.cpp src/phreeqcpp/PBasic.h src/phreeqcpp/phqalloc.cpp src/phreeqcpp/phqalloc.h src/phreeqcpp/Phreeqc.cpp src/phreeqcpp/Phreeqc.h src/phreeqcpp/PhreeqcKeywords/Keywords.cpp src/phreeqcpp/PhreeqcKeywords/Keywords.h src/phreeqcpp/PHRQ_io_output.cpp src/phreeqcpp/pitzer.cpp src/phreeqcpp/pitzer_structures.cpp src/phreeqcpp/PPassemblage.cxx src/phreeqcpp/PPassemblage.h src/phreeqcpp/PPassemblageComp.cxx src/phreeqcpp/PPassemblageComp.h src/phreeqcpp/prep.cpp src/phreeqcpp/Pressure.cxx src/phreeqcpp/Pressure.h src/phreeqcpp/print.cpp src/phreeqcpp/Reaction.cxx src/phreeqcpp/Reaction.h src/phreeqcpp/read.cpp src/phreeqcpp/ReadClass.cxx src/phreeqcpp/readtr.cpp src/phreeqcpp/runner.cpp src/phreeqcpp/runner.h src/phreeqcpp/SelectedOutput.cpp src/phreeqcpp/SelectedOutput.h src/phreeqcpp/Serializer.cxx src/phreeqcpp/Serializer.h src/phreeqcpp/sit.cpp src/phreeqcpp/smalldense.cpp src/phreeqcpp/smalldense.h src/phreeqcpp/Solution.cxx src/phreeqcpp/Solution.h src/phreeqcpp/SolutionIsotope.cxx src/phreeqcpp/SolutionIsotope.h src/phreeqcpp/spread.cpp src/phreeqcpp/SS.cxx src/phreeqcpp/SS.h src/phreeqcpp/SSassemblage.cxx src/phreeqcpp/SSassemblage.h src/phreeqcpp/SScomp.cxx src/phreeqcpp/SScomp.h src/phreeqcpp/step.cpp src/phreeqcpp/StorageBin.cxx src/phreeqcpp/StorageBin.h src/phreeqcpp/StorageBinList.cpp src/phreeqcpp/StorageBinList.h src/phreeqcpp/structures.cpp src/phreeqcpp/sundialsmath.cpp src/phreeqcpp/sundialsmath.h src/phreeqcpp/sundialstypes.h src/phreeqcpp/Surface.cxx src/phreeqcpp/Surface.h src/phreeqcpp/SurfaceCharge.cxx src/phreeqcpp/SurfaceCharge.h src/phreeqcpp/SurfaceComp.cxx src/phreeqcpp/SurfaceComp.h src/phreeqcpp/System.cxx src/phreeqcpp/System.h src/phreeqcpp/tally.cpp src/phreeqcpp/Temperature.cxx src/phreeqcpp/Temperature.h src/phreeqcpp/tidy.cpp src/phreeqcpp/transport.cpp src/phreeqcpp/Use.cpp src/phreeqcpp/Use.h src/phreeqcpp/UserPunch.cpp src/phreeqcpp/UserPunch.h src/phreeqcpp/utilities.cpp src/thread.h src/Var.c src/Var.h src/Version.h ) # compile Var.c as c++ set_source_files_properties(src/Var.c PROPERTIES LANGUAGE CXX) # fwrap files if (NOT IPHREEQC_ENABLE_MODULE) set(IPhreeqc_SOURCES ${IPhreeqc_SOURCES} src/fimpl.h src/fwrap.cpp src/fwrap1.cpp src/fwrap2.cpp src/fwrap3.cpp src/fwrap4.cpp src/fwrap5.cpp src/fwrap6.cpp src/fwrap7.cpp src/fwrap8.cpp ) endif() if (STANDALONE_BUILD) option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF) set(LIB_TYPE STATIC) endif() if (BUILD_SHARED_LIBS) set(LIB_TYPE SHARED) if (STANDALONE_BUILD) if (MSVC) option(BUILD_CLR_LIBS "Build CLR Libraries" OFF) endif() endif() endif() add_library(IPhreeqc ${LIB_TYPE} ${IPhreeqc_SOURCES}) # target_include_directories(IPhreeqc PUBLIC "${PROJECT_SOURCE_DIR}/src") # target_include_directories(IPhreeqc PUBLIC "${PROJECT_SOURCE_DIR}/src/phreeqcpp") # target_include_directories(IPhreeqc PUBLIC "${PROJECT_SOURCE_DIR}/src/phreeqcpp/common") # target_include_directories(IPhreeqc PUBLIC "${PROJECT_SOURCE_DIR}/src/phreeqcpp/PhreeqcKeywords") # # target_include_directories(IPhreeqc PUBLIC $) # # target_include_directories(IPhreeqc PUBLIC $) # # target_include_directories(IPhreeqc PUBLIC $) # # target_include_directories(IPhreeqc PUBLIC $) # # target_include_directories(IPhreeqc PUBLIC $) # target_include_directories(IPhreeqc # PUBLIC # "${PROJECT_SOURCE_DIR}/src" # "${PROJECT_SOURCE_DIR}/src/phreeqcpp" # "${PROJECT_SOURCE_DIR}/src/phreeqcpp/common" # "${PROJECT_SOURCE_DIR}/src/phreeqcpp/PhreeqcKeywords" # ) target_include_directories(IPhreeqc PUBLIC $ $ $ $ $ ) # target_include_directories(IPhreeqc # PUBLIC # $ # $ # ) target_compile_definitions(IPhreeqc PRIVATE "SWIG_SHARED_OBJ") target_compile_definitions(IPhreeqc PRIVATE "USE_PHRQ_ALLOC") if (NOT IPHREEQC_ENABLE_MODULE) target_compile_definitions(IPhreeqc PUBLIC "IPHREEQC_NO_FORTRAN_MODULE") endif() if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) target_compile_options(IPhreeqc PRIVATE /wd4251 /wd4275 /wd4793) endif() # Disable deprecation warnings for standard C and STL functions in VS2005 # and later if (MSVC_VERSION EQUAL 1400 OR MSVC_VERSION GREATER 1400) target_compile_definitions(IPhreeqc PUBLIC "_CRT_SECURE_NO_DEPRECATE") target_compile_definitions(IPhreeqc PUBLIC "_SCL_SECURE_NO_WARNINGS") endif(MSVC_VERSION EQUAL 1400 OR MSVC_VERSION GREATER 1400) set_target_properties(IPhreeqc PROPERTIES DEBUG_POSTFIX "d") set_target_properties(IPhreeqc PROPERTIES MINSIZEREL_POSTFIX "msr") set_target_properties(IPhreeqc PROPERTIES RELWITHDEBINFO_POSTFIX "rwd") set(IPhreeqc_Headers ${PROJECT_SOURCE_DIR}/src/IPhreeqc.h ${PROJECT_SOURCE_DIR}/src/IPhreeqc.hpp ${PROJECT_SOURCE_DIR}/src/IPhreeqcCallbacks.h ${PROJECT_SOURCE_DIR}/src/phreeqcpp/PhreeqcKeywords/Keywords.h ${PROJECT_SOURCE_DIR}/src/phreeqcpp/common/PHRQ_io.h ${PROJECT_SOURCE_DIR}/src/Var.h ) if (IPHREEQC_ENABLE_MODULE) set(IPhreeqc_SRC ${PROJECT_SOURCE_DIR}/src/IPhreeqc_interface.F90 ${PROJECT_SOURCE_DIR}/src/README.Fortran ) else() # always install README.Fortran set(IPhreeqc_SRC ${PROJECT_SOURCE_DIR}/src/README.Fortran ) # install old fortran include files set(IPhreeqc_Headers ${IPhreeqc_Headers} ${PROJECT_SOURCE_DIR}/src/IPhreeqc.f.inc ${PROJECT_SOURCE_DIR}/src/IPhreeqc.f90.inc ) endif() # Setup references for /CLR if (MSVC AND BUILD_SHARED_LIBS AND BUILD_CLR_LIBS) if (MSVC_VERSION LESS 1600) message(FATAL_ERROR "CLR options must be set manually for versions prior to Visual Studio 2010") endif() set_target_properties(IPhreeqc PROPERTIES VS_DOTNET_REFERENCES "System;System.Drawing;System.Windows.Forms;${CMAKE_CURRENT_SOURCE_DIR}/src/phreeqcpp/ZedGraph.dll") set_target_properties(IPhreeqc PROPERTIES COMMON_LANGUAGE_RUNTIME "") target_compile_definitions(IPhreeqc PRIVATE "MULTICHART") endif() # install # if (WIN32) # if (BUILD_CLR_LIBS) # if ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) # SET(CMAKE_INSTALL_LIBDIR "clrx64") # else() # SET(CMAKE_INSTALL_LIBDIR "clr") # endif() # else() # if ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) # if (BUILD_SHARED_LIBS) # SET(CMAKE_INSTALL_LIBDIR "dllx64") # else() # SET(CMAKE_INSTALL_LIBDIR "libx64") # endif() # else() # if (BUILD_SHARED_LIBS) # SET(CMAKE_INSTALL_LIBDIR "dll") # else() # SET(CMAKE_INSTALL_LIBDIR "lib") # endif() # endif() # endif() # endif() # install if (STANDALONE_BUILD) # install(TARGETS IPhreeqc DESTINATION ${CMAKE_INSTALL_LIBDIR}) #{{ include(CMakePackageConfigHelpers) configure_package_config_file(IPhreeqcConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/IPhreeqcConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/IPhreeqc ) write_basic_package_version_file("IPhreeqcConfigVersion.cmake" VERSION 3.2.0 COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/IPhreeqcConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/IPhreeqcConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/IPhreeqc ) install(TARGETS IPhreeqc EXPORT IPhreeqcTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(EXPORT IPhreeqcTargets FILE IPhreeqcTargets.cmake NAMESPACE IPhreeqc:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/IPhreeqc ) ##}} install(FILES ${IPhreeqc_Headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) # if (WIN32) # install(FILES ${IPhreeqc_SRC} DESTINATION src) # else() # install(FILES ${IPhreeqc_SRC} DESTINATION ${CMAKE_INSTALL_DOCDIR}/src) # endif() # if (BUILD_CLR_LIBS) # install(FILES "${PROJECT_SOURCE_DIR}/src/phreeqcpp/ZedGraph.dll" DESTINATION ${CMAKE_INSTALL_LIBDIR}) # endif() endif() ##IF(MSVC) ## message("PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}") ## INSTALL( ## DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ## DESTINATION ${CMAKE_INSTALL_LIBDIR} ## CONFIGURATIONS Debug ## FILES_MATCHING ## PATTERN "*.pdb" ## ) ## INSTALL( ## FILES ## ${LIBRARY_OUTPUT_PATH}/Debug/${target_prefix}${target_name}.pdb ## DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ## DESTINATION ${CMAKE_INSTALL_LIBDIR} ## CONFIGURATIONS Debug ## ) ##ENDIF(MSVC) if (BUILD_CLR_LIBS AND IPHREEQC_STATIC_RUNTIME) message(FATAL_ERROR "BUILD_CLR_LIBS and IPHREEQC_STATIC_RUNTIME are mutually exclusive") endif() if (EXISTS "${PROJECT_SOURCE_DIR}/CTestConfig.cmake") # enable dashboard scripting include (CTest) endif() if (STANDALONE_BUILD) add_subdirectory(database) add_subdirectory(doc) add_subdirectory(examples) if (BUILD_TESTING) add_subdirectory(tests) endif() if (BUILD_TESTING) include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/release-1.8.1.tar.gz URL_HASH MD5=2e6fbeb6a91310a16efe181886c59596 ) mark_as_advanced( FETCHCONTENT_BASE_DIR FETCHCONTENT_FULLY_DISCONNECTED FETCHCONTENT_QUIET FETCHCONTENT_SOURCE_DIR_GOOGLETEST FETCHCONTENT_UPDATES_DISCONNECTED FETCHCONTENT_UPDATES_DISCONNECTED_GOOGLETEST ) # Prevent GoogleTest from overriding our compiler/linker options # when building with Visual Studio set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) set(BUILD_GTEST ON CACHE BOOL "" FORCE) set(BUILD_GMOCK OFF CACHE BOOL "" FORCE) set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) set(INSTALL_GMOCK OFF CACHE BOOL "" FORCE) mark_as_advanced( BUILD_GTEST BUILD_GMOCK INSTALL_GTEST INSTALL_GMOCK gmock_build_tests gtest_build_tests gtest_build_samples gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols ) FetchContent_GetProperties(googletest) if (NOT googletest_POPULATED) FetchContent_Populate(googletest) add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) endif() add_subdirectory(gtest) endif() # enable distribution creation set(CPACK_PACKAGE_VERSION "3.2.0") set(CPACK_PACKAGE_VENDOR "USGS") include (CPack) endif()