Newer
Older
# CMake version check. Require CMake 3.13 - Required for add_link_options
# 3.15 is required on Windows, but is not available to RHEL yet
cmake_minimum_required(VERSION 3.13)
# Define the project name.
if(POLICY CMP0022)
cmake_policy(SET CMP0022 NEW)
endif()
if(POLICY CMP0072)
cmake_policy(SET CMP0072 OLD)
endif()
if(POLICY CMP0074)
cmake_policy(SET CMP0074 NEW)
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")
# Send libraries to common place, reference in several places so must be at top
# level
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
option(ENABLE_MANTIDPLOT "Enable Qt4-based gui & components" ON)
option(ENABLE_WORKBENCH "Enable Qt5-based gui & components" ON)
set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}" "Mantid" "ALL" "/")
# Ensure that if we are running any sanitizers the compiler options are
# known in sub targets
include(Sanitizers)
# 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()
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
# Set ParaView information since later items depend on it
option(MAKE_VATES "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()
if( MSVC )
include ( MSVCSetup )
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
include(DarwinSetup)
endif()
# Cross-platform setup
if(ENABLE_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()
# 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()
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()
if(PYTHON_VERSION_MAJOR EQUAL 3 AND
UNIX_DIST MATCHES "RedHatEnterprise" AND UNIX_RELEASE MATCHES "7\..*")
set(USE_PRIVATE_SIPPYQT4 ON)
include(ExternalSipPyQt4)
else()
find_package(PyQt4 REQUIRED)
find_package(SIP REQUIRED)
endif()
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}")
find_package(PyQt5 REQUIRED)
find_package(SIP REQUIRED)
separate_arguments(PYQT5_SIP_FLAGS)
Russell Taylor
committed
# 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
option(CXXTEST_ADD_PERFORMANCE
"Switch to add Performance tests to the list of tests run by ctest?")
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
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(ENABLE_MANTIDPLOT AND MAKE_VATES)
if(UNIX)
# Experimental feature. Unix only at this point.
option(UNITY_BUILD
"Switch for utilising unity builds. Faster builds for selected components.")
Owen Arnold
committed
if(MSVC)
add_definitions(-DQWT_DLL)
endif()
add_custom_target(AllTests)
add_dependencies(AllTests FrameworkTests)
if(ENABLE_MANTIDPLOT OR ENABLE_WORKBENCH)
add_custom_target(GUITests)
add_dependencies(check GUITests)
# Collect all tests together
add_dependencies(AllTests GUITests)
add_subdirectory(qt)
if(ENABLE_MANTIDPLOT)
add_subdirectory(MantidPlot)
option(ENABLE_DOCS "Enable Building user and developer documentation" ON)
if (ENABLE_DOCS)
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()
# System test data target
add_subdirectory(Testing/SystemTests/scripts)
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")
Russell Taylor
committed
# 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 items
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
function(uppercase_first_letter output_var input)
string(LENGTH ${input} _inputlen)
string(TOUPPER ${input} _allupper)
string(SUBSTRING ${_allupper} 0 1 _first)
string(SUBSTRING ${input} 1 ${_inputlen} _rest)
set(${output_var} ${_first}${_rest} PARENT_SCOPE)
endfunction()
function(install_desktop_files filename app_name exec_cmd icon_file icon_install_file)
set(DESKTOP_NAME ${app_name})
set(DESKTOP_EXEC_CMD ${exec_cmd})
get_filename_component(DESKTOP_ICON ${icon_install_file} NAME_WE)
set(_output_file ${CMAKE_CURRENT_BINARY_DIR}/${filename}.install)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/installers/LinuxInstaller/launcher-template.desktop.in
${_output_file} @ONLY)
install(FILES ${_output_file}
DESTINATION /usr/share/applications
RENAME ${filename})
install(FILES ${icon_file}
DESTINATION /usr/share/pixmaps
RENAME ${icon_install_file})
endfunction()
set(_icon_suffix)
if(CPACK_PACKAGE_SUFFIX)
if (${CPACK_PACKAGE_SUFFIX} STREQUAL "nightly" OR
${CPACK_PACKAGE_SUFFIX} STREQUAL "unstable")
set(_icon_suffix ${CPACK_PACKAGE_SUFFIX})
endif()
endif()
set( IMAGES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/images )
set(_app_name_suffix)
if(CPACK_PACKAGE_SUFFIX)
uppercase_first_letter(_app_name_suffix ${CPACK_PACKAGE_SUFFIX})
endif()
if(ENABLE_MANTIDPLOT)
set(_icon_filename ${IMAGES_DIR}/mantidplot)
if(_icon_suffix)
set(_icon_filename ${_icon_filename}${_icon_suffix})
endif()
install_desktop_files(mantidplot${CPACK_PACKAGE_SUFFIX}.desktop
"Mantid Plot ${_app_name_suffix}"
${CMAKE_INSTALL_PREFIX}/bin/MantidPlot
${_icon_filename}.png
mantidplot${CPACK_PACKAGE_SUFFIX}.png )
endif()
if(ENABLE_WORKBENCH)
set(_icon_filename ${IMAGES_DIR}/mantid_workbench)
if(_icon_suffix)
set(_icon_filename ${_icon_filename}${_icon_suffix})
endif()
install_desktop_files(mantidworkbench${CPACK_PACKAGE_SUFFIX}.desktop
"Mantid Workbench ${_app_name_suffix}"
${CMAKE_INSTALL_PREFIX}/bin/mantidworkbench
${_icon_filename}.png
mantid_workbench${CPACK_PACKAGE_SUFFIX}.png)
# THIS MUST BE THE LAST SUB_DIRECTORY ADDED. See
# Framework/PostInstall/CMakeLists for an explanation
add_subdirectory(Framework/PostInstall)
# Conda
option(ENABLE_CONDA "Switch to enable conda package generation")
if(ENABLE_CONDA)
include(conda)
endif(ENABLE_CONDA)
Russell Taylor
committed
# CPack settings
# Keep this in a defaulted-to-off option
option(ENABLE_CPACK "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 - only used if package requested is rpm
set(
CPACK_RPM_PACKAGE_REQUIRES
"boost169-date-time,"
"boost169-regex,"
"boost169-serialization,"
"boost169-filesystem,"
"boost169-system,"
"nexus >= 4.3.1,gsl,glibc,muParser,tbb,librdkafka,"
"OCE-draw,OCE-foundation,OCE-modeling,OCE-ocaf,OCE-visualization,"
"poco-crypto,poco-data,poco-mysql,poco-sqlite,poco-odbc,poco-util,poco-xml,poco-zip,poco-net,poco-netssl,poco-foundation,"
"hdf,hdf5,jsoncpp >= 0.7.0")
if(ENABLE_MANTIDPLOT)
set(CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},qt4 >= 4.2,qscintilla,qwt5-qt4,qwtplot3d-qt4")
endif()
if(ENABLE_WORKBENCH)
set(CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},qt5-qtbase,qscintilla-qt5")
set(
CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},"
"boost169-python3,"
"python36-numpy,python36-scipy,python36-h5py,python36-PyCifRW,"
"python36-six,python36-PyYAML,python36-requests,python36-toml,"
"python36-ipython,python36-ipython-notebook"
)
if(ENABLE_MANTIDPLOT)
set(CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},python36-QtPy,"
"python36-matplotlib-qt4,python36-ipython-gui")
endif()
if(ENABLE_WORKBENCH)
set(CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},python36-qt5,python36-QtPy,"
"python36-matplotlib-qt5,python36-psutil,python36-ipython-gui")
endif()
else()
set(
CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},"
"boost169-python2,"
"numpy,scipy,h5py >= 2.3.1,PyCifRW >= 4.2.1,"
"python-enum34,python-six,PyYAML,python-requests,"
"python-ipython >= 1.1.0,python-ipython-notebook"
)
if(ENABLE_MANTIDPLOT)
set(CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},sip >= 4.18,PyQt4,python2-QtPy,"
"python2-matplotlib-qt4 >= 1.5.2,python-ipython-gui")
if(ENABLE_WORKBENCH)
set(CPACK_RPM_PACKAGE_REQUIRES
"${CPACK_RPM_PACKAGE_REQUIRES},python2-qt5,python2-QtPy,"
"python2-matplotlib-qt4 >= 1.5.2,python-psutil,python-ipython-gui")
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
string(REPLACE ";"
","
CPACK_RPM_PACKAGE_REQUIRES
${CPACK_RPM_PACKAGE_REQUIRES}) # fix up the fact that it was
# made as an array
string(REPLACE ",,"
","
CPACK_RPM_PACKAGE_REQUIRES
${CPACK_RPM_PACKAGE_REQUIRES})
# ubuntu requirements - only used if package requested is deb
set(
CPACK_DEBIAN_PACKAGE_DEPENDS
"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),"
"libjsoncpp1 (>=0.7.0),"
"libmuparser2v5,"
"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}"
)
if(ENABLE_MANTIDPLOT)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},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")
endif()
if("${UNIX_CODENAME}" STREQUAL "xenial")
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},libgsl2,"
"liboce-foundation10,liboce-modeling10,"
"libqscintilla2-12v5,"
"ipython-notebook,"
"libhdf5-cpp-11")
if(ENABLE_WORKBENCH)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5scintilla2-12v5")
else() # bionic and newer
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},libgsl23,"
"liboce-foundation11,liboce-modeling11,"
"libqscintilla2-qt4-13,"
"jupyter-notebook,"
"libhdf5-cpp-100")
if(ENABLE_WORKBENCH)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},libqscintilla2-qt5-13")
if(PYTHON_VERSION_MAJOR EQUAL 3)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},python3-h5py,"
"python3-numpy,"
"python3-requests,"
"python3-sip,"
"python3-six,"
"python3-matplotlib,"
"python3-pycifrw (>= 4.2.1),"
"python3-yaml,"
"ipython3-qtconsole") # transitional package for bionic
if(ENABLE_MANTIDPLOT)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},python3-pyqt4")
endif()
if(ENABLE_WORKBENCH)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},python3-pyqt5,python3-psutil")
endif()
else() # python 2
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},python-h5py,"
"python-numpy,"
"python-requests,"
"python-sip,"
"python-six,"
"python-matplotlib,"
"python-scipy,"
"python-pycifrw (>= 4.2.1),"
"python-yaml,"
"ipython-qtconsole")
if(ENABLE_MANTIDPLOT)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},python-qt4")
endif()
if(ENABLE_WORKBENCH)
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"${CPACK_DEBIAN_PACKAGE_DEPENDS},python-pyqt5,python-psutil")
# parse list to string required for deb package
string(REPLACE ";"
","
CPACK_DEBIAN_PACKAGE_DEPENDS
${CPACK_DEBIAN_PACKAGE_DEPENDS}) # fix up the fact that it
# was made as an array
string(REPLACE ",,"
","
CPACK_DEBIAN_PACKAGE_DEPENDS
${CPACK_DEBIAN_PACKAGE_DEPENDS})
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},libgoogle-perftools4 (>= 1.7)")
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()