3 # Top level CMakeList.txt file for the AliRoot Build System
5 # Author: Johny Jose (johny.jose@cern.ch)
6 # Port of previous Makefile build to cmake
9 cmake_minimum_required(VERSION 2.8.4 FATAL_ERROR)
11 #--------------------------------------------------------------------------------#
12 # Set Basic CMake Configuration #
13 #--------------------------------------------------------------------------------#
15 project(AliRoot CXX C Fortran)
17 # Environment variables
18 set(ALICE $ENV{ALICE})
20 message(WARNING "Environment variable ALICE is not set")
23 set(ALICE_ROOT $ENV{ALICE_ROOT})
25 message(FATAL_ERROR "Please set ALICE_ROOT to the AliRoot source directory")
28 set(ALICE_INSTALL $ENV{ALICE_INSTALL})
29 # Set AliRoot Installation directory
30 # If CMAKE_INSTALL_PREFIX was not set than we set it to ALICE_INSTALL.
31 # If ALICE_INSTALL was not defined than it will default to source directory
32 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
34 message(STATUS "AliRoot files will be installed in ${ALICE_INSTALL}")
36 message(STATUS "AliRoot files will be installed in ${ALICE_ROOT}. You
37 can specify a different location by passing -DCMAKE_INSTALL_PREFIX or
38 by setting ALICE_INSTALL environment variable")
39 set(ALICE_INSTALL ${ALICE_ROOT})
40 if(${ALICE_INSTALL} STREQUAL ${CMAKE_BINARY_DIR})
41 message(FATAL_ERROR "The install directory must differ from the
45 set(CMAKE_INSTALL_PREFIX ${ALICE_INSTALL} CACHE STRING "Install dir" FORCE)
49 # Environment for SHUTTLE
50 set(DIMDIR $ENV{DIMDIR})
53 get_filename_component(PROJECT_SOURCE_DIR "${PROJECT_SOURCE_DIR}" REALPATH)
54 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
55 set(CPACK_COMPONENTS_ALL MDC)
59 #--------------------------------------------------------------------------------#
61 #--------------------------------------------------------------------------------#
64 # ------------------------------
66 find_package(Subversion REQUIRED)
69 # ------------------------------
71 find_package(ROOT REQUIRED)
74 # ------------------------------
76 find_package(RuleChecker)
79 # ------------------------------
84 # ------------------------------
89 # ------------------------------
93 # AliRoot CPack configuration
94 #-------------------------------
99 # ------------------------------
103 # ------------------------------
104 find_package(FASTJET)
106 #--------------------------------------------------------------------------------#
107 # Environment/Compiler Configuration #
108 #--------------------------------------------------------------------------------#
110 ALICE_CheckOutOfSourceBuild()
111 ALICE_RootConfig(CMAKE_CXX_COMPILER --cxx)
112 ALICE_RootConfig(CMAKE_C_COMPILER --cc)
113 ALICE_RootConfig(CMAKE_Fortran_COMPILER --f77)
114 ALICE_ConfigurePlatform()
115 ALICE_ConfigureCompiler()
118 #--------------------------------------------------------------------------------#
119 # AliRoot Path Settings #
120 #--------------------------------------------------------------------------------#
122 ALICE_DevFlagsOutput()
123 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/tgt_${ALICE_TARGET}")
124 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/tgt_${ALICE_TARGET}")
125 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/tgt_${ALICE_TARGET}")
126 set(CMAKE_INCLUDE_EXPORT_DIRECTORY "${PROJECT_BINARY_DIR}/include")
127 file(MAKE_DIRECTORY ${CMAKE_INCLUDE_EXPORT_DIRECTORY})
128 set(EXPORTDIRS "${ALICE_INSTALL}/include")
129 set(BINLIBDIRS "-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
132 #--------------------------------------------------------------------------------#
134 #--------------------------------------------------------------------------------#
136 # Exclude Module from all target
137 # ------------------------------
139 #set(EXCLUDEMODULES THydjet SHUTTLE)
143 # ------------------------------
144 set(ALIROOTMODULES STEER PHOS TRD TPC ZDC MUON PMD FMD TOF ITS AD ACORDE HMPID T0 BCM STRUCT VZERO THijing THbtp EMCAL THerwig TEPEMGEN FASTSIM TPHIC RAW MONITOR STORAGE ANALYSIS JETAN HLT STAT TTherminator CORRFW DPMJET TDPMjet STARLIGHT PWGPP PWG PWGCF PWGGA PWGHF PWGDQ PWGJE PWGLF PWGUD TRIGGER PYTHIA8 TAmpt OADB MFT TEvtGen FIT)
147 list(APPEND ALIROOTMODULES THydjet)
151 list(APPEND ALIROOTMODULES SHUTTLE)
155 # ------------------------------
156 list(APPEND ALIROOTMODULES TUHKMgen EPOS)
159 # ------------------------------
160 ALICE_RootConfig(EVE --has-opengl)
161 if(NOT EVE STREQUAL "no")
162 list(APPEND ALIROOTMODULES EVE)
163 endif(NOT EVE STREQUAL "no")
166 # ------------------------------
167 set(CERNMODULES LHAPDF HIJING MICROCERN HERWIG)
170 if(EXISTS ${ROOTINCDIR}/TPythia6.h)
172 list(APPEND CERNMODULES PYTHIA6 EVGEN)
174 message(FATAL_ERROR "ROOT must have Pythia6 enabled !")
175 endif(EXISTS ${ROOTINCDIR}/TPythia6.h)
177 # Set Final list of modules
178 set(MODULES ${ALIROOTMODULES} ${CERNMODULES} ALIROOT)
180 # Set Module directories
181 set(MODDIRS ${MODULES})
183 # Libraries for Linking
184 # ------------------------------
185 set(ALILIBS MUON TPC PMD TRD FMD TOF ITS PHOS AD ACORDE HMPID VZERO ZDC STRUCT T0 EVGEN STEER TRIGGER MFT)
186 set(LIBS ${ROOTCLIBS} ${ROOTPLIBS} ${SYSLIBS})
188 # Configure ARVerion.h
189 # ------------------------------
190 #If the sources were taken from Git
191 if(EXISTS ${PROJECT_SOURCE_DIR}/.git/)
192 include(GetGitRevisionDescription)
197 get_git_head_revision(GIT_REFSPEC GIT_SHA1)
199 # GIT_REFSPEC is empty for detached mode = tags in detached mode or checkout to specific hash
202 # returns the closest reference to the current hash
203 # name of the current tag or heads/branch in the case of branches
204 git_describe(ALIROOT_GIT_TAG "--all" "--abbrev=0")
206 STRING(REGEX REPLACE "^(.+/)(.+)/(.*)$" "\\2" BRANCH_TYPE "${GIT_REFSPEC}" )
208 # the revision is not set in the case of a branch, it means we are doing development
209 # and the revision will trigger a reconfiguration
210 if(BRANCH_TYPE STREQUAL "heads")
211 set(ALIROOT_REVISION "ThisIsaBranchNoRevisionProvided")
212 STRING(REGEX REPLACE "^(.+/)(.+/)(.*)$" "\\3" SHORT_BRANCH "${GIT_REFSPEC}" )
214 set(SHORT_BRANCH ${ALIROOT_GIT_TAG})
215 set(ALIROOT_REVISION ${GIT_SHA1})
218 set(ALIROOT_BRANCH ${SHORT_BRANCH})
219 message(STATUS "Aliroot branch/tag: \"${ALIROOT_BRANCH}\" - Revision: \"${GIT_SHA1}\" ")
222 message("Git not installed. I can't tell you which revision you are using!")
225 message("AliRoot sources not downloaded from a Version Control System. I can't tell which revision you are using!")
226 endif(EXISTS ${PROJECT_SOURCE_DIR}/.git/)
228 configure_file(${PROJECT_SOURCE_DIR}/cmake/ARVersion.h.tmp ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/FromTemplate/ARVersion.h @ONLY)
230 string (REPLACE "-" "." ALIROOT_BRANCH_SPEC "${ALIROOT_BRANCH}")
232 #--------------------------------------------------------------------------------#
234 #--------------------------------------------------------------------------------#
237 # ------------------------------
244 # Top Level Build Targets
245 # ------------------------------
247 add_custom_target(alilibs-static)
248 add_custom_target(include-headers ALL)
249 add_custom_target(DA-all)
250 add_custom_target(check-all)
251 add_custom_target(check-hxml)
252 add_custom_target(smell-all)
253 add_custom_target(htmldoc)
254 add_custom_target(par-all)
255 add_custom_target(test-par-all)
257 #NY file(GLOB CFILES_LIST ${CMAKE_SOURCE_DIR}/macros/*.C)
259 add_custom_command(TARGET htmldoc
261 COMMAND mkdir -p html
262 COMMAND rm -rf html/roothtml
263 COMMAND rm -f html/picts
264 COMMAND cd html && aliroot -q -b mkhtml.C\\\(0,1\\\)
265 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
267 # Include Vc, which provides the static libVc and the relevant CMake macros
272 # ------------------------------
273 foreach(MODULE ${MODDIRS})
275 #RS configure_file(${PROJECT_SOURCE_DIR}/cmake/Module.tmp ${PROJECT_SOURCE_DIR}/${MODULE}/CMakeLists.txt @ONLY)
276 add_custom_target(${MODULE}-all ALL)
277 add_custom_target(${MODULE}-par-all)
278 add_custom_target(test-${MODULE}-par-all)
279 add_custom_target(${MODULE}-all-static)
280 add_dependencies(alilibs-static "${MODULE}-static")
281 add_subdirectory(${MODULE})
283 #NY set(dir "${CMAKE_SOURCE_DIR}/${MODULE}")
284 #NY if (EXISTS "${dir}")
285 #NY file(GLOB CFILES_MOD ${dir}/*.C)
286 #NY list(LENGTH CFILES_MOD len)
287 #NY if (${len} GREATER 0)
288 #NY list(APPEND CFILES_LIST "${CFILES_MOD}")
289 #NY endif (${len} GREATER 0)
290 #NY endif(EXISTS "${dir}")
293 #NY foreach(cfile ${CFILES_LIST})
294 #NY add_custom_command(TARGET htmldoc
296 #NY COMMAND cd html &&
297 #NY aliroot -b -q \"mkhtml.C(\"${cfile}\")\" > /dev/null
298 #NY WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
299 #NY endforeach(cfile)
305 if(RULECHECKER_FOUND)
306 add_custom_target(factfile DEPENDS ${FACTFILE})
307 add_custom_command( OUTPUT ${FACTFILE}
308 COMMAND ${CMAKE_COMMAND} -E echo "Re-generating factfile"
309 COMMAND ${JAVA_RUNTIME} -Xmx1024M -jar ${FACTEXTRACTOR_JAR} ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
310 DEPENDS check-hxml ${CMAKE_BINARY_DIR}/check-hxml-touchfile ${_factfile_deps}
311 WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
312 endif(RULECHECKER_FOUND)
314 #--------------------------------------------------------------------------------#
315 # Additional Targets #
316 #--------------------------------------------------------------------------------#
319 # ------------------------------
322 COMMAND root-config --libdir
323 OUTPUT_VARIABLE ROOTALIBDIR)
324 string(REPLACE "\n" "" ROOTALIBDIR ${ROOTALIBDIR})
327 COMMAND root-config --arch
328 OUTPUT_VARIABLE ARCHITECTURE)
332 set(LIBPATH ${CMAKE_BINARY_DIR}/lib/tgt_${ALICE_TARGET})
333 set(BINPATH ${CMAKE_BINARY_DIR}/bin/tgt_${ALICE_TARGET})
334 set(EXPORTDIR ${ALICE_ROOT}/include)
335 set(BINLIBDIRS -L${ALICE_ROOT}/${LIBPATH})
336 set(RAWDIRO ${CMAKE_BINARY_DIR}/RAW)
337 set(ALIMDCSPECFILE ${RAWDIRO}/alimdc.spec)
338 set(RAWDatabaseALIB ${LIBPATH}/libRAWDatabase.${AEXT})
339 set(ESDALIB ${LIBPATH}/libESD.${AEXT})
340 set(STEERBaseALIB ${LIBPATH}/libSTEERBase.${AEXT})
341 set(MDCALIB ${LIBPATH}/libMDC.${AEXT})
342 set(MODDIRO RAW/tgt_${ALICE_TARGET})
345 if( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
346 set(ALIMDCARCHDIR x86_64)
347 elseif( ${ARCHITECTURE} MATCHES "linux" )
348 set(ALIMDCARCHDIR i386)
349 elseif( ${ARCHITECTURE} MATCHES "linuxia64gcc" )
350 set(ALIMDCARCHDIR ia64)
351 elseif(NOT DEFINED ${ARCHITECTURE})
352 message("alimdc-rpm: Unknown architecture" )
353 else( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
354 message("alimdc-rpm: Unknown architecture" )
355 endif( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
358 # Module version will be written in the generated header
359 configure_file ("RAW/alimdc.spec.in" "${CMAKE_CURRENT_BINARY_DIR}/RAW/alimdc.spec" @ONLY)
361 add_custom_target( alimdc-rpm
362 DEPENDS alimdc-static
368 COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root
369 COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
370 COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/include
371 COMMAND cp ${ALICE_ROOT}/RAW/mdc.h ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/include
372 COMMAND cp ${LIBPATH}/libAliMDC.a ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
373 COMMAND cp ${ROOTALIBDIR}/libRoot.a ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
374 COMMAND cp ${ROOTALIBDIR}/liblzma.a ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
375 COMMAND cp ${ROOTALIBDIR}/libpcre.a ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
376 COMMAND cp ${ROOTALIBDIR}/libfreetype.a ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
377 COMMAND cp ${ROOTALIBDIR}/libpcre.a ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root/opt/alimdc/lib
378 COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/RPMS
379 COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/RPMS/${ALIMDCARCHDIR}/
380 COMMAND rpmbuild --verbose --define "_topdir ${CMAKE_CURRENT_BINARY_DIR}" --define "%buildroot ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root" -bb ${ALIMDCSPECFILE}
381 COMMAND cp -p ${CMAKE_CURRENT_BINARY_DIR}/RPMS/${ALIMDCARCHDIR}/alimdc-*.rpm .
382 COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/alimdc-root
383 COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/RPMS
384 COMMAND echo "***** alimdc RPM created and put in ${CMAKE_BINARY_DIR} folder *****"
389 COMMAND mkdir-p ${RAWDIRO}
393 add_custom_target( alimdc-static
394 DEPENDS ${LIBPATH} ${BINPATH} RAW-all-static STEER-all-static )
399 COMMAND ar r ${LIBPATH}/alimdccxxo.a ${CMAKE_BINARY_DIR}/RAW/CMakeFiles/alimdc.dir/alimdc_main.cxx.o
400 COMMAND rm -rf ${LIBPATH}/libAliMDC.a
401 COMMAND ar x ${RAWDatabaseALIB}
402 COMMAND ar x ${MDCALIB}
403 COMMAND ar x ${ESDALIB}
404 COMMAND ar x ${STEERBaseALIB}
405 COMMAND ar r ${LIBPATH}/libAliMDC.a *.o
406 COMMAND ar t ${RAWDatabaseALIB} | xargs rm
407 COMMAND ar t ${MDCALIB} | xargs rm
408 COMMAND ar t ${ESDALIB} | xargs rm
409 COMMAND ar t ${STEERBaseALIB} | xargs rm
410 COMMAND ${CMAKE_CXX_COMPILER} ${LDFLAGS} -o ${BINPATH}/alimdca ${LIBPATH}/alimdccxxo.a ${LIBPATH}/libAliMDC.a ${ROOTALIBDIR}/libRoot.a ${ROOTALIBDIR}/libfreetype.a ${ROOTALIBDIR}/libpcre.a ${ROOTALIBDIR}/liblzma.a -pthread -lssl -ldl -lz
411 COMMAND @echo "Target alimdc-static made"
416 COMMAND mkdir -p ${LIBPATH}
420 #include (MakefileDA)
421 include (InstallRequiredSystemLibraries)
425 # ------------------------------
426 install ( DIRECTORY data
428 install ( DIRECTORY OCDB
430 PATTERN ".svn" EXCLUDE)
431 install ( DIRECTORY QAref
433 PATTERN ".svn" EXCLUDE)
434 install ( DIRECTORY GRP
436 PATTERN ".svn" EXCLUDE)