Backported #6865: Disable websockets command line option
[platform/upstream/freerdp.git] / cmake / FindGSSAPI.cmake
1 # - Try to find the GSS Kerberos libraries
2 # Once done this will define
3 #
4 #  GSS_ROOT_DIR - Set this variable to the root installation of GSS
5 #  GSS_ROOT_FLAVOUR - Set this variable to the flavour of Kerberos installation (MIT or Heimdal)
6 #
7 # Read-Only variables:
8 #  GSS_FOUND - system has the Heimdal library
9 #  GSS_FLAVOUR - "MIT" or "Heimdal" if anything found.
10 #  GSS_INCLUDE_DIR - the Heimdal include directory
11 #  GSS_LIBRARIES - The libraries needed to use GSS
12 #  GSS_LINK_DIRECTORIES - Directories to add to linker search path
13 #  GSS_LINKER_FLAGS - Additional linker flags
14 #  GSS_COMPILER_FLAGS - Additional compiler flags
15 #  GSS_VERSION - This is set to version advertised by pkg-config or read from manifest.
16 #                In case the library is found but no version info availabe it'll be set to "unknown"
17
18 set(_MIT_MODNAME mit-krb5-gssapi)
19 set(_HEIMDAL_MODNAME heimdal-gssapi)
20
21 include(CheckIncludeFile)
22 include(CheckIncludeFiles)
23 include(CheckTypeSize)
24
25 # export GSS_ROOT_FLAVOUR to use pkg-config system under UNIX
26 if(UNIX)
27   if(NOT "$ENV{GSS_ROOT_FLAVOUR} " STREQUAL " ")
28     string(REGEX MATCH "^[M|m]it$" MIT_FLAVOUR "$ENV{GSS_ROOT_FLAVOUR}")
29     if(NOT MIT_FLAVOUR)
30       string(REGEX MATCH "^MIT$" MIT_FLAVOUR "$ENV{GSS_ROOT_FLAVOUR}")
31     endif()
32     string(REGEX MATCH "^[H|h]eimdal$" HEIMDAL_FLAVOUR "$ENV{GSS_ROOT_FLAVOUR}")
33     if(NOT HEIMDAL_FLAVOUR)
34       string(REGEX MATCH "^HEIMDAL$" HEIMDAL_FLAVOUR "$ENV{GSS_ROOT_FLAVOUR}")
35     endif()
36     if(MIT_FLAVOUR)
37       set(GSS_FLAVOUR "MIT")
38     elseif(HEIMDAL_FLAVOUR)
39       set(GSS_FLAVOUR "Heimdal")
40     else()
41       message(SEND_ERROR "Kerberos flavour unknown ($ENV{GSS_ROOT_FLAVOUR}). Choose MIT or Heimdal.")
42     endif()
43   endif()
44 endif()
45
46 set(_GSS_ROOT_HINTS
47     "${GSS_ROOT_DIR}"
48     "$ENV{GSS_ROOT_DIR}"
49 )
50
51 # try to find library using system pkg-config if user did not specify root dir
52 if(UNIX)
53   if("$ENV{GSS_ROOT_DIR} " STREQUAL " ")
54     if(GSS_FLAVOUR)
55       find_package(PkgConfig QUIET)
56       if(GSS_FLAVOUR STREQUAL "MIT")
57         pkg_search_module(_GSS_PKG ${_MIT_MODNAME})
58       else()
59         pkg_search_module(_GSS_PKG ${_HEIMDAL_MODNAME})
60       endif()
61
62       if("${_GSS_PKG_PREFIX} " STREQUAL " ")
63         if(NOT "$ENV{PKG_CONFIG_PATH} " STREQUAL " ")
64           list(APPEND _GSS_ROOT_HINTS "$ENV{PKG_CONFIG_PATH}")
65         else()
66           message(SEND_ERROR "pkg_search_module failed : try to set PKG_CONFIG_PATH to PREFIX_OF_KERBEROS/lib/pkgconfig")
67         endif()
68       else()
69         if($ENV{GSS_ROOT_FLAVOUR} STREQUAL "Heimdal")
70           string(FIND "${_GSS_PKG_PREFIX}" "heimdal" PKG_HEIMDAL_PREFIX_POSITION)
71           if(PKG_HEIMDAL_PREFIX_POSITION STREQUAL "-1")
72             message(WARNING "Try to set PKG_CONFIG_PATH to \"PREFIX_OF_KERBEROS/lib/pkgconfig\"")
73           else()
74             list(APPEND _GSS_ROOT_HINTS "${_GSS_PKG_PREFIX}")
75           endif()
76         else()
77           list(APPEND _GSS_ROOT_HINTS "${_GSS_PKG_PREFIX}")
78         endif()
79       endif()
80     else()
81       message(WARNING "export GSS_ROOT_FLAVOUR to use pkg-config")
82     endif()
83   endif()
84 elseif(WIN32)
85   list(APPEND _GSS_ROOT_HINTS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos;InstallDir]")
86 endif()
87
88 if(NOT GSS_FOUND) # not found by pkg-config. Let's take more traditional approach.
89   find_file(_GSS_CONFIGURE_SCRIPT
90       NAMES
91           "krb5-config"
92       HINTS
93           ${_GSS_ROOT_HINTS}
94       PATH_SUFFIXES
95           bin
96       NO_CMAKE_PATH
97       NO_CMAKE_ENVIRONMENT_PATH
98   )
99
100   # if not found in user-supplied directories, maybe system knows better
101   find_file(_GSS_CONFIGURE_SCRIPT
102       NAMES
103           "krb5-config"
104       PATH_SUFFIXES
105           bin
106   )
107
108   execute_process(
109        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
110        OUTPUT_VARIABLE _GSS_VENDOR
111        RESULT_VARIABLE _GSS_CONFIGURE_FAILED
112   )
113
114   if(NOT _GSS_CONFIGURE_FAILED)
115     string(STRIP "${_GSS_VENDOR}" _GSS_VENDOR)
116     if((GSS_FLAVOUR STREQUAL "Heimdal" AND NOT _GSS_VENDOR STREQUAL "Heimdal")
117        OR (GSS_FLAVOUR STREQUAL "MIT" AND NOT _GSS_VENDOR STREQUAL "Massachusetts Institute of Technology"))
118       message(SEND_ERROR "GSS vendor and GSS flavour are not matching : _GSS_VENDOR=${_GSS_VENDOR} ; GSS_FLAVOUR=${GSS_FLAVOUR}")
119       message(STATUS "Try to set the path to GSS root folder in the system variable GSS_ROOT_DIR")
120     endif()
121   else()
122     message(SEND_ERROR "GSS configure script failed to get vendor")
123   endif()
124
125   # NOTE: fail to link Heimdal libraries using configure script due to limitations
126   # during Heimdal linking process. Then, we do it "manually".
127   if(NOT "${_GSS_CONFIGURE_SCRIPT} " STREQUAL " " AND GSS_FLAVOUR AND NOT _GSS_VENDOR STREQUAL "Heimdal")
128     execute_process(
129           COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
130           OUTPUT_VARIABLE _GSS_CFLAGS
131           RESULT_VARIABLE _GSS_CONFIGURE_FAILED
132     )
133
134     if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
135       # should also work in an odd case when multiple directories are given
136       string(STRIP "${_GSS_CFLAGS}" _GSS_CFLAGS)
137       string(REGEX REPLACE " +-I" ";" _GSS_CFLAGS "${_GSS_CFLAGS}")
138       string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1" _GSS_CFLAGS "${_GSS_CFLAGS}")
139
140       foreach(_flag ${_GSS_CFLAGS})
141         if(_flag MATCHES "^-I.*")
142           string(REGEX REPLACE "^-I" "" _val "${_flag}")
143           list(APPEND _GSS_INCLUDE_DIR "${_val}")
144         else()
145           list(APPEND _GSS_COMPILER_FLAGS "${_flag}")
146         endif()
147       endforeach()
148     endif()
149
150     if(_GSS_VENDOR STREQUAL "Massachusetts Institute of Technology")
151       execute_process(
152             COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
153             OUTPUT_VARIABLE _GSS_LIB_FLAGS
154             RESULT_VARIABLE _GSS_CONFIGURE_FAILED
155       )
156     elseif(_GSS_VENDOR STREQUAL "Heimdal")
157       execute_process(
158             COMMAND ${_GSS_CONFIGURE_SCRIPT} "--deps --libs" "gssapi kafs"
159             OUTPUT_VARIABLE _GSS_LIB_FLAGS
160             RESULT_VARIABLE _GSS_CONFIGURE_FAILED
161       )
162     else()
163       message(SEND_ERROR "Unknown vendor")
164     endif()
165
166     if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
167       # this script gives us libraries and link directories. We have to deal with it.
168       string(STRIP "${_GSS_LIB_FLAGS}" _GSS_LIB_FLAGS)
169       string(REGEX REPLACE " +-(L|l)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
170       string(REGEX REPLACE " +-([^Ll][^ \\t;]*)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
171
172       foreach(_flag ${_GSS_LIB_FLAGS})
173         if(_flag MATCHES "^-l.*")
174           string(REGEX REPLACE "^-l" "" _val "${_flag}")
175           list(APPEND _GSS_LIBRARIES "${_val}")
176         elseif(_flag MATCHES "^-L.*")
177           string(REGEX REPLACE "^-L" "" _val "${_flag}")
178           list(APPEND _GSS_LINK_DIRECTORIES "${_val}")
179         else()
180           list(APPEND _GSS_LINKER_FLAGS "${_flag}")
181         endif()
182       endforeach()
183
184     endif()
185
186     execute_process(
187           COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
188           OUTPUT_VARIABLE _GSS_VERSION
189           RESULT_VARIABLE _GSS_CONFIGURE_FAILED
190     )
191
192     # older versions may not have the "--version" parameter. In this case we just don't care.
193     if(_GSS_CONFIGURE_FAILED)
194       set(_GSS_VERSION 0)
195     endif()
196
197   else() # either there is no config script or we are on platform that doesn't provide one (Windows?)
198     if(_GSS_VENDOR STREQUAL "Massachusetts Institute of Technology")
199       find_path(_GSS_INCLUDE_DIR
200                NAMES
201                    "gssapi/gssapi_generic.h"
202                HINTS
203                    ${_GSS_ROOT_HINTS}
204                PATH_SUFFIXES
205                    include
206                    inc
207       )
208
209       if(_GSS_INCLUDE_DIR) # we've found something
210         set(CMAKE_REQUIRED_INCLUDES "${_GSS_INCLUDE_DIR}")
211         check_include_files( "gssapi/gssapi_generic.h;gssapi/gssapi_ext.h" _GSS_HAVE_MIT_HEADERS)
212         if(_GSS_HAVE_MIT_HEADERS)
213           set(GSS_FLAVOUR "MIT")
214         else()
215           message(SEND_ERROR "Try to set the Kerberos flavour (GSS_ROOT_FLAVOUR)")
216         endif()
217       elseif("$ENV{PKG_CONFIG_PATH} " STREQUAL " ")
218         message(WARNING "Try to set PKG_CONFIG_PATH to PREFIX_OF_KERBEROS/lib/pkgconfig")
219       endif()
220     elseif(_GSS_VENDOR STREQUAL "Heimdal")
221       find_path(_GSS_INCLUDE_DIR
222                NAMES
223                    "gssapi/gssapi_spnego.h"
224                HINTS
225                    ${_GSS_ROOT_HINTS}
226                PATHS
227                    /usr/heimdal
228                    /usr/local/heimdal
229                PATH_SUFFIXES
230                    include
231                    inc
232       )
233
234       if(_GSS_INCLUDE_DIR) # we've found something
235         set(CMAKE_REQUIRED_INCLUDES "${_GSS_INCLUDE_DIR}")
236         # prevent compiling the header - just check if we can include it
237         set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D__ROKEN_H__")
238         check_include_file( "roken.h" _GSS_HAVE_ROKEN_H)
239         check_include_file( "heimdal/roken.h" _GSS_HAVE_HEIMDAL_ROKEN_H)
240         if(_GSS_HAVE_ROKEN_H OR _GSS_HAVE_HEIMDAL_ROKEN_H)
241           set(GSS_FLAVOUR "Heimdal")
242         endif()
243         set(CMAKE_REQUIRED_DEFINITIONS "")
244       elseif("$ENV{PKG_CONFIG_PATH} " STREQUAL " ")
245         message(WARNING "Try to set PKG_CONFIG_PATH to PREFIX_OF_KERBEROS/lib/pkgconfig")
246       endif()
247     else()
248       message(SEND_ERROR "Kerberos vendor unknown (${_GSS_VENDOR})")
249     endif()
250
251     # if we have headers, check if we can link libraries
252     if(GSS_FLAVOUR)
253       set(_GSS_LIBDIR_SUFFIXES "")
254       set(_GSS_LIBDIR_HINTS ${_GSS_ROOT_HINTS})
255       get_filename_component(_GSS_CALCULATED_POTENTIAL_ROOT "${_GSS_INCLUDE_DIR}" PATH)
256       list(APPEND _GSS_LIBDIR_HINTS ${_GSS_CALCULATED_POTENTIAL_ROOT})
257
258       if(WIN32)
259         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
260           list(APPEND _GSS_LIBDIR_SUFFIXES "lib/AMD64")
261           if(GSS_FLAVOUR STREQUAL "MIT")
262             set(_GSS_LIBNAME "gssapi64")
263           else()
264             set(_GSS_LIBNAME "libgssapi")
265           endif()
266         else()
267           list(APPEND _GSS_LIBDIR_SUFFIXES "lib/i386")
268           if(GSS_FLAVOUR STREQUAL "MIT")
269             set(_GSS_LIBNAME "gssapi32")
270           else()
271             set(_GSS_LIBNAME "libgssapi")
272           endif()
273         endif()
274       else()
275         list(APPEND _GSS_LIBDIR_SUFFIXES "lib;lib64;x86_64-linux-gnu") # those suffixes are not checked for HINTS
276         if(GSS_FLAVOUR STREQUAL "MIT")
277           set(_GSS_LIBNAME "gssapi_krb5")
278           set(_KRB5_LIBNAME "krb5")
279           set(_COMERR_LIBNAME "com_err")
280           set(_KRB5SUPPORT_LIBNAME "krb5support")
281         else()
282           set(_GSS_LIBNAME "gssapi")
283           set(_KRB5_LIBNAME "krb5")
284           set(_KAFS_LIBNAME "kafs")
285           set(_ROKEN_LIBNAME "roken")
286         endif()
287       endif()
288
289       find_library(_GSS_LIBRARIES
290                   NAMES
291                       ${_GSS_LIBNAME}
292                   HINTS
293                       ${_GSS_LIBDIR_HINTS}
294                   PATH_SUFFIXES
295                       ${_GSS_LIBDIR_SUFFIXES}
296       )
297
298       if(GSS_FLAVOUR STREQUAL "MIT")
299         find_library(_KRB5_LIBRARY
300                     NAMES
301                         ${_KRB5_LIBNAME}
302                     HINTS
303                         ${_GSS_LIBDIR_HINTS}
304                     PATH_SUFFIXES
305                         ${_GSS_LIBDIR_SUFFIXES}
306         )
307         find_library(_COMERR_LIBRARY
308                     NAMES
309                         ${_COMERR_LIBNAME}
310                     HINTS
311                         ${_GSS_LIBDIR_HINTS}
312                     PATH_SUFFIXES
313                         ${_GSS_LIBDIR_SUFFIXES}
314         )
315         find_library(_KRB5SUPPORT_LIBRARY
316                     NAMES
317                         ${_KRB5SUPPORT_LIBNAME}
318                     HINTS
319                         ${_GSS_LIBDIR_HINTS}
320                     PATH_SUFFIXES
321                         ${_GSS_LIBDIR_SUFFIXES}
322         )
323         list(APPEND _GSS_LIBRARIES ${_KRB5_LIBRARY} ${_KRB5SUPPORT_LIBRARY} ${_COMERR_LIBRARY})
324       endif()
325
326       if(GSS_FLAVOUR STREQUAL "Heimdal")
327         find_library(_KRB5_LIBRARY
328                     NAMES
329                         ${_KRB5_LIBNAME}
330                     HINTS
331                         ${_GSS_LIBDIR_HINTS}
332                     PATH_SUFFIXES
333                         ${_GSS_LIBDIR_SUFFIXES}
334         )
335         find_library(_KAFS_LIBRARY
336                     NAMES
337                         ${_KAFS_LIBNAME}
338                     HINTS
339                         ${_GSS_LIBDIR_HINTS}
340                     PATH_SUFFIXES
341                         ${_GSS_LIBDIR_SUFFIXES}
342         )
343         find_library(_ROKEN_LIBRARY
344                     NAMES
345                         ${_ROKEN_LIBNAME}
346                     HINTS
347                         ${_GSS_LIBDIR_HINTS}
348                     PATH_SUFFIXES
349                         ${_GSS_LIBDIR_SUFFIXES}
350           )
351         list(APPEND _GSS_LIBRARIES ${_KRB5_LIBRARY} ${_KAFS_LIBRARY} ${_ROKEN_LIBRARY})
352       endif()
353     endif()
354
355     execute_process(
356           COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
357           OUTPUT_VARIABLE _GSS_VERSION
358           RESULT_VARIABLE _GSS_CONFIGURE_FAILED
359     )
360
361     # older versions may not have the "--version" parameter. In this case we just don't care.
362     if(_GSS_CONFIGURE_FAILED)
363       set(_GSS_VERSION 0)
364     endif()
365
366   endif()
367 else()
368   if(_GSS_PKG_${_MIT_MODNAME}_VERSION)
369     set(GSS_FLAVOUR "MIT")
370     set(_GSS_VERSION _GSS_PKG_${_MIT_MODNAME}_VERSION)
371   else()
372     set(GSS_FLAVOUR "Heimdal")
373     set(_GSS_VERSION _GSS_PKG_${_HEIMDAL_MODNAME}_VERSION)
374   endif()
375 endif()
376
377 set(GSS_INCLUDE_DIR ${_GSS_INCLUDE_DIR})
378 set(GSS_LIBRARIES ${_GSS_LIBRARIES})
379 set(GSS_LINK_DIRECTORIES ${_GSS_LINK_DIRECTORIES})
380 set(GSS_LINKER_FLAGS ${_GSS_LINKER_FLAGS})
381 set(GSS_COMPILER_FLAGS ${_GSS_COMPILER_FLAGS})
382 set(GSS_VERSION ${_GSS_VERSION})
383
384 if(GSS_FLAVOUR)
385   if(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "Heimdal")
386     if(CMAKE_SIZEOF_VOID_P EQUAL 8)
387       set(HEIMDAL_MANIFEST_FILE "Heimdal.Application.amd64.manifest")
388     else()
389       set(HEIMDAL_MANIFEST_FILE "Heimdal.Application.x86.manifest")
390     endif()
391     if(EXISTS "${GSS_INCLUDE_DIR}/${HEIMDAL_MANIFEST_FILE}")
392       file(STRINGS "${GSS_INCLUDE_DIR}/${HEIMDAL_MANIFEST_FILE}" heimdal_version_str
393                  REGEX "^.*version=\"[0-9]\\.[^\"]+\".*$")
394
395       string(REGEX MATCH "[0-9]\\.[^\"]+"
396                    GSS_VERSION "${heimdal_version_str}")
397     endif()
398     if(NOT GSS_VERSION)
399       set(GSS_VERSION "Heimdal Unknown")
400     endif()
401   elseif(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "MIT")
402     get_filename_component(_MIT_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos\\SDK\\CurrentVersion;VersionString]" NAME CACHE)
403     if(WIN32 AND _MIT_VERSION)
404       set(GSS_VERSION "${_MIT_VERSION}")
405     else()
406       set(GSS_VERSION "MIT Unknown")
407     endif()
408   endif()
409 endif()
410
411 include(FindPackageHandleStandardArgs)
412
413 set(_GSS_REQUIRED_VARS GSS_LIBRARIES GSS_FLAVOUR)
414
415 find_package_handle_standard_args(GSS
416     REQUIRED_VARS
417         ${_GSS_REQUIRED_VARS}
418     VERSION_VAR
419         GSS_VERSION
420     FAIL_MESSAGE
421         "Could NOT find GSS, try to set the path to GSS root folder in the system variable GSS_ROOT_DIR"
422 )
423
424 if(GSS_FLAVOUR STREQUAL "MIT")
425   string(STRIP "${GSS_VERSION}" GSS_VERSION)
426   string(SUBSTRING ${GSS_VERSION} 19 -1 GSS_RELEASE_NUMBER)
427   string(REGEX MATCH "([0-9]+)\\." GSS_VERSION_MAJOR ${GSS_RELEASE_NUMBER})
428   string(REGEX REPLACE "\\." "" GSS_VERSION_MAJOR "${GSS_VERSION_MAJOR}")
429   string(REGEX MATCH "\\.([0-9]+)$" GSS_VERSION_MINOR ${GSS_RELEASE_NUMBER})
430   if(NOT GSS_VERSION_MINOR)
431     string(REGEX MATCH "\\.([0-9]+)[-\\.]" GSS_VERSION_MINOR ${GSS_RELEASE_NUMBER})
432     string(REGEX REPLACE "\\." ""     GSS_VERSION_MINOR "${GSS_VERSION_MINOR}")
433     string(REGEX REPLACE "\\." ""     GSS_VERSION_MINOR "${GSS_VERSION_MINOR}")
434     string(REGEX REPLACE "-"   ""     GSS_VERSION_MINOR "${GSS_VERSION_MINOR}")
435     string(REGEX MATCH "\\.([0-9]+)$" GSS_VERSION_PATCH "${GSS_RELEASE_NUMBER}")
436     string(REGEX REPLACE "\\." ""     GSS_VERSION_PATCH "${GSS_VERSION_PATCH}")
437     if(NOT GSS_VERSION_PATCH)
438       set(GSS_VERSION_PATCH "0")
439     endif()
440   else()
441     string(REGEX REPLACE "\\." ""     GSS_VERSION_MINOR "${GSS_VERSION_MINOR}")
442     set(GSS_VERSION_PATCH "0")
443   endif()
444   if(GSS_VERSION_MAJOR AND GSS_VERSION_MINOR)
445     string(COMPARE GREATER ${GSS_VERSION_MAJOR} 0 GSS_VERSION_1)
446     string(COMPARE GREATER ${GSS_VERSION_MINOR} 12 GSS_VERSION_1_13)
447   else()
448     message(SEND_ERROR "Failed to retrieved Kerberos version number")
449   endif()
450   message(STATUS "Located Kerberos ${GSS_VERSION_MAJOR}.${GSS_VERSION_MINOR}.${GSS_VERSION_PATCH}")
451 endif()
452
453 mark_as_advanced(GSS_INCLUDE_DIR GSS_LIBRARIES)