| # 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. |
| |
| # This file was adapted from https://github.com/apache/kudu/blob/master/CMakeLists.txt. |
| # It adds two useful cmake methods (ADD_EXPORTABLE_LIBRARY and ADD_THIRDPARTY_LIB), and |
| # also defines a shim method (ADD_KUDU_TEST) to simplify importing Kudu's utility |
| # libraries. |
| |
| cmake_minimum_required(VERSION 3.2.3) |
| include(CMakeParseArguments) |
| |
| # add_library() wrapper provided for compatibility with Kudu. In the original version, |
| # this would add a second variant of the library, which is compiled with special |
| # visibility flags to hide all symbols except those that are part of the public ABI. Here |
| # it is a shim that simply calls add_library() to make the library available for internal |
| # linking. |
| # |
| # Arguments: |
| # |
| # LIB_NAME is the name of the library. It must come first. Required. |
| # |
| # SRCS is the list of source files to compile into the library. Required. |
| # |
| # DEPS is the list of targets that both library variants depend on. Required. |
| # |
| # The following arguments are all optional, and supported for compatibility, but don't |
| # have any effect: |
| # |
| # NONLINK_DEPS, COMPILE_FLAGS, EXPORTED_SHARED, EXPORTED_OUTPUT_NAME, |
| # EXPORTED_OUTPUT_DIRECTORY, EXPORTED_DEPS |
| function(ADD_EXPORTABLE_LIBRARY LIB_NAME) |
| set(options EXPORTED_SHARED) |
| set(one_value_args COMPILE_FLAGS EXPORTED_OUTPUT_NAME EXPORTED_OUTPUT_DIRECTORY) |
| set(multi_value_args SRCS DEPS EXPORTED_DEPS NONLINK_DEPS) |
| cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) |
| if(ARG_UNPARSED_ARGUMENTS) |
| message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}") |
| endif() |
| |
| add_library(${LIB_NAME} ${ARG_SRCS}) |
| |
| set_target_properties(${LIB_NAME} PROPERTIES |
| ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIB_NAME}" |
| LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIB_NAME}" |
| EXECUTABLE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIB_NAME}") |
| |
| if(ARG_COMPILE_FLAGS) |
| set_target_properties(${LIB_NAME} |
| PROPERTIES COMPILE_FLAGS ${ARG_COMPILE_FLAGS}) |
| endif() |
| if (ARG_DEPS) |
| target_link_libraries(${LIB_NAME} ${ARG_DEPS}) |
| endif() |
| endfunction() |
| |
| ############################################################ |
| # Testing |
| ############################################################ |
| |
| function(ADD_KUDU_TEST REL_TEST_NAME) |
| # Shim for compatibility, doesn't do anything. |
| endfunction() |
| |
| |
| ############################################################ |
| # Dependencies |
| ############################################################ |
| function(ADD_THIRDPARTY_LIB LIB_NAME) |
| set(options) |
| set(one_value_args SHARED_LIB STATIC_LIB) |
| set(multi_value_args DEPS) |
| cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) |
| if(ARG_UNPARSED_ARGUMENTS) |
| message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}") |
| endif() |
| |
| if(("${KUDU_LINK}" STREQUAL "s" AND ARG_STATIC_LIB) OR (NOT ARG_SHARED_LIB)) |
| if(NOT ARG_STATIC_LIB) |
| message(FATAL_ERROR "No static or shared library provided for ${LIB_NAME}") |
| endif() |
| add_library(${LIB_NAME} STATIC IMPORTED) |
| set_target_properties(${LIB_NAME} |
| PROPERTIES IMPORTED_LOCATION "${ARG_STATIC_LIB}") |
| message(STATUS "Added static library dependency ${LIB_NAME}: ${ARG_STATIC_LIB}") |
| else() |
| add_library(${LIB_NAME} SHARED IMPORTED) |
| set_target_properties(${LIB_NAME} |
| PROPERTIES IMPORTED_LOCATION "${ARG_SHARED_LIB}") |
| message(STATUS "Added shared library dependency ${LIB_NAME}: ${ARG_SHARED_LIB}") |
| endif() |
| |
| if(ARG_DEPS) |
| set_target_properties(${LIB_NAME} |
| PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES "${ARG_DEPS}") |
| endif() |
| |
| # Set up an "exported variant" for this thirdparty library (see "Visibility" |
| # above). It's the same as the real target, just with an "_exported" suffix. |
| # We prefer the static archive if it exists (as it's akin to an "internal" |
| # library), but we'll settle for the shared object if we must. |
| # |
| # A shared object exported variant will force any "leaf" library that |
| # transitively depends on it to also depend on it at runtime; this is |
| # desirable for some libraries (e.g. cyrus_sasl). |
| set(LIB_NAME_EXPORTED ${LIB_NAME}_exported) |
| if(ARG_STATIC_LIB) |
| add_library(${LIB_NAME_EXPORTED} STATIC IMPORTED) |
| set_target_properties(${LIB_NAME_EXPORTED} |
| PROPERTIES IMPORTED_LOCATION "${ARG_STATIC_LIB}") |
| else() |
| add_library(${LIB_NAME_EXPORTED} SHARED IMPORTED) |
| set_target_properties(${LIB_NAME_EXPORTED} |
| PROPERTIES IMPORTED_LOCATION "${ARG_SHARED_LIB}") |
| endif() |
| if(ARG_DEPS) |
| set_target_properties(${LIB_NAME_EXPORTED} |
| PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES "${ARG_DEPS}") |
| endif() |
| endfunction() |
| |
| |
| # This macro initializes KUDU_MIN_TEST_LIBS to KUDU_MIN_TEST_LIBS and |
| # appends the passed list of libraries to the end. This ensures that |
| # KUDU_MIN_TEST_LIBS is linked first. |
| macro(SET_KUDU_TEST_LINK_LIBS) |
| set(KUDU_TEST_LINK_LIBS ${KUDU_MIN_TEST_LIBS}) |
| list(APPEND KUDU_TEST_LINK_LIBS ${ARGN}) |
| endmacro() |