]> git.uio.no Git - u/mrichter/AliRoot.git/blob - cmake/FindROOT.cmake
7b7902bb87fdcc362db460023e0daac269061d8a
[u/mrichter/AliRoot.git] / cmake / FindROOT.cmake
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
16 # Checking for a proper ROOT installation based on the ROOTSYS variable
17 # received during configuration
18 # If proper root installation it is setting the following variables
19 # - ROOT_VERSION - ROOT version as reported by root-config
20 # - ROOT_VERSION_MAJOR
21 # - ROOT_VERSIOM_MINOR
22 # - ROOT_VERSION_PATCH
23 # - ROOT_CONFIG - path to root-config script
24 # - ROOT_CINT - path to rootcint executable
25 # - ROOT_LIBMAP - path to rlibmap executable
26 # - ROOT_FEATURES - list of build features for ROOT
27 # - ROOT_LIBDIR - full path to ROOT library folder
28 # - ROOT_ETCDIR - full path to the ROOT's configuration directory
29 # - ROOT_LIBRARIES - libraries needed for the package to be used
30 # - ROOT_GLIBRARIES - regular + GUI ROOT libraries + path to be used during linking
31 # - ROOT_INCLUDE_DIR - full path to ROOT include folder
32 # - ROOT_CXX_FLAGS - flags used by the C++ compiler for building ROOT
33 # - ROOT_HAS_LIBCXX - TRUE if ROOT was built against libc++ (as opposed to libstdc++)
34 # - ROOT_HAS_CXX11 - TRUE if ROOT was built with C++11 support
35 # - ROOT_HASALIEN - ROOT was built with AliEn support
36 # - ROOT_HASOPENGL - ROOT was built with OpenGL support
37 # - ROOT_HASXML - ROOT was built with XML support
38 # - ROOT_HASMONALISA - ROOT was built with MonAlisa support - needed by SHUTTLE
39 # - ROOT_FORTRAN - fortran compiler
40
41 set(ROOT_FOUND FALSE)
42
43 if(ROOTSYS)
44     message(STATUS "Checking for a proper ROOT installation in ${ROOTSYS}.")
45
46     # Setting defaults
47     set(ROOT_LIBDIR ${ROOTSYS}/lib)
48     set(ROOT_INCLUDE_DIR ${ROOTSYS}/include)
49
50     # Check for root-config scripts
51     find_program(ROOT_CONFIG NAMES root-config PATHS ${ROOTSYS}/bin NO_DEFAULT_PATH)
52
53     if(NOT ROOT_CONFIG)
54         message(FATAL_ERROR "Could not find root-config script.")
55     endif(NOT ROOT_CONFIG)
56     mark_as_advanced(ROOT_CONFIG)
57
58     # Check for rlibmap
59     find_program(ROOT_LIBMAP NAMES rlibmap rootcling PATHS ${ROOTSYS}/bin NO_DEFAULT_PATH)
60     if(ROOT_LIBMAP)
61         message(STATUS "Found ${ROOT_LIBMAP}")
62     else()
63         message(FATAL_ERROR "Could not find rlibmap executable.")
64     endif(ROOT_LIBMAP)
65     mark_as_advanced(ROOT_LIBMAP)
66
67     # Check for rootcint
68     find_program(ROOT_CINT NAMES rootcint PATHS ${ROOTSYS}/bin NO_DEFAULT_PATH)
69     if(ROOT_CINT)
70         message(STATUS "Found ${ROOT_CINT}")
71     else()
72         message(FATAL_ERROR "Could not find rootcint executable.")
73     endif(ROOT_CINT)
74     mark_as_advanced(ROOT_CINT)
75
76     # Checking ROOT version
77     execute_process(COMMAND ${ROOT_CONFIG} --version OUTPUT_VARIABLE ROOT_VERSION ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
78     if(error)
79         message(FATAL_ERROR "Error retrieving ROOT version : ${error}")
80     endif(error)
81     string(STRIP "${ROOT_VERSION}" ROOT_VERSION)
82
83     # Extract major, minor, and patch versions from
84     string(REGEX REPLACE "^([0-9]+)\\.[0-9][0-9]+\\/[0-9][0-9]+.*" "\\1" ROOT_VERSION_MAJOR "${ROOT_VERSION}")
85     string(REGEX REPLACE "^[0-9]+\\.([0-9][0-9])+\\/[0-9][0-9]+.*" "\\1" ROOT_VERSION_MINOR "${ROOT_VERSION}")
86     string(REGEX REPLACE "^[0-9]+\\.[0-9][0-9]+\\/([0-9][0-9]+).*" "\\1" ROOT_VERSION_PATCH "${ROOT_VERSION}")
87     message(STATUS "Found ROOT version ${ROOT_VERSION_MAJOR}.${ROOT_VERSION_MINOR}.${ROOT_VERSION_PATCH}")
88
89     # Print ROOT features
90     execute_process(COMMAND ${ROOT_CONFIG} --features OUTPUT_VARIABLE ROOT_FEATURES ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
91     if(error)
92         message(FATAL_ERROR "Error retrieving ROOT features : ${error}")
93     else()
94         message(STATUS "ROOT was built with the following features: ${ROOT_FEATURES}")
95     endif(error)
96     string(STRIP "${ROOT_FEATURES}" ROOT_FEATURES)
97
98     # Checking for ROOT libdir
99     execute_process(COMMAND ${ROOT_CONFIG} --libdir OUTPUT_VARIABLE ROOT_LIBDIR ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
100     if(error)
101         message(FATAL_ERROR "Error retrieving ROOT libdir: ${error}")
102     endif(error)
103     string(STRIP "${ROOT_LIBDIR}" ROOT_LIBDIR)
104
105     # Checking for ROOT etcdir
106     execute_process(COMMAND ${ROOT_CONFIG} --etcdir OUTPUT_VARIABLE ROOT_ETCDIR ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE)
107     if(error)
108         message(FATAL_ERROR "Error retrieving ROOT etcdir: ${error}")
109     endif(error)
110     string(STRIP "${ROOT_ETCDIR}" ROOT_ETCDIR)
111
112     # Checking for ROOT libs
113     execute_process(COMMAND ${ROOT_CONFIG} --noldflags --libs OUTPUT_VARIABLE ROOT_LIBS ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
114     if(error)
115         message(FATAL_ERROR "Error retrieving ROOT libdir: ${error}")
116     endif(error)
117     string(STRIP "${ROOT_LIBS}" ROOT_LIBS)
118
119     foreach(lib ${ROOT_LIBS})
120         string(REPLACE "-rdynamic" "" new_lib ${lib})
121         string(REPLACE "-l" "" lib ${new_lib})
122         set(ROOT_LIBRARIES ${ROOT_LIBRARIES} ${lib})
123     endforeach()
124     string(STRIP "${ROOT_LIBRARIES}" ROOT_LIBRARIES)
125     separate_arguments(ROOT_LIBRARIES)
126
127     # Checking for ROOT incdir
128     execute_process(COMMAND ${ROOT_CONFIG} --incdir OUTPUT_VARIABLE ROOT_INCDIR ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
129     if(error)
130         message(FATAL_ERROR "Error retrieving ROOT incdir: ${error}")
131     endif(error)
132     string(STRIP "${ROOT_INCDIR}" ROOT_INCDIR)
133     set(ROOT_INCLUDE_DIR ${ROOT_INCDIR})
134
135     # Setting ROOT compiler flags (except the -I parts) to a variable
136     execute_process(COMMAND ${ROOT_CONFIG} --auxcflags OUTPUT_VARIABLE _ROOT_CXX_FLAGS ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE)
137     if(error)
138         message(FATAL_ERROR "Error retrieving ROOT compiler flags: ${error}")
139     endif(error)
140     string(STRIP "${_ROOT_CXX_FLAGS}" ROOT_CXX_FLAGS)
141
142     # Check if ROOT was built with libc++ (as opposed to stdlibc++)
143     if(ROOT_CXX_FLAGS MATCHES "-stdlib=libc\\+\\+")
144         set(ROOT_HAS_LIBCXX TRUE)
145     else()
146         set(ROOT_HAS_LIBCXX FALSE)
147     endif()
148
149     # Check if ROOT was built with C++11 support
150     if(ROOT_CXX_FLAGS MATCHES "-std=c\\+\\+11")
151         message(STATUS "ROOT was built with C++11 support")
152         set(ROOT_HAS_CXX11 TRUE)
153     else()
154         set(ROOT_HAS_CXX11 FALSE)
155     endif()
156
157     # Checking for glibs
158     execute_process(COMMAND ${ROOT_CONFIG} --noldflags --glibs OUTPUT_VARIABLE ROOT_GLIBS ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
159     if(error)
160         message(FATAL_ERROR "Error retrieving ROOT glibs: ${error}")
161     endif(error)
162
163     # Checking for glibs
164     string(STRIP "${ROOT_GLIBS}" ROOT_GLIBS)
165
166     foreach(lib ${ROOT_GLIBS})
167         string(REPLACE "-rdynamic" "" new_lib "${lib}")
168         string(REPLACE "-l" "" lib "${new_lib}")
169         set(ROOT_GLIBRARIES ${ROOT_GLIBRARIES} ${lib})
170     endforeach()
171     string(STRIP "${ROOT_GLIBRARIES}" ROOT_GLIBRARIES)
172     separate_arguments(ROOT_GLIBRARIES)
173
174     # Checking for AliEn support
175     # If AliEn support is enabled we need to point to AliEn
176     execute_process(COMMAND ${ROOT_CONFIG} --has-alien OUTPUT_VARIABLE ROOT_HASALIEN ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
177     if(error)
178         message(FATAL_ERROR "Error checking if ROOT was built with AliEn support: ${error}")
179     endif(error)
180     
181     #if defined
182     if(ROOT_HASALIEN)
183         string(STRIP "${ROOT_HASALIEN}" ROOT_HASALIEN)
184         if(ROOT_HASALIEN STREQUAL "yes")
185             if(ALIEN)
186             add_definitions(-DWITHALIEN)
187
188             # AliEn might bring some system libraries, we need to use them
189             if(EXISTS "${ALIEN}/lib")
190                 link_directories(${ALIEN}/lib)
191             endif()
192
193             # api/lib should always exists
194             if(EXISTS "${ALIEN}/api/lib")
195                 link_directories(${ALIEN}/api/lib)
196             endif()
197
198             # include for AliEn
199             if(EXISTS "${ALIEN}/include")
200                 include_directories(SYSTEM ${ALIEN}/include)
201             endif()
202
203             # api/include always exists
204             if(EXISTS "${ALIEN}/api/include")
205                 include_directories(SYSTEM ${ALIEN}/api/include)
206             endif()
207
208             set(ROOT_HASALIEN TRUE)
209             else(ALIEN)
210             message(FATAL_ERROR "ROOT was built with AliEn support but no AliEn installation found. Please set \"ALIEN\" to point to your AliEn installation.")
211             endif(ALIEN)
212         else()
213             set(ROOT_HASALIEN FALSE)
214         endif()
215     endif(ROOT_HASALIEN)
216
217     # Checking for xml support
218     execute_process(COMMAND ${ROOT_CONFIG} --has-xml OUTPUT_VARIABLE ROOT_HASXML ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
219     if(error)
220         message(FATAL_ERROR "Error checking if ROOT was built with xml support: ${error}")
221     endif(error)
222     
223     # if defined
224     if(ROOT_HASXML)
225         string(STRIP "${ROOT_HASXML}" ROOT_HASXML)
226         if(ROOT_HASXML STREQUAL "yes")
227             add_definitions(-DWITHXML)
228             set(ROOT_HASXML TRUE)
229         else()
230             set(ROOT_HASXML FALSE)
231         endif()
232     endif(ROOT_HASXML)
233
234     # Checking for monalisa support
235     execute_process(COMMAND ${ROOT_CONFIG} --has-monalisa OUTPUT_VARIABLE ROOT_HASMONALISA ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
236     if(error)
237         message(FATAL_ERROR "Error checking if ROOT was built with monalisa support: ${error}")
238     endif(error)
239     
240     # if defined
241     if(ROOT_HASMONALISA)
242         string(STRIP "${ROOT_HASMONALISA}" ROOT_HASMONALISA)
243         if(ROOT_HASMONALISA STREQUAL "yes")
244             set(ROOT_HASMONALISA TRUE)
245         else()
246             set(ROOT_HASMONALISA FALSE)
247         endif()
248     endif(ROOT_HASMONALISA)
249
250     # Checking for OpenGL support
251     execute_process(COMMAND ${ROOT_CONFIG} --has-opengl OUTPUT_VARIABLE ROOT_HASOPENGL ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
252     if(error)
253         message(FATAL_ERROR "Error checking if ROOT was built with OpenGL support: ${error}")
254     endif(error)
255     
256     if(ROOT_HASOPENGL)
257         string(STRIP "${ROOT_HASOPENGL}" ROOT_HASOPENGL)
258         if(ROOT_HASOPENGL STREQUAL "yes")
259             set(ROOT_HASOPENGL TRUE)
260         else()
261             set(ROOT_HASOPENGL FALSE)
262         endif()
263     endif()
264
265     # Checking for fortran compiler
266     execute_process(COMMAND ${ROOT_CONFIG} --f77 OUTPUT_VARIABLE ROOT_FORTRAN ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
267     if(error)
268         message(FATAL_ERROR "Error checking ROOT fortran compiler: ${error}")
269     endif(error)
270     string(STRIP "${ROOT_FORTRAN}" ROOT_FORTRAN)
271
272     # adding the libraries and the inc dir
273     link_directories(${ROOT_LIBDIR})
274 #    include_directories(SYSTEM ${ROOT_INCLUDE_DIR})
275     set(ROOT_FOUND TRUE)
276
277     # Workaround misssing XML, VMC, Minuit from ROOT static library
278     # Also adding libzma.a libfreetype.a libpcre.a
279     # To be removed where https://sft.its.cern.ch/jira/browse/ROOT-6904 issue is fixed
280     if(ALIROOT_STATIC)
281         message(WARNING "AliRoot static build enabled! libRootExtra.a will be created.\nPlease remove when ROOT https://sft.its.cern.ch/jira/browse/ROOT-6904 issue is fixed")
282
283         # ROOT needs xml2 but it is not built with the static version so we have to add it
284         find_package(LibXml2)
285
286         if(LIBXML2_FOUND)
287         
288             # adding SSL
289             find_package(OpenSSL)
290         
291             if(OPENSSL_FOUND)
292                 file(GLOB _extraroot "${ROOTSYS}/montercarlo/vmc/src/*.o" "${ROOTSYS}/tree/treeplayer/src/*.o" "${ROOTSYS}/io/xmlparser/src/*.o" "${ROOTSYS}/math/minuit2/src/*.o")
293                 add_library(RootExtra STATIC ${_extraroot})
294                 set_target_properties(RootExtra PROPERTIES COMPILE_FLAGS "${LIBXML2_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}")
295                 set_target_properties(RootExtra PROPERTIES LINKER_LANGUAGE CXX)
296                 target_link_libraries(RootExtra ${ROOT_LIBDIR}/libfreetype.a ${ROOT_LIBDIR}/libpcre.a ${ROOT_LIBDIR}/liblzma.a ${LIBXML2_LIBRARIES} ${OPENSSL_LIBRARIES})
297             else()
298                 message(FATAL_ERROR "OpenSSL not found. Coould not generate the static RootExtra. Please install Openssl")
299             endif()
300         else()
301             message(FATAL_ERROR "libxml2 not found. Can not generate the static RootExtra. Please install libxml2")
302         endif()
303     endif(ALIROOT_STATIC)
304 else()
305     message(FATAL_ERROR "ROOT installation not found! Please point to the ROOT installation using -DROOTSYS=ROOT_INSTALL_DIR.")
306 endif(ROOTSYS)