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>