1 Macro(CreateSubCMakeFiles)
3 # Extract list of subdirectories for which the script has to
4 # create CMakeLists.txt out of the information of the main
7 MESSAGE(STATUS "Generating CMakeLists.txt in subdirectories from the package files.")
9 file(STRINGS ${CMAKE_SOURCE_DIR}/CMakeLists.txt bla
10 REGEX "^Add_subdirectory(.*)"
14 STRING(REGEX REPLACE "^Add_subdirectory\((.*)\)$" "\\1" _OutDir "${_dir}")
15 STRING(STRIP ${_OutDir} _OutDir1)
16 string(LENGTH ${_OutDir1} _Length)
17 math(EXPR _Length1 ${_Length}-2)
18 string(SUBSTRING ${_OutDir1} 1 ${_Length1} _OutDir)
19 List(APPEND Directories ${_OutDir})
20 EndForeach(_dir ${bla})
22 # Check if ROOT was compile with xml and alien support
23 # This is needed later to set properly the definitions during
26 COMMAND root-config --has-xml
27 OUTPUT_VARIABLE ROOT_HAS_XML
28 OUTPUT_STRIP_TRAILING_WHITESPACE)
31 COMMAND root-config --has-alien
32 OUTPUT_VARIABLE ROOT_HAS_ALIEN
33 OUTPUT_STRIP_TRAILING_WHITESPACE)
35 # Loop over the subdirectories, extract the package files and
36 # call for each of the package files a macro which creates the
37 # corresponding CMake input files in the subdirectory
39 Foreach(_dir ${Directories})
40 if(NOT ${_dir} STREQUAL HLT)
41 file(GLOB Package RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/${_dir}/*.pkg)
42 get_filename_component(__path ${_dir} NAME)
43 set(EINCLUDE_SUBDIR ${__path} STEER)
44 set(PACKCXXFLAGS_SUBDIR)
46 Foreach(_pack ${Package})
47 GenerateInputFiles(${_pack})
48 set(EINCLUDE_SUBDIR ${EINCLUDE_SUBDIR} ${EINCLUDE_PACKAGE})
49 set(PACKCXXFLAGS_SUBDIR ${PACKCXXFLAGS_SUBDIR} ${PACKCXXFLAGS_PACKAGE})
50 EndForeach(_pack ${Package})
51 list(REMOVE_DUPLICATES EINCLUDE_SUBDIR)
52 CreateMainCMakeFile(${__path})
53 else(NOT ${_dir} STREQUAL HLT)
54 # MESSAGE(STATUS "Don't generate files for HLT do to complete different syntax of package files")
55 Include(CreateHLTSubCMakeFiles)
56 CreateHLTSubCMakeFiles()
57 endif(NOT ${_dir} STREQUAL HLT)
58 EndForeach(_dir ${Directories})
61 EndMacro(CreateSubCMakeFiles)
63 Macro(GenerateInputFiles Package)
65 get_filename_component(_path ${Package} PATH)
66 get_filename_component(_name ${Package} NAME)
68 STRING(REGEX REPLACE "^(lib.*).pkg$" "\\1" _lib "${_name}")
69 STRING(REGEX REPLACE "^(bin.*).pkg$" "\\1" _bin "${_name}")
71 ParsePackageFile(${Package})
73 If(_name MATCHES "^lib.*$")
74 Set(PACKAGES ${PACKAGES} ${_lib})
75 SpecialSettingsMadeByHand(${_lib}) # Correct the Parser
76 CreateLibPackageFile(${_path} ${_lib})
77 Else(_name MATCHES "^lib.*$")
78 Set(PACKAGES ${PACKAGES} ${_bin})
79 CreateBinPackageFile(${_path} ${_bin})
80 EndIf(_name MATCHES "^lib.*$")
82 EndMacro(GenerateInputFiles Package)
84 Macro(ParsePackageFile Package)
93 Set(PACKCXXFLAGS_PACKAGE)
94 Set(PACKFFLAGS_PACKAGE)
96 Set(EXCLUDE_PART FALSE)
100 Set(DIMDIR $ENV{DIMDIR})
102 # Read the complete text file into variable contents
104 FILE(READ "${Package}" contents)
106 # Convert file contents into a CMake list (where each element in the list
107 # is one line of the file)
108 # Replace as first step ";" to "\". One "\" in a regex must be "\\\\"
109 # After that replace line breaks by a semicolon, which is in cmake the
110 # separator between list elements. The nice feature is that if there is a
111 # follow up line this is indicated with an "\" at the end of the line
112 # directly before the line break. In the generated string this two letters
113 # together becomes "\;" which is not the separator between two list elements
114 # but a single ";" in a liste element. With this trick one gets all
115 # follow up lines in one list element which can be parsed
117 STRING(REGEX REPLACE ";" "\\\\;" contents "${contents}")
118 STRING(REGEX REPLACE "\n" ";" contents "${contents}")
120 # Iterate over the lines of the input file
121 Foreach(line ${contents})
124 # Simple technique to handle if statements in the package files
125 # If you hit an endif or an else at the begining of a line read
126 # again lines below this point. In case of else check if it is a
127 # nested "if else if else endif endif" structure. If the correct
128 # case is already found don't read the following lines
130 # If(line MATCHES "^[#].*$")
131 # Set(EXCLUDE_PART TRUE)
132 # EndIf(line MATCHES "^[#].*$")
134 If(line MATCHES "^endif.*$")
135 Set(EXCLUDE_PART FALSE)
136 EndIf(line MATCHES "^endif.*$")
138 If(line MATCHES "^else.*$")
140 Set(EXCLUDE_PART FALSE)
142 Set(EXCLUDE_PART TRUE)
144 EndIf(line MATCHES "^else.*$")
146 # Special handling in case ther is a if statement
148 If(line MATCHES "^if.*$")
150 # Special handling in case ther is a ifeq statement
152 If(line MATCHES "^ifeq.*$")
154 # Remove ifeq from text. The rest is the interesting part of
157 STRING(REGEX REPLACE "ifeq" "" statement "${line}")
159 # check if "ifeq" compares for ALICE_TARGET. If required target is
160 # equal to ALICE_TARGET, then read the following lines until endif
162 # Since only one target is possible mark that a target was already
163 # found. A short summary of regular expressions can be found at the
166 If(line MATCHES "^.*ALICE_TARGET.*$")
167 STRING(REGEX REPLACE "^.*[(](.*),[$][(]ALICE_TARGET[)][)].*$" "\\1" _result "${line}")
168 If(_result STREQUAL ${ALICE_TARGET})
170 Set(EXCLUDE_PART FALSE)
171 Else(_result STREQUAL ${ALICE_TARGET})
172 Set(EXCLUDE_PART TRUE)
173 EndIf(_result STREQUAL ${ALICE_TARGET})
174 EndIf(line MATCHES "^.*ALICE_TARGET.*$")
177 # check if "if" statement checks for Alien or XML installation.
178 # If ROOT is installed with Alien or XML switch on the compile
181 If(line MATCHES "^.*CHECK.*$")
182 STRING(REGEX REPLACE "^.*[(](.*),[$][(]CHECKXML[)][)].*$" "\\1" _result_xml "${line}")
183 STRING(REGEX REPLACE "^.*[(](.*),[$][(]CHECKALIEN[)][)].*$" "\\1" _result_alien "${line}")
184 If(${_result_xml} STREQUAL ${ROOT_HAS_XML} OR ${_result_alien} STREQUAL ${ROOT_HAS_ALIEN})
185 Set(EXCLUDE_PART FALSE)
186 Else(${_result_xml} STREQUAL ${ROOT_HAS_XML} OR ${_result_alien} STREQUAL ${ROOT_HAS_ALIEN})
187 Set(EXCLUDE_PART TRUE)
188 EndIf(${_result_xml} STREQUAL ${ROOT_HAS_XML} OR ${_result_alien} STREQUAL ${ROOT_HAS_ALIEN})
190 EndIf(line MATCHES "^.*CHECK.*$")
192 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
194 If(line MATCHES "^.*CCM.*$")
195 STRING(REGEX REPLACE "^.*[(][$][(]CCMAJORV[)],(.*)[)].*$" "\\1" _result_maj "${line}")
196 STRING(REGEX REPLACE "^.*[(][$][(]CCMINORV[)],(.*)[)].*$" "\\1" _result_min "${line}")
197 If(${_result_maj} EQUAL 4 OR ${_result_min} EQUAL 3)
198 Set(EXCLUDE_PART FALSE)
199 Else(${_result_maj} EQUAL 4 OR ${_result_min} EQUAL 3)
200 Set(EXCLUDE_PART TRUE)
201 EndIf(${_result_maj} EQUAL 4 OR ${_result_min} EQUAL 3)
202 EndIf(line MATCHES "^.*CCM.*$")
204 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
206 If(line MATCHES "^.*F77.*$")
207 STRING(REGEX REPLACE "^.*[(](.*),[$][(]F77[)][)].*$" "\\1" _result_f77 "${line}")
208 If(${_result_f77} STREQUAL g95)
209 Set(EXCLUDE_PART FALSE)
210 Else(${_result_f77} STREQUAL g95)
211 Set(EXCLUDE_PART TRUE)
212 EndIf(${_result_f77} STREQUAL g95)
213 EndIf(line MATCHES "^.*F77.*$")
216 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
218 If(line MATCHES "^.*MACOSX_MINOR.*$")
219 STRING(REGEX REPLACE "^.*[(](.*),[$][(]MACOSX_MINOR[)][)].*$" "\\1" _result_mac "${line}")
220 If(${_result_mac} EQUAL 5)
221 Set(EXCLUDE_PART FALSE)
222 Else(${_result_mac} EQUAL 5)
223 Set(EXCLUDE_PART TRUE)
224 EndIf(${_result_mac} EQUAL 5)
225 EndIf(line MATCHES "^.*MACOSX_MINOR.*$")
227 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
229 Else(line MATCHES "^ifeq.*$")
231 If(line MATCHES "^ifdef.*$")
232 #MESSAGE("LINE: ${line}")
234 # line starts with if but not ifeq
236 # Parse DATE dependent part of if statements
237 STRING(REGEX REPLACE "^.*(DATE_ROOT).*$" "\\1" _result_date "${line}")
238 If(${_result_date} STREQUAL DATE_ROOT)
240 Set(EXCLUDE_PART FALSE)
242 Set(EXCLUDE_PART TRUE)
244 EndIf(${_result_date} STREQUAL DATE_ROOT)
246 STRING(REGEX REPLACE "^.*(DIMDIR).*$" "\\1" _result_date "${line}")
247 If(${_result_date} STREQUAL DIMDIR)
249 Set(EXCLUDE_PART FALSE)
251 Set(EXCLUDE_PART TRUE)
253 EndIf(${_result_date} STREQUAL DIMDIR)
255 Else(line MATCHES "^ifdef.*$")
256 If(line MATCHES "^ifneq.*$")
258 If(line MATCHES "^.*FASTJET_ROOT.*$")
259 STRING(REGEX REPLACE "^.*[(][$][(]FASTJET_ROOT[)],(.*)[)].*$" "\\1" _result_fastjet "${line}")
260 If(NOT ${_length_fastjet})
261 Set(EXCLUDE_PART FALSE)
262 Else(NOT ${_length_fastjet})
263 Set(EXCLUDE_PART TRUE)
264 EndIf(NOT ${_length_fastjet})
266 Else(line MATCHES "^.*FASTJET_ROOT.*$")
267 If(line MATCHES "^.*findstring macosx,[$][(]ALICE_TARGET[)].*$")
268 STRING(REGEX REPLACE "^.*findstring[ ](,*),[$][(]ALICE_TARGET[)].*$" "\\1" _result_macox "${line}")
269 If(${_result_macox} MATCHES ".*macosx.*")
270 Set(EXCLUDE_PART FALSE)
271 Else(${_result_macox} MATCHES ".*macosx.*")
272 Set(EXCLUDE_PART FALSE)
273 EndIf(${_result_macox} MATCHES ".*macosx.*")
275 Else(line MATCHES "^.*findstring macosx,[$][(]ALICE_TARGET[)].*$")
277 MESSAGE(FATAL_ERROR "There is no rule how to handle ifneq statement in ${line}")
279 EndIf(line MATCHES "^.*findstring macosx,[$][(]ALICE_TARGET[)].*$")
280 EndIf(line MATCHES "^.*FASTJET_ROOT.*$")
284 Else(line MATCHES "^ifneq.*$")
285 Set(EXCLUDE_PART TRUE)
286 MESSAGE(FATAL_ERROR "There is no rule how to handle if statement in ${line}")
287 EndIf(line MATCHES "^ifneq.*$")
289 EndIf(line MATCHES "^ifdef.*$")
290 EndIf(line MATCHES "^ifeq.*$")
291 EndIf(line MATCHES "^if.*$")
293 # If the lines are inside an if statement which is not true exclude this
294 # part. In other words read only interesting part of of the file
296 # MESSAGE("EXCLUDE*: ${EXCLUDE_PART}")
300 If(line MATCHES "^ORGSRCS.*$")
301 STRING(REGEX REPLACE "^.*[$][(]wildcard[ ](.*)[*].*$" "\\1" orgsrc "${line}")
302 Set(_file_glob_dir ${_file_glob_dir} ${orgsrc})
303 EndIf(line MATCHES "^ORGSRCS.*$")
305 If(line MATCHES "^SRCS.*$")
306 STRING(REGEX REPLACE "SRCS" "" CXXSRCS "${line}")
307 STRING(REGEX REPLACE ":=" "" CXXSRCS "${CXXSRCS}")
308 STRING(REGEX REPLACE "[+]=" "" CXXSRCS "${CXXSRCS}")
309 STRING(REGEX REPLACE "=" "" CXXSRCS "${CXXSRCS}")
310 STRING(REGEX REPLACE "[ ]+" ";" CXXSRCS "${CXXSRCS}")
311 STRING(REGEX REPLACE "^;" "" CXXSRCS "${CXXSRCS}")
312 If(CXXSRCS MATCHES "^.*patsubst.*$")
314 Else(CXXSRCS MATCHES "^.*patsubst.*$")
315 SET(CXXSRCS_PACKAGE ${CXXSRCS_PACKAGE} ${CXXSRCS})
316 EndIf(CXXSRCS MATCHES "^.*patsubst.*$")
317 EndIf(line MATCHES "^SRCS.*$")
319 If(line MATCHES "^CSRCS.*$")
320 STRING(REGEX REPLACE "CSRCS" "" CSRCS "${line}")
321 STRING(REGEX REPLACE ":=" "" CSRCS "${CSRCS}")
322 STRING(REGEX REPLACE "[+]=" "" CSRCS "${CSRCS}")
323 STRING(REGEX REPLACE "=" "" CSRCS "${CSRCS}")
324 STRING(REGEX REPLACE "[ ]+" ";" CSRCS "${CSRCS}")
325 STRING(REGEX REPLACE "^;" "" CSRCS "${CSRCS}")
326 SET(CSRCS_PACKAGE ${CSRCS_PACKAGE} ${CSRCS})
327 EndIf(line MATCHES "^CSRCS.*$")
329 If(line MATCHES "^FSRCS.*$")
330 STRING(REGEX REPLACE "FSRCS" "" FSRCS "${line}")
331 STRING(REGEX REPLACE ":=" "" FSRCS "${FSRCS}")
332 STRING(REGEX REPLACE "[+]=" "" FSRCS "${FSRCS}")
333 STRING(REGEX REPLACE "=" "" FSRCS "${FSRCS}")
334 STRING(REGEX REPLACE "[ ]+" ";" FSRCS "${FSRCS}")
335 STRING(REGEX REPLACE "^;" "" FSRCS "${FSRCS}")
336 SET(FSRCS_PACKAGE ${FSRCS_PACKAGE} ${FSRCS})
337 EndIf(line MATCHES "^FSRCS.*$")
339 If(line MATCHES "^EINCLUDE.*$")
340 # MESSAGE("BLA: ${line}")
341 STRING(REGEX REPLACE "EINCLUDE" "" EINCLUDE "${line}")
342 STRING(REGEX REPLACE ":=" "" EINCLUDE "${EINCLUDE}")
343 STRING(REGEX REPLACE "[+]=" "" EINCLUDE "${EINCLUDE}")
344 STRING(REGEX REPLACE "=" "" EINCLUDE "${EINCLUDE}")
345 STRING(REGEX REPLACE "[ ]+" ";" EINCLUDE "${EINCLUDE}")
346 STRING(REGEX REPLACE "^;" "" EINCLUDE "${EINCLUDE}")
347 SET(EINCLUDE_PACKAGE ${EINCLUDE_PACKAGE} ${EINCLUDE})
348 # MESSAGE("EINCLUDE_PACKAGE: ${EINCLUDE_PACKAGE}")
349 EndIf(line MATCHES "^EINCLUDE.*$")
351 If(line MATCHES "^DHDR.*$")
352 STRING(REGEX REPLACE "DHDR" "" DHDR "${line}")
353 STRING(REGEX REPLACE ":=" "" DHDR "${DHDR}")
354 STRING(REGEX REPLACE "[+]=" "" DHDR "${DHDR}")
355 STRING(REGEX REPLACE "=" "" DHDR "${DHDR}")
356 STRING(REGEX REPLACE "[ ]+" ";" DHDR "${DHDR}")
357 STRING(REGEX REPLACE "^;" "" DHDR "${DHDR}")
358 SET(DHDR_PACKAGE ${DHDR_PACKAGE} ${DHDR})
359 EndIf(line MATCHES "^DHDR.*$")
361 If(line MATCHES "^PACKCXXFLAGS.*$")
362 STRING(REGEX REPLACE "PACKCXXFLAGS" "" PACKCXXFLAGS "${line}")
363 STRING(REGEX REPLACE ":=" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
364 STRING(REGEX REPLACE "[+]=" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
365 STRING(REGEX REPLACE "^[ ]+[=]" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
366 STRING(REGEX REPLACE "[ ]+" ";" PACKCXXFLAGS "${PACKCXXFLAGS}")
367 STRING(REGEX REPLACE "^;" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
368 foreach(elem ${PACKCXXFLAGS})
369 STRING(REGEX MATCH "^[-]D.*$" _match_result ${elem})
370 if(${elem} STREQUAL "${_match_result}")
371 SET(PACKCXXFLAGS_PACKAGE ${PACKCXXFLAGS_PACKAGE} ${elem})
372 endif(${elem} STREQUAL "${_match_result}")
373 endforeach(elem ${PACKCXXFLAGS})
374 # MESSAGE("DEFINITIONS: ${PACKCXXFLAGS_PACKAGE}")
375 EndIf(line MATCHES "^PACKCXXFLAGS.*$")
377 If(line MATCHES "^PACKFFLAGS.*$")
378 STRING(REGEX REPLACE "PACKFFLAGS" "" PACKFFLAGS "${line}")
379 STRING(REGEX REPLACE ":=" "" PACKFFLAGS "${PACKFFLAGS}")
380 STRING(REGEX REPLACE "[+]=" "" PACKFFLAGS "${PACKFFLAGS}")
381 STRING(REGEX REPLACE "^[ ]+[=]" "" PACKFFLAGS "${PACKFFLAGS}")
382 STRING(REGEX REPLACE "[ ]+" ";" PACKFFLAGS "${PACKFFLAGS}")
383 STRING(REGEX REPLACE "^;" "" PACKFFLAGS "${PACKFFLAGS}")
384 foreach(elem ${PACKFFLAGS})
385 STRING(REGEX MATCH "[-]O[%]" _match_result ${elem})
386 if("${_match_result}" STREQUAL "-O%")
388 endif("${_match_result}" STREQUAL "-O%")
389 STRING(REGEX MATCH "^[-].*$" _match_result ${elem})
390 if(${elem} STREQUAL "${_match_result}")
391 SET(PACKFFLAGS_PACKAGE ${PACKFFLAGS_PACKAGE} ${elem})
392 endif(${elem} STREQUAL "${_match_result}")
393 endforeach(elem ${PACKFFLAGS})
394 # MESSAGE("FDEFINITIONS: ${PACKFFLAGS_PACKAGE}")
395 EndIf(line MATCHES "^PACKFFLAGS.*$")
397 If(line MATCHES "^ELIBS.*$")
398 If(NOT line MATCHES "^ELIBSCPP.*$")
399 If(NOT line MATCHES "^ELIBSDIR.*$")
400 STRING(REGEX REPLACE "ELIBS" "" ELIBS "${line}")
401 STRING(REGEX REPLACE ":=" "" ELIBS "${ELIBS}")
402 STRING(REGEX REPLACE "[+]=" "" ELIBS "${ELIBS}")
403 STRING(REGEX REPLACE "=" "" ELIBS "${ELIBS}")
404 STRING(REGEX REPLACE "[ ]+" ";" ELIBS "${ELIBS}")
405 STRING(REGEX REPLACE "^;" "" ELIBS "${ELIBS}")
406 SET(ELIBS_PACKAGE ${ELIBS_PACKAGE} ${ELIBS})
407 EndIf(NOT line MATCHES "^ELIBSDIR.*$")
408 EndIf(NOT line MATCHES "^ELIBSCPP.*$")
409 EndIf(line MATCHES "^ELIBS.*$")
411 If(line MATCHES "^HDRS.*$")
412 STRING(REGEX REPLACE "HDRS" "" HDRS "${line}")
414 # Check if list of header files should be build from
415 # list of source files. Add additional header files to
416 # the list if they are defined. The parser does not
417 IF("${HDRS}" MATCHES "[$][(]SRCS:[.]cxx=[.]h[)]")
418 set(ADD_HEADERS TRUE)
419 ELSE("${HDRS}" MATCHES "[$][(]SRCS:[.]cxx=[.]h[)]")
421 set(ADD_HEADERS TRUE)
423 set(ADD_HEADERS FALSE)
425 ENDIF("${HDRS}" MATCHES "[$][(]SRCS:[.]cxx=[.]h[)]")
426 STRING(REGEX REPLACE "[$][(]SRCS:[.]cxx=[.]h[)]" "" HDRS "${HDRS}")
428 # STRING(REGEX REPLACE "[$][(]filter-out(.*),.*[)]" "//1" _exclude_h "${HDRS}")
429 # STRING(LENGTH ${_exclude_h} _exclude_h_length)
430 # If(${_exclude_h_length} GREATER 0)
431 # String(STRIP ${_exclude_h} _exclude_h)
432 # list(REMOVE_ITEM HDRS ${_exclude_h})
433 # EndIf(${_exclude_h_length} GREATER 0)
435 STRING(REGEX REPLACE "[$][(]filter-out.*[)]" "" HDRS "${HDRS}")
436 STRING(REGEX REPLACE ":=" "" HDRS "${HDRS}")
437 STRING(REGEX REPLACE "[+]=" "" HDRS "${HDRS}")
438 STRING(REGEX REPLACE "=" "" HDRS "${HDRS}")
439 STRING(REGEX REPLACE "[ ]+" ";" HDRS "${HDRS}")
440 STRING(REGEX REPLACE "^;" "" HDRS "${HDRS}")
441 SET(HDRS_PACKAGE ${HDRS_PACKAGE} ${HDRS})
442 EndIf(line MATCHES "^HDRS.*$")
444 # MESSAGE("Parsed: ${line}")
445 Else(NOT EXCLUDE_PART)
446 # MESSAGE("Not parsed: ${line}")
447 EndIf(NOT EXCLUDE_PART)
449 EndForeach(line ${contents})
450 EndMacro(ParsePackageFile Package)
452 Macro(CreateMainCMakeFile path)
453 set(FileName ${path}/CMakeLists.txt)
454 file(WRITE ${FileName} "# -*- mode: cmake -*-\n")
455 file(APPEND ${FileName} "# Create a library called \"lib<name>\" which includes the source files given in\n")
456 file(APPEND ${FileName} "# the array .\n")
457 file(APPEND ${FileName} "# The extension is already found. Any number of sources could be listed here.\n\n")
458 file(APPEND ${FileName} "set(INCLUDE_DIRECTORIES\n")
459 foreach(file ${EINCLUDE_SUBDIR})
460 If(file MATCHES "^.*[$].*$")
461 STRING(REGEX REPLACE "[(]" "ENV{" file "${file}")
462 STRING(REGEX REPLACE "[)]" "}" file "${file}")
463 file(APPEND ${FileName} "${file}\n")
464 Else(file MATCHES "^.*[$].*$")
465 file(APPEND ${FileName} "\${CMAKE_SOURCE_DIR}/${file}\n")
466 EndIf(file MATCHES "^.*[$].*$")
467 endforeach(file ${EINCLUDE_SUBDIR})
468 file(APPEND ${FileName} "\${ROOT_INCLUDE_DIR}\n")
470 if(${_dir} STREQUAL STEER OR ${_dir} STREQUAL TPC OR ${_dir} STREQUAL ALIROOT)
471 file(APPEND ${FileName} "\${CMAKE_BINARY_DIR}/STEER\n")
472 endif(${_dir} STREQUAL STEER OR ${_dir} STREQUAL TPC OR ${_dir} STREQUAL ALIROOT)
473 if(${_dir} STREQUAL RAW)
474 file(APPEND ${FileName} "\${CMAKE_SOURCE_DIR}\n")
475 endif(${_dir} STREQUAL RAW)
478 file(APPEND ${FileName} ")\n\n")
479 file(APPEND ${FileName} "include_directories(\${INCLUDE_DIRECTORIES})\n\n")
480 file(APPEND ${FileName} "set(LINK_DIRECTORIES\n")
481 file(APPEND ${FileName} "\${ROOT_LIBRARY_DIR}\n")
482 file(APPEND ${FileName} ")\n\n")
483 file(APPEND ${FileName} "link_directories(\${LINK_DIRECTORIES})\n\n")
485 list(LENGTH PACKCXXFLAGS_SUBDIR definition_length)
486 if(${definition_length} GREATER 0)
487 list(REMOVE_DUPLICATES PACKCXXFLAGS_SUBDIR)
488 file(APPEND ${FileName} "Add_Definitions(\n")
489 foreach(file ${PACKCXXFLAGS_SUBDIR})
490 file(APPEND ${FileName} "${file}\n")
491 endforeach(file ${CXXSRCS_SUBDIR})
492 file(APPEND ${FileName} ")\n\n")
493 endif(${definition_length} GREATER 0)
495 file(APPEND ${FileName} "SetModule()\n\n")
496 foreach(file ${PACKAGES})
497 file(APPEND ${FileName} "include (CMake_${file}.txt)\n\n")
498 endforeach(file ${PACKAGES})
499 EndMacro(CreateMainCMakeFile path)
501 Macro(CreateLibPackageFile path lib)
503 set(FileName ${path}/CMake_${lib}.txt)
504 set(AddCSource FALSE)
505 set(AddFortranSource FALSE)
507 STRING(REGEX REPLACE "^lib(.*)" "\\1" _lib "${lib}")
509 file(WRITE ${FileName} "# -*- mode: cmake -*-\n\n")
511 file(APPEND ${FileName} "set(SRCS)\n\n")
515 ForEach(_file ${_file_glob_dir})
516 file(APPEND ${FileName} "File(GLOB SRCS${_counter} RELATIVE \${CMAKE_CURRENT_SOURCE_DIR} \${CMAKE_SOURCE_DIR}/${_file}*.cxx)\n\n")
517 Math(EXPR _counter ${_counter}+1)
518 EndForEach(_file ${_file_glob_dir})
519 Math(EXPR _counter ${_counter}-1)
520 file(APPEND ${FileName} "set(SRCS)\n")
521 ForEach(_loop RANGE ${_counter})
522 file(APPEND ${FileName} "set(SRCS \${SRCS} \${SRCS${_loop}})\n")
523 EndForEach(_loop RANGE ${_counter})
525 list(LENGTH CXXSRCS_PACKAGE cxx_length)
526 if(${cxx_length} GREATER 0)
527 file(APPEND ${FileName} "set(SRCS\n")
528 foreach(file ${CXXSRCS_PACKAGE})
529 file(APPEND ${FileName} "${file}\n")
530 endforeach(file ${CXXSRCS_PACKAGE})
531 file(APPEND ${FileName} ")\n\n")
532 endif(${cxx_length} GREATER 0)
535 list(LENGTH CSRCS_PACKAGE c_length)
536 if(${c_length} GREATER 0)
538 file(APPEND ${FileName} "set(CSRCS\n")
539 foreach(file ${CSRCS_PACKAGE})
540 file(APPEND ${FileName} "${file}\n")
541 endforeach(file ${CSRCS_PACKAGE})
542 file(APPEND ${FileName} ")\n\n")
543 endif(${c_length} GREATER 0)
545 list(LENGTH FSRCS_PACKAGE f_length)
546 if(${f_length} GREATER 0)
547 set(AddFortranSource TRUE)
548 file(APPEND ${FileName} "set(FSRCS\n")
549 foreach(file ${FSRCS_PACKAGE})
550 file(APPEND ${FileName} "${file}\n")
551 endforeach(file ${FSRCS_PACKAGE})
552 file(APPEND ${FileName} ")\n\n")
553 endif(${f_length} GREATER 0)
557 file(APPEND ${FileName} "# fill list of header files from list of source files\n")
558 file(APPEND ${FileName} "# by exchanging the file extension\n")
560 file(APPEND ${FileName} "String(REPLACE \".cxx\" \".h\" HDRS \"\${SRCS}\")\n\n")
561 list(LENGTH HDRS_PACKAGE _length)
562 if(${_length} GREATER 0)
563 file(APPEND ${FileName} "set(HDRS \${HDRS}\n")
564 foreach(file ${HDRS_PACKAGE})
565 file(APPEND ${FileName} "${file}\n")
566 endforeach(file ${HDRS_PACKAGE})
567 file(APPEND ${FileName} ")\n\n")
568 endif(${_length} GREATER 0)
570 list(LENGTH HDRS_PACKAGE _length)
571 if(${_length} GREATER 0)
572 file(APPEND ${FileName} "set(HDRS\n")
573 foreach(file ${HDRS_PACKAGE})
574 file(APPEND ${FileName} "${file}\n")
575 endforeach(file ${HDRS_PACKAGE})
576 file(APPEND ${FileName} ")\n\n")
577 endif(${_length} GREATER 0)
581 file(APPEND ${FileName} "Set(SRCS \${SRCS} \${CSRCS})\n\n")
584 file(APPEND ${FileName} "Set(SRCS \${SRCS} \${FSRCS})\n\n")
585 EndIf(AddFortranSource)
587 list(LENGTH PACKFFLAGS_PACKAGE packf_length)
588 if(${packf_length} GREATER 0)
589 file(APPEND ${FileName} "SET_SOURCE_FILES_PROPERTIES(\n")
590 file(APPEND ${FileName} "${FSRCS} PROPERTIES COMPILE_FLAGS\n")
591 file(APPEND ${FileName} "${PACKFFLAGS_PACKAGE}\n")
592 file(APPEND ${FileName} ")\n\n")
593 endif(${packf_length} GREATER 0)
596 file(APPEND ${FileName} "AddLibrary(${_lib} \"\${SRCS}\" \"\${HDRS}\")\n")
599 # If package file is empty remove the CMake input file for that packge and
600 # remove the package from the list.
601 # If( ${cxx_length} EQUAL 0 AND ${c_length} EQUAL 0 AND ${f_length} EQUAL 0)
602 # file(REMOVE ${FileName})
603 # list(REMOVE_ITEM PACKAGES lib${_lib})
604 # EndIf( ${cxx_length} EQUAL 0 AND ${c_length} EQUAL 0 AND ${f_length} EQUAL 0)
606 EndMacro(CreateLibPackageFile path lib)
608 Macro(CreateBinPackageFile path bin)
610 set(FileName ${path}/CMake_${bin}.txt)
611 STRING(REGEX REPLACE "^bin(.*)" "\\1" _bin "${bin}")
613 file(WRITE ${FileName} "# -*- mode: cmake -*-\n\n")
615 file(APPEND ${FileName} "set(SRCS)\n\n")
617 list(LENGTH CXXSRCS_PACKAGE _length)
618 if(${_length} GREATER 0)
619 file(APPEND ${FileName} "set(SRCS\n")
620 foreach(file ${CXXSRCS_PACKAGE})
621 file(APPEND ${FileName} "${file}\n")
622 endforeach(file ${CXXSRCS_PACKAGE})
623 file(APPEND ${FileName} ")\n\n")
624 endif(${_length} GREATER 0)
626 list(LENGTH CSRCS_PACKAGE _length)
627 if(${_length} GREATER 0)
628 file(APPEND ${FileName} "set(CSRCS\n")
629 foreach(file ${CSRCS_PACKAGE})
630 file(APPEND ${FileName} "${file}\n")
631 endforeach(file ${CXXSRCS_PACKAGE})
632 file(APPEND ${FileName} ")\n\n")
633 endif(${_length} GREATER 0)
635 list(LENGTH ELIBS_PACKAGE _length)
636 if(${_length} GREATER 0)
637 file(APPEND ${FileName} "set(LIBS\n")
638 foreach(file ${ELIBS_PACKAGE})
639 file(APPEND ${FileName} "${file}\n")
640 endforeach(file ${ELIBS_PACKAGE})
641 file(APPEND ${FileName} ")\n\n")
642 endif(${_length} GREATER 0)
644 file(APPEND ${FileName} "AddExecutable(${_bin}exe \"\${SRCS}\" \"\${LIBS}\")\n")
645 EndMacro(CreateBinPackageFile path bin)
647 Macro(SpecialSettingsMadeByHand lib)
648 If(${lib} STREQUAL libAliengui)
649 list(REMOVE_ITEM CXXSRCS_PACKAGE Aliengui/AliAnalysisGUIdummy.cxx)
650 EndIf(${lib} STREQUAL libAliengui)
651 # If(${lib} STREQUAL libTPCmon)
652 # list(REMOVE_ITEM CXXSRCS_PACKAGE AliTPCMonitorDateMonitor.cxx)
653 # list(REMOVE_ITEM HDRS_PACKAGE AliTPCMonitorDateMonitor.h)
654 # EndIf(${lib} STREQUAL libTPCmon)
655 If(${lib} STREQUAL libRAWDatabase)
656 list(APPEND HDRS_PACKAGE \${ROOT_INCLUDE_DIR}/TH1F.h)
657 list(APPEND H_PACKAGE \${ROOT_INCLUDE_DIR}/TH1F.h)
658 EndIf(${lib} STREQUAL libRAWDatabase)
659 If(${lib} STREQUAL liblhapdf)
660 # STRING(REGEX REPLACE "[=]" "\\\\=" PACKCXXFLAGS "${PACKCXXFLAGS}")
661 # STRING(REGEX REPLACE "[$][(]ALICE_ROOT[)]" "\$ENV{ALICE_ROOT}" PACKCXXFLAGS "${PACKCXXFLAGS}")
662 EndIf(${lib} STREQUAL liblhapdf)
663 EndMacro(SpecialSettingsMadeByHand lib)
664 Macro(CreateSubCMakeFiles)
666 # Extract list of subdirectories for which the script has to
667 # create CMakeLists.txt out of the information of the main
670 MESSAGE(STATUS "Generating CMakeLists.txt in subdirectories from the package files.")
672 file(STRINGS ${CMAKE_SOURCE_DIR}/CMakeLists.txt bla
673 REGEX "^Add_subdirectory(.*)"
677 STRING(REGEX REPLACE "^Add_subdirectory\((.*)\)$" "\\1" _OutDir "${_dir}")
678 STRING(STRIP ${_OutDir} _OutDir1)
679 string(LENGTH ${_OutDir1} _Length)
680 math(EXPR _Length1 ${_Length}-2)
681 string(SUBSTRING ${_OutDir1} 1 ${_Length1} _OutDir)
682 List(APPEND Directories ${_OutDir})
683 EndForeach(_dir ${bla})
685 # Check if ROOT was compile with xml and alien support
686 # This is needed later to set properly the definitions during
689 COMMAND root-config --has-xml
690 OUTPUT_VARIABLE ROOT_HAS_XML
691 OUTPUT_STRIP_TRAILING_WHITESPACE)
694 COMMAND root-config --has-alien
695 OUTPUT_VARIABLE ROOT_HAS_ALIEN
696 OUTPUT_STRIP_TRAILING_WHITESPACE)
698 # Loop over the subdirectories, extract the package files and
699 # call for each of the package files a macro which creates the
700 # corresponding CMake input files in the subdirectory
702 Foreach(_dir ${Directories})
703 if(NOT ${_dir} STREQUAL HLT)
704 file(GLOB Package RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/${_dir}/*.pkg)
705 get_filename_component(__path ${_dir} NAME)
706 set(EINCLUDE_SUBDIR ${__path} STEER)
707 set(PACKCXXFLAGS_SUBDIR)
709 Foreach(_pack ${Package})
710 GenerateInputFiles(${_pack})
711 set(EINCLUDE_SUBDIR ${EINCLUDE_SUBDIR} ${EINCLUDE_PACKAGE})
712 set(PACKCXXFLAGS_SUBDIR ${PACKCXXFLAGS_SUBDIR} ${PACKCXXFLAGS_PACKAGE})
713 EndForeach(_pack ${Package})
714 list(REMOVE_DUPLICATES EINCLUDE_SUBDIR)
715 CreateMainCMakeFile(${__path})
716 else(NOT ${_dir} STREQUAL HLT)
717 # MESSAGE(STATUS "Don't generate files for HLT do to complete different syntax of package files")
718 Include(CreateHLTSubCMakeFiles)
719 CreateHLTSubCMakeFiles()
720 endif(NOT ${_dir} STREQUAL HLT)
721 EndForeach(_dir ${Directories})
724 EndMacro(CreateSubCMakeFiles)
726 Macro(GenerateInputFiles Package)
728 get_filename_component(_path ${Package} PATH)
729 get_filename_component(_name ${Package} NAME)
731 STRING(REGEX REPLACE "^(lib.*).pkg$" "\\1" _lib "${_name}")
732 STRING(REGEX REPLACE "^(bin.*).pkg$" "\\1" _bin "${_name}")
734 ParsePackageFile(${Package})
736 If(_name MATCHES "^lib.*$")
737 Set(PACKAGES ${PACKAGES} ${_lib})
738 SpecialSettingsMadeByHand(${_lib}) # Correct the Parser
739 CreateLibPackageFile(${_path} ${_lib})
740 Else(_name MATCHES "^lib.*$")
741 Set(PACKAGES ${PACKAGES} ${_bin})
742 CreateBinPackageFile(${_path} ${_bin})
743 EndIf(_name MATCHES "^lib.*$")
745 EndMacro(GenerateInputFiles Package)
747 Macro(ParsePackageFile Package)
752 Set(EINCLUDE_PACKAGE)
756 Set(PACKCXXFLAGS_PACKAGE)
757 Set(PACKFFLAGS_PACKAGE)
759 Set(EXCLUDE_PART FALSE)
761 Set(_file_glob FALSE)
763 Set(DIMDIR $ENV{DIMDIR})
765 # Read the complete text file into variable contents
767 FILE(READ "${Package}" contents)
769 # Convert file contents into a CMake list (where each element in the list
770 # is one line of the file)
771 # Replace as first step ";" to "\". One "\" in a regex must be "\\\\"
772 # After that replace line breaks by a semicolon, which is in cmake the
773 # separator between list elements. The nice feature is that if there is a
774 # follow up line this is indicated with an "\" at the end of the line
775 # directly before the line break. In the generated string this two letters
776 # together becomes "\;" which is not the separator between two list elements
777 # but a single ";" in a liste element. With this trick one gets all
778 # follow up lines in one list element which can be parsed
780 STRING(REGEX REPLACE ";" "\\\\;" contents "${contents}")
781 STRING(REGEX REPLACE "\n" ";" contents "${contents}")
783 # Iterate over the lines of the input file
784 Foreach(line ${contents})
787 # Simple technique to handle if statements in the package files
788 # If you hit an endif or an else at the begining of a line read
789 # again lines below this point. In case of else check if it is a
790 # nested "if else if else endif endif" structure. If the correct
791 # case is already found don't read the following lines
793 # If(line MATCHES "^[#].*$")
794 # Set(EXCLUDE_PART TRUE)
795 # EndIf(line MATCHES "^[#].*$")
797 If(line MATCHES "^endif.*$")
798 Set(EXCLUDE_PART FALSE)
799 EndIf(line MATCHES "^endif.*$")
801 If(line MATCHES "^else.*$")
803 Set(EXCLUDE_PART FALSE)
805 Set(EXCLUDE_PART TRUE)
807 EndIf(line MATCHES "^else.*$")
809 # Special handling in case ther is a if statement
811 If(line MATCHES "^if.*$")
813 # Special handling in case ther is a ifeq statement
815 If(line MATCHES "^ifeq.*$")
817 # Remove ifeq from text. The rest is the interesting part of
820 STRING(REGEX REPLACE "ifeq" "" statement "${line}")
822 # check if "ifeq" compares for ALICE_TARGET. If required target is
823 # equal to ALICE_TARGET, then read the following lines until endif
825 # Since only one target is possible mark that a target was already
826 # found. A short summary of regular expressions can be found at the
829 If(line MATCHES "^.*ALICE_TARGET.*$")
830 STRING(REGEX REPLACE "^.*[(](.*),[$][(]ALICE_TARGET[)][)].*$" "\\1" _result "${line}")
831 If(_result STREQUAL ${ALICE_TARGET})
833 Set(EXCLUDE_PART FALSE)
834 Else(_result STREQUAL ${ALICE_TARGET})
835 Set(EXCLUDE_PART TRUE)
836 EndIf(_result STREQUAL ${ALICE_TARGET})
837 EndIf(line MATCHES "^.*ALICE_TARGET.*$")
840 # check if "if" statement checks for Alien or XML installation.
841 # If ROOT is installed with Alien or XML switch on the compile
844 If(line MATCHES "^.*CHECK.*$")
845 STRING(REGEX REPLACE "^.*[(](.*),[$][(]CHECKXML[)][)].*$" "\\1" _result_xml "${line}")
846 STRING(REGEX REPLACE "^.*[(](.*),[$][(]CHECKALIEN[)][)].*$" "\\1" _result_alien "${line}")
847 If(${_result_xml} STREQUAL ${ROOT_HAS_XML} OR ${_result_alien} STREQUAL ${ROOT_HAS_ALIEN})
848 Set(EXCLUDE_PART FALSE)
849 Else(${_result_xml} STREQUAL ${ROOT_HAS_XML} OR ${_result_alien} STREQUAL ${ROOT_HAS_ALIEN})
850 Set(EXCLUDE_PART TRUE)
851 EndIf(${_result_xml} STREQUAL ${ROOT_HAS_XML} OR ${_result_alien} STREQUAL ${ROOT_HAS_ALIEN})
853 EndIf(line MATCHES "^.*CHECK.*$")
855 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
857 If(line MATCHES "^.*CCM.*$")
858 STRING(REGEX REPLACE "^.*[(][$][(]CCMAJORV[)],(.*)[)].*$" "\\1" _result_maj "${line}")
859 STRING(REGEX REPLACE "^.*[(][$][(]CCMINORV[)],(.*)[)].*$" "\\1" _result_min "${line}")
860 If(${_result_maj} EQUAL 4 OR ${_result_min} EQUAL 3)
861 Set(EXCLUDE_PART FALSE)
862 Else(${_result_maj} EQUAL 4 OR ${_result_min} EQUAL 3)
863 Set(EXCLUDE_PART TRUE)
864 EndIf(${_result_maj} EQUAL 4 OR ${_result_min} EQUAL 3)
865 EndIf(line MATCHES "^.*CCM.*$")
867 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
869 If(line MATCHES "^.*F77.*$")
870 STRING(REGEX REPLACE "^.*[(](.*),[$][(]F77[)][)].*$" "\\1" _result_f77 "${line}")
871 If(${_result_f77} STREQUAL g95)
872 Set(EXCLUDE_PART FALSE)
873 Else(${_result_f77} STREQUAL g95)
874 Set(EXCLUDE_PART TRUE)
875 EndIf(${_result_f77} STREQUAL g95)
876 EndIf(line MATCHES "^.*F77.*$")
879 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
881 If(line MATCHES "^.*MACOSX_MINOR.*$")
882 STRING(REGEX REPLACE "^.*[(](.*),[$][(]MACOSX_MINOR[)][)].*$" "\\1" _result_mac "${line}")
883 If(${_result_mac} EQUAL 5)
884 Set(EXCLUDE_PART FALSE)
885 Else(${_result_mac} EQUAL 5)
886 Set(EXCLUDE_PART TRUE)
887 EndIf(${_result_mac} EQUAL 5)
888 EndIf(line MATCHES "^.*MACOSX_MINOR.*$")
890 # MESSAGE("EXCLUDE: ${EXCLUDE_PART}")
892 Else(line MATCHES "^ifeq.*$")
894 If(line MATCHES "^ifdef.*$")
895 #MESSAGE("LINE: ${line}")
897 # line starts with if but not ifeq
899 # Parse DATE dependent part of if statements
900 STRING(REGEX REPLACE "^.*(DATE_ROOT).*$" "\\1" _result_date "${line}")
901 If(${_result_date} STREQUAL DATE_ROOT)
903 Set(EXCLUDE_PART FALSE)
905 Set(EXCLUDE_PART TRUE)
907 EndIf(${_result_date} STREQUAL DATE_ROOT)
909 STRING(REGEX REPLACE "^.*(DIMDIR).*$" "\\1" _result_date "${line}")
910 If(${_result_date} STREQUAL DIMDIR)
912 Set(EXCLUDE_PART FALSE)
914 Set(EXCLUDE_PART TRUE)
916 EndIf(${_result_date} STREQUAL DIMDIR)
918 Else(line MATCHES "^ifdef.*$")
919 If(line MATCHES "^ifneq.*$")
921 If(line MATCHES "^.*FASTJET_ROOT.*$")
922 STRING(REGEX REPLACE "^.*[(][$][(]FASTJET_ROOT[)],(.*)[)].*$" "\\1" _result_fastjet "${line}")
923 If(NOT ${_length_fastjet})
924 Set(EXCLUDE_PART FALSE)
925 Else(NOT ${_length_fastjet})
926 Set(EXCLUDE_PART TRUE)
927 EndIf(NOT ${_length_fastjet})
929 Else(line MATCHES "^.*FASTJET_ROOT.*$")
930 If(line MATCHES "^.*findstring macosx,[$][(]ALICE_TARGET[)].*$")
931 STRING(REGEX REPLACE "^.*findstring[ ](,*),[$][(]ALICE_TARGET[)].*$" "\\1" _result_macox "${line}")
932 If(${_result_macox} MATCHES ".*macosx.*")
933 Set(EXCLUDE_PART FALSE)
934 Else(${_result_macox} MATCHES ".*macosx.*")
935 Set(EXCLUDE_PART FALSE)
936 EndIf(${_result_macox} MATCHES ".*macosx.*")
938 Else(line MATCHES "^.*findstring macosx,[$][(]ALICE_TARGET[)].*$")
940 MESSAGE(FATAL_ERROR "There is no rule how to handle ifneq statement in ${line}")
942 EndIf(line MATCHES "^.*findstring macosx,[$][(]ALICE_TARGET[)].*$")
943 EndIf(line MATCHES "^.*FASTJET_ROOT.*$")
947 Else(line MATCHES "^ifneq.*$")
948 Set(EXCLUDE_PART TRUE)
949 MESSAGE(FATAL_ERROR "There is no rule how to handle if statement in ${line}")
950 EndIf(line MATCHES "^ifneq.*$")
952 EndIf(line MATCHES "^ifdef.*$")
953 EndIf(line MATCHES "^ifeq.*$")
954 EndIf(line MATCHES "^if.*$")
956 # If the lines are inside an if statement which is not true exclude this
957 # part. In other words read only interesting part of of the file
959 # MESSAGE("EXCLUDE*: ${EXCLUDE_PART}")
963 If(line MATCHES "^ORGSRCS.*$")
964 STRING(REGEX REPLACE "^.*[$][(]wildcard[ ](.*)[*].*$" "\\1" orgsrc "${line}")
965 Set(_file_glob_dir ${_file_glob_dir} ${orgsrc})
966 EndIf(line MATCHES "^ORGSRCS.*$")
968 If(line MATCHES "^SRCS.*$")
969 STRING(REGEX REPLACE "SRCS" "" CXXSRCS "${line}")
970 STRING(REGEX REPLACE ":=" "" CXXSRCS "${CXXSRCS}")
971 STRING(REGEX REPLACE "[+]=" "" CXXSRCS "${CXXSRCS}")
972 STRING(REGEX REPLACE "=" "" CXXSRCS "${CXXSRCS}")
973 STRING(REGEX REPLACE "[ ]+" ";" CXXSRCS "${CXXSRCS}")
974 STRING(REGEX REPLACE "^;" "" CXXSRCS "${CXXSRCS}")
975 If(CXXSRCS MATCHES "^.*patsubst.*$")
977 Else(CXXSRCS MATCHES "^.*patsubst.*$")
978 SET(CXXSRCS_PACKAGE ${CXXSRCS_PACKAGE} ${CXXSRCS})
979 EndIf(CXXSRCS MATCHES "^.*patsubst.*$")
980 EndIf(line MATCHES "^SRCS.*$")
982 If(line MATCHES "^CSRCS.*$")
983 STRING(REGEX REPLACE "CSRCS" "" CSRCS "${line}")
984 STRING(REGEX REPLACE ":=" "" CSRCS "${CSRCS}")
985 STRING(REGEX REPLACE "[+]=" "" CSRCS "${CSRCS}")
986 STRING(REGEX REPLACE "=" "" CSRCS "${CSRCS}")
987 STRING(REGEX REPLACE "[ ]+" ";" CSRCS "${CSRCS}")
988 STRING(REGEX REPLACE "^;" "" CSRCS "${CSRCS}")
989 SET(CSRCS_PACKAGE ${CSRCS_PACKAGE} ${CSRCS})
990 EndIf(line MATCHES "^CSRCS.*$")
992 If(line MATCHES "^FSRCS.*$")
993 STRING(REGEX REPLACE "FSRCS" "" FSRCS "${line}")
994 STRING(REGEX REPLACE ":=" "" FSRCS "${FSRCS}")
995 STRING(REGEX REPLACE "[+]=" "" FSRCS "${FSRCS}")
996 STRING(REGEX REPLACE "=" "" FSRCS "${FSRCS}")
997 STRING(REGEX REPLACE "[ ]+" ";" FSRCS "${FSRCS}")
998 STRING(REGEX REPLACE "^;" "" FSRCS "${FSRCS}")
999 SET(FSRCS_PACKAGE ${FSRCS_PACKAGE} ${FSRCS})
1000 EndIf(line MATCHES "^FSRCS.*$")
1002 If(line MATCHES "^EINCLUDE.*$")
1003 # MESSAGE("BLA: ${line}")
1004 STRING(REGEX REPLACE "EINCLUDE" "" EINCLUDE "${line}")
1005 STRING(REGEX REPLACE ":=" "" EINCLUDE "${EINCLUDE}")
1006 STRING(REGEX REPLACE "[+]=" "" EINCLUDE "${EINCLUDE}")
1007 STRING(REGEX REPLACE "=" "" EINCLUDE "${EINCLUDE}")
1008 STRING(REGEX REPLACE "[ ]+" ";" EINCLUDE "${EINCLUDE}")
1009 STRING(REGEX REPLACE "^;" "" EINCLUDE "${EINCLUDE}")
1010 SET(EINCLUDE_PACKAGE ${EINCLUDE_PACKAGE} ${EINCLUDE})
1011 # MESSAGE("EINCLUDE_PACKAGE: ${EINCLUDE_PACKAGE}")
1012 EndIf(line MATCHES "^EINCLUDE.*$")
1014 If(line MATCHES "^DHDR.*$")
1015 STRING(REGEX REPLACE "DHDR" "" DHDR "${line}")
1016 STRING(REGEX REPLACE ":=" "" DHDR "${DHDR}")
1017 STRING(REGEX REPLACE "[+]=" "" DHDR "${DHDR}")
1018 STRING(REGEX REPLACE "=" "" DHDR "${DHDR}")
1019 STRING(REGEX REPLACE "[ ]+" ";" DHDR "${DHDR}")
1020 STRING(REGEX REPLACE "^;" "" DHDR "${DHDR}")
1021 SET(DHDR_PACKAGE ${DHDR_PACKAGE} ${DHDR})
1022 EndIf(line MATCHES "^DHDR.*$")
1024 If(line MATCHES "^PACKCXXFLAGS.*$")
1025 STRING(REGEX REPLACE "PACKCXXFLAGS" "" PACKCXXFLAGS "${line}")
1026 STRING(REGEX REPLACE ":=" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
1027 STRING(REGEX REPLACE "[+]=" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
1028 STRING(REGEX REPLACE "^[ ]+[=]" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
1029 STRING(REGEX REPLACE "[ ]+" ";" PACKCXXFLAGS "${PACKCXXFLAGS}")
1030 STRING(REGEX REPLACE "^;" "" PACKCXXFLAGS "${PACKCXXFLAGS}")
1031 foreach(elem ${PACKCXXFLAGS})
1032 STRING(REGEX MATCH "^[-]D.*$" _match_result ${elem})
1033 if(${elem} STREQUAL "${_match_result}")
1034 SET(PACKCXXFLAGS_PACKAGE ${PACKCXXFLAGS_PACKAGE} ${elem})
1035 endif(${elem} STREQUAL "${_match_result}")
1036 endforeach(elem ${PACKCXXFLAGS})
1037 # MESSAGE("DEFINITIONS: ${PACKCXXFLAGS_PACKAGE}")
1038 EndIf(line MATCHES "^PACKCXXFLAGS.*$")
1040 If(line MATCHES "^PACKFFLAGS.*$")
1041 STRING(REGEX REPLACE "PACKFFLAGS" "" PACKFFLAGS "${line}")
1042 STRING(REGEX REPLACE ":=" "" PACKFFLAGS "${PACKFFLAGS}")
1043 STRING(REGEX REPLACE "[+]=" "" PACKFFLAGS "${PACKFFLAGS}")
1044 STRING(REGEX REPLACE "^[ ]+[=]" "" PACKFFLAGS "${PACKFFLAGS}")
1045 STRING(REGEX REPLACE "[ ]+" ";" PACKFFLAGS "${PACKFFLAGS}")
1046 STRING(REGEX REPLACE "^;" "" PACKFFLAGS "${PACKFFLAGS}")
1047 foreach(elem ${PACKFFLAGS})
1048 STRING(REGEX MATCH "[-]O[%]" _match_result ${elem})
1049 if("${_match_result}" STREQUAL "-O%")
1051 endif("${_match_result}" STREQUAL "-O%")
1052 STRING(REGEX MATCH "^[-].*$" _match_result ${elem})
1053 if(${elem} STREQUAL "${_match_result}")
1054 SET(PACKFFLAGS_PACKAGE ${PACKFFLAGS_PACKAGE} ${elem})
1055 endif(${elem} STREQUAL "${_match_result}")
1056 endforeach(elem ${PACKFFLAGS})
1057 # MESSAGE("FDEFINITIONS: ${PACKFFLAGS_PACKAGE}")
1058 EndIf(line MATCHES "^PACKFFLAGS.*$")
1060 If(line MATCHES "^ELIBS.*$")
1061 If(NOT line MATCHES "^ELIBSCPP.*$")
1062 If(NOT line MATCHES "^ELIBSDIR.*$")
1063 STRING(REGEX REPLACE "ELIBS" "" ELIBS "${line}")
1064 STRING(REGEX REPLACE ":=" "" ELIBS "${ELIBS}")
1065 STRING(REGEX REPLACE "[+]=" "" ELIBS "${ELIBS}")
1066 STRING(REGEX REPLACE "=" "" ELIBS "${ELIBS}")
1067 STRING(REGEX REPLACE "[ ]+" ";" ELIBS "${ELIBS}")
1068 STRING(REGEX REPLACE "^;" "" ELIBS "${ELIBS}")
1069 SET(ELIBS_PACKAGE ${ELIBS_PACKAGE} ${ELIBS})
1070 EndIf(NOT line MATCHES "^ELIBSDIR.*$")
1071 EndIf(NOT line MATCHES "^ELIBSCPP.*$")
1072 EndIf(line MATCHES "^ELIBS.*$")
1074 If(line MATCHES "^HDRS.*$")
1075 STRING(REGEX REPLACE "HDRS" "" HDRS "${line}")
1077 # Check if list of header files should be build from
1078 # list of source files. Add additional header files to
1079 # the list if they are defined. The parser does not
1080 IF("${HDRS}" MATCHES "[$][(]SRCS:[.]cxx=[.]h[)]")
1081 set(ADD_HEADERS TRUE)
1082 ELSE("${HDRS}" MATCHES "[$][(]SRCS:[.]cxx=[.]h[)]")
1084 set(ADD_HEADERS TRUE)
1086 set(ADD_HEADERS FALSE)
1088 ENDIF("${HDRS}" MATCHES "[$][(]SRCS:[.]cxx=[.]h[)]")
1089 STRING(REGEX REPLACE "[$][(]SRCS:[.]cxx=[.]h[)]" "" HDRS "${HDRS}")
1091 # STRING(REGEX REPLACE "[$][(]filter-out(.*),.*[)]" "//1" _exclude_h "${HDRS}")
1092 # STRING(LENGTH ${_exclude_h} _exclude_h_length)
1093 # If(${_exclude_h_length} GREATER 0)
1094 # String(STRIP ${_exclude_h} _exclude_h)
1095 # list(REMOVE_ITEM HDRS ${_exclude_h})
1096 # EndIf(${_exclude_h_length} GREATER 0)
1098 STRING(REGEX REPLACE "[$][(]filter-out.*[)]" "" HDRS "${HDRS}")
1099 STRING(REGEX REPLACE ":=" "" HDRS "${HDRS}")
1100 STRING(REGEX REPLACE "[+]=" "" HDRS "${HDRS}")
1101 STRING(REGEX REPLACE "=" "" HDRS "${HDRS}")
1102 STRING(REGEX REPLACE "[ ]+" ";" HDRS "${HDRS}")
1103 STRING(REGEX REPLACE "^;" "" HDRS "${HDRS}")
1104 SET(HDRS_PACKAGE ${HDRS_PACKAGE} ${HDRS})
1105 EndIf(line MATCHES "^HDRS.*$")
1107 # MESSAGE("Parsed: ${line}")
1108 Else(NOT EXCLUDE_PART)
1109 # MESSAGE("Not parsed: ${line}")
1110 EndIf(NOT EXCLUDE_PART)
1112 EndForeach(line ${contents})
1113 EndMacro(ParsePackageFile Package)
1115 Macro(CreateMainCMakeFile path)
1116 set(FileName ${path}/CMakeLists.txt)
1117 file(WRITE ${FileName} "# -*- mode: cmake -*-\n")
1118 file(APPEND ${FileName} "# Create a library called \"lib<name>\" which includes the source files given in\n")
1119 file(APPEND ${FileName} "# the array .\n")
1120 file(APPEND ${FileName} "# The extension is already found. Any number of sources could be listed here.\n\n")
1121 file(APPEND ${FileName} "set(INCLUDE_DIRECTORIES\n")
1122 foreach(file ${EINCLUDE_SUBDIR})
1123 If(file MATCHES "^.*[$].*$")
1124 STRING(REGEX REPLACE "[(]" "ENV{" file "${file}")
1125 STRING(REGEX REPLACE "[)]" "}" file "${file}")
1126 file(APPEND ${FileName} "${file}\n")
1127 Else(file MATCHES "^.*[$].*$")
1128 file(APPEND ${FileName} "\${CMAKE_SOURCE_DIR}/${file}\n")
1129 EndIf(file MATCHES "^.*[$].*$")
1130 endforeach(file ${EINCLUDE_SUBDIR})
1131 file(APPEND ${FileName} "\${ROOT_INCLUDE_DIR}\n")
1133 if(${_dir} STREQUAL STEER OR ${_dir} STREQUAL TPC OR ${_dir} STREQUAL ALIROOT)
1134 file(APPEND ${FileName} "\${CMAKE_BINARY_DIR}/STEER\n")
1135 endif(${_dir} STREQUAL STEER OR ${_dir} STREQUAL TPC OR ${_dir} STREQUAL ALIROOT)
1136 if(${_dir} STREQUAL RAW)
1137 file(APPEND ${FileName} "\${CMAKE_SOURCE_DIR}\n")
1138 endif(${_dir} STREQUAL RAW)
1141 file(APPEND ${FileName} ")\n\n")
1142 file(APPEND ${FileName} "include_directories(\${INCLUDE_DIRECTORIES})\n\n")
1143 file(APPEND ${FileName} "set(LINK_DIRECTORIES\n")
1144 file(APPEND ${FileName} "\${ROOT_LIBRARY_DIR}\n")
1145 file(APPEND ${FileName} ")\n\n")
1146 file(APPEND ${FileName} "link_directories(\${LINK_DIRECTORIES})\n\n")
1148 list(LENGTH PACKCXXFLAGS_SUBDIR definition_length)
1149 if(${definition_length} GREATER 0)
1150 list(REMOVE_DUPLICATES PACKCXXFLAGS_SUBDIR)
1151 file(APPEND ${FileName} "Add_Definitions(\n")
1152 foreach(file ${PACKCXXFLAGS_SUBDIR})
1153 file(APPEND ${FileName} "${file}\n")
1154 endforeach(file ${CXXSRCS_SUBDIR})
1155 file(APPEND ${FileName} ")\n\n")
1156 endif(${definition_length} GREATER 0)
1158 file(APPEND ${FileName} "SetModule()\n\n")
1159 foreach(file ${PACKAGES})
1160 file(APPEND ${FileName} "include (CMake_${file}.txt)\n\n")
1161 endforeach(file ${PACKAGES})
1162 EndMacro(CreateMainCMakeFile path)
1164 Macro(CreateLibPackageFile path lib)
1166 set(FileName ${path}/CMake_${lib}.txt)
1167 set(AddCSource FALSE)
1168 set(AddFortranSource FALSE)
1170 STRING(REGEX REPLACE "^lib(.*)" "\\1" _lib "${lib}")
1172 file(WRITE ${FileName} "# -*- mode: cmake -*-\n\n")
1174 file(APPEND ${FileName} "set(SRCS)\n\n")
1178 ForEach(_file ${_file_glob_dir})
1179 file(APPEND ${FileName} "File(GLOB SRCS${_counter} RELATIVE \${CMAKE_CURRENT_SOURCE_DIR} \${CMAKE_SOURCE_DIR}/${_file}*.cxx)\n\n")
1180 Math(EXPR _counter ${_counter}+1)
1181 EndForEach(_file ${_file_glob_dir})
1182 Math(EXPR _counter ${_counter}-1)
1183 file(APPEND ${FileName} "set(SRCS)\n")
1184 ForEach(_loop RANGE ${_counter})
1185 file(APPEND ${FileName} "set(SRCS \${SRCS} \${SRCS${_loop}})\n")
1186 EndForEach(_loop RANGE ${_counter})
1188 list(LENGTH CXXSRCS_PACKAGE cxx_length)
1189 if(${cxx_length} GREATER 0)
1190 file(APPEND ${FileName} "set(SRCS\n")
1191 foreach(file ${CXXSRCS_PACKAGE})
1192 file(APPEND ${FileName} "${file}\n")
1193 endforeach(file ${CXXSRCS_PACKAGE})
1194 file(APPEND ${FileName} ")\n\n")
1195 endif(${cxx_length} GREATER 0)
1198 list(LENGTH CSRCS_PACKAGE c_length)
1199 if(${c_length} GREATER 0)
1200 set(AddCSource TRUE)
1201 file(APPEND ${FileName} "set(CSRCS\n")
1202 foreach(file ${CSRCS_PACKAGE})
1203 file(APPEND ${FileName} "${file}\n")
1204 endforeach(file ${CSRCS_PACKAGE})
1205 file(APPEND ${FileName} ")\n\n")
1206 endif(${c_length} GREATER 0)
1208 list(LENGTH FSRCS_PACKAGE f_length)
1209 if(${f_length} GREATER 0)
1210 set(AddFortranSource TRUE)
1211 file(APPEND ${FileName} "set(FSRCS\n")
1212 foreach(file ${FSRCS_PACKAGE})
1213 file(APPEND ${FileName} "${file}\n")
1214 endforeach(file ${FSRCS_PACKAGE})
1215 file(APPEND ${FileName} ")\n\n")
1216 endif(${f_length} GREATER 0)
1220 file(APPEND ${FileName} "# fill list of header files from list of source files\n")
1221 file(APPEND ${FileName} "# by exchanging the file extension\n")
1223 file(APPEND ${FileName} "String(REPLACE \".cxx\" \".h\" HDRS \"\${SRCS}\")\n\n")
1224 list(LENGTH HDRS_PACKAGE _length)
1225 if(${_length} GREATER 0)
1226 file(APPEND ${FileName} "set(HDRS \${HDRS}\n")
1227 foreach(file ${HDRS_PACKAGE})
1228 file(APPEND ${FileName} "${file}\n")
1229 endforeach(file ${HDRS_PACKAGE})
1230 file(APPEND ${FileName} ")\n\n")
1231 endif(${_length} GREATER 0)
1233 list(LENGTH HDRS_PACKAGE _length)
1234 if(${_length} GREATER 0)
1235 file(APPEND ${FileName} "set(HDRS\n")
1236 foreach(file ${HDRS_PACKAGE})
1237 file(APPEND ${FileName} "${file}\n")
1238 endforeach(file ${HDRS_PACKAGE})
1239 file(APPEND ${FileName} ")\n\n")
1240 endif(${_length} GREATER 0)
1244 file(APPEND ${FileName} "Set(SRCS \${SRCS} \${CSRCS})\n\n")
1246 If(AddFortranSource)
1247 file(APPEND ${FileName} "Set(SRCS \${SRCS} \${FSRCS})\n\n")
1248 EndIf(AddFortranSource)
1250 list(LENGTH PACKFFLAGS_PACKAGE packf_length)
1251 if(${packf_length} GREATER 0)
1252 file(APPEND ${FileName} "SET_SOURCE_FILES_PROPERTIES(\n")
1253 file(APPEND ${FileName} "${FSRCS} PROPERTIES COMPILE_FLAGS\n")
1254 file(APPEND ${FileName} "${PACKFFLAGS_PACKAGE}\n")
1255 file(APPEND ${FileName} ")\n\n")
1256 endif(${packf_length} GREATER 0)
1259 file(APPEND ${FileName} "AddLibrary(${_lib} \"\${SRCS}\" \"\${HDRS}\")\n")
1262 # If package file is empty remove the CMake input file for that packge and
1263 # remove the package from the list.
1264 # If( ${cxx_length} EQUAL 0 AND ${c_length} EQUAL 0 AND ${f_length} EQUAL 0)
1265 # file(REMOVE ${FileName})
1266 # list(REMOVE_ITEM PACKAGES lib${_lib})
1267 # EndIf( ${cxx_length} EQUAL 0 AND ${c_length} EQUAL 0 AND ${f_length} EQUAL 0)
1269 EndMacro(CreateLibPackageFile path lib)
1271 Macro(CreateBinPackageFile path bin)
1273 set(FileName ${path}/CMake_${bin}.txt)
1274 STRING(REGEX REPLACE "^bin(.*)" "\\1" _bin "${bin}")
1276 file(WRITE ${FileName} "# -*- mode: cmake -*-\n\n")
1278 file(APPEND ${FileName} "set(SRCS)\n\n")
1280 list(LENGTH CXXSRCS_PACKAGE _length)
1281 if(${_length} GREATER 0)
1282 file(APPEND ${FileName} "set(SRCS\n")
1283 foreach(file ${CXXSRCS_PACKAGE})
1284 file(APPEND ${FileName} "${file}\n")
1285 endforeach(file ${CXXSRCS_PACKAGE})
1286 file(APPEND ${FileName} ")\n\n")
1287 endif(${_length} GREATER 0)
1289 list(LENGTH CSRCS_PACKAGE _length)
1290 if(${_length} GREATER 0)
1291 file(APPEND ${FileName} "set(CSRCS\n")
1292 foreach(file ${CSRCS_PACKAGE})
1293 file(APPEND ${FileName} "${file}\n")
1294 endforeach(file ${CXXSRCS_PACKAGE})
1295 file(APPEND ${FileName} ")\n\n")
1296 endif(${_length} GREATER 0)
1298 list(LENGTH ELIBS_PACKAGE _length)
1299 if(${_length} GREATER 0)
1300 file(APPEND ${FileName} "set(LIBS\n")
1301 foreach(file ${ELIBS_PACKAGE})
1302 file(APPEND ${FileName} "${file}\n")
1303 endforeach(file ${ELIBS_PACKAGE})
1304 file(APPEND ${FileName} ")\n\n")
1305 endif(${_length} GREATER 0)
1307 file(APPEND ${FileName} "AddExecutable(${_bin}exe \"\${SRCS}\" \"\${LIBS}\")\n")
1308 EndMacro(CreateBinPackageFile path bin)
1310 Macro(SpecialSettingsMadeByHand lib)
1311 If(${lib} STREQUAL libAliengui)
1312 list(REMOVE_ITEM CXXSRCS_PACKAGE Aliengui/AliAnalysisGUIdummy.cxx)
1313 EndIf(${lib} STREQUAL libAliengui)
1314 # If(${lib} STREQUAL libTPCmon)
1315 # list(REMOVE_ITEM CXXSRCS_PACKAGE AliTPCMonitorDateMonitor.cxx)
1316 # list(REMOVE_ITEM HDRS_PACKAGE AliTPCMonitorDateMonitor.h)
1317 # EndIf(${lib} STREQUAL libTPCmon)
1318 If(${lib} STREQUAL libRAWDatabase)
1319 list(APPEND HDRS_PACKAGE \${ROOT_INCLUDE_DIR}/TH1F.h)
1320 list(APPEND H_PACKAGE \${ROOT_INCLUDE_DIR}/TH1F.h)
1321 EndIf(${lib} STREQUAL libRAWDatabase)
1322 If(${lib} STREQUAL liblhapdf)
1323 # STRING(REGEX REPLACE "[=]" "\\\\=" PACKCXXFLAGS "${PACKCXXFLAGS}")
1324 # STRING(REGEX REPLACE "[$][(]ALICE_ROOT[)]" "\$ENV{ALICE_ROOT}" PACKCXXFLAGS "${PACKCXXFLAGS}")
1325 EndIf(${lib} STREQUAL liblhapdf)
1326 EndMacro(SpecialSettingsMadeByHand lib)