1 # AliRoot Build System Utility Macro and Function definitions
3 # Author: Johny Jose (johny.jose@cern.ch)
4 # Port of previous Makefile build to cmake
6 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
8 macro(ALICE_DevFlagsOutput)
10 if(ALICEDEV STREQUAL "YES")
11 message(STATUS "FFLAGS : ${FFLAGS}")
12 message(STATUS "CXXFLAGS : ${CXXFLAGS}")
13 message(STATUS "CFLAGS : ${CFLAGS}")
14 message(STATUS "SOFLAGS : ${SOFLAGS}")
15 message(STATUS "LDFLAGS : ${LDFLAGS}")
16 message(STATUS "SHLIB : ${SHLIB}")
17 message(STATUS "SYSLIBS : ${SYSLIBS}")
18 message(STATUS "CINTFLAGS : ${CINTFLAGS}")
19 endif(ALICEDEV STREQUAL "YES")
21 endmacro(ALICE_DevFlagsOutput)
23 function(ALICE_CleanOutput _output input)
25 string(REGEX REPLACE "\n" " " clean ${input})
26 set(${_output} ${clean} PARENT_SCOPE)
28 endfunction(ALICE_CleanOutput)
30 function(ALICE_CorrectPaths _output value )
33 foreach(path ${value})
35 string(REGEX MATCH "^/" external ${path})
37 list(APPEND corrected "${CMAKE_SOURCE_DIR}/${path}" )
39 list(APPEND corrected ${path})
42 set(${_output} ${corrected} PARENT_SCOPE)
44 endfunction(ALICE_CorrectPaths)
46 function(ALICE_Format _output prefix suffix input)
48 # DevNotes - input should be put in quotes or the complete list does not get passed to the function
53 string(REGEX MATCH "^${prefix}" pre ${arg})
56 string(REGEX MATCH "${suffix}$" suf ${arg})
59 set(item "${prefix}${item}")
62 set(item "${item}${suffix}")
64 list(APPEND format ${item})
66 set(${_output} ${format} PARENT_SCOPE)
68 endfunction(ALICE_Format)
70 function(ALICE_CheckLibraries _output input)
75 string(REGEX MATCH "^(/|-)" preformatted ${item})
78 endif(NOT preformatted)
79 list(APPEND format ${item})
81 set(${_output} ${format} PARENT_SCOPE)
83 endfunction(ALICE_CheckLibraries)
85 function(ALICE_RootConfig _output parameters)
88 execute_process(COMMAND ${ROOT_CONFIG} ${parameters} OUTPUT_VARIABLE result ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
90 message(FATAL_ERROR "root-config ERROR : ${error}")
92 ALICE_CleanOutput(result "${result}")
93 set(${_output} "${result}" PARENT_SCOPE)
95 message(FATAL_ERROR "root-config not found")
98 endfunction(ALICE_RootConfig)
100 macro(ALICE_CheckOutOfSourceBuild)
102 #Check if previous in-source build failed
103 if(EXISTS ${CMAKE_SOURCE_DIR}/CMakeCache.txt OR EXISTS ${CMAKE_SOURCE_DIR}/CMakeFiles)
104 message(FATAL_ERROR "CMakeCache.txt or CMakeFiles exists in source directory! Please remove them before running cmake $ALICE_ROOT")
105 endif(EXISTS ${CMAKE_SOURCE_DIR}/CMakeCache.txt OR EXISTS ${CMAKE_SOURCE_DIR}/CMakeFiles)
107 #Get Real Paths of the source and binary directories
108 get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
109 get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
111 #Check for in-source builds
112 if(${srcdir} STREQUAL ${bindir})
113 message(FATAL_ERROR "AliRoot cannot be built in-source! Please run cmake $ALICE_ROOT outside the source directory")
114 endif(${srcdir} STREQUAL ${bindir})
116 endmacro(ALICE_CheckOutOfSourceBuild)
118 macro(ALICE_ConfigureCompiler)
120 if(ALIDEBUG STREQUAL "YES")
121 set(ALICE_TARGET ${ALICE_TARGET}DEBUG)
122 message("Befor ${CXXFLAGS}")
123 string(REGEX MATCHALL "-O[^ ]*" FFLAGS ${FFLAGS})
124 string(REGEX MATCHALL "-O[^ ]*" CXXFLAGS ${CXXFLAGS})
125 message("After ${CXXFLAGS}")
126 string(REGEX MATCHALL "-O[^ ]*" CFLAGS ${CFLAGS})
127 string(REGEX MATCHALL "-O[^ ]*" SOFLAGS ${SOFLAGS})
128 string(REGEX MATCHALL "-O[^ ]*" LDFLAGS ${LDFLAGS})
129 set(FFLAGS "-g ${FFLAGS}")
130 set(CXXFLAGS "-g ${CXXFLAGS}")
131 set(CFLAGS "-g ${CFLAGS}")
132 set(SOFLAGS "-g ${SOFLAGS}")
133 set(LDFLAGS "-g ${LDFLAGS}")
134 endif(ALIDEBUG STREQUAL "YES")
136 if(ALIPROFILE STREQUAL "YES")
137 set(ALICE_TARGET ${ALICE_TARGET}PROF)
138 set(FFLAGS "-pg ${FFLAGS}")
139 set(CXXFLAGS "-pg ${CXXFLAGS}")
140 set(CFLAGS "-pg ${CFLAGS}")
141 set(SOFLAGS "-pg ${SOFLAGS}")
142 set(LDFLAGS "-pg ${LDFLAGS}")
143 endif(ALIPROFILE STREQUAL "YES")
145 ALICE_RootConfig(RCFLAGS --auxcflags)
146 ALICE_RootConfig(RLFLAGS --ldflags)
148 set(CXXFLAGS "${CXXFLAGS} ${RCFLAGS}")
149 set(CFLAGS "${CFLAGS} ${RCFLAGS}")
150 set(SOFLAGS "${SOFLAGS} ${RLFLAGS}")
151 set(LDFLAGS "${LDFLAGS} ${RLFLAGS}")
153 if(NOT ALICXXWARN STREQUAL "NO")
154 set(CXXFLAGS "${CXXFLAGS} ${CXXWARN}")
155 endif(NOT ALICXXWARN STREQUAL "NO")
157 set(CXXFLAGS "${DATEFLAGS} ${CXXFLAGS}")
158 set(CFLAGS "${DATEFLAGS} ${CFLAGS}")
159 set(CINTFLAGS "${DATEFLAGS}")
161 endmacro(ALICE_ConfigureCompiler)
163 macro(ALICE_ConfigurePlatform)
166 include("CMake${ALICE_TARGET}")
168 endmacro(ALICE_ConfigurePlatform)
170 macro(ALICE_GetTarget)
172 #Set ALICE_TARGET if it has not been set yet
174 set(ALICE_TARGET $ENV{ALICE_TARGET})
175 #If ALICE_TARGET is not defined assign default values
177 message(WARNING "Environment variable ALICE_TARGET is not set ! Setting to default value.")
178 ALICE_RootConfig(ALICE_TARGET --arch)
179 message("ALICE_TARGET set to ${ALICE_TARGET}")
180 endif(NOT ALICE_TARGET)
181 endif(NOT ALICE_TARGET)
183 endmacro(ALICE_GetTarget)
185 macro(ALICE_ResetPackage)
187 set(MODDIR ${MODULE})
188 set(MODDIRI ${PROJECT_SOURCE_DIR}/${MODULE})
249 endmacro(ALICE_ResetPackage)
251 function(ALICE_SetPackageVariable _var ext setvalue unsetvalue )
253 #DevNotes - setvalue and unsetcalue should both be put in quotes or cmake throws an error if they have undefined values
255 set(${_var} ${setvalue} PARENT_SCOPE)
256 set(${PACKAGE}${ext} ${setvalue} PARENT_SCOPE)
258 set(${_var} ${unsetvalue} PARENT_SCOPE)
259 set(${PACKAGE}${ext} ${unsetvalue} PARENT_SCOPE)
262 endfunction(ALICE_SetPackageVariable)
264 macro(ALICE_BuildPackage)
266 list(APPEND EINCLUDE STEER)
268 ALICE_SetPackageVariable(PFFLAGS "FFLAGS" "${PACKFFLAGS}" "${FFLAGS}")
269 ALICE_SetPackageVariable(PCFLAGS "CFLAGS" "${PACKCFLAGS}" "${CFLAGS}")
270 ALICE_SetPackageVariable(PCXXFLAGS "CXXFLAGS" "${PACKCXXFLAGS}" "${CXXFLAGS}")
271 ALICE_SetPackageVariable(PSOFLAGS "SOFLAGS" "${PACKSOFLAGS}" "${SOFLAGS}")
272 ALICE_SetPackageVariable(PLDFLAGS "LDFLAGS" "${PACKLDFLAGS}" "${LDFLAGS}")
273 ALICE_SetPackageVariable(PDCXXFLAGS "DCXXFLAGS" "${PACKDCXXFLAGS}" "${CXXFLAGSNO}")
274 ALICE_SetPackageVariable(PBLIBS "BLIBS" "${PACKBLIBS}" "${LIBS}")
277 if(DHDR OR CINTAUTOLINK)
279 endif(DHDR OR CINTAUTOLINK)
281 ALICE_SetPackageVariable(PEDEFINE "EDEFINE" "${EDEFINE}" "${EDEFINE}")
282 ALICE_SetPackageVariable(PEXPORT "EXPORT" "${EXPORT}" "${EXPORT}")
283 ALICE_SetPackageVariable(PEXPORTDEST "EXPORTDEST" "${CMAKE_INCLUDE_EXPORT_DIRECTORY}" "${CMAKE_INCLUDE_EXPORT_DIRECTORY}")
284 ALICE_SetPackageVariable(PINC "INC" "${EINCLUDE};${MODULE}" "${EINCLUDE};${MODULE}")
285 ALICE_SetPackageVariable(PELIBS "ELIBS" "${ELIBS}" "${ELIBS}")
286 ALICE_SetPackageVariable(PELIBSDIR "ELIBSDIR" "${ELIBSDIR}" "${ELIBSDIR}")
288 ALICE_SetPackageVariable(PCS "CS" "${CSRCS}" "${CSRCS}")
289 ALICE_SetPackageVariable(PCH "CH" "${CHDRS}" "${CHDRS}")
291 ALICE_SetPackageVariable(PFS "FS" "${FSRCS}" "${FSRCS}")
293 ALICE_SetPackageVariable(PS "S" "${SRCS}" "${SRCS}")
294 ALICE_SetPackageVariable(PH "H" "${HDRS} ${EHDRS}" "${HDRS} ${EHDRS}")
295 ALICE_SetPackageVariable(PCINTHDRS "CINTHDRS" "${CINTHDRS}" "${PH}")
297 string( REPLACE ".h" "" PCINTCLASSES "${PCINTHDRS}")
298 set ( ${PACKAGE}CINTCLASSES ${PCINTCLASSES})
300 ALICE_SetPackageVariable(PDH "DH" "${DHDR}" "")
303 ALICE_SetPackageVariable(PDAL "DAL" "${CMAKE_CURRENT_BINARY_DIR}/G__${PACKAGE}AutoLinkDef.h" "${CMAKE_CURRENT_BINARY_DIR}/G__${PACKAGE}AutoLinkDef.h")
304 ALICE_SetPackageVariable(PDH "DH" "${PDAL}" "${PDAL}")
305 ALICE_GenerateLinkDef()
309 list(APPEND PMLIBS ${PACKAGE})
310 list(APPEND ALLLIBS ${PACKAGE})
311 list(APPEND PMALIBS ${PACKAGE}_a)
312 list(APPEND ALLALIBS ${PACKAGE}_a)
313 list(APPEND BINLIBS ${PACKAGE})
315 list(APPEND ALLEXECS ${PACKAGE})
317 set(${MODULE}ALIBS "${PMALIBS}" PARENT_SCOPE)
318 set(${MODULE}LIBS "${PMLIBS}" PARENT_SCOPE)
319 set(${MODULE}INC "${EINCLUDE}" PARENT_SCOPE)
320 list(APPEND INCLUDEFILES ${PEXPORTDEST})
323 ALICE_SetPackageVariable(PDS "DS" "G__${PACKAGE}.cxx" "G__${PACKAGE}.cxx")
324 ALICE_GenerateDictionary()
327 message(STATUS "No dictionary generated for ${PACKAGE}")
335 ALICE_BuildExecutable()
337 endif(PS OR PCS OR PFS)
339 endmacro(ALICE_BuildPackage)
342 macro(ALICE_BuildModule)
344 add_definitions(-D_MODULE="${MODULE}")
345 foreach(PACKAGEFILE ${PACKAGES})
348 string(REGEX MATCH "CMakelib" lib ${PACKAGEFILE})
349 string(REGEX MATCH "CMakebin" bin ${PACKAGEFILE})
350 get_filename_component(PACKAGE ${PACKAGEFILE} NAME)
351 string(REGEX REPLACE "^CMake(lib|bin)(.*)\\.pkg" "\\2" PACKAGE ${PACKAGE})
353 message("Adding package ${PACKAGE} in ${MODULE}")
356 include(${PACKAGEFILE})
359 get_property(EXCLUDEPACKAGE TARGET ${PACKAGE} PROPERTY EXCLUDE_FROM_ALL)
360 if(NOT EXCLUDEPACKAGE)
361 install(TARGETS ${PACKAGE}
362 RUNTIME DESTINATION bin
363 LIBRARY DESTINATION lib
364 ARCHIVE DESTINATION bin)
365 endif(NOT EXCLUDEPACKAGE)
366 endforeach(PACKAGEFILE)
368 endmacro(ALICE_BuildModule)
370 macro(ALICE_GenerateDictionary)
372 if(ALICEDEV STREQUAL "YES")
373 message("Generating Dictionary rule for ${PACKAGE}")
374 message("${ROOTCINT} -f ${PDS} -c ${PEDEFINE} ${CINTFLAGS} ${PINC} ${PCINTHDRS} ${PDH}")
375 endif(ALICEDEV STREQUAL "YES")
377 # Split up all arguments
379 set(DEDEFINE ${PEDEFINE})
380 set(DCINTFLAGS ${CINTFLAGS})
382 set(DCINTHDRS ${PCINTHDRS})
384 separate_arguments(DEDEFINE)
385 separate_arguments(DCINTFLAGS)
386 separate_arguments(DINC)
387 separate_arguments(DCINTHDRS)
388 separate_arguments(DDH)
389 # Format neccesary arguments
390 ALICE_Format(DINC "-I" "" "${DINC};${CMAKE_INCLUDE_EXPORT_DIRECTORY}")
391 set_source_files_properties(${PDS} PROPERTIES GENERATED TRUE)
392 add_custom_command(OUTPUT ${PDS}
393 COMMAND cd ${PROJECT_SOURCE_DIR} && ${ROOTCINT} -f ${CMAKE_CURRENT_BINARY_DIR}/${PDS} -c -D_MODULE=\\\"${MODULE}\\\" ${DEDEFINE} ${DCINTFLAGS} ${DINC} ${DCINTHDRS} ${DDH}
394 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
395 DEPENDS ${DCINTHDRS} ${DDH}
397 add_custom_target(G${PACKAGE})
398 add_dependencies(G${PACKAGE} ${PDS})
400 endmacro(ALICE_GenerateDictionary)
402 macro(ALICE_BuildLibrary)
404 ALICE_DevFlagsOutput()
405 set(CMAKE_CXX_FLAGS "${PEDEFINE} ${PCXXFLAGS}")
406 set(CMAKE_C_FLAGS "${PEDEFINE} ${PCFLAGS}")
407 set(CMAKE_Fortran_FLAGS ${PEDEFINE} ${PFFLAGS})
408 set(CMAKE_SHARED_LINKER_FLAGS ${PSOFLAGS})
409 set(CMAKE_MODULE_LINKER_FLAGS ${PLDFLAGS})
412 separate_arguments(PINC)
413 separate_arguments(EINCLUDE)
414 separate_arguments(PELIBSDIR)
415 separate_arguments(PBLIBS)
416 separate_arguments(PELIBS)
417 separate_arguments(SHLIB)
419 ALICE_Format(PELIBSDIR "-L" "" "${PELIBSDIR}")
420 ALICE_CheckLibraries(PBLIBS "${PBLIBS}")
421 ALICE_CheckLibraries(PELIBS "${PELIBS}")
423 ALICE_CorrectPaths(EINCLUDE "${EINCLUDE}")
424 ALICE_CorrectPaths(PINC "${PINC}")
426 include_directories(SYSTEM ${ROOTINCDIR})
427 include_directories(${PINC})
428 include_directories(${EINCLUDE})
429 include_directories(${CMAKE_INCLUDE_EXPORT_DIRECTORY})
431 add_library(${PACKAGE} SHARED ${PCS} ${PFS} ${PS} ${PDS})
435 target_link_libraries(${PACKAGE} ${PELIBSDIR} ${PELIBS} ${SHLIB})
436 endif(PELIBS OR SHLIB)
438 add_dependencies(${MODULE}-all ${PACKAGE})
440 add_library(${PACKAGE}_a STATIC EXCLUDE_FROM_ALL ${PCS} ${PFS} ${PS} ${PDS})
442 target_link_libraries(${PACKAGE}_a ${PELIBSDIR} ${PELIBS} ${ALLIB})
443 endif(PELIBS OR ALLIB)
445 add_dependencies(${MODULE}-static ${PACKAGE}_a)
446 if(ALIPROFILE STREQUAL "YES")
447 add_dependencies(${MODULE}-all ${MODULE}-static)
448 endif(ALIPROFILE STREQUAL "YES")
450 list(FIND EXCLUDEMODULES ${MODULE} RESULT)
451 if(NOT RESULT STREQUAL "-1")
452 message(STATUS "${MODULE} will not be built by default. Type make ${MODULE}-all to build.")
453 set_property(TARGET ${PACKAGE} PROPERTY EXCLUDE_FROM_ALL TRUE)
454 endif(NOT RESULT STREQUAL "-1")
456 endmacro(ALICE_BuildLibrary)
458 macro(ALICE_BuildExecutable)
460 ALICE_DevFlagsOutput()
461 set(CMAKE_CXX_FLAGS "${PEDEFINE} ${PCXXFLAGS} ${EXEFLAGS}")
462 set(CMAKE_C_FLAGS "${PEDEFINE} ${PCFLAGS} ${EXEFLAGS}")
463 set(CMAKE_Fortran_FLAGS "${PEDEFINE} ${PFFLAGS} ${EXEFLAGS}")
464 set(CMAKE_SHARED_LINKER_FLAGS ${PSOFLAGS})
465 set(CMAKE_MODULE_LINKER_FLAGS ${PLDFLAGS})
467 separate_arguments(PINC)
468 separate_arguments(EINCLUDE)
469 separate_arguments(PELIBSDIR)
470 separate_arguments(PBLIBS)
471 separate_arguments(PELIBS)
472 separate_arguments(SHLIB)
474 ALICE_Format(PELIBSDIR "-L" "" "${PELIBSDIR}")
475 ALICE_CheckLibraries(PBLIBS "${PBLIBS}")
476 #ALICE_CheckLibraries(PELIBS "${PELIBS}")
478 ALICE_CorrectPaths(EINCLUDE "${EINCLUDE}")
479 ALICE_CorrectPaths(PINC "${PINC}")
481 include_directories(SYSTEM ${ROOTINCDIR})
482 include_directories(${PINC})
483 include_directories(${EINCLUDE})
484 include_directories(${CMAKE_INCLUDE_EXPORT_DIRECTORY})
486 if(ALIPROFILE STREQUAL "YES")
487 add_executable(${PACKAGE} ${PFS} ${PCS} ${PS} ${PDS})
488 if(ARLIBS OR SHLIBS OR PBLIBS OR EXEFLAGS)
489 target_link_libraries(${PACKAGE} ${ARLIBS} ${SHLIBS} ${PBLIBS} ${EXEFLAGS})
490 endif(ARLIBS OR SHLIBS OR PBLIBS OR EXEFLAGS)
491 add_dependencies(${MODULE}-all ${PACKAGE})
493 add_executable(${PACKAGE} ${PFS} ${PCS} ${PS} ${PDS})
494 if(PELIBS OR PBLIBS OR EXEFLAGS)
495 target_link_libraries(${PACKAGE} ${BINLIBDIRS} ${PELIBSDIR} ${PELIBS} ${PBLIBS} ${EXEFLAGS})
496 endif(PELIBS OR PBLIBS OR EXEFLAGS)
497 add_dependencies(${MODULE}-all ${PACKAGE})
498 endif(ALIPROFILE STREQUAL "YES")
500 list(FIND EXCLUDEMODULES ${MODULE} RESULT)
501 if(NOT RESULT STREQUAL "-1")
502 set_property(TARGET ${PACKAGE} PROPERTY EXCLUDE_FROM_ALL TRUE)
503 endif(NOT RESULT STREQUAL "-1")
505 endmacro(ALICE_BuildExecutable)
507 macro(ALICE_CopyHeaders)
512 set(HEADERS ${EXPORT})
514 foreach(header ${HEADERS})
515 configure_file(${header} ${PEXPORTDEST} COPYONLY)
516 install(FILES ${header} DESTINATION include)
519 endmacro(ALICE_CopyHeaders)
521 macro(ALICE_GenerateLinkDef)
523 file (WRITE ${PDAL} "//--------------------------------------------------------------------------------\n")
524 file (APPEND ${PDAL} "// This is an automatically generated Root Dictionary Linkdef file for ${PACKAGE}\n")
525 file (APPEND ${PDAL} "// !!! DO NOT EDIT THIS FILE !!!\n")
526 file (APPEND ${PDAL} "#ifdef __CINT__\n")
527 file (APPEND ${PDAL} "#pragma link off all globals;\n")
528 file (APPEND ${PDAL} "#pragma link off all classes;\n")
529 file (APPEND ${PDAL} "#pragma link off all functions;\n")
530 foreach (class ${PCINTCLASSES})
531 get_filename_component(classname ${class} NAME)
532 file(APPEND ${PDAL} "#pragma link C++ class ${classname}+;\n")
534 file (APPEND ${PDAL} "#endif\n")
535 endmacro(ALICE_GenerateLinkDef)