2525#
2626# Input variables:
2727#
28- # - `GSS_ROOT_DIR`: Set this variable to the root installation of GSS. (also supported as environment)
28+ # - `GSS_ROOT_DIR`: Absolute path to the root installation of GSS. (also supported as environment)
2929#
3030# Result variables:
3131#
32- # - `GSS_FOUND`: System has the Heimdal library.
33- # - `GSS_FLAVOUR`: "GNU", "MIT" or "Heimdal " if anything found.
32+ # - `GSS_FOUND`: System has a GSS library.
33+ # - `GSS_FLAVOUR`: "GNU" or "MIT " if anything found.
3434# - `GSS_INCLUDE_DIRS`: The GSS include directories.
3535# - `GSS_LIBRARIES`: The GSS library names.
3636# - `GSS_LIBRARY_DIRS`: The GSS library directories.
4141
4242set (_gnu_modname "gss" )
4343set (_mit_modname "mit-krb5-gssapi" )
44- set (_heimdal_modname "heimdal-gssapi" )
4544
4645include (CheckIncludeFile )
4746include (CheckIncludeFiles )
4847include (CheckTypeSize )
4948
50- set (_gss_root_hints
51- "${GSS_ROOT_DIR} "
52- "$ENV{GSS_ROOT_DIR} "
53- )
49+ set (_gss_root_hints "${GSS_ROOT_DIR} " "$ENV{GSS_ROOT_DIR} " )
5450
5551set (_gss_CFLAGS "" )
5652set (_gss_LIBRARY_DIRS "" )
@@ -59,7 +55,7 @@ set(_gss_LIBRARY_DIRS "")
5955if (NOT GSS_ROOT_DIR AND NOT "$ENV{GSS_ROOT_DIR} " )
6056 if (CURL_USE_PKGCONFIG)
6157 find_package (PkgConfig QUIET )
62- pkg_search_module (_gss ${_gnu_modname} ${_mit_modname} ${_heimdal_modname} )
58+ pkg_search_module (_gss ${_gnu_modname} ${_mit_modname} )
6359 list (APPEND _gss_root_hints "${_gss_PREFIX} " )
6460 set (_gss_version "${_gss_VERSION} " )
6561 endif ()
@@ -69,37 +65,22 @@ if(NOT GSS_ROOT_DIR AND NOT "$ENV{GSS_ROOT_DIR}")
6965endif ()
7066
7167if (NOT _gss_FOUND) # Not found by pkg-config. Let us take more traditional approach.
72- find_file (_gss_configure_script
73- NAMES
74- "krb5-config"
75- HINTS
76- ${_gss_root_hints}
77- PATH_SUFFIXES
78- "bin"
79- NO_CMAKE_PATH
80- NO_CMAKE_ENVIRONMENT_PATH
81- )
82-
68+ find_file (_gss_configure_script NAMES "krb5-config" PATH_SUFFIXES "bin" HINTS ${_gss_root_hints}
69+ NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH )
8370 # If not found in user-supplied directories, maybe system knows better
84- find_file (_gss_configure_script
85- NAMES
86- "krb5-config"
87- PATH_SUFFIXES
88- "bin"
89- )
71+ find_file (_gss_configure_script NAMES "krb5-config" PATH_SUFFIXES "bin" )
9072
9173 if (_gss_configure_script)
9274
9375 set (_gss_INCLUDE_DIRS "" )
9476 set (_gss_LIBRARIES "" )
9577
96- execute_process (
97- COMMAND ${_gss_configure_script} "--cflags" "gssapi"
78+ execute_process (COMMAND ${_gss_configure_script} "--cflags" "gssapi"
9879 OUTPUT_VARIABLE _gss_cflags_raw
9980 RESULT_VARIABLE _gss_configure_failed
100- OUTPUT_STRIP_TRAILING_WHITESPACE
101- )
81+ OUTPUT_STRIP_TRAILING_WHITESPACE )
10282 message (STATUS "FindGSS krb5-config --cflags: ${_gss_cflags_raw} " )
83+
10384 if (NOT _gss_configure_failed) # 0 means success
10485 # Should also work in an odd case when multiple directories are given.
10586 string (STRIP "${_gss_cflags_raw} " _gss_cflags_raw)
@@ -116,12 +97,10 @@ if(NOT _gss_FOUND) # Not found by pkg-config. Let us take more traditional appr
11697 endforeach ()
11798 endif ()
11899
119- execute_process (
120- COMMAND ${_gss_configure_script} "--libs" "gssapi"
100+ execute_process (COMMAND ${_gss_configure_script} "--libs" "gssapi"
121101 OUTPUT_VARIABLE _gss_lib_flags
122102 RESULT_VARIABLE _gss_configure_failed
123- OUTPUT_STRIP_TRAILING_WHITESPACE
124- )
103+ OUTPUT_STRIP_TRAILING_WHITESPACE )
125104 message (STATUS "FindGSS krb5-config --libs: ${_gss_lib_flags} " )
126105
127106 if (NOT _gss_configure_failed) # 0 means success
@@ -141,157 +120,93 @@ if(NOT _gss_FOUND) # Not found by pkg-config. Let us take more traditional appr
141120 endforeach ()
142121 endif ()
143122
144- execute_process (
145- COMMAND ${_gss_configure_script} "--version"
123+ execute_process (COMMAND ${_gss_configure_script} "--version"
146124 OUTPUT_VARIABLE _gss_version
147125 RESULT_VARIABLE _gss_configure_failed
148- OUTPUT_STRIP_TRAILING_WHITESPACE
149- )
126+ OUTPUT_STRIP_TRAILING_WHITESPACE )
150127
151128 # Older versions may not have the "--version" parameter. In this case we just do not care.
152129 if (_gss_configure_failed)
153130 set (_gss_version 0)
131+ else ()
132+ # Strip prefix string to leave the version number only
133+ string (REPLACE "Kerberos 5 release " "" _gss_version "${_gss_version} " )
154134 endif ()
155135
156- execute_process (
157- COMMAND ${_gss_configure_script} "--vendor"
136+ execute_process (COMMAND ${_gss_configure_script} "--vendor"
158137 OUTPUT_VARIABLE _gss_vendor
159138 RESULT_VARIABLE _gss_configure_failed
160- OUTPUT_STRIP_TRAILING_WHITESPACE
161- )
139+ OUTPUT_STRIP_TRAILING_WHITESPACE )
162140
163141 # Older versions may not have the "--vendor" parameter. In this case we just do not care.
164- if (_gss_configure_failed)
165- set (GSS_FLAVOUR "Heimdal" ) # most probably, should not really matter
166- else ()
167- if (_gss_vendor MATCHES "H|heimdal" )
168- set (GSS_FLAVOUR "Heimdal" )
169- else ()
170- set (GSS_FLAVOUR "MIT" )
171- endif ()
142+ if (NOT _gss_configure_failed AND NOT _gss_vendor MATCHES "Heimdal|heimdal" )
143+ set (GSS_FLAVOUR "MIT" ) # assume a default, should not really matter
172144 endif ()
173145
174146 else () # Either there is no config script or we are on a platform that does not provide one (Windows?)
175147
176- find_path (_gss_INCLUDE_DIRS NAMES "gssapi/gssapi.h"
177- HINTS
178- ${_gss_root_hints}
179- PATH_SUFFIXES
180- "include"
181- "inc"
182- )
148+ find_path (_gss_INCLUDE_DIRS NAMES "gssapi/gssapi.h" HINTS ${_gss_root_hints} PATH_SUFFIXES "include" "inc" )
149+
150+ if (_gss_INCLUDE_DIRS) # We have found something
151+ set (_gss_libdir_suffixes "" )
183152
184- if (_gss_INCLUDE_DIRS) # jay, we have found something
185153 cmake_push_check_state ()
186154 list (APPEND CMAKE_REQUIRED_INCLUDES "${_gss_INCLUDE_DIRS} " )
187155 check_include_files ("gssapi/gssapi_generic.h;gssapi/gssapi_krb5.h" _gss_have_mit_headers )
156+ cmake_pop_check_state ()
188157
189158 if (_gss_have_mit_headers)
190159 set (GSS_FLAVOUR "MIT" )
191- else ()
192- # Prevent compiling the header - just check if we can include it
193- list (APPEND CMAKE_REQUIRED_DEFINITIONS "-D__ROKEN_H__" )
194- check_include_file ("roken.h" _gss_have_roken_h )
195-
196- check_include_file ("heimdal/roken.h" _gss_have_heimdal_roken_h )
197- if (_gss_have_roken_h OR _gss_have_heimdal_roken_h)
198- set (GSS_FLAVOUR "Heimdal" )
160+ if (WIN32 )
161+ if (CMAKE_SIZEOF_VOID_P EQUAL 8)
162+ list (APPEND _gss_libdir_suffixes "lib/AMD64" )
163+ set (_gss_libname "gssapi64" )
164+ else ()
165+ list (APPEND _gss_libdir_suffixes "lib/i386" )
166+ set (_gss_libname "gssapi32" )
167+ endif ()
168+ else ()
169+ list (APPEND _gss_libdir_suffixes "lib" "lib64" ) # those suffixes are not checked for HINTS
170+ set (_gss_libname "gssapi_krb5" )
199171 endif ()
200172 endif ()
201- cmake_pop_check_state ()
202173 else ()
203- # I am not convinced if this is the right way but this is what autotools do at the moment
204- find_path (_gss_INCLUDE_DIRS NAMES "gssapi.h"
205- HINTS
206- ${_gss_root_hints}
207- PATH_SUFFIXES
208- "include"
209- "inc"
210- )
174+ find_path (_gss_INCLUDE_DIRS NAMES "gss.h" HINTS ${_gss_root_hints} PATH_SUFFIXES "include" )
211175
212176 if (_gss_INCLUDE_DIRS)
213- set (GSS_FLAVOUR "Heimdal" )
214- else ()
215- find_path (_gss_INCLUDE_DIRS NAMES "gss.h"
216- HINTS
217- ${_gss_root_hints}
218- PATH_SUFFIXES
219- "include"
220- )
221-
222- if (_gss_INCLUDE_DIRS)
223- set (GSS_FLAVOUR "GNU" )
224- set (GSS_PC_REQUIRES "gss" )
225- endif ()
177+ set (GSS_FLAVOUR "GNU" )
178+ set (GSS_PC_REQUIRES ${_gnu_modname} )
179+ set (_gss_libname "gss" )
226180 endif ()
227181 endif ()
228182
229- # If we have headers, check if we can link libraries
183+ # If we have headers, look up libraries
230184 if (GSS_FLAVOUR)
231- set (_gss_libdir_suffixes "" )
232185 set (_gss_libdir_hints ${_gss_root_hints} )
233- get_filename_component (_gss_calculated_potential_root "${_gss_INCLUDE_DIRS} " DIRECTORY )
234- list (APPEND _gss_libdir_hints ${_gss_calculated_potential_root} )
235-
236- if (WIN32 )
237- if (CMAKE_SIZEOF_VOID_P EQUAL 8)
238- list (APPEND _gss_libdir_suffixes "lib/AMD64" )
239- if (GSS_FLAVOUR STREQUAL "GNU" )
240- set (_gss_libname "gss" )
241- elseif (GSS_FLAVOUR STREQUAL "MIT" )
242- set (_gss_libname "gssapi64" )
243- else ()
244- set (_gss_libname "libgssapi" )
245- endif ()
246- else ()
247- list (APPEND _gss_libdir_suffixes "lib/i386" )
248- if (GSS_FLAVOUR STREQUAL "GNU" )
249- set (_gss_libname "gss" )
250- elseif (GSS_FLAVOUR STREQUAL "MIT" )
251- set (_gss_libname "gssapi32" )
252- else ()
253- set (_gss_libname "libgssapi" )
254- endif ()
255- endif ()
186+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
187+ cmake_path (GET _gss_INCLUDE_DIRS PARENT_PATH _gss_calculated_potential_root )
256188 else ()
257- list (APPEND _gss_libdir_suffixes "lib;lib64" ) # those suffixes are not checked for HINTS
258- if (GSS_FLAVOUR STREQUAL "GNU" )
259- set (_gss_libname "gss" )
260- elseif (GSS_FLAVOUR STREQUAL "MIT" )
261- set (_gss_libname "gssapi_krb5" )
262- else ()
263- set (_gss_libname "gssapi" )
264- endif ()
189+ get_filename_component (_gss_calculated_potential_root "${_gss_INCLUDE_DIRS} " DIRECTORY )
265190 endif ()
191+ list (APPEND _gss_libdir_hints ${_gss_calculated_potential_root} )
266192
267- find_library (_gss_LIBRARIES NAMES ${_gss_libname}
268- HINTS
269- ${_gss_libdir_hints}
270- PATH_SUFFIXES
271- ${_gss_libdir_suffixes}
272- )
193+ find_library (_gss_LIBRARIES NAMES ${_gss_libname} HINTS ${_gss_libdir_hints} PATH_SUFFIXES ${_gss_libdir_suffixes} )
273194 endif ()
274195 endif ()
196+ if (NOT GSS_FLAVOUR)
197+ message (FATAL_ERROR "GNU or MIT GSS is required" )
198+ endif ()
275199else ()
276- # _gss_MODULE_NAME set since CMake 3.16
277- if (_gss_MODULE_NAME STREQUAL _gnu_modname OR _gss_${_gnu_modname} _VERSION)
200+ # _gss_MODULE_NAME set since CMake 3.16.
201+ # _pkg_check_modules_pkg_name is undocumented and used as a fallback for CMake <3.16 versions.
202+ if (_gss_MODULE_NAME STREQUAL _gnu_modname OR _pkg_check_modules_pkg_name STREQUAL _gnu_modname)
278203 set (GSS_FLAVOUR "GNU" )
279- set (GSS_PC_REQUIRES "gss" )
280- if (NOT _gss_version) # for old CMake versions?
281- set (_gss_version ${_gss_${_gnu_modname} _VERSION})
282- endif ()
283- elseif (_gss_MODULE_NAME STREQUAL _mit_modname OR _gss_${_mit_modname} _VERSION)
204+ set (GSS_PC_REQUIRES ${_gnu_modname} )
205+ elseif (_gss_MODULE_NAME STREQUAL _mit_modname OR _pkg_check_modules_pkg_name STREQUAL _mit_modname)
284206 set (GSS_FLAVOUR "MIT" )
285- set (GSS_PC_REQUIRES "mit-krb5-gssapi" )
286- if (NOT _gss_version) # for old CMake versions?
287- set (_gss_version ${_gss_${_mit_modname} _VERSION})
288- endif ()
207+ set (GSS_PC_REQUIRES ${_mit_modname} )
289208 else ()
290- set (GSS_FLAVOUR "Heimdal" )
291- set (GSS_PC_REQUIRES "heimdal-gssapi" )
292- if (NOT _gss_version) # for old CMake versions?
293- set (_gss_version ${_gss_${_heimdal_modname} _VERSION})
294- endif ()
209+ message (FATAL_ERROR "GNU or MIT GSS is required" )
295210 endif ()
296211 message (STATUS "Found GSS/${GSS_FLAVOUR} (via pkg-config): ${_gss_INCLUDE_DIRS} (found version \" ${_gss_version} \" )" )
297212endif ()
@@ -304,33 +219,21 @@ set(GSS_LIBRARY_DIRS ${_gss_LIBRARY_DIRS})
304219set (GSS_CFLAGS ${_gss_CFLAGS} )
305220set (GSS_VERSION ${_gss_version} )
306221
307- if (GSS_FLAVOUR)
308- if (NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "Heimdal" )
309- if (CMAKE_SIZEOF_VOID_P EQUAL 8)
310- set (_heimdal_manifest_file "Heimdal.Application.amd64.manifest" )
222+ if (NOT GSS_VERSION)
223+ if (GSS_FLAVOUR STREQUAL "MIT" )
224+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.24)
225+ cmake_host_system_information (RESULT _mit_version QUERY WINDOWS_REGISTRY
226+ "HKLM/SOFTWARE/MIT/Kerberos/SDK/CurrentVersion" VALUE "VersionString" )
311227 else ()
312- set (_heimdal_manifest_file "Heimdal.Application.x86.manifest" )
313- endif ()
314-
315- if (EXISTS "${GSS_INCLUDE_DIRS} /${_heimdal_manifest_file} " )
316- file (STRINGS "${GSS_INCLUDE_DIRS} /${_heimdal_manifest_file} " _heimdal_version_str
317- REGEX "^.*version=\" [0-9]\\ .[^\" ]+\" .*$" )
318-
319- string (REGEX MATCH "[0-9]\\ .[^\" ]+" GSS_VERSION "${_heimdal_version_str} " )
320- endif ()
321-
322- if (NOT GSS_VERSION)
323- set (GSS_VERSION "Heimdal Unknown" )
228+ get_filename_component (_mit_version
229+ "[HKEY_LOCAL_MACHINE\\ SOFTWARE\\ MIT\\ Kerberos\\ SDK\\ CurrentVersion;VersionString]" NAME CACHE )
324230 endif ()
325- elseif (NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL "MIT" )
326- get_filename_component (_mit_version "[HKEY_LOCAL_MACHINE\\ SOFTWARE\\ MIT\\ Kerberos\\ SDK\\ CurrentVersion;VersionString]" NAME
327- CACHE )
328231 if (WIN32 AND _mit_version)
329232 set (GSS_VERSION "${_mit_version} " )
330233 else ()
331234 set (GSS_VERSION "MIT Unknown" )
332235 endif ()
333- elseif ( NOT GSS_VERSION AND GSS_FLAVOUR STREQUAL " GNU" )
236+ else () # GNU
334237 if (GSS_INCLUDE_DIRS AND EXISTS "${GSS_INCLUDE_DIRS} /gss.h" )
335238 set (_version_regex "#[\t ]*define[\t ]+GSS_VERSION[\t ]+\" ([^\" ]*)\" " )
336239 file (STRINGS "${GSS_INCLUDE_DIRS} /gss.h" _version_str REGEX "${_version_regex} " )
@@ -350,7 +253,7 @@ find_package_handle_standard_args(GSS
350253 VERSION_VAR
351254 GSS_VERSION
352255 FAIL_MESSAGE
353- "Could NOT find GSS, try to set the path to GSS root folder in the system variable GSS_ROOT_DIR"
256+ "Could NOT find GSS, try to set the absolute path to GSS installation root directory in the environment variable GSS_ROOT_DIR"
354257)
355258
356259mark_as_advanced (
0 commit comments