ITS/UPGRADE: additional headers
[u/mrichter/AliRoot.git] / cmake / CMakeALICE.cmake
CommitLineData
b22a7396 1# **************************************************************************
2# * Copyright(c) 1998-2014, ALICE Experiment at CERN, All rights reserved. *
3# * *
4# * Author: The ALICE Off-line Project. *
5# * Contributors are mentioned in the code where appropriate. *
6# * *
7# * Permission to use, copy, modify and distribute this software and its *
8# * documentation strictly for non-commercial purposes is hereby granted *
9# * without fee, provided that the above copyright notice appears in all *
10# * copies and that both the copyright notice and this permission notice *
11# * appear in the supporting documentation. The authors make no claims *
12# * about the suitability of this software for any purpose. It is *
13# * provided "as is" without express or implied warranty. *
14# **************************************************************************
15
fffaf6a5 16# General purpose functions
17
7b0a9d94 18#########################
c2f9135f 19# ROOT utilities
7b0a9d94 20#########################
c2f9135f 21
fffaf6a5 22# Generation of the dictionaries
23# @DNAME Dictionary name
24# @LDNAME LinkDef file name, ex: LinkDef.h
25# @DHDRS Dictionary headers
26# @DINCDIR Include folders that need to be passed to cint/cling
27macro(generate_dictionary DNAME LDNAME DHDRS DINCDIRS)
8e186b29 28
fffaf6a5 29 # Creating the INCLUDE path for cint/cling
30 foreach( dir ${DINCDIRS})
31 set(INCLUDE_PATH -I${dir} ${INCLUDE_PATH})
32 endforeach()
33
34 # Generate the dictionary
b22a7396 35# message(STATUS "Generating dictionary ${DNAME} for ${LDNAME}")
fffaf6a5 36
37# message(STATUS "${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx")
38# message(STATUS "${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.h")
39# message(STATUS "bbb${INCLUDE_PATH}bbb")
40# message(STATUS "${DHDRS} ${LDNAME}")
41# message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}")
42
b168bfa8 43 # Get the definitions from the directory to be sent to CINT
44 get_directory_property(tmpdirdefs DEFINITIONS)
6f45236b 45 string(REPLACE " " ";" tmpdirdefs "${tmpdirdefs}")
b168bfa8 46
8e186b29 47 if (ROOT_VERSION_MAJOR LESS 6)
fffaf6a5 48 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.h
49 COMMAND LD_LIBRARY_PATH=${ROOT_LIBDIR}:$ENV{LD_LIBRARY_PATH} ${ROOT_CINT}
50 ARGS -f ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx -c -p
b168bfa8 51 ${tmpdirdefs} ${INCLUDE_PATH}
fffaf6a5 52 ${DHDRS} ${LDNAME}
0224bae4 53 DEPENDS ${DHDRS} ${LDNAME} ${ROOT_CINT}
fffaf6a5 54 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
55 )
8e186b29 56 else (ROOT_VERSION_MAJOR LESS 6)
57 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lib${DNAME}.rootmap ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx
58 COMMAND
59 LD_LIBRARY_PATH=${ROOT_LIBDIR}:$ENV{LD_LIBRARY_PATH} ${ROOT_CINT}
60 ARGS
61 -f ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx
62 -rmf ${CMAKE_CURRENT_BINARY_DIR}/lib${DNAME}.rootmap -rml lib${DNAME}
63 ${tmpdirdefs} ${INCLUDE_PATH} ${DHDRS} ${LDNAME}
64 DEPENDS
65 ${DHDRS} ${LDNAME} ${ROOT_CINT}
66 WORKING_DIRECTORY
67 ${CMAKE_CURRENT_BINARY_DIR}
68 )
69 endif (ROOT_VERSION_MAJOR LESS 6)
70
0224bae4 71endmacro(generate_dictionary)
72
73# Generate the ROOTmap files
74# @LIBNAME - library name: libAnalysis.so -> Analysis.rootmap
75# @LIBDEPS - library dependencies
76# @LINKDEF - LinkDef header
77macro(generate_rootmap LIBNAME LIBDEPS LINKDEF)
a0f34e87 78# message(STATUS "LIBNAME = ${LIBNAME}")
79# message(STATUS "LIBDEPS = ${LIBDEPS}")
80# message(STATUS "LINKDEF = ${LINKDEF}")
a0f34e87 81# message(STATUS "ROOT_LIBMAP=${ROOT_LIBMAP}")
5e8fe0e0 82
8e186b29 83if (ROOT_VERSION_MAJOR LESS 6)
84
5e8fe0e0 85 set(LOCAL_DEPS)
a0f34e87 86 foreach(file ${LIBDEPS})
87 get_filename_component(ext ${file} EXT)
88 if(ext)
271875a7 89 set(LOCAL_DEPS ${LOCAL_DEPS} ${file})
0224bae4 90 else()
e3dfb233 91 set(LOCAL_DEPS ${LOCAL_DEPS} lib${file})
0224bae4 92 endif()
93 endforeach()
5e8fe0e0 94
b22a7396 95# message(STATUS "Generating ROOT map for ${LIBNAME}")
0224bae4 96 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap
97 COMMAND LD_LIBRARY_PATH=${ROOT_LIBDIR}:$ENV{LD_LIBRARY_PATH} ${ROOT_LIBMAP}
e3dfb233 98 ARGS -o ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap -l lib${LIBNAME} -d ${LOCAL_DEPS} -c ${LINKDEF}
0224bae4 99 DEPENDS ${LIBNAME}
100 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VERBATIM
101 )
102 add_custom_target(lib${LIBNAME}.rootmap ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap)
103 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap DESTINATION lib)
8e186b29 104
105endif (ROOT_VERSION_MAJOR LESS 6)
106
befa423d 107endmacro(generate_rootmap)
108
7b0a9d94 109#########################
110# Static utilities
111#########################
c2f9135f 112
befa423d 113# Generate the static dependecies from dynamic list
114# @ shared_list - list of shared libraries
115# @ static_list - the name of the variable that will contain the list of static libraries
116macro(generate_static_dependencies shared_list static_list)
befa423d 117 set(static_list_tmp "")
118 foreach(shared_lib ${shared_list})
119 set(static_list_tmp ${static_list_tmp} "${shared_lib}-static")
120 endforeach()
121
122 # create the variable with the name received by the macro
123 set(${static_list} ${static_list_tmp})
124 # set the scope to parent in order to be visible in the parent
125 set(${static_list} PARENT_SCOPE)
c2f9135f 126endmacro(generate_static_dependencies)
127
7b0a9d94 128#########################
c2f9135f 129# DA utilities
7b0a9d94 130#########################
252db43c 131
132# Extract the first comment from a DA file
133# Find the position for first /* and */ and extract the substring
134macro(getDAdescription _detector _daname)
135 # Reading the file into a string
136 file(READ "${_detector}${_daname}da.cxx" tmpinfo)
137
138 # Find the first occurance of /* */
139 string(FIND "${tmpinfo}" "/*" _first_position)
140 string(FIND "${tmpinfo}" "*/" _second_position)
141
142 # Adding and removing 2 characters to remove /* */
143 math(EXPR _first_position ${_first_position}+2)
144 math(EXPR _second_position ${_second_position}-2)
145
146 # Generating the length of the comment in order to take out the description
147 math(EXPR _desc_length ${_second_position}-${_first_position})
148
149 if(${_desc_length} EQUAL 0 OR ${_desc_length} LESS 0)
150 message(FATAL_ERROR "{_detector}${_daname}da.cxx does not contain a description. Please add the description as the first /*comment*/ in the file")
151 else()
152 string(SUBSTRING "${tmpinfo}" ${_first_position} ${_second_position} _da_description)
6646d571 153 string(STRIP "${_da_description}" _da_description)
252db43c 154
155 # The variable can be accesed by the parent
156 set(RPM_DESCRIPTION ${_da_description})
157 endif()
158endmacro()
159
160# Set the compilation flags
161macro(setDAflags)
162 # DIM
163 link_directories(${DIMDIR}/${ODIR})
164
165 #daqDA flags
166 include_directories(${daqDA})
167 link_directories(${daqDA})
168
169 # AMORE definitions
170 add_definitions(${AMORE_DEFINITIONS})
171 include_directories(${AMORE_INCLUDE_DIR})
172
173endmacro()
174
175# Generate a DA
176macro(generateDA DETECTOR ALGORITHM STATIC_DEPENDENCIES)
177 setDAflags()
178
179 # Generating the DA executable
dbafa283 180 add_executable(${DETECTOR}${ALGORITHM}da.exe ${DETECTOR}${ALGORITHM}da.cxx) #
252db43c 181
182 # DA flags and linking information
183 set(MODULE_COMPILE_FLAGS)
184 set(MODULE_LINK_FLAGS)
185
dbafa283 186 target_link_libraries(${DETECTOR}${ALGORITHM}da.exe ${STATIC_DEPENDENCIES} ${AMORE_AUXLIBS} daqDA ${DATE_MONLIBRARIES} ${DATE_RCPROXYLIBRARIES} Root RootExtra) # 1
252db43c 187
188 # different flags
189 set(MODULE_COMPILE_FLAGS " ${DATE_CFLAGS} ${AMORE_CFLAGS}")
190 set(MODULE_LINK_FLAGS "${DATE_LDFLAGS} ${AMORE_STATICLIBS}")
191
dbafa283 192 set_target_properties(${DETECTOR}${ALGORITHM}da.exe PROPERTIES COMPILE_FLAGS ${MODULE_COMPILE_FLAGS})
193 set_target_properties(${DETECTOR}${ALGORITHM}da.exe PROPERTIES LINK_FLAGS "${MODULE_LINK_FLAGS}")
252db43c 194
195 # Installation
dbafa283 196 install(TARGETS ${DETECTOR}${ALGORITHM}da.exe RUNTIME DESTINATION bin)
252db43c 197
198 if(DARPM)
199 createDArpm("${DETECTOR}" "${ALGORITHM}")
200 endif(DARPM)
201endmacro()
c2f9135f 202
203# DA rpm creation
204macro(createDArpm DETECTOR ALGORITHM)
252db43c 205 getDAdescription("${DETECTOR}" "${ALGORITHM}")
c2f9135f 206
dbafa283 207 set(DA_EXECUTABLE "${DETECTOR}${ALGORITHM}da.exe")
252db43c 208 set(DETECTOR "${DETECTOR}")
209 set(ALGORITHM "${ALGORITHM}")
210 set(RPM_DESCRIPTION ${RPM_DESCRIPTION})
211
212 if(ALGORITHM STREQUAL "")
213 set(_ALGORITHM "none")
214 set(DA_PREFIX "opt/daqDA-${DETECTOR}")
215 set(DA_NAME "daqDA-${DETECTOR}")
216 else()
217 set(_ALGORITHM ${ALGORITHM})
218 set(DA_PREFIX "opt/daqDA-${DETECTOR}-${ALGORITHM}")
219 set(DA_NAME "daqDA-${DETECTOR}-${ALGORITHM}")
220 endif()
221
222 configure_file("${AliRoot_SOURCE_DIR}/cmake/da.spec.in" "${_ALGORITHM}-da.spec" @ONLY)
c2f9135f 223
dbafa283 224 add_custom_command(TARGET ${DETECTOR}${ALGORITHM}da.exe POST_BUILD
252db43c 225 COMMAND mkdir ARGS -p da-${_ALGORITHM}-rpm/root/${DA_PREFIX}/
dbafa283 226 COMMAND cp ARGS ${DETECTOR}${ALGORITHM}da.exe da-${_ALGORITHM}-rpm/root/${DA_PREFIX}/
252db43c 227 COMMAND rpmbuild ARGS --verbose --define "_topdir ${CMAKE_CURRENT_BINARY_DIR}/da-${_ALGORITHM}-rpm" --define "%buildroot ${CMAKE_CURRENT_BINARY_DIR}/da-${_ALGORITHM}-rpm/root" -bb ${_ALGORITHM}-da.spec
c2f9135f 228 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VERBATIM
252db43c 229 COMMENT "RPM creation for ${DETECTOR}-${_ALGORITHM}"
c2f9135f 230 )
252db43c 231
232 # make clean will remove also the rpm folder
233 # Retrive the current list of file to be deleted - set_directory_property is overwriting, not adding to the list
234 get_directory_property(_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
235 set(_clean_files da-${_ALGORITHM}-rpm ${_clean_files})
236 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${_clean_files}")
237
238 # install RPM into $CMAKE_INSTALL_PREFIX/darpms
239 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/da-${_ALGORITHM}-rpm/RPMS/ DESTINATION darpms PATTERN "\\.rpm")
6646d571 240endmacro()