Spaces:
Running
Running
# Copyright 2012 Cloudera Inc. | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
# - Find Thrift (a cross platform RPC lib/tool) | |
# | |
# Variables used by this module, they can change the default behaviour and need | |
# to be set before calling find_package: | |
# | |
# Thrift_ROOT - When set, this path is inspected instead of standard library | |
# locations as the root of the Thrift installation. | |
# The environment variable THRIFT_HOME overrides this variable. | |
# | |
# This module defines | |
# Thrift_FOUND, whether Thrift is found or not | |
# Thrift_COMPILER_FOUND, whether Thrift compiler is found or not | |
# | |
# thrift::thrift, a library target to use Thrift | |
# thrift::compiler, a executable target to use Thrift compiler | |
if(ThriftAlt_FOUND) | |
return() | |
endif() | |
# There are some problems in ThriftConfig.cmake provided by MSYS2 and | |
# conda on Windows: | |
# | |
# * https://github.com/conda-forge/thrift-cpp-feedstock/issues/68 | |
# * https://github.com/msys2/MINGW-packages/issues/6619#issuecomment-649728718 | |
# | |
# We can remove the following "if(NOT WIN32)" condition once the | |
# followings are fixed and a new version that includes these fixes is | |
# published by MSYS2 and conda: | |
# | |
# * https://github.com/apache/thrift/pull/2725 | |
# * https://github.com/apache/thrift/pull/2726 | |
# * https://github.com/conda-forge/thrift-cpp-feedstock/issues/68 | |
if(NOT WIN32) | |
set(find_package_args "") | |
if(ThriftAlt_FIND_VERSION) | |
list(APPEND find_package_args ${ThriftAlt_FIND_VERSION}) | |
endif() | |
if(ThriftAlt_FIND_QUIETLY) | |
list(APPEND find_package_args QUIET) | |
endif() | |
find_package(Thrift ${find_package_args}) | |
if(Thrift_FOUND) | |
set(ThriftAlt_FOUND TRUE) | |
add_executable(thrift::compiler IMPORTED) | |
set_target_properties(thrift::compiler PROPERTIES IMPORTED_LOCATION | |
"${THRIFT_COMPILER}") | |
return() | |
endif() | |
endif() | |
function(extract_thrift_version) | |
if(ThriftAlt_INCLUDE_DIR) | |
file(READ "${ThriftAlt_INCLUDE_DIR}/thrift/config.h" THRIFT_CONFIG_H_CONTENT) | |
string(REGEX MATCH "#define PACKAGE_VERSION \"[0-9.]+\"" THRIFT_VERSION_DEFINITION | |
"${THRIFT_CONFIG_H_CONTENT}") | |
string(REGEX MATCH "[0-9.]+" ThriftAlt_VERSION "${THRIFT_VERSION_DEFINITION}") | |
set(ThriftAlt_VERSION | |
"${ThriftAlt_VERSION}" | |
PARENT_SCOPE) | |
else() | |
set(ThriftAlt_VERSION | |
"" | |
PARENT_SCOPE) | |
endif() | |
endfunction() | |
if(MSVC_TOOLCHAIN AND NOT DEFINED THRIFT_MSVC_LIB_SUFFIX) | |
if(NOT ARROW_THRIFT_USE_SHARED) | |
if(ARROW_USE_STATIC_CRT) | |
if("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") | |
set(THRIFT_MSVC_LIB_SUFFIX "mtd") | |
else() | |
set(THRIFT_MSVC_LIB_SUFFIX "mt") | |
endif() | |
else() | |
if("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") | |
set(THRIFT_MSVC_LIB_SUFFIX "mdd") | |
else() | |
set(THRIFT_MSVC_LIB_SUFFIX "md") | |
endif() | |
endif() | |
endif() | |
endif() | |
set(ThriftAlt_LIB_NAME_BASE "thrift${THRIFT_MSVC_LIB_SUFFIX}") | |
if(ARROW_THRIFT_USE_SHARED) | |
if(CMAKE_IMPORT_LIBRARY_SUFFIX) | |
set(ThriftAlt_LIB_NAME | |
"${CMAKE_IMPORT_LIBRARY_PREFIX}${ThriftAlt_LIB_NAME_BASE}${CMAKE_IMPORT_LIBRARY_SUFFIX}" | |
) | |
else() | |
set(ThriftAlt_LIB_NAME | |
"${CMAKE_SHARED_LIBRARY_PREFIX}${ThriftAlt_LIB_NAME_BASE}${CMAKE_SHARED_LIBRARY_SUFFIX}" | |
) | |
endif() | |
else() | |
set(ThriftAlt_LIB_NAME | |
"${CMAKE_STATIC_LIBRARY_PREFIX}${ThriftAlt_LIB_NAME_BASE}${CMAKE_STATIC_LIBRARY_SUFFIX}" | |
) | |
endif() | |
if(Thrift_ROOT) | |
find_library(ThriftAlt_LIB | |
NAMES ${ThriftAlt_LIB_NAME} | |
PATHS ${Thrift_ROOT} | |
PATH_SUFFIXES "lib/${CMAKE_LIBRARY_ARCHITECTURE}" "lib") | |
find_path(ThriftAlt_INCLUDE_DIR thrift/Thrift.h | |
PATHS ${Thrift_ROOT} | |
PATH_SUFFIXES "include") | |
find_program(THRIFT_COMPILER thrift | |
PATHS ${Thrift_ROOT} | |
PATH_SUFFIXES "bin") | |
extract_thrift_version() | |
else() | |
# THRIFT-4760: The pkgconfig files are currently only installed when using autotools. | |
# Starting with 0.13, they are also installed for the CMake-based installations of Thrift. | |
find_package(PkgConfig QUIET) | |
pkg_check_modules(THRIFT_PC thrift) | |
if(THRIFT_PC_FOUND) | |
set(ThriftAlt_INCLUDE_DIR "${THRIFT_PC_INCLUDEDIR}") | |
list(APPEND THRIFT_PC_LIBRARY_DIRS "${THRIFT_PC_LIBDIR}") | |
find_library(ThriftAlt_LIB | |
NAMES ${ThriftAlt_LIB_NAME} | |
PATHS ${THRIFT_PC_LIBRARY_DIRS} | |
NO_DEFAULT_PATH) | |
find_program(THRIFT_COMPILER thrift | |
HINTS ${THRIFT_PC_PREFIX} | |
NO_DEFAULT_PATH | |
PATH_SUFFIXES "bin") | |
set(ThriftAlt_VERSION ${THRIFT_PC_VERSION}) | |
else() | |
find_library(ThriftAlt_LIB | |
NAMES ${ThriftAlt_LIB_NAME} | |
PATH_SUFFIXES "lib/${CMAKE_LIBRARY_ARCHITECTURE}" "lib") | |
find_path(ThriftAlt_INCLUDE_DIR thrift/Thrift.h PATH_SUFFIXES "include") | |
find_program(THRIFT_COMPILER thrift PATH_SUFFIXES "bin") | |
extract_thrift_version() | |
endif() | |
endif() | |
if(THRIFT_COMPILER) | |
set(Thrift_COMPILER_FOUND TRUE) | |
else() | |
set(Thrift_COMPILER_FOUND FALSE) | |
endif() | |
find_package_handle_standard_args( | |
ThriftAlt | |
REQUIRED_VARS ThriftAlt_LIB ThriftAlt_INCLUDE_DIR | |
VERSION_VAR ThriftAlt_VERSION | |
HANDLE_COMPONENTS) | |
if(ThriftAlt_FOUND) | |
set(Thrift_VERSION ${ThriftAlt_VERSION}) | |
set(ThriftAlt_IMPORTED_PROPERTY_NAME IMPORTED_LOCATION) | |
# Reuse partially defined thrift::thrift by ThriftConfig.cmake. | |
if(NOT TARGET thrift::thrift) | |
if(ARROW_THRIFT_USE_SHARED) | |
add_library(thrift::thrift SHARED IMPORTED) | |
if(CMAKE_IMPORT_LIBRARY_SUFFIX) | |
set(ThriftAlt_IMPORTED_PROPERTY_NAME IMPORTED_IMPLIB) | |
endif() | |
else() | |
add_library(thrift::thrift STATIC IMPORTED) | |
endif() | |
endif() | |
set_target_properties(thrift::thrift | |
PROPERTIES ${ThriftAlt_IMPORTED_PROPERTY_NAME} "${ThriftAlt_LIB}" | |
INTERFACE_INCLUDE_DIRECTORIES | |
"${ThriftAlt_INCLUDE_DIR}") | |
if(WIN32 AND NOT MSVC_TOOLCHAIN) | |
# We don't need this for Visual C++ because Thrift uses | |
# "#pragma comment(lib, "Ws2_32.lib")" in | |
# thrift/windows/config.h for Visual C++. | |
set_target_properties(thrift::thrift PROPERTIES INTERFACE_LINK_LIBRARIES "ws2_32") | |
endif() | |
if(Thrift_COMPILER_FOUND) | |
add_executable(thrift::compiler IMPORTED) | |
set_target_properties(thrift::compiler PROPERTIES IMPORTED_LOCATION | |
"${THRIFT_COMPILER}") | |
endif() | |
endif() | |