1 |
pam-ts |
1.1 |
# - Finds ROOT instalation |
2 |
|
|
# This module sets up ROOT information |
3 |
|
|
# It defines: |
4 |
|
|
# ROOT_FOUND If the ROOT is found |
5 |
|
|
# ROOT_INCLUDE_DIR PATH to the include directory |
6 |
|
|
# ROOT_LIBRARIES Most common libraries |
7 |
|
|
# ROOT_LIBRARY_DIR PATH to the library directory |
8 |
|
|
# |
9 |
|
|
# Updated by K. Smith (ksmith37@nd.edu) to properly handle |
10 |
|
|
# dependncies in ROOT_GENERATE_DICTIONARY |
11 |
|
|
|
12 |
|
|
if("$ENV{ROOTSYS}" STREQUAL "") |
13 |
|
|
message(WARNING "The ROOTSYS environment variable is not defined") |
14 |
|
|
endif() |
15 |
|
|
|
16 |
|
|
find_program(ROOT_CONFIG_EXECUTABLE root-config |
17 |
|
|
PATHS $ENV{ROOTSYS}/bin) |
18 |
|
|
|
19 |
|
|
if(NOT ROOT_CONFIG_EXECUTABLE) |
20 |
|
|
set(ROOT_FOUND FALSE) |
21 |
|
|
else() |
22 |
|
|
set(ROOT_FOUND TRUE) |
23 |
|
|
|
24 |
|
|
execute_process( |
25 |
|
|
COMMAND ${ROOT_CONFIG_EXECUTABLE} --prefix |
26 |
|
|
OUTPUT_VARIABLE ROOTSYS |
27 |
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
28 |
|
|
|
29 |
|
|
execute_process( |
30 |
|
|
COMMAND ${ROOT_CONFIG_EXECUTABLE} --version |
31 |
|
|
OUTPUT_VARIABLE ROOT_VERSION |
32 |
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
33 |
|
|
string(REGEX REPLACE "/" "." ROOT_VERSION "${ROOT_VERSION}") |
34 |
|
|
|
35 |
|
|
execute_process( |
36 |
|
|
COMMAND ${ROOT_CONFIG_EXECUTABLE} --incdir |
37 |
|
|
OUTPUT_VARIABLE ROOT_INCLUDE_DIR |
38 |
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
39 |
|
|
|
40 |
|
|
execute_process( |
41 |
|
|
COMMAND ${ROOT_CONFIG_EXECUTABLE} --libs |
42 |
|
|
OUTPUT_VARIABLE ROOT_LIBRARIES |
43 |
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
44 |
|
|
|
45 |
|
|
# Extract library dir from ROOT_LIBRARIES |
46 |
|
|
string(REGEX REPLACE " " ";" ROOT_LIBRARY_LIST ${ROOT_LIBRARIES}) |
47 |
|
|
list(GET ROOT_LIBRARY_LIST 0 ROOT_LIBRARY_DIR) |
48 |
|
|
string(REGEX REPLACE "-L" "" ROOT_LIBRARY_DIR ${ROOT_LIBRARY_DIR}) |
49 |
|
|
|
50 |
|
|
endif() |
51 |
|
|
|
52 |
|
|
include(FindPackageHandleStandardArgs) |
53 |
|
|
find_package_handle_standard_args(ROOT REQUIRED_VARS ROOT_CONFIG_EXECUTABLE |
54 |
|
|
ROOTSYS ROOT_VERSION ROOT_INCLUDE_DIR ROOT_LIBRARIES ROOT_LIBRARY_DIR |
55 |
|
|
VERSION_VAR ROOT_VERSION) |
56 |
|
|
|
57 |
|
|
mark_as_advanced(ROOT_CONFIG_EXECUTABLE) |
58 |
|
|
|
59 |
|
|
include(CMakeParseArguments) |
60 |
|
|
find_program(ROOTCINT_EXECUTABLE rootcint PATHS $ENV{ROOTSYS}/bin) |
61 |
|
|
find_program(GENREFLEX_EXECUTABLE genreflex PATHS $ENV{ROOTSYS}/bin) |
62 |
|
|
find_package(GCCXML) |
63 |
|
|
|
64 |
|
|
#---------------------------------------------------------------------------- |
65 |
|
|
# function ROOT_GENERATE_DICTIONARY( dictionary |
66 |
|
|
# header1 header2 ... |
67 |
|
|
# LINKDEF linkdef1 ... |
68 |
|
|
# OPTIONS opt1...) |
69 |
|
|
function(ROOT_GENERATE_DICTIONARY dictionary) |
70 |
|
|
CMAKE_PARSE_ARGUMENTS(ARG "" "" "LINKDEF;OPTIONS" "" ${ARGN}) |
71 |
|
|
#---Get the list of include directories------------------ |
72 |
|
|
get_directory_property(incdirs INCLUDE_DIRECTORIES) |
73 |
|
|
set(includedirs) |
74 |
|
|
foreach( d ${incdirs}) |
75 |
|
|
set(includedirs ${includedirs} -I${d}) |
76 |
|
|
endforeach() |
77 |
|
|
#---Get the list of header files------------------------- |
78 |
|
|
set(headerfiles) |
79 |
|
|
foreach(fp ${ARG_UNPARSED_ARGUMENTS}) |
80 |
|
|
if(${fp} MATCHES "[*?]") # Is this header a globbing expression? |
81 |
|
|
file(GLOB files ${fp}) |
82 |
|
|
foreach(f ${files}) |
83 |
|
|
if(NOT f MATCHES LinkDef) # skip LinkDefs from globbing result |
84 |
|
|
set(headerfiles ${headerfiles} ${f}) |
85 |
|
|
endif() |
86 |
|
|
endforeach() |
87 |
|
|
else() |
88 |
|
|
find_file(headerFile ${fp} PATHS ${incdirs}) |
89 |
|
|
set(headerfiles ${headerfiles} ${headerFile}) |
90 |
|
|
unset(headerFile CACHE) |
91 |
|
|
endif() |
92 |
|
|
endforeach() |
93 |
|
|
#---Get LinkDef.h file------------------------------------ |
94 |
|
|
set(linkdefs) |
95 |
|
|
foreach( f ${ARG_LINKDEF}) |
96 |
|
|
find_file(linkFile ${f} PATHS ${incdirs}) |
97 |
|
|
set(linkdefs ${linkdefs} ${linkFile}) |
98 |
|
|
unset(linkFile CACHE) |
99 |
|
|
endforeach() |
100 |
|
|
#---call rootcint------------------------------------------ |
101 |
|
|
add_custom_command(OUTPUT ${dictionary}.cxx ${dictionary}.h |
102 |
|
|
COMMAND ${ROOTCINT_EXECUTABLE} -cint -f ${dictionary}.cxx |
103 |
|
|
-c ${ARG_OPTIONS} ${includedirs} ${headerfiles} ${linkdefs} |
104 |
|
|
DEPENDS ${headerfiles} ${linkdefs} VERBATIM) |
105 |
|
|
endfunction() |
106 |
|
|
|
107 |
|
|
#---------------------------------------------------------------------------- |
108 |
|
|
# function REFLEX_GENERATE_DICTIONARY(dictionary |
109 |
|
|
# header1 header2 ... |
110 |
|
|
# SELECTION selectionfile ... |
111 |
|
|
# OPTIONS opt1...) |
112 |
|
|
function(REFLEX_GENERATE_DICTIONARY dictionary) |
113 |
|
|
CMAKE_PARSE_ARGUMENTS(ARG "" "" "SELECTION;OPTIONS" "" ${ARGN}) |
114 |
|
|
#---Get the list of header files------------------------- |
115 |
|
|
set(headerfiles) |
116 |
|
|
foreach(fp ${ARG_UNPARSED_ARGUMENTS}) |
117 |
|
|
file(GLOB files ${fp}) |
118 |
|
|
if(files) |
119 |
|
|
foreach(f ${files}) |
120 |
|
|
set(headerfiles ${headerfiles} ${f}) |
121 |
|
|
endforeach() |
122 |
|
|
else() |
123 |
|
|
set(headerfiles ${headerfiles} ${fp}) |
124 |
|
|
endif() |
125 |
|
|
endforeach() |
126 |
|
|
#---Get Selection file------------------------------------ |
127 |
|
|
if(IS_ABSOLUTE ${ARG_SELECTION}) |
128 |
|
|
set(selectionfile ${ARG_SELECTION}) |
129 |
|
|
else() |
130 |
|
|
set(selectionfile ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_SELECTION}) |
131 |
|
|
endif() |
132 |
|
|
#---Get the list of include directories------------------ |
133 |
|
|
get_directory_property(incdirs INCLUDE_DIRECTORIES) |
134 |
|
|
set(includedirs) |
135 |
|
|
foreach( d ${incdirs}) |
136 |
|
|
set(includedirs ${includedirs} -I${d}) |
137 |
|
|
endforeach() |
138 |
|
|
#---Get preprocessor definitions-------------------------- |
139 |
|
|
get_directory_property(defs COMPILE_DEFINITIONS) |
140 |
|
|
foreach( d ${defs}) |
141 |
|
|
set(definitions ${definitions} -D${d}) |
142 |
|
|
endforeach() |
143 |
|
|
#---Nanes and others--------------------------------------- |
144 |
|
|
set(gensrcdict ${dictionary}.cpp) |
145 |
|
|
if(MSVC) |
146 |
|
|
set(gccxmlopts "--gccxmlopt=\"--gccxml-compiler cl\"") |
147 |
|
|
else() |
148 |
|
|
#set(gccxmlopts "--gccxmlopt=\'--gccxml-cxxflags -m64 \'") |
149 |
|
|
set(gccxmlopts) |
150 |
|
|
endif() |
151 |
|
|
#set(rootmapname ${dictionary}Dict.rootmap) |
152 |
|
|
#set(rootmapopts --rootmap=${rootmapname} --rootmap-lib=${libprefix}${dictionary}Dict) |
153 |
|
|
#---Check GCCXML and get path----------------------------- |
154 |
|
|
if(GCCXML) |
155 |
|
|
get_filename_component(gccxmlpath ${GCCXML} PATH) |
156 |
|
|
else() |
157 |
|
|
message(WARNING "GCCXML not found. Install and setup your environment to find 'gccxml' executable") |
158 |
|
|
endif() |
159 |
|
|
#---Actual command---------------------------------------- |
160 |
|
|
add_custom_command(OUTPUT ${gensrcdict} ${rootmapname} |
161 |
|
|
COMMAND ${GENREFLEX_EXECUTABLE} ${headerfiles} -o ${gensrcdict} ${gccxmlopts} ${rootmapopts} --select=${selectionfile} |
162 |
|
|
--gccxmlpath=${gccxmlpath} ${ARG_OPTIONS} ${includedirs} ${definitions} |
163 |
|
|
DEPENDS ${headerfiles} ${selectionfile}) |
164 |
|
|
endfunction() |
165 |
|
|
|