]> git.uio.no Git - u/mrichter/AliRoot.git/blame - cmake/CMakeALICE.cmake
Nicer comments
[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
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
27macro(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 54endmacro(generate_dictionary)
55
56# Generate the ROOTmap files
57# @LIBNAME - library name: libAnalysis.so -> Analysis.rootmap
58# @LIBDEPS - library dependencies
59# @LINKDEF - LinkDef header
60macro(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 86endmacro(generate_rootmap)
87
693743d7 88###########################################################################
89# Shared librarires utilities
90###########################################################################
91macro(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)
128endmacro()
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
137macro(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 147endmacro(generate_static_dependencies)
148
8d59788e 149# Generate the static library
693743d7 150macro(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)
167endmacro()
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
175macro(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()
199endmacro()
200
201# Set the compilation flags
202macro(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
214endmacro()
215
216# Generate a DA
217macro(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)
242endmacro()
c2f9135f 243
244# DA rpm creation
245macro(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 281endmacro()