tCMakeLists.txt - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
 (HTM) git clone git://src.adamsgaard.dk/pism
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tCMakeLists.txt (8153B)
       ---
            1 cmake_minimum_required (VERSION 3.1)
            2 project (Pism C CXX)
            3 
            4 if (NOT (${CMAKE_VERSION} VERSION_LESS "3.12"))
            5   # Policy CMP0074 was introduced in 3.12. See "cmake --help-policies" for details.
            6   # use PackageName_ROOT variables
            7   cmake_policy(SET CMP0074 NEW)
            8 endif()
            9 
           10 if (NOT (${CMAKE_VERSION} VERSION_LESS "3.13"))
           11   # Policy CMP0078 was introduced in 3.13. See "cmake --help-policies" for details.
           12   cmake_policy(SET CMP0078 OLD)       #controls names of SWIG targets
           13 endif()
           14 
           15 if (NOT (${CMAKE_VERSION} VERSION_LESS "3.14"))
           16   # Policy CMP0086 was introduced in 3.14. See "cmake --help-policies" for details.
           17   cmake_policy(SET CMP0086 NEW)
           18 endif()
           19 
           20 # Require C++11 compiler support.
           21 set(CMAKE_CXX_STANDARD 11)
           22 set(CMAKE_CXX_STANDARD_REQUIRED ON)
           23 set(CMAKE_CXX_EXTENSIONS OFF)
           24 
           25 # Looks like CMAKE_CXX_STANDARD does not support Intel C++ compilers
           26 # yet...
           27 if (CMAKE_CXX_COMPILER_ID MATCHES "Intel" AND NOT CMAKE_CXX_FLAGS MATCHES "-std=c\\+\\+11")
           28   message (STATUS "Adding -std=c++11 to C++ compiler flags for Intel compilers.")
           29   set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}" CACHE STRING "C++ compiler flags" FORCE)
           30 endif()
           31 
           32 include ("CMake/PISM_CMake_macros.cmake")
           33 list (APPEND CMAKE_MODULE_PATH "${Pism_SOURCE_DIR}/CMake")
           34 
           35 set (Pism_BRANCH "stable")
           36 
           37 # Set Pism_REVISION_TAG
           38 pism_set_revision_tag()
           39 
           40 # Put executables in the build directory:
           41 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
           42 
           43 # Set the install prefix
           44 pism_set_install_prefix()
           45 set(CMAKE_INSTALL_MESSAGE "LAZY")
           46 
           47 # Set Pism_CONFIG_FILE (*after* we set the CMAKE_INSTALL_PREFIX above).
           48 pism_check_build_dir_location()
           49 set (Pism_CONFIG_FILE "${CMAKE_INSTALL_PREFIX}/${Pism_SHARE_DIR}/pism_config.nc" CACHE STRING "" FORCE)
           50 mark_as_advanced (Pism_CONFIG_FILE)
           51 file (WRITE ${PROJECT_BINARY_DIR}/.petscrc "-config ${PROJECT_BINARY_DIR}/pism_config.nc")
           52 
           53 # The default options cache
           54 option (Pism_BUILD_EXTRA_EXECS "Build extra executables (mostly testing/verification)" OFF)
           55 option (BUILD_SHARED_LIBS      "Build shared Pism libraries" ON)
           56 option (Pism_BUILD_PYTHON_BINDINGS "Build python bindings" OFF)
           57 option (Pism_BUILD_ICEBIN "Build PISM portions of IceBin library" OFF)
           58 option (Pism_BUILD_DOCS "Build PISM's documentation with 'make all'." OFF)
           59 option (Pism_USE_PROJ "Use PROJ to compute longitudes and latitudes." OFF)
           60 option (Pism_USE_PIO "Use NCAR's ParallelIO for I/O." OFF)
           61 option (Pism_USE_PARALLEL_NETCDF4 "Enables parallel NetCDF-4 I/O." OFF)
           62 option (Pism_USE_PNETCDF "Enables parallel NetCDF-3 I/O using PnetCDF." OFF)
           63 option (Pism_ENABLE_DOCUMENTATION "Enable targets building PISM's documentation." ON)
           64 
           65 # PISM will eventually use Jansson to read configuration files.
           66 # set (Pism_USE_JANSSON OFF)
           67 option (Pism_USE_JANSSON "Use Jansson to read configuration files." OFF)
           68 
           69 option (Pism_TEST_USING_VALGRIND "Add extra regression tests using valgrind" OFF)
           70 mark_as_advanced (Pism_TEST_USING_VALGRIND)
           71 
           72 option (Pism_ADD_FPIC "Add -fPIC to C++ compiler flags (CMAKE_CXX_FLAGS). Try turning it off if it does not work." ON)
           73 option (Pism_CODE_COVERAGE "Add compiler options for code coverage testing." OFF)
           74 option (Pism_LINK_STATICALLY "Set CMake flags to try to ensure that everything is linked statically")
           75 option (Pism_LOOK_FOR_LIBRARIES "Specifies whether PISM should look for libraries. (Disable this on Crays.)" ON)
           76 option (Pism_USE_EVERYTRACE "Use the Everytrace library to provide stacktraces on crashes." OFF)
           77 
           78 # Use rpath by default; this has to go first, because rpath settings may be overridden later.
           79 pism_use_rpath()
           80 
           81 if (Pism_LINK_STATICALLY)
           82   pism_strictly_static()
           83 endif ()
           84 
           85 # Deal with build types
           86 mark_as_advanced(CLEAR CMAKE_BUILD_TYPE)
           87 if (CMAKE_BUILD_TYPE MATCHES "Debug")
           88   set (Pism_BUILD_EXTRA_EXECS ON CACHE BOOL "Build extra executables (mostly testing/verification)" FORCE)
           89   option (Pism_DEBUG              "Enables extra checks in the code."          ON)
           90   option (Pism_PEDANTIC_WARNINGS  "Compile with pedantic warnings."            ON)
           91   option (Pism_GPROF_FLAGS        "Add flags necessary to profile with gprof." OFF)
           92 endif (CMAKE_BUILD_TYPE MATCHES "Debug")
           93 
           94 # Add -fPIC to C and CXX flags.
           95 if (Pism_ADD_FPIC)
           96   add_compile_options(-fPIC)
           97 endif ()
           98 
           99 if (Pism_CODE_COVERAGE)
          100   add_compile_options(-fprofile-arcs -ftest-coverage -g -O0)
          101   add_link_options(--coverage)
          102 
          103   add_custom_target (coverage_report
          104     # remove coverage data from src/pythonbindings
          105     COMMAND lcov --directory ${Pism_BINARY_DIR}/src/pythonbindings -z
          106     COMMAND lcov --directory ${Pism_BINARY_DIR}/src/external -z
          107     COMMAND lcov --base-directory ${Pism_SOURCE_DIR} --directory src --quiet --no-external --capture -o pism-coverage.info
          108     COMMAND genhtml -t "PISM Coverage report" -o cover --demangle-cpp --legend pism-coverage.info
          109     WORKING_DIRECTORY ${Pism_BINARY_DIR}
          110     VERBATIM
          111     )
          112   add_custom_target (coverage_reset
          113     COMMAND lcov -d ${Pism_BINARY_DIR} -z
          114     WORKING_DIRECTORY ${Pism_BINARY_DIR}
          115     VERBATIM
          116     )
          117 endif ()
          118 
          119 if (Pism_PEDANTIC_WARNINGS)
          120   pism_set_pedantic_flags()
          121 endif (Pism_PEDANTIC_WARNINGS)
          122 
          123 if (Pism_GPROF_FLAGS)
          124   set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -pg -fno-omit-frame-pointer -fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls")
          125   set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg -fno-omit-frame-pointer -fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls")
          126 endif ()
          127 
          128 # Look for libraries using find_package(...), etc. Run CMake with -DPism_LOOK_FOR_LIBRARIES=OFF
          129 # to build on systems that rely on the module system to set all compiler and linker flags.
          130 if (Pism_LOOK_FOR_LIBRARIES)
          131   pism_find_prerequisites()
          132 endif()
          133 
          134 # Set Pism_EXTERNAL_LIBS and include directories.
          135 pism_set_dependencies()
          136 
          137 # Make sure that PetscScalar is double (not complex<double>.)
          138 pism_check_petsc_scalar_type()
          139 
          140 # Get PETSc's configuration flags (they will be written to output files).
          141 pism_petsc_get_variable("CONFIGURE_OPTIONS" Pism_PETSC_CONFIGURE_FLAGS)
          142 
          143 if (Pism_USE_EVERYTRACE)
          144   find_package(Everytrace REQUIRED)
          145   list (APPEND Pism_EXTERNAL_LIBS ${EVERYTRACE_LIBRARY})
          146 endif()
          147 
          148 if (Pism_BUILD_PYTHON_BINDINGS)
          149   find_package(PythonInterp REQUIRED)
          150   find_package(PythonLibs REQUIRED)
          151   find_package(PETSc4Py REQUIRED)
          152   find_package(SWIG REQUIRED)
          153 
          154   if (DEFINED PETSC4PY_VERSION)
          155     # FindPETSc4Py.cmake does not put PETSC4PY_VERSION into the CMake cache,
          156     # so we save it here.
          157     set(Pism_PETSC4PY_VERSION ${PETSC4PY_VERSION} CACHE STRING "PETSc4Py version")
          158     mark_as_advanced(Pism_PETSC4PY_VERSION)
          159   endif()
          160 
          161   mark_as_advanced (SWIG_DIR SWIG_EXECUTABLE SWIG_VERSION)
          162 
          163   execute_process(
          164     COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print(distutils.sysconfig.get_python_lib(plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}'))"
          165     OUTPUT_VARIABLE PISM_INSTALL_PYTHON_MODULE_DIR
          166     OUTPUT_STRIP_TRAILING_WHITESPACE)
          167   set(PISM_INSTALL_PYTHON_MODULE_DIR ${PISM_INSTALL_PYTHON_MODULE_DIR}
          168     CACHE PATH "Python extension module installation directory." )
          169 endif ()
          170 
          171 add_custom_target (etags
          172   COMMAND find . -iname *.cc -o -iname *.hh -o -iname *.c -o -iname *.h | xargs etags --no-defines
          173   WORKING_DIRECTORY ${Pism_SOURCE_DIR}
          174   VERBATIM
          175 )
          176 
          177 # re-run tests that failed
          178 add_custom_target (retest
          179   COMMAND ${CMAKE_CTEST_COMMAND} --rerun-failed --output-on-failure
          180   WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
          181   VERBATIM
          182 )
          183 
          184 # run Python tests
          185 add_custom_target (test-python
          186   COMMAND ${CMAKE_CTEST_COMMAND} -R "Python:"
          187   WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
          188   VERBATIM
          189 )
          190 
          191 # Install helper scripts residing in util/
          192 install(DIRECTORY ${PROJECT_SOURCE_DIR}/util/ DESTINATION ${Pism_BIN_DIR}
          193   USE_SOURCE_PERMISSIONS
          194   FILES_MATCHING PATTERN "*.py")
          195 
          196 
          197 install(DIRECTORY ${PROJECT_SOURCE_DIR}/examples
          198   DESTINATION ${Pism_SHARE_DIR}
          199   USE_SOURCE_PERMISSIONS)
          200 
          201 add_subdirectory (src)
          202 add_subdirectory (site-packages)
          203 
          204 if (Pism_ENABLE_DOCUMENTATION)
          205   if (Pism_BUILD_DOCS)
          206     add_subdirectory (doc)
          207   else()
          208     add_subdirectory (doc EXCLUDE_FROM_ALL)
          209   endif()
          210 endif()
          211 
          212 # PISM regression testing
          213 ENABLE_TESTING()
          214 include(CTest)
          215 add_subdirectory (test)
          216 add_subdirectory (test/regression)
          217 
          218 add_subdirectory (docker)