Coverity fixes
[u/mrichter/AliRoot.git] / CMakeLists.txt
1 # -*- mode: cmake -*-
2
3 # Top level CMakeList.txt file for the AliRoot Build System
4 #
5 # Author: Johny Jose (johny.jose@cern.ch)
6 #         Port of previous Makefile build to cmake
7
8
9 cmake_minimum_required(VERSION 2.8.4 FATAL_ERROR)
10
11 #--------------------------------------------------------------------------------#
12 # Set Basic CMake Configuration                                                  #
13 #--------------------------------------------------------------------------------#
14
15 project(AliRoot CXX C Fortran)
16
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})
26 set(ODIR $ENV{ODIR})
27
28 if(NOT ALICE)
29   message(WARNING "Environment variable ALICE is not set")
30 endif(NOT ALICE)
31
32 if(NOT ALICE_ROOT)
33   message(FATAL_ERROR "Please set ALICE_ROOT to the AliRoot source directory")
34 endif(NOT ALICE_ROOT)
35
36 # Set AliRoot Installation directory 
37 if(NOT ALICE_INSTALL)
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})
40 else()
41   message(STATUS "AliRoot files will be installed in ${ALICE_INSTALL}")
42 endif(NOT ALICE_INSTALL)
43 set(CMAKE_INSTALL_PREFIX ${ALICE_INSTALL})
44
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)
48
49 include(ALICE_CMake)
50
51 #--------------------------------------------------------------------------------#
52 # Find Packages                                                                  #
53 #--------------------------------------------------------------------------------#
54
55 # Subversion
56 # ------------------------------
57
58 find_package(Subversion REQUIRED)
59
60 # ROOT
61 # ------------------------------
62
63 find_package(ROOT REQUIRED)
64
65 # IRST Rule Checker 
66 # ------------------------------
67
68 find_package(RuleChecker)
69
70 # DATE
71 # ------------------------------ 
72
73 find_package(DATE)
74
75 # GEANT3
76 # ------------------------------
77
78 find_package(GEANT3)
79
80 # AMORE
81 # ------------------------------
82
83 find_package(AMORE)
84
85 # AliRoot CPack configuration                                                    
86 #-------------------------------
87
88 find_package(CPack)
89
90
91 #--------------------------------------------------------------------------------#
92 # Environment/Compiler Configuration                                             #
93 #--------------------------------------------------------------------------------#
94
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()
101
102
103 #--------------------------------------------------------------------------------#
104 # AliRoot Path Settings                                                          #
105 #--------------------------------------------------------------------------------#
106
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}")
115
116
117 #--------------------------------------------------------------------------------#
118 # AliRoot Modules                                                                #
119 #--------------------------------------------------------------------------------#
120
121 # Exclude Module from all target
122 # ------------------------------
123
124 #set(EXCLUDEMODULES THydjet SHUTTLE)
125
126
127 # Standard Modules
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 PWG0 PWG1 PWG2 PWG3 PWG4 TRIGGER PYTHIA8 TAmpt OADB MFT)
130
131 if(THydjet)
132   list(APPEND ALIROOTMODULES THydjet)
133 endif(THydjet)
134
135 if(SHUTTLE)
136   list(APPEND ALIROOTMODULES SHUTTLE)
137 endif(SHUTTLE)
138
139 # Additional Modules
140 # ------------------------------
141 list(APPEND ALIROOTMODULES TUHKMgen EPOS)
142
143 # EVE
144 # ------------------------------
145 ALICE_RootConfig(EVE --has-opengl)
146 if(NOT EVE STREQUAL "no")
147   list(APPEND ALIROOTMODULES EVE)
148 endif(NOT EVE STREQUAL "no")
149
150 # CERN Modules
151 # ------------------------------
152 set(CERNMODULES LHAPDF HIJING MICROCERN HERWIG)
153
154 # Check for Pythia 6
155 if(EXISTS ${ROOTINCDIR}/TPythia6.h)
156   set(PYTHIA6 TRUE)
157   list(APPEND CERNMODULES PYTHIA6 EVGEN)
158 elseif(NOT NOPYTHIA)
159   message(FATAL_ERROR "ROOT must have Pythia6 enabled !")
160 endif(EXISTS ${ROOTINCDIR}/TPythia6.h)
161
162 # Set Final list of modules 
163 set(MODULES ${ALIROOTMODULES} ${CERNMODULES} ALIROOT)
164
165 # Set Module directories
166 set(MODDIRS ${MODULES})
167
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})
172
173 # Configure ARVerion.h
174 # ------------------------------
175 if(Subversion_FOUND)
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})
181
182   elseif(EXISTS ${PROJECT_SOURCE_DIR}/.git/ )
183     execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND git svn info OUTPUT_VARIABLE OUTPUTVAR)
184     string(REPLACE "\n" ";" OUTPUTVAR ${OUTPUTVAR})
185     foreach(f ${OUTPUTVAR})
186       if(${f} MATCHES URL)
187         string(REGEX MATCH "[^/]+$" ALIROOT_SVN_BRANCH ${f})
188       elseif(${f} MATCHES Revision)
189         string(REGEX MATCH "[^: ]+$" ALIROOT_SVN_REVISION ${f})
190       endif(${f} MATCHES URL)   
191     endforeach()
192   endif(EXISTS ${PROJECT_SOURCE_DIR}/.svn/ )
193
194   message(STATUS "Aliroot Revision - ${ALIROOT_SVN_REVISION} Branch - ${ALIROOT_SVN_BRANCH}")
195   if(EXISTS ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h)
196     file(REMOVE ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h)
197   endif(EXISTS ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h)
198   configure_file(${PROJECT_SOURCE_DIR}/cmake/ARVersion.h.tmp ${CMAKE_INCLUDE_EXPORT_DIRECTORY}/ARVersion.h @ONLY)
199 endif(Subversion_FOUND)
200 string (REPLACE "-" "." ALIROOT_SVN_BRANCH_SPEC "${ALIROOT_SVN_BRANCH}")
201
202 #--------------------------------------------------------------------------------#
203 # Build Modules                                                                  #
204 #--------------------------------------------------------------------------------#
205
206 # Module Variables
207 # ------------------------------
208 set(ALLLIBS)
209 set(ALLEXECS)
210 set(INCLUDEFILES)
211 set(BINLIBS)
212 set(EXPORTFILES)
213
214 # Top Level Build Targets
215 # ------------------------------
216
217 add_custom_target(alilibs-static)
218 add_custom_target(include-headers ALL)
219 add_custom_target(DA-all)
220 add_custom_target(check-all) 
221 add_custom_target(check-hxml)
222 add_custom_target(smell-all) 
223 add_custom_target(htmldoc) 
224 add_custom_target(par-all)
225 add_custom_target(test-par-all)
226
227 #NY file(GLOB CFILES_LIST ${CMAKE_SOURCE_DIR}/macros/*.C)
228
229 add_custom_command(TARGET htmldoc
230                    PRE_BUILD
231                    COMMAND mkdir -p html
232                    COMMAND rm -rf html/roothtml
233                    COMMAND rm -f html/picts
234                    COMMAND cd html &&
235                             aliroot -q -b \"mkhtml.C(0,1)\"
236                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
237
238
239 # Add Modules   
240 # ------------------------------
241 foreach(MODULE ${MODDIRS})
242   set(${MODULE}ALIBS)
243   configure_file(${PROJECT_SOURCE_DIR}/cmake/Module.tmp ${PROJECT_SOURCE_DIR}/${MODULE}/CMakeLists.txt @ONLY)
244   add_custom_target(${MODULE}-all ALL)
245   add_custom_target(${MODULE}-par-all)
246   add_custom_target(test-${MODULE}-par-all)
247   add_custom_target(${MODULE}-all-static)
248   add_dependencies(alilibs-static "${MODULE}-static")
249   add_subdirectory(${MODULE})
250   
251 #NY  set(dir "${CMAKE_SOURCE_DIR}/${MODULE}")
252 #NY  if (EXISTS "${dir}")
253 #NY      file(GLOB CFILES_MOD ${dir}/*.C)
254 #NY      list(LENGTH CFILES_MOD len)
255 #NY      if (${len} GREATER 0)
256 #NY        list(APPEND CFILES_LIST "${CFILES_MOD}")
257 #NY      endif (${len} GREATER 0)
258 #NY  endif(EXISTS "${dir}")
259 endforeach(MODULE)
260
261 #NY foreach(cfile ${CFILES_LIST})
262 #NY     add_custom_command(TARGET htmldoc
263 #NY                    PRE_BUILD
264 #NY                    COMMAND cd html && 
265 #NY                            aliroot -b -q \"mkhtml.C(\"${cfile}\")\" > /dev/null
266 #NY                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
267 #NY endforeach(cfile)
268
269 if(DATE_FOUND)
270   include (CMakeDA)
271 endif(DATE_FOUND)
272
273 if(RULECHECKER_FOUND)
274     add_custom_target(factfile DEPENDS ${FACTFILE})
275     add_custom_command( OUTPUT ${FACTFILE}
276                         COMMAND ${CMAKE_COMMAND} -E echo "Re-generating factfile"
277                         COMMAND ${JAVA_RUNTIME}  -Xmx1024M -jar ${FACTEXTRACTOR_JAR} ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}                    
278                         DEPENDS check-hxml ${CMAKE_BINARY_DIR}/check-hxml-touchfile ${_factfile_deps} 
279                         WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
280 endif(RULECHECKER_FOUND)
281
282 #--------------------------------------------------------------------------------#
283 # Additional Targets                                                             #
284 #--------------------------------------------------------------------------------#
285
286 # AliMdc RPM
287 # ------------------------------
288
289 execute_process(
290 COMMAND root-config --libdir 
291 OUTPUT_VARIABLE ROOTALIBDIR)
292 string(REPLACE "\n" "" ROOTALIBDIR ${ROOTALIBDIR}) 
293
294 execute_process(
295 COMMAND root-config --arch 
296 OUTPUT_VARIABLE ARCHITECTURE)
297
298
299 set(AEXT a)
300 set(LIBPATH ${CMAKE_BINARY_DIR}/lib/tgt_${ALICE_TARGET})
301 set(BINPATH ${CMAKE_BINARY_DIR}/bin/tgt_${ALICE_TARGET})
302 set(EXPORTDIR ${ALICE_ROOT}/include)
303 set(BINLIBDIRS -L${ALICE_ROOT}/${LIBPATH})
304 set(RAWDIRO ${CMAKE_BINARY_DIR}/RAW)
305 set(ALIMDCSPECFILE ${RAWDIRO}/alimdc.spec)
306 set(RAWDatabaseALIB ${LIBPATH}/libRAWDatabase.${AEXT})
307 set(ESDALIB ${LIBPATH}/libESD.${AEXT})
308 set(STEERBaseALIB ${LIBPATH}/libSTEERBase.${AEXT})
309 set(MDCALIB ${LIBPATH}/libMDC.${AEXT})
310 set(MODDIRO RAW/tgt_${ALICE_TARGET})
311
312
313 if( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
314 set(ALIMDCARCHDIR x86_64)
315 elseif( ${ARCHITECTURE} MATCHES "linux" )
316 set(ALIMDCARCHDIR i386)
317 elseif( ${ARCHITECTURE} MATCHES "linuxia64gcc" )
318 set(ALIMDCARCHDIR ia64)
319 elseif(NOT DEFINED ${ARCHITECTURE})
320 message("alimdc-rpm: Unknown architecture" )
321 else( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
322 message("alimdc-rpm: Unknown architecture" )
323 endif( ${ARCHITECTURE} MATCHES "linuxx8664gcc" )
324
325
326 add_custom_target( alimdc-rpm
327 DEPENDS alimdc-static alimdc-specfile
328 )
329
330 add_custom_command(
331 TARGET alimdc-rpm
332 POST_BUILD 
333 COMMAND rm -rf ${ALICE_ROOT}/alimdc-root
334 COMMAND mkdir -p ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
335 COMMAND mkdir -p ${ALICE_ROOT}/alimdc-root/opt/alimdc/include
336 COMMAND cp ${ALICE_ROOT}/RAW/mdc.h ${ALICE_ROOT}/alimdc-root/opt/alimdc/include
337 COMMAND cp ${LIBPATH}/libAliMDC.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
338 COMMAND cp ${ROOTALIBDIR}/libRoot.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
339 COMMAND cp ${ROOTALIBDIR}/libfreetype.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
340 COMMAND cp ${ROOTALIBDIR}/libpcre.a ${ALICE_ROOT}/alimdc-root/opt/alimdc/lib
341 COMMAND rm -rf ${ALICE_ROOT}/RPMS
342 COMMAND mkdir -p ${ALICE_ROOT}/RPMS/${ALIMDCARCHDIR}/
343 COMMAND rpmbuild --verbose --define "_topdir ${ALICE_ROOT}" --define "_tmppath ${ALICE_ROOT}" -bb ${ALIMDCSPECFILE} 
344 COMMAND cp -p ${ALICE_ROOT}/RPMS/${ALIMDCARCHDIR}/alimdc-*.rpm .
345 COMMAND rm -rf ${ALICE_ROOT}/alimdc-root
346 COMMAND rm -rf ${ALICE_ROOT}/RPMS
347 COMMAND echo "***** alimdc RPM created and put in ${CMAKE_BINARY_DIR} folder *****"
348 )
349
350 add_custom_command(
351 TARGET ${RAWDIRO}
352 COMMAND mkdir-p ${RAWDIRO}
353 )
354
355
356 add_custom_target( alimdc-specfile
357 DEPENDS ${RAWDIRO}
358 )
359
360 add_custom_command( 
361 TARGET alimdc-specfile
362 POST_BUILD
363 COMMAND rm -rf ${ALIMDCSPECFILE}
364 COMMAND @echo "***** Making alimdc RPM spec-file ${ALIMDCSPECFILE} *****"
365 COMMAND @echo '\# RPM specfile for alimdc static libs' >> ${ALIMDCSPECFILE} 
366 COMMAND @echo '\# Package contains both ROOT and AliRoot' >> ${ALIMDCSPECFILE}
367 COMMAND @echo '\# static libs needed by mStreamRecorder' >> ${ALIMDCSPECFILE}
368 COMMAND @echo '\# in order to ROOT-ify the incoming raw' >> ${ALIMDCSPECFILE}
369 COMMAND @echo '\# data' >> ${ALIMDCSPECFILE}
370 COMMAND @echo '\# Example how-to build alimdc RPM:' >> ${ALIMDCSPECFILE}
371 COMMAND @echo '\# cd ${ALICE_ROOT}' >> ${ALIMDCSPECFILE}
372 COMMAND @echo '\# make alimdc-rpm' >> ${ALIMDCSPECFILE}
373 COMMAND @echo "" >> ${ALIMDCSPECFILE}
374 COMMAND @echo "Summary: AliMDC static libraries" >> ${ALIMDCSPECFILE}
375 COMMAND @echo "Name: alimdc" >> ${ALIMDCSPECFILE}
376 COMMAND @echo "Version:  ${ALIROOT_SVN_BRANCH_SPEC}" >> ${ALIMDCSPECFILE}
377 COMMAND @echo "Release: ${ALIROOT_SVN_REVISION}" >> ${ALIMDCSPECFILE}
378 COMMAND @echo '\# Copyright: CERN Alice Off-line' >> ${ALIMDCSPECFILE}
379 COMMAND @echo "License: CERN Alice Off-line" >> ${ALIMDCSPECFILE}
380 COMMAND @echo "Vendor: ALICE Core Off-line Group" >> ${ALIMDCSPECFILE}
381 COMMAND @echo "URL: http://aliceinfo.cern.ch" >> ${ALIMDCSPECFILE}
382 COMMAND @echo "Group: Applications/Alice" >> ${ALIMDCSPECFILE}
383 COMMAND @echo "Prefix: /opt/%{name}" >> ${ALIMDCSPECFILE}
384 COMMAND @echo "BuildRoot: %{_tmppath}/%{name}-root" >> ${ALIMDCSPECFILE}
385 COMMAND @echo "" >> ${ALIMDCSPECFILE}
386 COMMAND @echo '\# automatic dependencies' >> ${ALIMDCSPECFILE}
387 COMMAND @echo "AutoReqProv: yes" >> ${ALIMDCSPECFILE}
388 COMMAND @echo "" >> ${ALIMDCSPECFILE}
389 COMMAND @echo '\# list here required RPM packages for runtime' >> ${ALIMDCSPECFILE}
390 COMMAND @echo "Requires: glibc" >> ${ALIMDCSPECFILE}
391 COMMAND @echo "" >> ${ALIMDCSPECFILE}
392 COMMAND @echo "Provides: alimdc" >> ${ALIMDCSPECFILE}
393 COMMAND @echo "" >> ${ALIMDCSPECFILE}
394 COMMAND @echo '\# description of the package' >> ${ALIMDCSPECFILE}
395 COMMAND @echo "%description" >> ${ALIMDCSPECFILE}
396 COMMAND @echo "Package contains both ROOT and AliRoot" >> ${ALIMDCSPECFILE}
397 COMMAND @echo "static libs needed by mStreamRecorder" >> ${ALIMDCSPECFILE}
398 COMMAND @echo "in order to ROOT-ify the incoming raw" >> ${ALIMDCSPECFILE}
399 COMMAND @echo "data. The package version correspond to" >> ${ALIMDCSPECFILE}
400 COMMAND @echo "the AliRoot one." >> ${ALIMDCSPECFILE}
401 COMMAND @echo "" >> ${ALIMDCSPECFILE}
402 COMMAND @echo '\# list of files to be installed' >> ${ALIMDCSPECFILE}
403 COMMAND @echo "%files" >> ${ALIMDCSPECFILE}
404 COMMAND @echo '%defattr (-,root,root)' >> ${ALIMDCSPECFILE}
405 COMMAND @echo "%{prefix}/lib/libAliMDC.a" >> ${ALIMDCSPECFILE}
406 COMMAND @echo "%{prefix}/lib/libRoot.a" >> ${ALIMDCSPECFILE}
407 COMMAND @echo "%{prefix}/lib/libpcre.a" >> ${ALIMDCSPECFILE}
408 COMMAND @echo "%{prefix}/lib/libfreetype.a" >> ${ALIMDCSPECFILE}
409 COMMAND @echo "%{prefix}/include/mdc.h" >> ${ALIMDCSPECFILE}
410 )
411
412
413 add_custom_target( alimdc-static
414 DEPENDS ${LIBPATH} ${BINPATH} RAW-all-static STEER-all-static )
415
416 add_custom_command( 
417 TARGET alimdc-static
418 POST_BUILD
419 COMMAND ar r ${LIBPATH}/alimdccxxo.a ${CMAKE_BINARY_DIR}/RAW/CMakeFiles/alimdc.dir/alimdc_main.cxx.o
420 COMMAND rm -rf ${LIBPATH}/libAliMDC.a
421 COMMAND ar x ${RAWDatabaseALIB}
422 COMMAND ar x ${MDCALIB}
423 COMMAND ar x ${ESDALIB}
424 COMMAND ar x ${STEERBaseALIB}
425 COMMAND ar r ${LIBPATH}/libAliMDC.a *.o
426 COMMAND ar t ${RAWDatabaseALIB} | xargs rm 
427 COMMAND ar t ${MDCALIB} | xargs rm 
428 COMMAND ar t ${ESDALIB} | xargs rm 
429 COMMAND ar t ${STEERBaseALIB} | xargs rm 
430 COMMAND ${CMAKE_CXX_COMPILER} ${LDFLAGS} -o ${BINPATH}/alimdca ${LIBPATH}/alimdccxxo.a ${LIBPATH}/libAliMDC.a ${ROOTALIBDIR}/libRoot.a ${ROOTALIBDIR}/libfreetype.a ${ROOTALIBDIR}/libpcre.a -pthread -ldl -lz
431 COMMAND @echo "Target alimdc-static made"
432 )
433
434 add_custom_command(
435 TARGET ${LIBPATH}
436 COMMAND mkdir -p ${LIBPATH}
437 )
438
439
440 #include (MakefileDA) 
441 include (InstallRequiredSystemLibraries)
442 include (CPack)
443
444 # Install data
445 # ------------------------------
446 install ( DIRECTORY data 
447           DESTINATION . )
448
449
450 #
451 # EOF
452 #
453