]>
Commit | Line | Data |
---|---|---|
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 | ||
693743d7 | 18 | ########################################################################### |
c2f9135f | 19 | # ROOT utilities |
693743d7 | 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 | |
27 | macro(generate_dictionary DNAME LDNAME DHDRS DINCDIRS) | |
28 | # Creating the INCLUDE path for cint/cling | |
29 | foreach( dir ${DINCDIRS}) | |
30 | set(INCLUDE_PATH -I${dir} ${INCLUDE_PATH}) | |
31 | endforeach() | |
32 | ||
33 | # Generate the dictionary | |
b22a7396 | 34 | # message(STATUS "Generating dictionary ${DNAME} for ${LDNAME}") |
fffaf6a5 | 35 | |
36 | # message(STATUS "${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx") | |
37 | # message(STATUS "${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.h") | |
38 | # message(STATUS "bbb${INCLUDE_PATH}bbb") | |
39 | # message(STATUS "${DHDRS} ${LDNAME}") | |
40 | # message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}") | |
41 | ||
b168bfa8 | 42 | # Get the definitions from the directory to be sent to CINT |
43 | get_directory_property(tmpdirdefs DEFINITIONS) | |
44 | string(REPLACE " " ";" tmpdirdefs ${tmpdirdefs}) | |
45 | ||
fffaf6a5 | 46 | add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.h |
47 | COMMAND LD_LIBRARY_PATH=${ROOT_LIBDIR}:$ENV{LD_LIBRARY_PATH} ${ROOT_CINT} | |
48 | ARGS -f ${CMAKE_CURRENT_BINARY_DIR}/G__${DNAME}.cxx -c -p | |
b168bfa8 | 49 | ${tmpdirdefs} ${INCLUDE_PATH} |
fffaf6a5 | 50 | ${DHDRS} ${LDNAME} |
0224bae4 | 51 | DEPENDS ${DHDRS} ${LDNAME} ${ROOT_CINT} |
fffaf6a5 | 52 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} |
53 | ) | |
0224bae4 | 54 | endmacro(generate_dictionary) |
55 | ||
56 | # Generate the ROOTmap files | |
57 | # @LIBNAME - library name: libAnalysis.so -> Analysis.rootmap | |
58 | # @LIBDEPS - library dependencies | |
59 | # @LINKDEF - LinkDef header | |
60 | macro(generate_rootmap LIBNAME LIBDEPS LINKDEF) | |
a0f34e87 | 61 | # message(STATUS "LIBNAME = ${LIBNAME}") |
62 | # message(STATUS "LIBDEPS = ${LIBDEPS}") | |
63 | # message(STATUS "LINKDEF = ${LINKDEF}") | |
a0f34e87 | 64 | # message(STATUS "ROOT_LIBMAP=${ROOT_LIBMAP}") |
5e8fe0e0 | 65 | |
66 | set(LOCAL_DEPS) | |
a0f34e87 | 67 | foreach(file ${LIBDEPS}) |
68 | get_filename_component(ext ${file} EXT) | |
69 | if(ext) | |
271875a7 | 70 | set(LOCAL_DEPS ${LOCAL_DEPS} ${file}) |
0224bae4 | 71 | else() |
271875a7 | 72 | set(LOCAL_DEPS ${LOCAL_DEPS} lib${file}.so) |
0224bae4 | 73 | endif() |
74 | endforeach() | |
5e8fe0e0 | 75 | |
b22a7396 | 76 | # message(STATUS "Generating ROOT map for ${LIBNAME}") |
0224bae4 | 77 | add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap |
78 | COMMAND LD_LIBRARY_PATH=${ROOT_LIBDIR}:$ENV{LD_LIBRARY_PATH} ${ROOT_LIBMAP} | |
a0f34e87 | 79 | ARGS -o ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap -l lib${LIBNAME}.so -d ${LOCAL_DEPS} -c ${LINKDEF} |
0224bae4 | 80 | DEPENDS ${LIBNAME} |
81 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VERBATIM | |
82 | ) | |
83 | add_custom_target(lib${LIBNAME}.rootmap ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap) | |
84 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${LIBNAME}.rootmap DESTINATION lib) | |
85 | ||
befa423d | 86 | endmacro(generate_rootmap) |
87 | ||
693743d7 | 88 | ########################################################################### |
89 | # Shared librarires utilities | |
90 | ########################################################################### | |
91 | macro(generate_shared_library) | |
92 | # Generate the dictionary | |
93 | # It will create G_ARG1.cxx and G_ARG1.h / ARG1 = function first argument | |
94 | get_directory_property(incdirs INCLUDE_DIRECTORIES) | |
95 | set(incdirs ${MODULE_INCLUDES} ${CMAKE_CURRENT_SOURCE_DIR} ${incdirs}) | |
96 | generate_dictionary("${MODULE}" "${MODULE}LinkDef.h" "${MODULE_HDRS}" "${incdirs}") | |
97 | ||
98 | # Generate the ROOT map | |
99 | # Dependecies | |
100 | set(MODULE_LIBDEPS ${MODULE_ALIROOT_DEPENDENCIES} ${MODULE_ROOT_DEPENDENCIES}) | |
101 | generate_rootmap("${MODULE}" "${MODULE_LIBDEPS}" "${MODULE}LinkDef.h") | |
102 | ||
103 | # Create an object to be reused in case of static libraries | |
104 | # Otherwise the sources will be compiled twice | |
105 | add_library(${MODULE}-object OBJECT ${SRCS} G__${MODULE}.cxx) | |
106 | # Add a library to the project using the object | |
107 | add_library(${MODULE} SHARED $<TARGET_OBJECTS:${MODULE}-object>) | |
108 | target_link_libraries(${MODULE} ${MODULE_LIBDEPS}) | |
109 | ||
110 | # Setting the correct headers for the object as gathered from the dependencies | |
111 | target_include_directories(${MODULE}-object PUBLIC $<TARGET_PROPERTY:${MODULE},INCLUDE_DIRECTORIES>) | |
112 | set_target_properties(${MODULE}-object PROPERTIES COMPILE_DEFINITIONS $<TARGET_PROPERTY:${MODULE},COMPILE_DEFINITIONS>) | |
113 | ||
114 | # Public include folders that will be propagated to the dependecies | |
115 | target_include_directories(${MODULE} PUBLIC ${incdirs}) | |
116 | ||
117 | # Setting compilation flags for the object | |
118 | set_target_properties(${MODULE}-object PROPERTIES COMPILE_FLAGS "${MODULE_COMPILE_FLAGS}") | |
119 | # Setting the linking flags for the library | |
120 | set_target_properties(${MODULE} PROPERTIES LINK_FLAGS "${MODULE_LINK_FLAGS}") | |
121 | ||
122 | # Installation | |
123 | install(TARGETS ${MODULE} | |
124 | ARCHIVE DESTINATION lib | |
125 | LIBRARY DESTINATION lib) | |
126 | ||
127 | install(FILES ${MODULE_HDRS_INSTALL} DESTINATION include) | |
128 | endmacro() | |
129 | ||
130 | ########################################################################### | |
131 | # Static libraries utilities | |
132 | ########################################################################### | |
c2f9135f | 133 | |
befa423d | 134 | # Generate the static dependecies from dynamic list |
135 | # @ shared_list - list of shared libraries | |
136 | # @ static_list - the name of the variable that will contain the list of static libraries | |
137 | macro(generate_static_dependencies shared_list static_list) | |
befa423d | 138 | set(static_list_tmp "") |
139 | foreach(shared_lib ${shared_list}) | |
140 | set(static_list_tmp ${static_list_tmp} "${shared_lib}-static") | |
141 | endforeach() | |
142 | ||
143 | # create the variable with the name received by the macro | |
144 | set(${static_list} ${static_list_tmp}) | |
145 | # set the scope to parent in order to be visible in the parent | |
146 | set(${static_list} PARENT_SCOPE) | |
c2f9135f | 147 | endmacro(generate_static_dependencies) |
148 | ||
8d59788e | 149 | # Generate the static library |
693743d7 | 150 | macro(generate_static_library) |
151 | add_library(${MODULE}-static STATIC $<TARGET_OBJECTS:${MODULE}-object>) | |
152 | ||
153 | # list of shared dependencies / the name of the variable containing the list of static ones | |
154 | generate_static_dependencies("${MODULE_ALIROOT_DEPENDENCIES}" "STATIC_ALIROOT_DEPENDENCIES") | |
155 | target_link_libraries(${MODULE}-static ${STATIC_ALIROOT_DEPENDENCIES} Root RootExtra) | |
156 | ||
157 | # Public include folders that will be propagated to the dependecies | |
158 | target_include_directories(${MODULE}-static PUBLIC ${incdirs}) | |
159 | ||
160 | set_target_properties(${MODULE}-static PROPERTIES OUTPUT_NAME ${MODULE}) | |
161 | set_target_properties(${MODULE}-static PROPERTIES LINK_FLAGS "-Wl,--whole-archive") | |
162 | ||
163 | # Installation | |
164 | install(TARGETS ${MODULE}-static | |
165 | ARCHIVE DESTINATION lib | |
166 | LIBRARY DESTINATION lib) | |
167 | endmacro() | |
168 | ||
169 | ########################################################################### | |
c2f9135f | 170 | # DA utilities |
693743d7 | 171 | ########################################################################### |
252db43c | 172 | |
173 | # Extract the first comment from a DA file | |
174 | # Find the position for first /* and */ and extract the substring | |
175 | macro(getDAdescription _detector _daname) | |
176 | # Reading the file into a string | |
177 | file(READ "${_detector}${_daname}da.cxx" tmpinfo) | |
178 | ||
179 | # Find the first occurance of /* */ | |
180 | string(FIND "${tmpinfo}" "/*" _first_position) | |
181 | string(FIND "${tmpinfo}" "*/" _second_position) | |
182 | ||
183 | # Adding and removing 2 characters to remove /* */ | |
184 | math(EXPR _first_position ${_first_position}+2) | |
185 | math(EXPR _second_position ${_second_position}-2) | |
186 | ||
187 | # Generating the length of the comment in order to take out the description | |
188 | math(EXPR _desc_length ${_second_position}-${_first_position}) | |
189 | ||
190 | if(${_desc_length} EQUAL 0 OR ${_desc_length} LESS 0) | |
191 | message(FATAL_ERROR "{_detector}${_daname}da.cxx does not contain a description. Please add the description as the first /*comment*/ in the file") | |
192 | else() | |
193 | string(SUBSTRING "${tmpinfo}" ${_first_position} ${_second_position} _da_description) | |
194 | string(STRIP ${_da_description} _da_description) | |
195 | ||
196 | # The variable can be accesed by the parent | |
197 | set(RPM_DESCRIPTION ${_da_description}) | |
198 | endif() | |
199 | endmacro() | |
200 | ||
201 | # Set the compilation flags | |
202 | macro(setDAflags) | |
203 | # DIM | |
204 | link_directories(${DIMDIR}/${ODIR}) | |
205 | ||
206 | #daqDA flags | |
207 | include_directories(${daqDA}) | |
208 | link_directories(${daqDA}) | |
209 | ||
210 | # AMORE definitions | |
211 | add_definitions(${AMORE_DEFINITIONS}) | |
212 | include_directories(${AMORE_INCLUDE_DIR}) | |
213 | ||
214 | endmacro() | |
215 | ||
216 | # Generate a DA | |
217 | macro(generateDA DETECTOR ALGORITHM STATIC_DEPENDENCIES) | |
218 | setDAflags() | |
219 | ||
220 | # Generating the DA executable | |
221 | add_executable(${DETECTOR}${ALGORITHM}da ${DETECTOR}${ALGORITHM}da.cxx) # | |
222 | ||
223 | # DA flags and linking information | |
224 | set(MODULE_COMPILE_FLAGS) | |
225 | set(MODULE_LINK_FLAGS) | |
226 | ||
227 | target_link_libraries(${DETECTOR}${ALGORITHM}da ${STATIC_DEPENDENCIES} ${AMORE_AUXLIBS} daqDA ${DATE_MONLIBRARIES} ${DATE_RCPROXYLIBRARIES} Root RootExtra) # 1 | |
228 | ||
229 | # different flags | |
230 | set(MODULE_COMPILE_FLAGS " ${DATE_CFLAGS} ${AMORE_CFLAGS}") | |
231 | set(MODULE_LINK_FLAGS "${DATE_LDFLAGS} ${AMORE_STATICLIBS}") | |
232 | ||
233 | set_target_properties(${DETECTOR}${ALGORITHM}da PROPERTIES COMPILE_FLAGS ${MODULE_COMPILE_FLAGS}) | |
234 | set_target_properties(${DETECTOR}${ALGORITHM}da PROPERTIES LINK_FLAGS "${MODULE_LINK_FLAGS}") | |
235 | ||
236 | # Installation | |
237 | install(TARGETS ${DETECTOR}${ALGORITHM}da RUNTIME DESTINATION bin) | |
238 | ||
239 | if(DARPM) | |
240 | createDArpm("${DETECTOR}" "${ALGORITHM}") | |
241 | endif(DARPM) | |
242 | endmacro() | |
c2f9135f | 243 | |
244 | # DA rpm creation | |
245 | macro(createDArpm DETECTOR ALGORITHM) | |
252db43c | 246 | getDAdescription("${DETECTOR}" "${ALGORITHM}") |
c2f9135f | 247 | |
248 | set(DA_EXECUTABLE "${DETECTOR}${ALGORITHM}da") | |
252db43c | 249 | set(DETECTOR "${DETECTOR}") |
250 | set(ALGORITHM "${ALGORITHM}") | |
251 | set(RPM_DESCRIPTION ${RPM_DESCRIPTION}) | |
252 | ||
253 | if(ALGORITHM STREQUAL "") | |
254 | set(_ALGORITHM "none") | |
255 | set(DA_PREFIX "opt/daqDA-${DETECTOR}") | |
256 | set(DA_NAME "daqDA-${DETECTOR}") | |
257 | else() | |
258 | set(_ALGORITHM ${ALGORITHM}) | |
259 | set(DA_PREFIX "opt/daqDA-${DETECTOR}-${ALGORITHM}") | |
260 | set(DA_NAME "daqDA-${DETECTOR}-${ALGORITHM}") | |
261 | endif() | |
262 | ||
263 | configure_file("${AliRoot_SOURCE_DIR}/cmake/da.spec.in" "${_ALGORITHM}-da.spec" @ONLY) | |
c2f9135f | 264 | |
265 | add_custom_command(TARGET ${DETECTOR}${ALGORITHM}da POST_BUILD | |
252db43c | 266 | COMMAND mkdir ARGS -p da-${_ALGORITHM}-rpm/root/${DA_PREFIX}/ |
267 | COMMAND cp ARGS ${DETECTOR}${ALGORITHM}da da-${_ALGORITHM}-rpm/root/${DA_PREFIX}/ | |
268 | 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 | 269 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VERBATIM |
252db43c | 270 | COMMENT "RPM creation for ${DETECTOR}-${_ALGORITHM}" |
c2f9135f | 271 | ) |
252db43c | 272 | |
273 | # make clean will remove also the rpm folder | |
274 | # Retrive the current list of file to be deleted - set_directory_property is overwriting, not adding to the list | |
275 | get_directory_property(_clean_files ADDITIONAL_MAKE_CLEAN_FILES) | |
276 | set(_clean_files da-${_ALGORITHM}-rpm ${_clean_files}) | |
277 | set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${_clean_files}") | |
278 | ||
279 | # install RPM into $CMAKE_INSTALL_PREFIX/darpms | |
280 | install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/da-${_ALGORITHM}-rpm/RPMS/ DESTINATION darpms PATTERN "\\.rpm") | |
c2f9135f | 281 | endmacro() |