File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / CMake / FindGSS.cmake
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:16 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>