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_ROOT $ENV{ALICE_ROOT})
19 set(ALICE $ENV{ALICE})
20 set(ALICE_INSTALL $ENV{ALICE_INSTALL})
21 if(${ALICE_INSTALL} MATCHES ${CMAKE_BINARY_DIR})
22 message(FATAL_ERROR "Install dir should be different from build dir")
23 endif(${ALICE_INSTALL} MATCHES ${CMAKE_BINARY_DIR})
24 # Environment for SHUTTLE
25 set(DIMDIR $ENV{DIMDIR})
29 message(WARNING "Environment variable ALICE is not set")
33 message(FATAL_ERROR "Please set ALICE_ROOT to the AliRoot source directory")
36 # Set AliRoot Installation directory
38 message(STATUS "AliRoot files will be installed in ${ALICE_ROOT}. You can specify a different location by setting ALICE_INSTALL environment variable")
39 set(ALICE_INSTALL ${ALICE_ROOT})
41 message(STATUS "AliRoot files will be installed in ${ALICE_INSTALL}")
42 endif(NOT ALICE_INSTALL)
43 set(CMAKE_INSTALL_PREFIX ${ALICE_INSTALL})
45 get_filename_component(PROJECT_SOURCE_DIR "${PROJECT_SOURCE_DIR}" REALPATH)
46 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
47 set(CPACK_COMPONENTS_ALL MDC)
51 #--------------------------------------------------------------------------------#
53 #--------------------------------------------------------------------------------#
56 # ------------------------------
58 find_package(Subversion REQUIRED)
61 # ------------------------------
63 find_package(ROOT REQUIRED)
66 # ------------------------------
68 find_package(RuleChecker)
71 # ------------------------------
76 # ------------------------------
81 # ------------------------------
85 # AliRoot CPack configuration
86 #-------------------------------
91 #--------------------------------------------------------------------------------#
92 # Environment/Compiler Configuration #
93 #--------------------------------------------------------------------------------#
95 ALICE_CheckOutOfSourceBuild()
96 ALICE_RootConfig(CMAKE_CXX_COMPILER --cxx)
97 ALICE_RootConfig(CMAKE_C_COMPILER --cc)
98 ALICE_RootConfig(CMAKE_Fortran_COMPILER --f77)
99 ALICE_ConfigurePlatform()
100 ALICE_ConfigureCompiler()
103 #--------------------------------------------------------------------------------#
104 # AliRoot Path Settings #
105 #--------------------------------------------------------------------------------#
107 ALICE_DevFlagsOutput()
108 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/tgt_${ALICE_TARGET}")
109 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/tgt_${ALICE_TARGET}")
110 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/tgt_${ALICE_TARGET}")
111 set(CMAKE_INCLUDE_EXPORT_DIRECTORY "${PROJECT_BINARY_DIR}/include")
112 file(MAKE_DIRECTORY ${CMAKE_INCLUDE_EXPORT_DIRECTORY})
113 set(EXPORTDIRS "${ALICE_INSTALL}/include")
114 set(BINLIBDIRS "-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
117 #--------------------------------------------------------------------------------#
119 #--------------------------------------------------------------------------------#
121 # Exclude Module from all target
122 # ------------------------------
124 #set(EXCLUDEMODULES THydjet SHUTTLE)
128 # ------------------------------
129 set(ALIROOTMODULES STEER PHOS TRD TPC ZDC MUON PMD FMD TOF ITS ACORDE HMPID T0 BCM STRUCT VZERO THijing THbtp EMCAL THerwig TEPEMGEN FASTSIM TPHIC RAW MONITOR ANALYSIS JETAN HLT STAT TTherminator CORRFW DPMJET TDPMjet PWGPP PWG PWGCF PWGGA PWGHF PWGDQ PWGJE PWGLF PWGUD TRIGGER PYTHIA8 TAmpt OADB MFT TEvtGen)
132 list(APPEND ALIROOTMODULES THydjet)
136 list(APPEND ALIROOTMODULES SHUTTLE)
140 # ------------------------------
141 list(APPEND ALIROOTMODULES TUHKMgen EPOS)
144 # ------------------------------
145 ALICE_RootConfig(EVE --has-opengl)
146 if(NOT EVE STREQUAL "no")
147 list(APPEND ALIROOTMODULES EVE)
148 endif(NOT EVE STREQUAL "no")
151 # ------------------------------
152 set(CERNMODULES LHAPDF HIJING MICROCERN HERWIG)
155 if(EXISTS ${ROOTINCDIR}/TPythia6.h)
157 list(APPEND CERNMODULES PYTHIA6 EVGEN)
159 message(FATAL_ERROR "ROOT must have Pythia6 enabled !")
160 endif(EXISTS ${ROOTINCDIR}/TPythia6.h)
162 # Set Final list of modules
163 set(MODULES ${ALIROOTMODULES} ${CERNMODULES} ALIROOT)
165 # Set Module directories
166 set(MODDIRS ${MODULES})
168 # Libraries for Linking
169 # ------------------------------
170 set(ALILIBS MUON TPC PMD TRD FMD TOF ITS PHOS ACORDE HMPID VZERO ZDC STRUCT T0 EVGEN STEER TRIGGER MFT)
171 set(LIBS ${ROOTCLIBS} ${ROOTPLIBS} ${SYSLIBS})
173 # Configure ARVerion.h
174 # ------------------------------
176 if(EXISTS ${PROJECT_SOURCE_DIR}/.svn/ )
177 Subversion_WC_INFO(${PROJECT_SOURCE_DIR} PROJECT)
178 set(ALIROOT_SVN_REVISION ${PROJECT_WC_REVISION})
179 set(ALIROOT_SVN_BRANCH ${PROJECT_WC_URL})
180 string(REGEX MATCH "[^/]+$" ALIROOT_SVN_BRANCH ${ALIROOT_SVN_BRANCH})
182 elseif(EXISTS ${PROJECT_SOURCE_DIR}/.git/ )
183 if(EXISTS ${PROJECT_SOURCE_DIR}/.git/svn/refs )
184 execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND git svn info OUTPUT_VARIABLE OUTPUTVAR)
185 string(REPLACE "\n" ";" OUTPUTVAR ${OUTPUTVAR})
186 foreach(f ${OUTPUTVAR})
188 string(REGEX MATCH "[^/]+$" ALIROOT_SVN_BRANCH ${f})
189 elseif(${f} MATCHES Revision)
190 string(REGEX MATCH "[^: ]+$" ALIROOT_SVN_REVISION ${f})
191 endif(${f} MATCHES URL)
194 execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND git log -1 OUTPUT_VARIABLE OUTPUTVAR)
195 string(REPLACE "\n" ";" OUTPUTVAR ${OUTPUTVAR})
196 foreach(f ${OUTPUTVAR})
197 if(${f} MATCHES "^[ ]*git-svn-id:")
198 string(REGEX REPLACE "^.*/(.*)[@].*$" "\\1" ALIROOT_SVN_BRANCH "${f}" )
199 string(REGEX REPLACE "^.*/.*[@](.*) .*$" "\\1" ALIROOT_SVN_REVISION "${f}" )
200 endif(${f} MATCHES "^[ ]*git-svn-id:")
202 if(${ALIROOT_SVN_BRANCH}x STREQUAL "x")
203 set(ALIROOT_SVN_BRANCH "git clone")
204 set(ALIROOT_SVN_REVISION "-1")
205 endif(${ALIROOT_SVN_BRANCH}x STREQUAL "x")
206 endif(EXISTS ${PROJECT_SOURCE_DIR}/.git/svn/refs )
207 endif(EXISTS ${PROJECT_SOURCE_DIR}/.svn/ )
209 message(STATUS "Aliroot Revision - ${ALIROOT_SVN_REVISION} Branch - ${ALIROOT_SVN_BRANCH}")
210 if(EXISTS ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h)
211 file(REMOVE ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h)
212 endif(EXISTS ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h)
213 configure_file(${PROJECT_SOURCE_DIR}/cmake/ARVersion.h.tmp ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h @ONLY)
214 endif(Subversion_FOUND)
215 string (REPLACE "-" "." ALIROOT_SVN_BRANCH_SPEC "${ALIROOT_SVN_BRANCH}")
217 #--------------------------------------------------------------------------------#
219 #--------------------------------------------------------------------------------#
222 # ------------------------------
229 # Top Level Build Targets
230 # ------------------------------
232 add_custom_target(alilibs-static)
233 add_custom_target(include-headers ALL)
234 add_custom_target(DA-all)
235 add_custom_target(check-all)
236 add_custom_target(check-hxml)
237 add_custom_target(smell-all)
238 add_custom_target(htmldoc)
239 add_custom_target(par-all)
240 add_custom_target(test-par-all)
242 #NY file(GLOB CFILES_LIST ${CMAKE_SOURCE_DIR}/macros/*.C)
244 add_custom_command(TARGET htmldoc
246 COMMAND mkdir -p html
247 COMMAND rm -rf html/roothtml
248 COMMAND rm -f html/picts
250 aliroot -q -b \"mkhtml.C(0,1)\"
251 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
253 # Include Vc, which provides the static libVc and the relevant CMake macros
258 # ------------------------------
259 foreach(MODULE ${MODDIRS})
261 #RS configure_file(${PROJECT_SOURCE_DIR}/cmake/Module.tmp ${PROJECT_SOURCE_DIR}/${MODULE}/CMakeLists.txt @ONLY)
262 add_custom_target(${MODULE}-all ALL)
263 add_custom_target(${MODULE}-par-all)
264 add_custom_target(test-${MODULE}-par-all)
265 add_custom_target(${MODULE}-all-static)
266 add_dependencies(alilibs-static "${MODULE}-static")
267 add_subdirectory(${MODULE})
269 #NY set(dir "${CMAKE_SOURCE_DIR}/${MODULE}")
270 #NY if (EXISTS "${dir}")
271 #NY file(GLOB CFILES_MOD ${dir}/*.C)
272 #NY list(LENGTH CFILES_MOD len)
273 #NY if (${len} GREATER 0)
274 #NY list(APPEND CFILES_LIST "${CFILES_MOD}")
275 #NY endif (${len} GREATER 0)
276 #NY endif(EXISTS "${dir}")
279 #NY foreach(cfile ${CFILES_LIST})
280 #NY add_custom_command(TARGET htmldoc
282 #NY COMMAND cd html &&
283 #NY aliroot -b -q \"mkhtml.C(\"${cfile}\")\" > /dev/null
284 #NY WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
285 #NY endforeach(cfile)
291 if(RULECHECKER_FOUND)
292 add_custom_target(factfile DEPENDS ${FACTFILE})
293 add_custom_command( OUTPUT ${FACTFILE}
294 COMMAND ${CMAKE_COMMAND} -E echo "Re-generating factfile"
295 COMMAND ${JAVA_RUNTIME} -Xmx1024M -jar ${FACTEXTRACTOR_JAR} ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
296 DEPENDS check-hxml ${CMAKE_BINARY_DIR}/check-hxml-touchfile ${_factfile_deps}
297 WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
298 endif(RULECHECKER_FOUND)
300 #--------------------------------------------------------------------------------#
301 # Additional Targets #
302 #--------------------------------------------------------------------------------#
305 # ------------------------------
308 COMMAND root-config --libdir
309 OUTPUT_VARIABLE ROOTALIBDIR)
310 string(REPLACE "\n" "" ROOTALIBDIR ${ROOTALIBDIR})
313 COMMAND root-config --arch
314 OUTPUT_VARIABLE ARCHITECTURE)
318 set(LIBPATH ${CMAKE_BINARY_DIR}/lib/tgt_${ALICE_TARGET})
319 set(BINPATH ${CMAKE_BINARY_DIR}/bin/tgt_${ALICE_TARGET})
320 set(EXPORTDIR ${ALICE_ROOT}/include)
321 set(BINLIBDIRS -L${ALICE_ROOT}/${LIBPATH})
322 set(RAWDIRO ${CMAKE_BINARY_DIR}/RAW)
323 set(ALIMDCSPECFILE ${RAWDIRO}/alimdc.spec)
324 set(RAWDatabaseALIB ${LIBPATH}/libRAWDatabase.${AEXT})
325 set(ESDALIB ${LIBPATH}/libESD.${AEXT})
326 set(STEERBaseALIB ${LIBPATH}/libSTEERBase.${AEXT})
327 set(MDCALIB ${LIBPATH}/libMDC.${AEXT})
328 set(MODDIRO RAW/tgt_${ALICE_TARGET})
331 if( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
332 set(ALIMDCARCHDIR x86_64)
333 elseif( ${ARCHITECTURE} MATCHES "linux" )
334 set(ALIMDCARCHDIR i386)
335 elseif( ${ARCHITECTURE} MATCHES "linuxia64gcc" )
336 set(ALIMDCARCHDIR ia64)
337 elseif(NOT DEFINED ${ARCHITECTURE})
338 message("alimdc-rpm: Unknown architecture" )
339 else( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
340 message("alimdc-rpm: Unknown architecture" )
341 endif( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
344 add_custom_target( alimdc-rpm
345 DEPENDS alimdc-static alimdc-specfile
351 COMMAND rm -rf ${ALICE_ROOT}/alimdc-root
352 COMMAND mkdir -p ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
353 COMMAND mkdir -p ${ALICE_ROOT}/alimdc-root/opt/alimdc/include
354 COMMAND cp ${ALICE_ROOT}/RAW/mdc.h ${ALICE_ROOT}/alimdc-root/opt/alimdc/include
355 COMMAND cp ${LIBPATH}/libAliMDC.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
356 COMMAND cp ${ROOTALIBDIR}/libRoot.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
357 COMMAND cp ${ROOTALIBDIR}/liblzma.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
358 COMMAND cp ${ROOTALIBDIR}/libpcre.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
359 COMMAND cp ${ROOTALIBDIR}/libfreetype.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
360 COMMAND cp ${ROOTALIBDIR}/libpcre.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
361 COMMAND rm -rf ${ALICE_ROOT}/RPMS
362 COMMAND mkdir -p ${ALICE_ROOT}/RPMS/${ALIMDCARCHDIR}/
363 COMMAND rpmbuild --verbose --define "_topdir ${ALICE_ROOT}" --define "_tmppath ${ALICE_ROOT}" -bb ${ALIMDCSPECFILE}
364 COMMAND cp -p ${ALICE_ROOT}/RPMS/${ALIMDCARCHDIR}/alimdc-*.rpm .
365 COMMAND rm -rf ${ALICE_ROOT}/alimdc-root
366 COMMAND rm -rf ${ALICE_ROOT}/RPMS
367 COMMAND echo "***** alimdc RPM created and put in ${CMAKE_BINARY_DIR} folder *****"
372 COMMAND mkdir-p ${RAWDIRO}
376 add_custom_target( alimdc-specfile
381 TARGET alimdc-specfile
383 COMMAND rm -rf ${ALIMDCSPECFILE}
384 COMMAND @echo "***** Making alimdc RPM spec-file ${ALIMDCSPECFILE} *****"
385 COMMAND @echo '\# RPM specfile for alimdc static libs' >> ${ALIMDCSPECFILE}
386 COMMAND @echo '\# Package contains both ROOT and AliRoot' >> ${ALIMDCSPECFILE}
387 COMMAND @echo '\# static libs needed by mStreamRecorder' >> ${ALIMDCSPECFILE}
388 COMMAND @echo '\# in order to ROOT-ify the incoming raw' >> ${ALIMDCSPECFILE}
389 COMMAND @echo '\# data' >> ${ALIMDCSPECFILE}
390 COMMAND @echo '\# Example how-to build alimdc RPM:' >> ${ALIMDCSPECFILE}
391 COMMAND @echo '\# cd ${ALICE_ROOT}' >> ${ALIMDCSPECFILE}
392 COMMAND @echo '\# make alimdc-rpm' >> ${ALIMDCSPECFILE}
393 COMMAND @echo "" >> ${ALIMDCSPECFILE}
394 COMMAND @echo "Summary: AliMDC static libraries" >> ${ALIMDCSPECFILE}
395 COMMAND @echo "Name: alimdc" >> ${ALIMDCSPECFILE}
396 COMMAND @echo "Version: ${ALIROOT_SVN_BRANCH_SPEC}" >> ${ALIMDCSPECFILE}
397 COMMAND @echo "Release: ${ALIROOT_SVN_REVISION}" >> ${ALIMDCSPECFILE}
398 COMMAND @echo '\# Copyright: CERN Alice Off-line' >> ${ALIMDCSPECFILE}
399 COMMAND @echo "License: CERN Alice Off-line" >> ${ALIMDCSPECFILE}
400 COMMAND @echo "Vendor: ALICE Core Off-line Group" >> ${ALIMDCSPECFILE}
401 COMMAND @echo "URL: http://aliceinfo.cern.ch" >> ${ALIMDCSPECFILE}
402 COMMAND @echo "Group: Applications/Alice" >> ${ALIMDCSPECFILE}
403 COMMAND @echo "Prefix: /opt/%{name}" >> ${ALIMDCSPECFILE}
404 COMMAND @echo "BuildRoot: %{_tmppath}/%{name}-root" >> ${ALIMDCSPECFILE}
405 COMMAND @echo "" >> ${ALIMDCSPECFILE}
406 COMMAND @echo '\# automatic dependencies' >> ${ALIMDCSPECFILE}
407 COMMAND @echo "AutoReqProv: yes" >> ${ALIMDCSPECFILE}
408 COMMAND @echo "" >> ${ALIMDCSPECFILE}
409 COMMAND @echo '\# list here required RPM packages for runtime' >> ${ALIMDCSPECFILE}
410 COMMAND @echo "Requires: glibc" >> ${ALIMDCSPECFILE}
411 COMMAND @echo "" >> ${ALIMDCSPECFILE}
412 COMMAND @echo "Provides: alimdc" >> ${ALIMDCSPECFILE}
413 COMMAND @echo "" >> ${ALIMDCSPECFILE}
414 COMMAND @echo '\# description of the package' >> ${ALIMDCSPECFILE}
415 COMMAND @echo "%description" >> ${ALIMDCSPECFILE}
416 COMMAND @echo "Package contains both ROOT and AliRoot" >> ${ALIMDCSPECFILE}
417 COMMAND @echo "static libs needed by mStreamRecorder" >> ${ALIMDCSPECFILE}
418 COMMAND @echo "in order to ROOT-ify the incoming raw" >> ${ALIMDCSPECFILE}
419 COMMAND @echo "data. The package version correspond to" >> ${ALIMDCSPECFILE}
420 COMMAND @echo "the AliRoot one." >> ${ALIMDCSPECFILE}
421 COMMAND @echo "" >> ${ALIMDCSPECFILE}
422 COMMAND @echo '\# list of files to be installed' >> ${ALIMDCSPECFILE}
423 COMMAND @echo "%files" >> ${ALIMDCSPECFILE}
424 COMMAND @echo '%defattr (-,root,root)' >> ${ALIMDCSPECFILE}
425 COMMAND @echo "%{prefix}/lib/libAliMDC.a" >> ${ALIMDCSPECFILE}
426 COMMAND @echo "%{prefix}/lib/libRoot.a" >> ${ALIMDCSPECFILE}
427 COMMAND @echo "%{prefix}/lib/libpcre.a" >> ${ALIMDCSPECFILE}
428 COMMAND @echo "%{prefix}/lib/liblzma.a" >> ${ALIMDCSPECFILE}
429 COMMAND @echo "%{prefix}/lib/libfreetype.a" >> ${ALIMDCSPECFILE}
430 COMMAND @echo "%{prefix}/include/mdc.h" >> ${ALIMDCSPECFILE}
434 add_custom_target( alimdc-static
435 DEPENDS ${LIBPATH} ${BINPATH} RAW-all-static STEER-all-static )
440 COMMAND ar r ${LIBPATH}/alimdccxxo.a ${CMAKE_BINARY_DIR}/RAW/CMakeFiles/alimdc.dir/alimdc_main.cxx.o
441 COMMAND rm -rf ${LIBPATH}/libAliMDC.a
442 COMMAND ar x ${RAWDatabaseALIB}
443 COMMAND ar x ${MDCALIB}
444 COMMAND ar x ${ESDALIB}
445 COMMAND ar x ${STEERBaseALIB}
446 COMMAND ar r ${LIBPATH}/libAliMDC.a *.o
447 COMMAND ar t ${RAWDatabaseALIB} | xargs rm
448 COMMAND ar t ${MDCALIB} | xargs rm
449 COMMAND ar t ${ESDALIB} | xargs rm
450 COMMAND ar t ${STEERBaseALIB} | xargs rm
451 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 -ldl -lz
452 COMMAND @echo "Target alimdc-static made"
457 COMMAND mkdir -p ${LIBPATH}
461 #include (MakefileDA)
462 include (InstallRequiredSystemLibraries)
466 # ------------------------------
467 install ( DIRECTORY data
469 install ( DIRECTORY OCDB
471 PATTERN ".svn" EXCLUDE)
472 install ( DIRECTORY QAref
474 PATTERN ".svn" EXCLUDE)
475 install ( DIRECTORY GRP
477 PATTERN ".svn" EXCLUDE)