blob: 2e6acdf0800c0b8ee9672546ef7f72daa83a38bd [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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_PACKAGE_HELPER is a convenience function that is intended for use
# in conjunction with the `find_package` CMake command. Our usage of
# `find_package(<package>)` will search for files named `Find<package>.cmake`
# in our configured CMake include directories and load those files as modules.
#
# The `Find<package>.cmake` files should call this helper function only after
# defining a set of variables:
# * POSSIBLE_${PACKAGE_NAME}_INCLUDE_DIRS
# A list of possible locations to find the `HEADER_FILE`.
# * POSSIBLE_${PACKAGE_NAME}_LIB_DIRS
# A list of possible locations to find the libraries (below).
# * ${PACKAGE_NAME}_LIBRARY_NAMES
# A list of all the library names to search for.
#
# Upon returning, this function will set the following variables in
# the caller's scope:
# * ${PACKAGE_NAME}_INCLUDE_DIR - Defines where to find header files.
# * ${PACKAGE_NAME}_LIBS - Defines the name of library files.
function(FIND_PACKAGE_HELPER PACKAGE_NAME HEADER_FILE)
# Return early if the package has already been found.
if (${PACKAGE_NAME}_FOUND)
return()
endif ()
# Put the return variables in a known state (empty).
unset(${PACKAGE_NAME}_INCLUDE_DIR)
unset(${PACKAGE_NAME}_LIBS)
# Search for the header file in the possible include directories.
find_path(
${PACKAGE_NAME}_INCLUDE_DIR
${HEADER_FILE}
HINTS ${POSSIBLE_${PACKAGE_NAME}_INCLUDE_DIRS})
# Check if the header file was found.
string(
COMPARE NOTEQUAL
"${PACKAGE_NAME}_INCLUDE_DIR-NOTFOUND"
${${PACKAGE_NAME}_INCLUDE_DIR}
# Output variable.
${PACKAGE_NAME}_INCLUDE_DIR_FOUND)
# Error out if the header is not found.
if (NOT ${${PACKAGE_NAME}_INCLUDE_DIR_FOUND})
message(FATAL_ERROR "Could not find ${PACKAGE_NAME} header ${HEADER_FILE}")
endif ()
# Search for all the libraries in the possible library directories.
foreach (LIBRARY_NAME ${${PACKAGE_NAME}_LIBRARY_NAMES})
# NOTE: `find_library` will set the output variable in the cache,
# meaning that subsequent calls to `find_library` with the same
# output variable give the same result. Therefore, we unset the
# cached variable each time before calling `find_library`.
unset(${PACKAGE_NAME}_LIB_PATH CACHE)
find_library(
${PACKAGE_NAME}_LIB_PATH
NAMES ${LIBRARY_NAME}
PATHS ${POSSIBLE_${PACKAGE_NAME}_LIB_DIRS}
NO_DEFAULT_PATH)
# NOTE: We call this again to search the default paths,
# but it will only do so if it wasn't found above.
# This is recommended by the CMake documentation.
find_library(
${PACKAGE_NAME}_LIB_PATH
NAMES ${LIBRARY_NAME})
# Check if the library was found.
string(
COMPARE NOTEQUAL
"${PACKAGE_NAME}_LIB_PATH-NOTFOUND"
${${PACKAGE_NAME}_LIB_PATH}
# Output variable.
${PACKAGE_NAME}_LIB_PATH_FOUND)
# Error out if any of the libraries are not found.
if (NOT ${${PACKAGE_NAME}_LIB_PATH_FOUND})
message(FATAL_ERROR "Could not find ${PACKAGE_NAME} library ${LIBRARY_NAME}")
endif ()
list(APPEND ${PACKAGE_NAME}_LIBS ${${PACKAGE_NAME}_LIB_PATH})
endforeach ()
set(${PACKAGE_NAME}_FOUND 1 PARENT_SCOPE)
message(STATUS "Found ${PACKAGE_NAME} library: ${${PACKAGE_NAME}_LIBS}")
message(STATUS "Found ${PACKAGE_NAME} header: ${${PACKAGE_NAME}_INCLUDE_DIR}")
# Export the return variables.
set(${PACKAGE_NAME}_LIBS ${${PACKAGE_NAME}_LIBS} PARENT_SCOPE)
set(${PACKAGE_NAME}_INCLUDE_DIR ${${PACKAGE_NAME}_INCLUDE_DIR} PARENT_SCOPE)
endfunction()