# 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()