Skip to content
Snippets Groups Projects
CMakeLists.txt 16.95 KiB
###########################################################################
# CMake version check.
# Require CMake 3.5, required by ParaView 5.1.0
###########################################################################
cmake_minimum_required ( VERSION 3.5 )

# Define the project name.
project ( Mantid )

# Policy settings
if (POLICY CMP0022)
  cmake_policy (SET CMP0022 NEW)
endif ()

if (POLICY CMP0072)
  cmake_policy (SET CMP0072 OLD)
endif ()

# System package target is important for the windows builds as it allows us to package only the dlls and exes and exclude libs. Defaults to empty for other platforms.
set ( SYSTEM_PACKAGE_TARGET "" )

# Add the path to our custom 'find' modules
set ( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/buildconfig/CMake")

set ( ENABLE_MANTIDPLOT ON CACHE BOOL "Enable Qt4-based gui & components" )
set ( ENABLE_WORKBENCH OFF CACHE BOOL "Enable Qt5-based gui & components" )
set ( PACKAGE_WORKBENCH OFF CACHE BOOL "If packaging is enabled then include the Qt-5 workbench in the package" )
if ( PACKAGE_WORKBENCH AND NOT ENABLE_WORKBENCH )
  message ( FATAL_ERROR "Packaging workbench requested but workbench build is disabled!" )
endif ()

set ( CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}" "Mantid" "ALL" "/" )

###########################################################################
# Quick exit if we only want data targets
###########################################################################
if( DATA_TARGETS_ONLY )
  include( SetupDataTargets )
  # System test config files
  add_subdirectory( Testing/SystemTests/scripts )
  return()
endif()

###########################################################################
# Packaging configuration
###########################################################################
set ( CPACK_PACKAGE_SUFFIX "unstable" CACHE STRING "suffix used to determine the deployment type")
set_property(CACHE CPACK_PACKAGE_SUFFIX PROPERTY STRINGS nightly unstable "") #empty string and release are treated as the same thing

#Set package name here
set ( CPACK_PACKAGE_NAME "mantid${CPACK_PACKAGE_SUFFIX}" )

###########################################################################
# Bootstrap any dependencies
###########################################################################
include ( Bootstrap )

###########################################################################
# Configure Eigen early
###########################################################################
include ( Eigen )

###########################################################################
# Set ParaView information since later items depend on it
###########################################################################
# VATES flag. Requires ParaView
set ( MAKE_VATES OFF CACHE BOOL "Switch for compiling the Vates project")
if ( ENABLE_MANTIDPLOT AND MAKE_VATES )
  find_package( ParaView )
  if( ParaView_FOUND )
    add_definitions ( -DMAKE_VATES )
    # Poco::File throws an exception when a backslash is used.
    string ( REPLACE "\\" "/" ParaView_DIR ${ParaView_DIR} )
  endif ()
endif ()
if ( ENABLE_MANTIDPLOT )
  include ( ParaViewSetup )
endif ()

###########################################################################
# Set expected variables for OS X
###########################################################################
if ( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
  include ( DarwinSetup )
endif ()

###########################################################################
# Cross-platform setup
###########################################################################
include ( CommonSetup )

###########################################################################
# Find OpenGL
###########################################################################
find_package ( OpenGL REQUIRED )
# FindOpenGL does not (as of CMake 2.6.4) take notice of the REQUIRED
if ( NOT OPENGL_FOUND )
  message ( FATAL_ERROR "OpenGL was not found." )
endif ()

find_package(TBB REQUIRED)

# We probably don't want this to run on every build.
option(COVERALLS "Generate coveralls data" OFF)

if (COVERALLS)
    include(Coveralls)
    coveralls_turn_on_coverage()
endif()

###########################################################################
# Qt/Qwt/PyQt/sip
###########################################################################
if (ENABLE_MANTIDPLOT)
  set ( QT_USE_IMPORTED_TARGETS ON )
  find_package ( Qt4 COMPONENTS QtCore QtGui QtOpenGL QtXml QtSvg REQUIRED )

  find_package ( Qwt5 REQUIRED )
  if( QWT5_VERSION VERSION_LESS 5.0 OR QWT5_VERSION VERSION_EQUAL 6.0 OR
      QWT5_VERSION VERSION_GREATER 6.0 )
    message ( FATAL_ERROR "Qwt version 5 is required, found: ${QWT5_VERSION}" )
  endif()

  find_package ( PyQt4 REQUIRED )
  find_package ( SIP REQUIRED )
  separate_arguments ( PYQT4_SIP_FLAGS )
endif()

if ( ENABLE_WORKBENCH )
  find_package ( Qt5 COMPONENTS Core Gui Widgets OpenGL REQUIRED )
  if ( Qt5_FOUND )
    message ( STATUS "Found Qt ${Qt5_VERSION}: ${Qt5_DIR}" )
  endif()
  find_package ( PyQt5 REQUIRED )
  find_package ( SIP REQUIRED )
  separate_arguments ( PYQT5_SIP_FLAGS )
endif()

###########################################################################
# gsl is currently needed by Geometry, Algorithms, Curvefitting, & MantidPlot
###########################################################################
find_package ( GSL REQUIRED )

###########################################################################
# Now add in all the components
###########################################################################
# Flag that this is a full build, i.e not framework only
set( FULL_PACKAGE_BUILD 1 )
# Set the path to the built docs directory here so that it can be used in
# the Kernel project for populating the properties file
set( DOCS_BUILDDIR ${CMAKE_BINARY_DIR}/docs )

# Framework Build options
set ( CXXTEST_SINGLE_LOGFILE CACHE BOOL "Switch to have the tests for each package run together")
set ( CXXTEST_ADD_PERFORMANCE OFF CACHE BOOL "Switch to add Performance tests to the list of tests run by ctest?")

add_subdirectory ( Framework )

include_directories ( Framework/Kernel/inc )
include_directories ( Framework/HistogramData/inc )
include_directories ( Framework/Indexing/inc )
include_directories ( Framework/Parallel/inc )
include_directories ( Framework/Beamline/inc )
include_directories ( Framework/Geometry/inc )
include_directories ( Framework/API/inc )
include_directories ( Framework/Types/inc )
include_directories ( Framework/NexusGeometry/inc )

set ( CORE_MANTIDLIBS Kernel HistogramData Indexing Beamline Geometry API Types )

if ( ENABLE_MANTIDPLOT AND MAKE_VATES )

  if (NOT APPLE)
    LIST( APPEND CPACK_INSTALL_CMAKE_PROJECTS
          "${ParaView_DIR}" "ParaView Runtime Libs" "Runtime" "${INBUNDLE}/"
    )
    LIST( APPEND CPACK_INSTALL_CMAKE_PROJECTS
          "${ParaView_DIR}" "VTK Runtime Libs" "RuntimeLibraries" "${INBUNDLE}/"
    )
    LIST( APPEND CPACK_INSTALL_CMAKE_PROJECTS
          "${ParaView_DIR}" "HDF5 Core Library" "libraries" "${INBUNDLE}/"
    )
    LIST( APPEND CPACK_INSTALL_CMAKE_PROJECTS
          "${ParaView_DIR}" "HDF5 HL Library" "hllibraries" "${INBUNDLE}/"
    )
  endif()

endif ( ENABLE_MANTIDPLOT AND MAKE_VATES )

if ( UNIX )
  #Experimental feature. Unix only at this point.
  set ( UNITY_BUILD OFF CACHE BOOL "Switch for utilising unity builds. Faster builds for selected components.")
endif ( UNIX )

if ( MSVC )
  add_definitions ( -DQWT_DLL )
endif ()

if ( ENABLE_MANTIDPLOT OR ENABLE_WORKBENCH )
  add_custom_target ( GUITests )
  add_dependencies ( check GUITests )
  # Collect all tests together
  add_custom_target ( AllTests )
  add_dependencies ( AllTests FrameworkTests GUITests )
  add_subdirectory ( qt )
endif()

if ( ENABLE_MANTIDPLOT )
  add_subdirectory ( MantidPlot )
endif()

add_subdirectory ( scripts )

# Docs requirements
find_package ( Sphinx 1.2 )
if ( SPHINX_FOUND )
  # run python to see if the theme is installed
  execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sphinx_bootstrap_theme"
                    OUTPUT_VARIABLE SPHINX_BOOTSTRAP_THEME_OUT
                    ERROR_VARIABLE SPHINX_BOOTSTRAP_THEME_ERR
                    OUTPUT_STRIP_TRAILING_WHITESPACE
                    ERROR_STRIP_TRAILING_WHITESPACE )
  if (SPHINX_BOOTSTRAP_THEME_ERR)
    message (ERROR " Did not find sphinx_bootstrap_theme")
    message (STATUS "${PYTHON_EXECUTABLE} -c \"import sphinx_bootstrap_theme\"")
    message (STATUS "${SPHINX_BOOTSTRAP_THEME_ERR}")
    message (FATAL_ERROR " Install instructions at https://pypi.python.org/pypi/sphinx-bootstrap-theme/")
  endif ()

  add_subdirectory ( dev-docs )
  if ( ENABLE_MANTIDPLOT )
    add_subdirectory ( docs )
  endif()
endif ()

# System test data target
add_subdirectory ( Testing/SystemTests/scripts )

if (COVERALLS)
  get_property(ALL_SRCS GLOBAL PROPERTY COVERAGE_SRCS)
        set(SRCS_FILE "")
        foreach (SRC ${ALL_SRCS})
                set(SRCS_FILE "${SRCS_FILE}\n${SRC}")
        endforeach()
        #remove initial \n
        string(SUBSTRING ${SRCS_FILE} 1 -1 SRCS_FILE)
  set( SRCS_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/sources.txt")
  file(WRITE ${SRCS_FILENAME} ${SRCS_FILE})
  coveralls_setup(
    ${SRCS_FILENAME}
    OFF
    "${CMAKE_SOURCE_DIR}/buildconfig/CMake"
  )
endif ()

###########################################################################
# Installation settings
###########################################################################

# N.B. INBUNDLE variable is empty except on Mac (set in DarwinSetup.cmake)
install ( DIRECTORY installers/colormaps/ DESTINATION ${INBUNDLE}colormaps)

# Install the files (.desktop and icon) to create a menu item, but only if installing to /opt/Mantid
if ( ENABLE_MANTIDPLOT AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND CMAKE_INSTALL_PREFIX STREQUAL "/opt/Mantid" )
  install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/installers/LinuxInstaller/mantidplot.desktop
            DESTINATION /usr/share/applications )
  install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/images/MantidPlot_Icon_32offset.png
            DESTINATION /usr/share/pixmaps
            RENAME mantidplot.png )
endif()

# THIS MUST BE THE LAST SUB_DIRECTORY ADDED. See Framework/PostInstall/CMakeLists
# for an explanation
add_subdirectory( Framework/PostInstall )


# Conda
set ( ENABLE_CONDA CACHE BOOL "Switch to enable conda package generation")
if ( ENABLE_CONDA )
  include ( conda )
endif ( ENABLE_CONDA )

###########################################################################
# CPack settings
###########################################################################

# Keep this in a defaulted-to-off option
set ( ENABLE_CPACK CACHE BOOL "Switch to enable CPack package generation")
if ( ENABLE_CPACK )
    include ( CPackCommon )

    # Mac package settings
    set ( CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/installers/WinInstaller/License.txt )

    if(CMAKE_HOST_WIN32)
      include ( WindowsNSIS )
    elseif ( ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" )
      include ( CPackLinuxSetup )

      # rhel requirements
      set ( CPACK_RPM_PACKAGE_REQUIRES "qt4 >= 4.2,nexus >= 4.3.1,gsl,glibc,qwtplot3d-qt4,muParser,numpy,h5py >= 2.3.1,PyCifRW >= 4.2.1,tbb,librdkafka" )
      # OCE
      set( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},OCE-draw,OCE-foundation,OCE-modeling,OCE-ocaf,OCE-visualization")
      set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},poco-crypto,poco-data,poco-mysql,poco-sqlite,poco-odbc,poco-util,poco-xml,poco-zip,poco-net,poco-netssl,poco-foundation,PyQt4" )
      set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},sip >= 4.18" )
      set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},python-six,python-ipython >= 1.1.0,python-ipython-notebook,PyYAML" )
      # scipy
      set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},scipy" )
      set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},mxml,hdf,hdf5,jsoncpp >= 0.7.0" )
      if (ENABLE_WORKBENCH)
        set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},python-qt5" )
      endif()

      if( "${UNIX_CODENAME}" MATCHES "Santiago" ) # RHEL6
        # On RHEL6 we have to use an updated qscintilla to fix an auto complete bug
        set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES} qscintilla >= 2.4.6, boost157,python-matplotlib" )
        # On RHEL6 we are using SCL packages for Qt
        set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},scl-utils,mantidlibs34,mantidlibs34-runtime,mantidlibs34-qt,mantidlibs34-qt-x11,mantidlibs34-qt-webkit,mantidlibs34-qwt5-qt4" )
      else()
        # Require matplotlib >= 1.5 to fix bug in latex rendering
        set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES} qscintilla,qwt5-qt4,python2-matplotlib-qt4 >= 1.5.2,python2-QtAwesome,boost >= 1.53.0" )
      endif()

      # Add software collections for RHEL
      if ( "${UNIX_CODENAME}" MATCHES "Santiago" ) # RHEL6
        set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES} scl-utils" )
      endif()

      if( "${UNIX_DIST}" MATCHES "Ubuntu" )
        # common packages
        set ( DEPENDS_LIST "libboost-date-time${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION},"
                           "libboost-regex${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION},"
                           "libboost-python${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION},"
                           "libboost-serialization${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION},"
                           "libboost-filesystem${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION},"
                           "libnexus0v5 (>= 4.3),"
                           "libgsl2,"
                           "libqtcore4 (>= 4.2),"
                           "libqtgui4 (>= 4.2),"
                           "libqt4-opengl (>= 4.2),"
                           "libqt4-xml (>= 4.2),"
                           "libqt4-svg (>= 4.2),"
                           "libqt4-qt3support (>= 4.2),"
                           "qt4-dev-tools,"
                           "libqwt5-qt4,"
                           "libqwtplot3d-qt4-0v5,"
                           "libqtwebkit4,"
                           "python-h5py,"
                           "python-numpy,"
                           "python-sip,"
                           "python-qt4,"
                           "python-nxs (>= 4.3),"
                           "python-six,"
                           "libjsoncpp1 (>=0.7.0),"
                           "libqscintilla2-12v5,"
                           "liboce-foundation10,liboce-modeling10,"
                           "libmuparser2v5,"
                           "ipython-qtconsole (>= 1.1),"
                           "ipython-notebook,"
                           "python-matplotlib,"
                           "python-scipy,"
                           "libtbb2,"
                           "librdkafka1,"
                           "librdkafka++1,"
                           "libpocofoundation${POCO_SOLIB_VERSION},libpocoutil${POCO_SOLIB_VERSION},libpoconet${POCO_SOLIB_VERSION},libpoconetssl${POCO_SOLIB_VERSION},libpococrypto${POCO_SOLIB_VERSION},libpocoxml${POCO_SOLIB_VERSION},"
                           "libhdf5-cpp-11,"
                           "python-pycifrw (>= 4.2.1),"
                           "python-yaml,"
                           "python-qtawesome")
        set ( PERFTOOLS_DEB_PACKAGE "libgoogle-perftools4 (>= 1.7)" )
        if( "${UNIX_CODENAME}" STREQUAL "bionic")
            list ( APPEND DEPENDS_LIST ",libgsl23,liboce-foundation11,liboce-modeling11,libqscintilla2-qt4-13,jupyter-notebook,libhdf5-cpp-100")
            list (REMOVE_ITEM DEPENDS_LIST "libgsl2," "liboce-foundation10,liboce-modeling10," "libqscintilla2-12v5," "ipython-notebook," "libhdf5-cpp-11,")
        endif()
        # Change DEPENDS_LIST for python 3
        if ( PYTHON_VERSION_MAJOR EQUAL 3 )
          list (REMOVE_ITEM DEPENDS_LIST "python-nxs (>= 4.3),")
          string ( REPLACE "python-" "python3-" DEPENDS_LIST ${DEPENDS_LIST} )
          string ( REPLACE "python3-qt4" "python3-pyqt4" DEPENDS_LIST ${DEPENDS_LIST} )
          if (ENABLE_WORKBENCH)
            set ( APPEND DEPENDS_LIST ",python3-qt5" )
          endif()
        else()
          if (ENABLE_WORKBENCH)
            set ( APPEND DEPENDS_LIST ",pyqt5" )
          endif()
        endif ()
        # parse list to string required for deb package
        string ( REPLACE ";" "" CPACK_DEBIAN_PACKAGE_DEPENDS ${DEPENDS_LIST} )
      endif()
      # soft requirement of tcmalloc if selected
      IF ( USE_TCMALLOC )
        message ( STATUS "Adding gperftools to the package requirements" )
        set ( CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES},gperftools-libs >= 2.0" )
        set ( CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},${PERFTOOLS_DEB_PACKAGE}" )
      ENDIF ( )
    ENDIF ()
    # run cpack configuration
    include ( CPack )
    # let people know what is coming out the other end - must be after cpack generates value for rpm
    message ( STATUS "CPACK_PACKAGE_FILE_NAME = ${CPACK_PACKAGE_FILE_NAME}" )
endif ()