annotate src/capnproto-0.6.0/c++/cmake/FindCapnProto.cmake @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 0994c39f1e94
children
rev   line source
cannam@62 1 #
cannam@62 2 # Finds the Cap'n Proto libraries, and compiles schema files.
cannam@62 3 #
cannam@62 4 # Configuration variables (optional):
cannam@62 5 # CAPNPC_OUTPUT_DIR
cannam@62 6 # Directory to place compiled schema sources (default: the same directory as the schema file).
cannam@62 7 # CAPNPC_IMPORT_DIRS
cannam@62 8 # List of additional include directories for the schema compiler.
cannam@62 9 # (CMAKE_CURRENT_SOURCE_DIR and CAPNP_INCLUDE_DIRS are always included.)
cannam@62 10 # CAPNPC_SRC_PREFIX
cannam@62 11 # Schema file source prefix (default: CMAKE_CURRENT_SOURCE_DIR).
cannam@62 12 # CAPNPC_FLAGS
cannam@62 13 # Additional flags to pass to the schema compiler.
cannam@62 14 #
cannam@62 15 # Variables that are discovered:
cannam@62 16 # CAPNP_EXECUTABLE
cannam@62 17 # Path to the `capnp` tool (can be set to override).
cannam@62 18 # CAPNPC_CXX_EXECUTABLE
cannam@62 19 # Path to the `capnpc-c++` tool (can be set to override).
cannam@62 20 # CAPNP_INCLUDE_DIRS
cannam@62 21 # Include directories for the library's headers (can be set to override).
cannam@62 22 # CANP_LIBRARIES
cannam@62 23 # The Cap'n Proto library paths.
cannam@62 24 # CAPNP_LIBRARIES_LITE
cannam@62 25 # Paths to only the 'lite' libraries.
cannam@62 26 # CAPNP_DEFINITIONS
cannam@62 27 # Compiler definitions required for building with the library.
cannam@62 28 # CAPNP_FOUND
cannam@62 29 # Set if the libraries have been located.
cannam@62 30 #
cannam@62 31 # Example usage:
cannam@62 32 #
cannam@62 33 # find_package(CapnProto REQUIRED)
cannam@62 34 # include_directories(${CAPNP_INCLUDE_DIRS})
cannam@62 35 # add_definitions(${CAPNP_DEFINITIONS})
cannam@62 36 #
cannam@62 37 # capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS schema.capnp)
cannam@62 38 # add_executable(a a.cc ${CAPNP_SRCS} ${CAPNP_HDRS})
cannam@62 39 # target_link_library(a ${CAPNP_LIBRARIES})
cannam@62 40 #
cannam@62 41 # For out-of-source builds:
cannam@62 42 #
cannam@62 43 # set(CAPNPC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
cannam@62 44 # include_directories(${CAPNPC_OUTPUT_DIR})
cannam@62 45 # capnp_generate_cpp(...)
cannam@62 46 #
cannam@62 47
cannam@62 48 # CAPNP_GENERATE_CPP ===========================================================
cannam@62 49
cannam@62 50 function(CAPNP_GENERATE_CPP SOURCES HEADERS)
cannam@62 51 if(NOT ARGN)
cannam@62 52 message(SEND_ERROR "CAPNP_GENERATE_CPP() called without any source files.")
cannam@62 53 endif()
cannam@62 54 if(NOT CAPNP_EXECUTABLE)
cannam@62 55 message(SEND_ERROR "Could not locate capnp executable (CAPNP_EXECUTABLE).")
cannam@62 56 endif()
cannam@62 57 if(NOT CAPNPC_CXX_EXECUTABLE)
cannam@62 58 message(SEND_ERROR "Could not locate capnpc-c++ executable (CAPNPC_CXX_EXECUTABLE).")
cannam@62 59 endif()
cannam@62 60 if(NOT CAPNP_INCLUDE_DIRS)
cannam@62 61 message(SEND_ERROR "Could not locate capnp header files (CAPNP_INCLUDE_DIRS).")
cannam@62 62 endif()
cannam@62 63
cannam@62 64 # Default compiler includes
cannam@62 65 set(include_path -I ${CMAKE_CURRENT_SOURCE_DIR} -I ${CAPNP_INCLUDE_DIRS})
cannam@62 66
cannam@62 67 if(DEFINED CAPNPC_IMPORT_DIRS)
cannam@62 68 # Append each directory as a series of '-I' flags in ${include_path}
cannam@62 69 foreach(directory ${CAPNPC_IMPORT_DIRS})
cannam@62 70 get_filename_component(absolute_path "${directory}" ABSOLUTE)
cannam@62 71 list(APPEND include_path -I ${absolute_path})
cannam@62 72 endforeach()
cannam@62 73 endif()
cannam@62 74
cannam@62 75 if(DEFINED CAPNPC_OUTPUT_DIR)
cannam@62 76 # Prepend a ':' to get the format for the '-o' flag right
cannam@62 77 set(output_dir ":${CAPNPC_OUTPUT_DIR}")
cannam@62 78 else()
cannam@62 79 set(output_dir ":.")
cannam@62 80 endif()
cannam@62 81
cannam@62 82 if(NOT DEFINED CAPNPC_SRC_PREFIX)
cannam@62 83 set(CAPNPC_SRC_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}")
cannam@62 84 endif()
cannam@62 85 get_filename_component(CAPNPC_SRC_PREFIX "${CAPNPC_SRC_PREFIX}" ABSOLUTE)
cannam@62 86
cannam@62 87 set(${SOURCES})
cannam@62 88 set(${HEADERS})
cannam@62 89 foreach(schema_file ${ARGN})
cannam@62 90 get_filename_component(file_path "${schema_file}" ABSOLUTE)
cannam@62 91 get_filename_component(file_dir "${file_path}" PATH)
cannam@62 92
cannam@62 93 # Figure out where the output files will go
cannam@62 94 if (NOT DEFINED CAPNPC_OUTPUT_DIR)
cannam@62 95 set(output_base "${file_path}")
cannam@62 96 else()
cannam@62 97 # Output files are placed in CAPNPC_OUTPUT_DIR, at a location as if they were
cannam@62 98 # relative to CAPNPC_SRC_PREFIX.
cannam@62 99 string(LENGTH "${CAPNPC_SRC_PREFIX}" prefix_len)
cannam@62 100 string(SUBSTRING "${file_path}" 0 ${prefix_len} output_prefix)
cannam@62 101 if(NOT "${CAPNPC_SRC_PREFIX}" STREQUAL "${output_prefix}")
cannam@62 102 message(SEND_ERROR "Could not determine output path for '${schema_file}' ('${file_path}') with source prefix '${CAPNPC_SRC_PREFIX}' into '${CAPNPC_OUTPUT_DIR}'.")
cannam@62 103 endif()
cannam@62 104
cannam@62 105 string(SUBSTRING "${file_path}" ${prefix_len} -1 output_path)
cannam@62 106 set(output_base "${CAPNPC_OUTPUT_DIR}${output_path}")
cannam@62 107 endif()
cannam@62 108
cannam@62 109 add_custom_command(
cannam@62 110 OUTPUT "${output_base}.c++" "${output_base}.h"
cannam@62 111 COMMAND "${CAPNP_EXECUTABLE}"
cannam@62 112 ARGS compile
cannam@62 113 -o ${CAPNPC_CXX_EXECUTABLE}${output_dir}
cannam@62 114 --src-prefix ${CAPNPC_SRC_PREFIX}
cannam@62 115 ${include_path}
cannam@62 116 ${CAPNPC_FLAGS}
cannam@62 117 ${file_path}
cannam@62 118 DEPENDS "${schema_file}"
cannam@62 119 COMMENT "Compiling Cap'n Proto schema ${schema_file}"
cannam@62 120 VERBATIM
cannam@62 121 )
cannam@62 122 list(APPEND ${SOURCES} "${output_base}.c++")
cannam@62 123 list(APPEND ${HEADERS} "${output_base}.h")
cannam@62 124 endforeach()
cannam@62 125
cannam@62 126 set_source_files_properties(${${SOURCES}} ${${HEADERS}} PROPERTIES GENERATED TRUE)
cannam@62 127 set(${SOURCES} ${${SOURCES}} PARENT_SCOPE)
cannam@62 128 set(${HEADERS} ${${HEADERS}} PARENT_SCOPE)
cannam@62 129 endfunction()
cannam@62 130
cannam@62 131 # Find Libraries/Paths =========================================================
cannam@62 132
cannam@62 133 # Use pkg-config to get path hints and definitions
cannam@62 134 find_package(PkgConfig QUIET)
cannam@62 135 pkg_check_modules(PKGCONFIG_CAPNP capnp)
cannam@62 136 pkg_check_modules(PKGCONFIG_CAPNP_RPC capnp-rpc QUIET)
cannam@62 137 pkg_check_modules(PKGCONFIG_CAPNP_JSON capnp-json QUIET)
cannam@62 138
cannam@62 139 find_library(CAPNP_LIB_KJ kj
cannam@62 140 HINTS "${PKGCONFIG_CAPNP_LIBDIR}" ${PKGCONFIG_CAPNP_LIBRARY_DIRS}
cannam@62 141 )
cannam@62 142 find_library(CAPNP_LIB_KJ-ASYNC kj-async
cannam@62 143 HINTS "${PKGCONFIG_CAPNP_RPC_LIBDIR}" ${PKGCONFIG_CAPNP_RPC_LIBRARY_DIRS}
cannam@62 144 )
cannam@62 145 find_library(CAPNP_LIB_CAPNP capnp
cannam@62 146 HINTS "${PKGCONFIG_CAPNP_LIBDIR}" ${PKGCONFIG_CAPNP_LIBRARY_DIRS}
cannam@62 147 )
cannam@62 148 find_library(CAPNP_LIB_CAPNP-RPC capnp-rpc
cannam@62 149 HINTS "${PKGCONFIG_CAPNP_RPC_LIBDIR}" ${PKGCONFIG_CAPNP_RPC_LIBRARY_DIRS}
cannam@62 150 )
cannam@62 151 find_library(CAPNP_LIB_CAPNP-JSON capnp-json
cannam@62 152 HINTS "${PKGCONFIG_CAPNP_JSON_LIBDIR}" ${PKGCONFIG_CAPNP_JSON_LIBRARY_DIRS}
cannam@62 153 )
cannam@62 154 mark_as_advanced(CAPNP_LIB_KJ CAPNP_LIB_KJ-ASYNC CAPNP_LIB_CAPNP CAPNP_LIB_CAPNP-RPC CAPNP_LIB_CAPNP-JSON)
cannam@62 155 set(CAPNP_LIBRARIES_LITE
cannam@62 156 ${CAPNP_LIB_CAPNP}
cannam@62 157 ${CAPNP_LIB_KJ}
cannam@62 158 )
cannam@62 159 set(CAPNP_LIBRARIES
cannam@62 160 ${CAPNP_LIB_CAPNP-JSON}
cannam@62 161 ${CAPNP_LIB_CAPNP-RPC}
cannam@62 162 ${CAPNP_LIB_CAPNP}
cannam@62 163 ${CAPNP_LIB_KJ-ASYNC}
cannam@62 164 ${CAPNP_LIB_KJ}
cannam@62 165 )
cannam@62 166
cannam@62 167 # Was only the 'lite' library found?
cannam@62 168 if(CAPNP_LIB_CAPNP AND NOT CAPNP_LIB_CAPNP-RPC)
cannam@62 169 set(CAPNP_DEFINITIONS -DCAPNP_LITE)
cannam@62 170 else()
cannam@62 171 set(CAPNP_DEFINITIONS)
cannam@62 172 endif()
cannam@62 173
cannam@62 174 find_path(CAPNP_INCLUDE_DIRS capnp/generated-header-support.h
cannam@62 175 HINTS "${PKGCONFIG_CAPNP_INCLUDEDIR}" ${PKGCONFIG_CAPNP_INCLUDE_DIRS}
cannam@62 176 )
cannam@62 177
cannam@62 178 find_program(CAPNP_EXECUTABLE
cannam@62 179 NAMES capnp
cannam@62 180 DOC "Cap'n Proto Command-line Tool"
cannam@62 181 HINTS "${PKGCONFIG_CAPNP_PREFIX}/bin"
cannam@62 182 )
cannam@62 183
cannam@62 184 find_program(CAPNPC_CXX_EXECUTABLE
cannam@62 185 NAMES capnpc-c++
cannam@62 186 DOC "Capn'n Proto C++ Compiler"
cannam@62 187 HINTS "${PKGCONFIG_CAPNP_PREFIX}/bin"
cannam@62 188 )
cannam@62 189
cannam@62 190 # Only *require* the include directory, libkj, and libcapnp. If compiling with
cannam@62 191 # CAPNP_LITE, nothing else will be found.
cannam@62 192 include(FindPackageHandleStandardArgs)
cannam@62 193 find_package_handle_standard_args(CAPNP DEFAULT_MSG
cannam@62 194 CAPNP_INCLUDE_DIRS
cannam@62 195 CAPNP_LIB_KJ
cannam@62 196 CAPNP_LIB_CAPNP
cannam@62 197 )