# Set Basic CMake Configuration #
#--------------------------------------------------------------------------#
-cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
+cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)
+
+### CMP0025 Compiler id for Apple Clang is now AppleClang.
+### CMP0042 MACOSX_RPATH is enabled by default.
+
+foreach(p
+ CMP0025 # CMake 3.0
+ CMP0042 # CMake 3.0
+ )
+ if(POLICY ${p})
+ cmake_policy(SET ${p} NEW)
+ endif()
+endforeach()
project(AliRoot CXX C)
-# If no Fortran, i.e on Windows
-include(CheckLanguage)
-check_language(Fortran)
-if(CMAKE_Fortran_COMPILER)
- enable_language(Fortran OPTIONAL)
-else()
- message("No Fortran support. Disabling LHAPDF, PHYTIA6, MICROCERN")
-endif()
+message(STATUS "CMake platform: ${CMAKE_SYSTEM}")
+message(STATUS "Build folder: ${AliRoot_BINARY_DIR}")
+message(STATUS "Source folder: ${AliRoot_SOURCE_DIR}")
+message(STATUS "Installation folder: ${CMAKE_INSTALL_PREFIX}")
-# Path to additonal modules
-set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
-include(CMakeALICE)
+# CMake supports different build types by default. We want the DEBUG build type
+# to have "-g -O0" flags: by default it only has "-g"
+set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
-# ROOT configuration mandatory
-if(ROOTSYS)
- find_package(ROOT REQUIRED)
+# You can change the build type using
+# cmake -DCMAKE_BUILD_TYPE=DEBUG | RELEASE | RELWITHDEBINFO | MINSIZEREL ...
+if (NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE RELWITHDEBINFO)
+endif(NOT CMAKE_BUILD_TYPE)
+message(STATUS "Build type: ${CMAKE_BUILD_TYPE} (${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}})")
- # ROOT must be build with XML2 support
- if(ROOT_HASXML STREQUAL "no")
- message(FATAL_ERROR "ROOT was not build with xml2 support. Please reinstall or rebuild ROOT with xml2 support")
- endif(ROOT_HASXML STREQUAL "no")
-else()
- message(FATAL_ERROR "ROOT installation not found!\nPlease point to the ROOT installation using -DROOTSYS=ROOT_INSTALL_DIR")
-endif(ROOTSYS)
+if(CMAKE_INSTALL_PREFIX STREQUAL "${AliRoot_SOURCE_DIR}")
+ message(FATAL_ERROR "Please choose a different installation point than the source tree!")
+endif()
-# DATE
-find_package(DATE)
+# Path to additonal modules
+set(CMAKE_MODULE_PATH "${AliRoot_SOURCE_DIR}/cmake")
-# Configure ARVerion.h using Git informatiion
-# Sets 3 git variables
+# AliRoot version extracted from Git repository
+# Sets 4 git variables
# - GIT_REFSPEC - complete name of the current reference
# - ALIROOT_BRANCH - name of the branch or tag extracted from the current reference
# - GIT_SHA1 - current hash in the long format
# - GIT_SHORT_SHA1 - current hash in the short format
-if(EXISTS ${PROJECT_SOURCE_DIR}/.git/)
- include(GetGitRevisionDescription)
-
- find_package(Git)
-
- if(GIT_FOUND)
- get_git_head_revision(GIT_REFSPEC GIT_SHA1)
-
- # GIT_REFSPEC is empty for detached mode = tags in detached mode or checkout to specific hash
-
- # returns the closest reference to the current hash
- # name of the current tag or heads/branch in the case of branches
- git_describe(ALIROOT_GIT_TAG "--all" "--abbrev=0")
-
- STRING(REGEX REPLACE "^(.+/)(.+)/(.*)$" "\\2" BRANCH_TYPE "${GIT_REFSPEC}" )
-
- # the revision is not set in the case of a branch, it means we are doing development
- # and the revision will trigger a reconfiguration
- if(BRANCH_TYPE STREQUAL "heads")
- set(ALIROOT_REVISION "ThisIsaBranchNoRevisionProvided")
- STRING(REGEX REPLACE "^(.+/)(.+/)(.*)$" "\\3" SHORT_BRANCH "${GIT_REFSPEC}" )
- else()
- set(SHORT_BRANCH ${ALIROOT_GIT_TAG})
- set(ALIROOT_REVISION ${GIT_SHA1})
- endif()
-
- set(ALIROOT_BRANCH ${SHORT_BRANCH})
-
- # generate the short version of the revision hash
- execute_process(COMMAND git rev-parse --short ${GIT_SHA1}
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
- OUTPUT_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE res
- OUTPUT_VARIABLE GIT_SHORT_SHA1)
-
- # if the rev-parse fails we set the short sha to the long initial one
- if(NOT res EQUAL 0)
- set(GIT_SHORT_SHA1 ${GIT_SHA1})
- endif()
-
- message(STATUS "Aliroot branch/tag: \"${ALIROOT_BRANCH}\" - Revision: \"${GIT_SHORT_SHA1}\" ")
+# - ALIROOT_VERSION = ALIROOT_BRANCH
+# - ALIROOT_REVISION = GIT_SHORT_SHA1
+include(CheckGitVersion)
- else()
- message(STATUS "Git not installed. I can't tell you which revision you are using!")
- endif(GIT_FOUND)
+# - CLANG_MAJOR.CLANG_MINOR or
+# - GCC_MAJOR.GCC_MINOR.GCC_PATCH
+include(CheckCompiler)
+
+# Utility to generate PARfiles
+include(cmake/GenParFile.cmake)
+
+# Shared library suffix
+if (NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
+ set(CMAKE_SHARED_LIBRARY_SUFFIX .so)
+endif (NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
+
+# Optional: Doxygen for reference doc generation
+find_package(Doxygen)
+if(DOXYGEN_FOUND AND DOXYGEN_DOT_FOUND)
+ message(STATUS "Doxygen ${DOXYGEN_VERSION} and Graphviz found: ${DOXYGEN_EXECUTABLE}, ${DOXYGEN_DOT_EXECUTABLE}")
+ set(CAN_GENERATE_DOC TRUE)
+elseif(DOXYGEN_ONLY)
+ message(FATAL_ERROR "Doxygen and Graphviz not found. Cannot generate documentation")
else()
- message("AliRoot sources not downloaded from a Version Control System. I can't tell which revision you are using!")
-endif(EXISTS ${PROJECT_SOURCE_DIR}/.git/)
+ message(STATUS "Doxygen and Graphviz not found. Disabling support for documentation generation")
+endif()
-configure_file(${PROJECT_SOURCE_DIR}/cmake/ARVersion.h.tmp ${CMAKE_BINARY_DIR}/version/ARVersion.h @ONLY)
-install(FILES ${PROJECT_BINARY_DIR}/version/ARVersion.h DESTINATION include)
+# Doxygen documentation is always included
+add_subdirectory(doxygen)
-string (REPLACE "-" "." ALIROOT_BRANCH_SPEC "${ALIROOT_BRANCH}")
+if(DEFINED DOXYGEN_ONLY AND DOXYGEN_ONLY)
+ # In this case we do not prepare targets for the rest, but for Doxygen only.
+ # This is useful because no checks are performed, and it means that Doxygen
+ # documentation can be generated on a relatively "dumb" server that has as
+ # requirements only cmake, doxygen and graphviz.
+ message(WARNING "Preparing build for Doxygen documentation only as requested. AliRoot will not be built!")
+else()
-message(STATUS "CMake platform: ${CMAKE_SYSTEM}")
-message(STATUS "Build folder: ${AliRoot_BINARY_DIR}")
-message(STATUS "Source folder: ${AliRoot_SOURCE_DIR}")
-message(STATUS "Installation folder: ${CMAKE_INSTALL_PREFIX}")
+ # Standard CMake inclusions and checks if we are actually building AliRoot,
+ # i.e. not only the documentation
+
+ # Checking first for DIM, DATE, AMORE and daqDA
+ # in case ROOT Extra static library needs to be enabled
+
+ # DATE
+ # date-config needs DIMDIR and ODIR set
+ # Setting variables in cache to be accesible by ccmake
+ set(DATE_CONFIG CACHE STRING "date-config script location")
+ set(DIMDIR CACHE STRING "dim installation folder")
+ set(ODIR CACHE STRING "dim plaform, usually \"linux\"")
+
+ if(DIMDIR AND ODIR)
+ find_package(DIM)
+ endif()
+
+ if(DATE_CONFIG)
+ if(DIM_FOUND)
+ find_package(DATE)
+ else()
+ message(FATAL_ERROR "DATE enabled but no DIMDIR and ODIR set. Please set DIMDIR and ODIR")
+ endif()
+ endif()
+
+ # daqDA
+ # Setting variables in cache to be accesible by ccmake
+ set(daqDA CACHE STRING "daqDA library folder installation")
+ if(daqDA)
+ find_package(daqDA)
+ endif(daqDA)
+
+ # AMORE -> requires ROOT to be installed
+ # Setting variables in cache to be accesible by ccmake
+ set(AMORE_CONFIG CACHE STRING "amore-config script location")
+ if(AMORE_CONFIG)
+ if(ROOTSYS)
+ find_package(AMORE)
+ else()
+ message(FATAL_ERROR "AMORE enabled but no ROOTSYS defined")
+ endif()
+ endif(AMORE_CONFIG)
+
+ # id DARPM we enable DA if it is not set
+ # Setting variables in cache to be accesible by ccmake
+ set(DARPM CACHE STRING "Enable DARPM: ON")
+ set(DA CACHE STRING "Enable DA: ON")
+ if(DARPM)
+ if(NOT DA)
+ set(DA ON)
+ endif(NOT DA)
+ endif(DARPM)
+
+ # DA is enabled
+ # Setting variables in cache to be accesible by ccmake
+ set(ALIROOT_STATIC CACHE STRING "ENABLE static building of AliRoot: ON")
+ if(DA)
+ if(NOT DIM_FOUND)
+ set(DA FALSE)
+ message(FATAL_ERROR "DAs enabled but no DIMDIR and ODIR set. Please set DIMDIR to DIM installation and ODIR to platform (default linux)")
+ endif()
+
+ if(NOT DATE_FOUND)
+ set(DA FALSE)
+ message(FATAL_ERROR "DAs enabled but no DATE support found. Please point to your date installation using \"DATE_CONFIG\" variable")
+ endif()
+
+ if(NOT daqDA_FOUND)
+ set(DA FALSE)
+ message(FATAL_ERROR "DAs enabled but no daqDA support found. Please point to your daqDA installation using \"daqDA\" variable")
+ endif()
+
+ if(NOT AMORE_FOUND)
+ set(DA FALSE)
+ message(FATAL_ERROR "DAs enabled but no AMORE support found. Please point to your AMORE installation using \"AMORE_CONFIG\" variable")
+ endif()
+
+ # Enable static libraries
+ set(ALIROOT_STATIC TRUE)
+ message(STATUS "DAs enabled")
+ endif(DA)
+
+ # MDC rpm creation enables the static build
+ # Setting variables in cache to be accesible by ccmake
+ set(MDCRPM CACHE STRING "Enable mdc rpm build")
+ if(MDCRPM)
+ set(ALIROOT_STATIC TRUE)
+ message(STATUS "AliMDC RPM enabled. AliRoot static build enabled")
+ endif(MDCRPM)
+
+ # ROOT configuration mandatory
+ # FindRoot has to be after the enabling of DA due to libRootExtra
+ # Do not put it above DA
+ # Setting variables in cache to be accesible by ccmake
+ set(ROOTSYS CACHE STRING "ROOT installation folder")
+ if(ROOTSYS)
+ find_package(ROOT REQUIRED)
+
+ # ROOT must be build with XML2 support
+ if(NOT ROOT_HASXML)
+ message(FATAL_ERROR "ROOT was not build with xml2 support. Please reinstall or rebuild ROOT with xml2 support")
+ endif(NOT ROOT_HASXML)
+ else()
+ message(FATAL_ERROR "ROOT installation not found!\nPlease point to the ROOT installation using -DROOTSYS=ROOT_INSTALL_DIR")
+ endif(ROOTSYS)
+
+ # ROOT dictionaries and maps
+ include(CMakeALICE)
+
+ # If no Fortran, i.e on Windows
+ # We need to specify ROOT fortran
+ # (f95 comes before gfortran in default module)
+ include(CheckLanguage)
+
+ if(ROOT_FORTRAN)
+ message(STATUS "Using the Fortran compiler defined by ROOT configuration: ${ROOT_FORTRAN}")
+ set(CMAKE_Fortran_COMPILER ${ROOT_FORTRAN})
+ else()
+ message(STATUS "Using default system Fortran compiler")
+ endif(ROOT_FORTRAN)
+
+ check_language(Fortran)
+ if(CMAKE_Fortran_COMPILER)
+ enable_language(Fortran OPTIONAL)
+ else()
+ message(STATUS "No Fortran support. Disabling LHAPDF, PHYTIA6, MICROCERN, etc.")
+ endif()
+
+ # FastJet
+ find_package(FASTJET)
+
+ # ZEROMQ
+ find_package(ZeroMQ)
+
+ # Generating the AliRoot-config.cmake file
+ configure_file(${PROJECT_SOURCE_DIR}/cmake/AliRoot-config.cmake.in ${CMAKE_BINARY_DIR}/version/AliRoot-config.cmake @ONLY)
+ install(FILES ${PROJECT_BINARY_DIR}/version/AliRoot-config.cmake DESTINATION etc)
+
+ # General flags -> Should be moved into a configuration file
+ set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
+ set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE)
+
+ # List of modules for which PARfiles are enabled -- use the cache as global scope and clean it
+ set(ALIPARFILES "" CACHE INTERNAL "ALIPARFILES" FORCE)
+
+ # AliRoot base modules
+ add_subdirectory(STEER)
+ add_subdirectory(RAW)
+ add_subdirectory(ANALYSIS)
+
+ # Include Vc own cmake
+ include(Vc/Vc.cmake)
+ add_subdirectory(Vc)
+
+ # AliRoot common macros
+ add_subdirectory(macros)
+
+ # AliRoot modules
+ add_subdirectory(ACORDE)
+ add_subdirectory(AD)
+ add_subdirectory(BCM)
+ add_subdirectory(EMCAL)
+ add_subdirectory(EPOS)
+ add_subdirectory(EVE)
+ add_subdirectory(EVGEN)
+ add_subdirectory(FASTSIM)
+ add_subdirectory(FIT)
+ add_subdirectory(FMD)
+ add_subdirectory(HLT)
+ add_subdirectory(HMPID)
+ add_subdirectory(ITS)
+ add_subdirectory(MFT)
+ add_subdirectory(MONITOR)
+ add_subdirectory(MUON)
+ add_subdirectory(PHOS)
+ add_subdirectory(PMD)
+ add_subdirectory(PYTHIA8)
+ add_subdirectory(STARLIGHT)
+ add_subdirectory(STAT)
+ add_subdirectory(STRUCT)
+ add_subdirectory(T0)
+ add_subdirectory(TDPMjet)
+ add_subdirectory(TEvtGen)
+ add_subdirectory(THerwig)
+ add_subdirectory(TOF)
+ add_subdirectory(TPC)
+ add_subdirectory(TRD)
+ add_subdirectory(TRIGGER)
+ add_subdirectory(TTherminator)
+ add_subdirectory(VZERO)
+ add_subdirectory(ZDC)
+
+ # Fortran modules
+ if(CMAKE_Fortran_COMPILER)
+ add_subdirectory(DIME)
+ add_subdirectory(DPMJET)
+ add_subdirectory(HERWIG)
+ add_subdirectory(HIJING)
+ add_subdirectory(LHAPDF)
+ add_subdirectory(MICROCERN)
+ add_subdirectory(PYTHIA6)
+ add_subdirectory(TEPEMGEN)
+ add_subdirectory(THbtp)
+ add_subdirectory(THijing)
+ add_subdirectory(THydjet)
+ add_subdirectory(TPHIC)
+ add_subdirectory(TUHKMgen)
+ add_subdirectory(TAmpt)
+ endif(CMAKE_Fortran_COMPILER)
+
+ add_subdirectory(data)
+ add_subdirectory(GRP)
+ add_subdirectory(OCDB)
+ add_subdirectory(QAref)
+
+ # Enable SHUTTLE compilation
+ # Check if DIMDIR and ODIR are set
+ # # Setting variables in cache to be accesible by ccmake
+ set(SHUTTLE CACHE STRING "Enable SHUTTLE build : ON")
+ if(SHUTTLE)
+ if(NOT ROOT_HASMONALISA)
+ message(FATAL_ERROR "ROOT was not build with MonAlisa support")
+ endif()
+
+ find_package(ApMon)
+
+ if(ROOT_HASALIEN STREQUAL "no")
+ message(FATAL_ERROR "Shuttle needs ROOT build with AliEn support. Please build ROOT with AliEn support. Do not forget to set ALIEN to your AliEn installation")
+ endif()
+
+ if(DIM_FOUND AND ALIEN)
+ add_subdirectory(SHUTTLE)
+ else()
+ message(FATAL_ERROR "SHUTTLE enabled! Please specify DIMDIR, ODIR and ALIEN")
+ endif()
+ endif(SHUTTLE)
+
+ add_subdirectory(ALIROOT)
+
+ # List modules with PARfiles
+ string(REPLACE ";" " " ALIPARFILES_FLAT "${ALIPARFILES}")
+ message(STATUS "PARfile target enabled for the following modules: ${ALIPARFILES_FLAT}")
+ # Install Find macros for common packages to be further used by AliPhysics
+ install(FILES
+ cmake/CMakeALICE.cmake
+ cmake/FindROOT.cmake
+ cmake/FindFASTJET.cmake
+ cmake/FindZeroMQ.cmake
+ cmake/GetGitRevisionDescription.cmake
+ cmake/GetGitRevisionDescription.cmake.in
+ DESTINATION cmake)
-# AliRoot modules
-add_subdirectory(STEER)
-add_subdirectory(STAT)
-add_subdirectory(OADB)
-add_subdirectory(ANALYSIS)
-add_subdirectory(RAW)
-add_subdirectory(ITS)
-add_subdirectory(TPC)
-add_subdirectory(VZERO)
-add_subdirectory (T0)
-add_subdirectory (TOF)
-add_subdirectory (TRD)
-add_subdirectory (ZDC)
-add_subdirectory (STRUCT)
-add_subdirectory (HMPID)
-add_subdirectory (PMD)
-#add_subdirectory (MUON)
-#add_subdirectory (FMD)
-#add_subdirectory (ACORDE)
-#add_subdirectory (EMCAL)
-#add_subdirectory (PHOS)
-#add_subdirectory (TRIGGER)
-#add_subdirectory (BCM)
-#add_subdirectory (CORRFW)
-#add_subdirectory (FASTSIM)
-#if(CMAKE_Fortran_COMPILER_WORKS)
-# add_subdirectory (LHAPDF)
-# add_subdirectory (PYTHIA6)
-# add_subdirectory (MICROCERN)
-#endif(CMAKE_Fortran_COMPILER_WORKS)
-#add_subdirectory (EVGEN)
-#add_subdirectory (TUHKMgen)
-#add_subdirectory (TTherminator)
-#add_subdirectory (TPHIC)
-#add_subdirectory (THydjet)
-#add_subdirectory (PWG)
-#add_subdirectory (Vc)
-#add_subdirectory (HLT)
+endif(DEFINED DOXYGEN_ONLY AND DOXYGEN_ONLY)