]> git.uio.no Git - u/mrichter/AliRoot.git/blob - cmake/FindROOT.cmake
New CMake build implementation
[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_LIBRARIES - libraries needed for the package to be used
29 # - ROOT_GLIBRARIES - regular + GUI ROOT libraries + path to be used during linking
30 # - ROOT_INCLUDE_DIR - full path to ROOT include folder
31 # - ROOT_HASALIEN - ROOT was built with AliEn support
32 # - ROOT_HASOPENGL - ROOT was built with OpenGL support
33 # - ROOT_HASXML - ROOT was built with XML support
34 # - ROOT_FORTRAN - fortran compiler
35
36 set(ROOT_FOUND FALSE)
37
38 if(ROOTSYS)
39     message(STATUS "Checking for a proper ROOT installation in ${ROOTSYS}.")
40
41     # Setting defaults
42     set(ROOT_LIBDIR ${ROOTSYS}/lib)
43     set(ROOT_INCLUDE_DIR ${ROOTSYS}/include)
44
45     # Check for root-config scripts
46     find_program(ROOT_CONFIG NAMES root-config PATHS ${ROOTSYS}/bin NO_DEFAULT_PATH)
47
48     if(NOT ROOT_CONFIG)
49         message(FATAL_ERROR "Could not find root-config script.")
50     endif(NOT ROOT_CONFIG)
51
52     # Check for rlibmap
53     find_program(ROOT_LIBMAP NAMES rlibmap PATHS ${ROOTSYS}/bin NO_DEFAULT_PATH)
54     if(ROOT_LIBMAP)
55         message(STATUS "Found ${ROOT_LIBMAP}")
56     else()
57         message(FATAL_ERROR "Could not find rlibmap executable.")
58     endif(ROOT_LIBMAP)
59
60     # Check for rootcint
61     find_program(ROOT_CINT NAMES rootcint PATHS ${ROOTSYS}/bin NO_DEFAULT_PATH)
62     if(ROOT_CINT)
63         message(STATUS "Found ${ROOT_CINT}")
64     else()
65         message(FATAL_ERROR "Could not find rootcint executable.")
66     endif(ROOT_CINT)
67
68     # Checking ROOT version
69     execute_process(COMMAND ${ROOT_CONFIG} --version OUTPUT_VARIABLE ROOT_VERSION ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
70     if(error)
71         message(FATAL_ERROR "Error retrieving ROOT version : ${error}")
72     endif(error)
73     string(STRIP ${ROOT_VERSION} ROOT_VERSION)
74
75     # Extract major, minor, and patch versions from
76     string(REGEX REPLACE "^([0-9]+)\\.[0-9][0-9]+\\/[0-9][0-9]+.*" "\\1" ROOT_VERSION_MAJOR "${ROOT_VERSION}")
77     string(REGEX REPLACE "^[0-9]+\\.([0-9][0-9])+\\/[0-9][0-9]+.*" "\\1" ROOT_VERSION_MINOR "${ROOT_VERSION}")
78     string(REGEX REPLACE "^[0-9]+\\.[0-9][0-9]+\\/([0-9][0-9]+).*" "\\1" ROOT_VERSION_PATCH "${ROOT_VERSION}")
79     message(STATUS "Found ROOT version ${ROOT_VERSION_MAJOR}.${ROOT_VERSION_MINOR}.${ROOT_VERSION_PATCH}")
80
81     # Print ROOT features
82     execute_process(COMMAND ${ROOT_CONFIG} --features OUTPUT_VARIABLE ROOT_FEATURES ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
83     if(error)
84         message(FATAL_ERROR "Error retrieving ROOT features : ${error}")
85     else()
86         message(STATUS "ROOT was build with the following features: ${ROOT_FEATURES}")
87     endif(error)
88     string(STRIP ${ROOT_FEATURES} ROOT_FEATURES)
89
90     # Checking for ROOT libdir
91     execute_process(COMMAND ${ROOT_CONFIG} --libdir OUTPUT_VARIABLE ROOT_LIBDIR ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
92     if(error)
93         message(FATAL_ERROR "Error retrieving ROOT libdir: ${error}")
94     endif(error)
95     string(STRIP ${ROOT_LIBDIR} ROOT_LIBDIR)
96
97     # Checking for ROOT libs
98     execute_process(COMMAND ${ROOT_CONFIG} --noldflags --libs OUTPUT_VARIABLE ROOT_LIBS ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
99     if(error)
100         message(FATAL_ERROR "Error retrieving ROOT libdir: ${error}")
101     endif(error)
102     string(STRIP ${ROOT_LIBS} ROOT_LIBS)
103
104     foreach(lib ${ROOT_LIBS})
105         string(REPLACE "-rdynamic" "" new_lib ${lib})
106         string(REPLACE "-l" "" lib ${new_lib})
107         set(ROOT_LIBRARIES ${ROOT_LIBRARIES} ${lib})
108     endforeach()
109     string(STRIP ${ROOT_LIBRARIES} ROOT_LIBRARIES)
110     separate_arguments(ROOT_LIBRARIES)
111
112     # Checking for ROOT incdir
113     execute_process(COMMAND ${ROOT_CONFIG} --incdir OUTPUT_VARIABLE ROOT_INCDIR ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
114     if(error)
115         message(FATAL_ERROR "Error retrieving ROOT incdir: ${error}")
116     endif(error)
117     string(STRIP ${ROOT_INCDIR} ROOT_INCDIR)
118     set(ROOT_INCLUDE_DIR ${ROOT_INCDIR})
119
120     # Checking for glibs
121     execute_process(COMMAND ${ROOT_CONFIG} --noldflags --glibs OUTPUT_VARIABLE ROOT_GLIBS ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
122     if(error)
123         message(FATAL_ERROR "Error retrieving ROOT glibs: ${error}")
124     endif(error)
125
126     # Checking for glibs
127     string(STRIP ${ROOT_GLIBS} ROOT_GLIBS)
128
129     foreach(lib ${ROOT_GLIBS})
130         string(REPLACE "-rdynamic" "" new_lib "${lib}")
131         string(REPLACE "-l" "" lib "${new_lib}")
132         set(ROOT_GLIBRARIES ${ROOT_GLIBRARIES} ${lib})
133     endforeach()
134     string(STRIP ${ROOT_GLIBRARIES} ROOT_GLIBRARIES)
135     separate_arguments(ROOT_GLIBRARIES)
136
137     # Checking for AliEn support
138     # If AliEn support is enabled we need to point to AliEn
139     execute_process(COMMAND ${ROOT_CONFIG} --has-alien OUTPUT_VARIABLE ROOT_HASALIEN ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
140     if(error)
141         message(FATAL_ERROR "Error checking if ROOT was build with AliEn support: ${error}")
142     endif(error)
143     
144     #if defined
145     if(ROOT_HASALIEN)
146         string(STRIP ${ROOT_HASALIEN} ROOT_HASALIEN)
147         if(ROOT_HASALIEN STREQUAL "yes")
148             if(ALIEN)
149                 add_definitions(-DWITHALIEN)
150                 
151                 # AliEn might bring some system libraries, we need to follow them
152                 link_directories(${ALIEN}/lib)
153                 link_directories(${ALIEN}/api/lib)
154                 
155                 # include for AliEn
156                 include_directories(${ALIEN}/include)
157                 
158                 set(ROOT_HASALIEN TRUE)
159             else(ALIEN)
160                 message(FATAL_ERROR "ROOT was build with AliEn support but no AliEn installation found. Please set \"ALIEN\" to point to your AliEn installation.")
161             endif(ALIEN)
162         else()
163             set(ROOT_HASALIEN FALSE)
164         endif()
165     endif(ROOT_HASALIEN)
166
167     # Checking for xml support
168     execute_process(COMMAND ${ROOT_CONFIG} --has-xml OUTPUT_VARIABLE ROOT_HASXML ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
169     if(error)
170         message(FATAL_ERROR "Error checking if ROOT was build with xml support: ${error}")
171     endif(error)
172     
173     # if defined
174     if(ROOT_HASXML)
175         string(STRIP ${ROOT_HASXML} ROOT_HASXML)
176         if(ROOT_HASXML STREQUAL "yes")
177             add_definitions(-DWITHXML)
178             set(ROOT_HASXML TRUE)
179         else()
180             set(ROOT_HASXML FALSE)
181         endif()
182     endif(ROOT_HASXML)
183
184     # Checking for OpenGL support
185     execute_process(COMMAND ${ROOT_CONFIG} --has-opengl OUTPUT_VARIABLE ROOT_HASOPENGL ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
186     if(error)
187         message(FATAL_ERROR "Error checking if ROOT was build with OpenGL support: ${error}")
188     endif(error)
189     
190     if(ROOT_HASOPENGL)
191         string(STRIP ${ROOT_HASOPENGL} ROOT_HASOPENGL)
192         if(ROOT_HASOPENGL STREQUAL "yes")
193             set(ROOT_HASOPENGL TRUE)
194         else()
195             set(ROOT_HASOPENGL FALSE)
196         endif()
197     endif()
198
199
200     # Checking for fortran compiler
201     execute_process(COMMAND ${ROOT_CONFIG} --f77 OUTPUT_VARIABLE ROOT_FORTRAN ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE )
202     if(error)
203         message(FATAL_ERROR "Error checking ROOT fortran compiler: ${error}")
204     endif(error)
205     string(STRIP ${ROOT_FORTRAN} ROOT_FORTRAN)
206
207     # adding the libraries and the inc dir
208     link_directories(${ROOT_LIBDIR})
209     include_directories(${ROOT_INCLUDE_DIR})
210     set(ROOT_FOUND TRUE)
211
212     # Workaround misssing XML, VMC, Minuit from ROOT static library
213     # Also adding libzma.a libfreetype.a libpcre.a
214     # To be removed where https://sft.its.cern.ch/jira/browse/ROOT-6904 issue is fixed
215     if(ALIROOT_STATIC)
216         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")
217
218         # ROOT needs xml2 but it is not build with the static version so we have to add it
219         find_package(LibXml2)
220
221         if(LIBXML2_FOUND)
222         
223             # adding SSL
224             find_package(OpenSSL)
225         
226             if(OPENSSL_FOUND)
227                 file(GLOB _extraroot "${ROOTSYS}/montercarlo/vmc/src/*.o" "${ROOTSYS}/tree/treeplayer/src/*.o" "${ROOTSYS}/io/xmlparser/src/*.o" "${ROOTSYS}/math/minuit2/src/*.o")
228                 add_library(RootExtra STATIC ${_extraroot})
229                 set_target_properties(RootExtra PROPERTIES COMPILE_FLAGS "${LIBXML2_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}")
230                 set_target_properties(RootExtra PROPERTIES LINKER_LANGUAGE CXX)
231                 target_link_libraries(RootExtra ${ROOT_LIBDIR}/libfreetype.a ${ROOT_LIBDIR}/libpcre.a ${ROOT_LIBDIR}/liblzma.a ${LIBXML2_LIBRARIES} ${OPENSSL_LIBRARIES})
232             else()
233                 message(FATAL_ERROR "OpenSSL not found. Coould not generate the static RootExtra. Please install Openssl")
234             endif()
235         else()
236             message(FATAL_ERROR "libxml2 not found. Can not generate the static RootExtra. Please install libxml2")
237         endif()
238     endif(ALIROOT_STATIC)
239 else()
240     message(FATAL_ERROR "ROOT installation not found! Please point to the ROOT installation using -DROOTSYS=ROOT_INSTALL_DIR.")
241 endif(ROOTSYS)