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