Annotation of embedaddon/curl/CMake/FindGSS.cmake, revision 1.1.1.1
1.1 misho 1: #***************************************************************************
2: # _ _ ____ _
3: # Project ___| | | | _ \| |
4: # / __| | | | |_) | |
5: # | (__| |_| | _ <| |___
6: # \___|\___/|_| \_\_____|
7: #
8: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
9: #
10: # This software is licensed as described in the file COPYING, which
11: # you should have received as part of this distribution. The terms
12: # are also available at https://curl.haxx.se/docs/copyright.html.
13: #
14: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: # copies of the Software, and permit persons to whom the Software is
16: # furnished to do so, under the terms of the COPYING file.
17: #
18: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: # KIND, either express or implied.
20: #
21: ###########################################################################
22: # - Try to find the GSS Kerberos library
23: # Once done this will define
24: #
25: # GSS_ROOT_DIR - Set this variable to the root installation of GSS
26: #
27: # Read-Only variables:
28: # GSS_FOUND - system has the Heimdal library
29: # GSS_FLAVOUR - "MIT" or "Heimdal" if anything found.
30: # GSS_INCLUDE_DIR - the Heimdal include directory
31: # GSS_LIBRARIES - The libraries needed to use GSS
32: # GSS_LINK_DIRECTORIES - Directories to add to linker search path
33: # GSS_LINKER_FLAGS - Additional linker flags
34: # GSS_COMPILER_FLAGS - Additional compiler flags
35: # GSS_VERSION - This is set to version advertised by pkg-config or read from manifest.
36: # In case the library is found but no version info available it'll be set to "unknown"
37:
38: set(_MIT_MODNAME mit-krb5-gssapi)
39: set(_HEIMDAL_MODNAME heimdal-gssapi)
40:
41: include(CheckIncludeFile)
42: include(CheckIncludeFiles)
43: include(CheckTypeSize)
44:
45: set(_GSS_ROOT_HINTS
46: "${GSS_ROOT_DIR}"
47: "$ENV{GSS_ROOT_DIR}"
48: )
49:
50: # try to find library using system pkg-config if user didn't specify root dir
51: if(NOT GSS_ROOT_DIR AND NOT "$ENV{GSS_ROOT_DIR}")
52: if(UNIX)
53: find_package(PkgConfig QUIET)
54: pkg_search_module(_GSS_PKG ${_MIT_MODNAME} ${_HEIMDAL_MODNAME})
55: list(APPEND _GSS_ROOT_HINTS "${_GSS_PKG_PREFIX}")
56: elseif(WIN32)
57: list(APPEND _GSS_ROOT_HINTS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos;InstallDir]")
58: endif()
59: endif()
60:
61: if(NOT _GSS_FOUND) #not found by pkg-config. Let's take more traditional approach.
62: find_file(_GSS_CONFIGURE_SCRIPT
63: NAMES
64: "krb5-config"
65: HINTS
66: ${_GSS_ROOT_HINTS}
67: PATH_SUFFIXES
68: bin
69: NO_CMAKE_PATH
70: NO_CMAKE_ENVIRONMENT_PATH
71: )
72:
73: # if not found in user-supplied directories, maybe system knows better
74: find_file(_GSS_CONFIGURE_SCRIPT
75: NAMES
76: "krb5-config"
77: PATH_SUFFIXES
78: bin
79: )
80:
81: if(_GSS_CONFIGURE_SCRIPT)
82: execute_process(
83: COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
84: OUTPUT_VARIABLE _GSS_CFLAGS
85: RESULT_VARIABLE _GSS_CONFIGURE_FAILED
86: OUTPUT_STRIP_TRAILING_WHITESPACE
87: )
88: message(STATUS "CFLAGS: ${_GSS_CFLAGS}")
89: if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
90: # should also work in an odd case when multiple directories are given
91: string(STRIP "${_GSS_CFLAGS}" _GSS_CFLAGS)
92: string(REGEX REPLACE " +-I" ";" _GSS_CFLAGS "${_GSS_CFLAGS}")
93: string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1" _GSS_CFLAGS "${_GSS_CFLAGS}")
94:
95: foreach(_flag ${_GSS_CFLAGS})
96: if(_flag MATCHES "^-I.*")
97: string(REGEX REPLACE "^-I" "" _val "${_flag}")
98: list(APPEND _GSS_INCLUDE_DIR "${_val}")
99: else()
100: list(APPEND _GSS_COMPILER_FLAGS "${_flag}")
101: endif()
102: endforeach()
103: endif()
104:
105: execute_process(
106: COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
107: OUTPUT_VARIABLE _GSS_LIB_FLAGS
108: RESULT_VARIABLE _GSS_CONFIGURE_FAILED
109: OUTPUT_STRIP_TRAILING_WHITESPACE
110: )
111: message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}")
112:
113: if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
114: # this script gives us libraries and link directories. Blah. We have to deal with it.
115: string(STRIP "${_GSS_LIB_FLAGS}" _GSS_LIB_FLAGS)
116: string(REGEX REPLACE " +-(L|l)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
117: string(REGEX REPLACE " +-([^Ll][^ \\t;]*)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
118:
119: foreach(_flag ${_GSS_LIB_FLAGS})
120: if(_flag MATCHES "^-l.*")
121: string(REGEX REPLACE "^-l" "" _val "${_flag}")
122: list(APPEND _GSS_LIBRARIES "${_val}")
123: elseif(_flag MATCHES "^-L.*")
124: string(REGEX REPLACE "^-L" "" _val "${_flag}")
125: list(APPEND _GSS_LINK_DIRECTORIES "${_val}")
126: else()
127: list(APPEND _GSS_LINKER_FLAGS "${_flag}")
128: endif()
129: endforeach()
130: endif()
131:
132: execute_process(
133: COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
134: OUTPUT_VARIABLE _GSS_VERSION
135: RESULT_VARIABLE _GSS_CONFIGURE_FAILED
136: OUTPUT_STRIP_TRAILING_WHITESPACE
137: )
138:
139: # older versions may not have the "--version" parameter. In this case we just don't care.
140: if(_GSS_CONFIGURE_FAILED)
141: set(_GSS_VERSION 0)
142: endif()
143:
144: execute_process(
145: COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
146: OUTPUT_VARIABLE _GSS_VENDOR
147: RESULT_VARIABLE _GSS_CONFIGURE_FAILED
148: OUTPUT_STRIP_TRAILING_WHITESPACE
149: )
150:
151: # older versions may not have the "--vendor" parameter. In this case we just don't care.
152: if(_GSS_CONFIGURE_FAILED)
153: set(GSS_FLAVOUR "Heimdal") # most probably, shouldn't really matter
154: else()
155: if(_GSS_VENDOR MATCHES ".*H|heimdal.*")
156: set(GSS_FLAVOUR "Heimdal")
157: else()
158: set(GSS_FLAVOUR "MIT")
159: endif()
160: endif()
161:
162: else() # either there is no config script or we are on a platform that doesn't provide one (Windows?)
163:
164: find_path(_GSS_INCLUDE_DIR
165: NAMES
166: "gssapi/gssapi.h"
167: HINTS
168: ${_GSS_ROOT_HINTS}
169: PATH_SUFFIXES
170: include
171: inc
172: )
173:
174: if(_GSS_INCLUDE_DIR) #jay, we've found something
175: set(CMAKE_REQUIRED_INCLUDES "${_GSS_INCLUDE_DIR}")
176: check_include_files( "gssapi/gssapi_generic.h;gssapi/gssapi_krb5.h" _GSS_HAVE_MIT_HEADERS)
177:
178: if(_GSS_HAVE_MIT_HEADERS)
179: set(GSS_FLAVOUR "MIT")
180: else()
181: # prevent compiling the header - just check if we can include it
182: set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D__ROKEN_H__")
183: check_include_file( "roken.h" _GSS_HAVE_ROKEN_H)
184:
185: check_include_file( "heimdal/roken.h" _GSS_HAVE_HEIMDAL_ROKEN_H)
186: if(_GSS_HAVE_ROKEN_H OR _GSS_HAVE_HEIMDAL_ROKEN_H)
187: set(GSS_FLAVOUR "Heimdal")
188: endif()
189: set(CMAKE_REQUIRED_DEFINITIONS "")
190: endif()
191: else()
192: # I'm not convinced if this is the right way but this is what autotools do at the moment
193: find_path(_GSS_INCLUDE_DIR
194: NAMES
195: "gssapi.h"
196: HINTS
197: ${_GSS_ROOT_HINTS}
198: PATH_SUFFIXES
199: include
200: inc
201: )
202:
203: if(_GSS_INCLUDE_DIR)
204: set(GSS_FLAVOUR "Heimdal")
205: endif()
206: endif()
207:
208: # if we have headers, check if we can link libraries
209: if(GSS_FLAVOUR)
210: set(_GSS_LIBDIR_SUFFIXES "")
211: set(_GSS_LIBDIR_HINTS ${_GSS_ROOT_HINTS})
212: get_filename_component(_GSS_CALCULATED_POTENTIAL_ROOT "${_GSS_INCLUDE_DIR}" PATH)
213: list(APPEND _GSS_LIBDIR_HINTS ${_GSS_CALCULATED_POTENTIAL_ROOT})
214:
215: if(WIN32)
216: if(CMAKE_SIZEOF_VOID_P EQUAL 8)
217: list(APPEND _GSS_LIBDIR_SUFFIXES "lib/AMD64")
218: if(GSS_FLAVOUR STREQUAL "MIT")
219: set(_GSS_LIBNAME "gssapi64")
220: else()
221: set(_GSS_LIBNAME "libgssapi")
222: endif()
223: else()
224: list(APPEND _GSS_LIBDIR_SUFFIXES "lib/i386")
225: if(GSS_FLAVOUR STREQUAL "MIT")
226: set(_GSS_LIBNAME "gssapi32")
227: else()
228: set(_GSS_LIBNAME "libgssapi")
229: endif()
230: endif()
231: else()
232: list(APPEND _GSS_LIBDIR_SUFFIXES "lib;lib64") # those suffixes are not checked for HINTS
233: if(GSS_FLAVOUR STREQUAL "MIT")
234: set(_GSS_LIBNAME "gssapi_krb5")
235: else()
236: set(_GSS_LIBNAME "gssapi")
237: endif()
238: endif()
239:
240: find_library(_GSS_LIBRARIES
241: NAMES
242: ${_GSS_LIBNAME}
243: HINTS
244: ${_GSS_LIBDIR_HINTS}
245: PATH_SUFFIXES
246: ${_GSS_LIBDIR_SUFFIXES}
247: )
248:
249: endif()
250: endif()
251: else()
252: if(_GSS_PKG_${_MIT_MODNAME}_VERSION)
253: set(GSS_FLAVOUR "MIT")
254: set(_GSS_VERSION _GSS_PKG_${_MIT_MODNAME}_VERSION)
255: else()
256: set(GSS_FLAVOUR "Heimdal")
257: set(_GSS_VERSION _GSS_PKG_${_MIT_HEIMDAL}_VERSION)
258: endif()
259: endif()
260:
261: set(GSS_INCLUDE_DIR ${_GSS_INCLUDE_DIR})
262: set(GSS_LIBRARIES ${_GSS_LIBRARIES})
263: set(GSS_LINK_DIRECTORIES ${_GSS_LINK_DIRECTORIES})
264: set(GSS_LINKER_FLAGS ${_GSS_LINKER_FLAGS})
265: set(GSS_COMPILER_FLAGS ${_GSS_COMPILER_FLAGS})
266: set(GSS_VERSION ${_GSS_VERSION})
267:
268: if(GSS_FLAVOUR)
269: if(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "Heimdal")
270: if(CMAKE_SIZEOF_VOID_P EQUAL 8)
271: set(HEIMDAL_MANIFEST_FILE "Heimdal.Application.amd64.manifest")
272: else()
273: set(HEIMDAL_MANIFEST_FILE "Heimdal.Application.x86.manifest")
274: endif()
275:
276: if(EXISTS "${GSS_INCLUDE_DIR}/${HEIMDAL_MANIFEST_FILE}")
277: file(STRINGS "${GSS_INCLUDE_DIR}/${HEIMDAL_MANIFEST_FILE}" heimdal_version_str
278: REGEX "^.*version=\"[0-9]\\.[^\"]+\".*$")
279:
280: string(REGEX MATCH "[0-9]\\.[^\"]+"
281: GSS_VERSION "${heimdal_version_str}")
282: endif()
283:
284: if(NOT GSS_VERSION)
285: set(GSS_VERSION "Heimdal Unknown")
286: endif()
287: elseif(NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "MIT")
288: get_filename_component(_MIT_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos\\SDK\\CurrentVersion;VersionString]" NAME CACHE)
289: if(WIN32 AND _MIT_VERSION)
290: set(GSS_VERSION "${_MIT_VERSION}")
291: else()
292: set(GSS_VERSION "MIT Unknown")
293: endif()
294: endif()
295: endif()
296:
297: include(FindPackageHandleStandardArgs)
298:
299: set(_GSS_REQUIRED_VARS GSS_LIBRARIES GSS_FLAVOUR)
300:
301: find_package_handle_standard_args(GSS
302: REQUIRED_VARS
303: ${_GSS_REQUIRED_VARS}
304: VERSION_VAR
305: GSS_VERSION
306: FAIL_MESSAGE
307: "Could NOT find GSS, try to set the path to GSS root folder in the system variable GSS_ROOT_DIR"
308: )
309:
310: mark_as_advanced(GSS_INCLUDE_DIR GSS_LIBRARIES)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>