annotate src/capnproto-git-20161025/c++/cmake/CapnProtoMacros.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 9530b331f8c1
children
rev   line source
cannam@48 1 # CAPNP_GENERATE_CPP ===========================================================
cannam@48 2 #
cannam@48 3 # Example usage:
cannam@48 4 # find_package(CapnProto)
cannam@48 5 # capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS schema.capnp)
cannam@48 6 # include_directories(${CMAKE_CURRENT_BINARY_DIR})
cannam@48 7 # add_executable(foo main.cpp ${CAPNP_SRCS})
cannam@48 8 # target_link_libraries(foo CapnProto::capnp-rpc)
cannam@48 9 #
cannam@48 10 # If you are using not using the RPC features you can use
cannam@48 11 # 'CapnProto::capnp' in target_link_libraries call
cannam@48 12 #
cannam@48 13 # Configuration variables (optional):
cannam@48 14 # CAPNPC_OUTPUT_DIR
cannam@48 15 # Directory to place compiled schema sources (default: CMAKE_CURRENT_BINARY_DIR).
cannam@48 16 # CAPNPC_IMPORT_DIRS
cannam@48 17 # List of additional include directories for the schema compiler.
cannam@48 18 # (CMAKE_CURRENT_SOURCE_DIR and CAPNP_INCLUDE_DIRECTORY are always included.)
cannam@48 19 # CAPNPC_SRC_PREFIX
cannam@48 20 # Schema file source prefix (default: CMAKE_CURRENT_SOURCE_DIR).
cannam@48 21 # CAPNPC_FLAGS
cannam@48 22 # Additional flags to pass to the schema compiler.
cannam@48 23 #
cannam@48 24 # TODO: convert to cmake_parse_arguments
cannam@48 25
cannam@48 26 function(CAPNP_GENERATE_CPP SOURCES HEADERS)
cannam@48 27 if(NOT ARGN)
cannam@48 28 message(SEND_ERROR "CAPNP_GENERATE_CPP() called without any source files.")
cannam@48 29 endif()
cannam@48 30 set(tool_depends ${EMPTY_STRING})
cannam@48 31 #Use cmake targets available
cannam@48 32 if(TARGET capnp_tool)
cannam@48 33 set(CAPNP_EXECUTABLE capnp_tool)
cannam@48 34 GET_TARGET_PROPERTY(CAPNPC_CXX_EXECUTABLE capnpc_cpp CAPNPC_CXX_EXECUTABLE)
cannam@48 35 GET_TARGET_PROPERTY(CAPNP_INCLUDE_DIRECTORY capnp_tool CAPNP_INCLUDE_DIRECTORY)
cannam@48 36 list(APPEND tool_depends capnp_tool capnpc_cpp)
cannam@48 37 endif()
cannam@48 38 if(NOT CAPNP_EXECUTABLE)
cannam@48 39 message(SEND_ERROR "Could not locate capnp executable (CAPNP_EXECUTABLE).")
cannam@48 40 endif()
cannam@48 41 if(NOT CAPNPC_CXX_EXECUTABLE)
cannam@48 42 message(SEND_ERROR "Could not locate capnpc-c++ executable (CAPNPC_CXX_EXECUTABLE).")
cannam@48 43 endif()
cannam@48 44 if(NOT CAPNP_INCLUDE_DIRECTORY)
cannam@48 45 message(SEND_ERROR "Could not locate capnp header files (CAPNP_INCLUDE_DIRECTORY).")
cannam@48 46 endif()
cannam@48 47
cannam@48 48 # Default compiler includes
cannam@48 49 set(include_path -I ${CMAKE_CURRENT_SOURCE_DIR} -I ${CAPNP_INCLUDE_DIRECTORY})
cannam@48 50
cannam@48 51 if(DEFINED CAPNPC_IMPORT_DIRS)
cannam@48 52 # Append each directory as a series of '-I' flags in ${include_path}
cannam@48 53 foreach(directory ${CAPNPC_IMPORT_DIRS})
cannam@48 54 get_filename_component(absolute_path "${directory}" ABSOLUTE)
cannam@48 55 list(APPEND include_path -I ${absolute_path})
cannam@48 56 endforeach()
cannam@48 57 endif()
cannam@48 58
cannam@48 59 if(DEFINED CAPNPC_OUTPUT_DIR)
cannam@48 60 # Prepend a ':' to get the format for the '-o' flag right
cannam@48 61 set(output_dir ":${CAPNPC_OUTPUT_DIR}")
cannam@48 62 else()
cannam@48 63 set(output_dir ":.")
cannam@48 64 endif()
cannam@48 65
cannam@48 66 if(NOT DEFINED CAPNPC_SRC_PREFIX)
cannam@48 67 set(CAPNPC_SRC_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}")
cannam@48 68 endif()
cannam@48 69 get_filename_component(CAPNPC_SRC_PREFIX "${CAPNPC_SRC_PREFIX}" ABSOLUTE)
cannam@48 70
cannam@48 71 set(${SOURCES})
cannam@48 72 set(${HEADERS})
cannam@48 73 foreach(schema_file ${ARGN})
cannam@48 74 if(NOT EXISTS "${CAPNPC_SRC_PREFIX}/${schema_file}")
cannam@48 75 message(FATAL_ERROR "Cap'n Proto schema file '${CAPNPC_SRC_PREFIX}/${schema_file}' does not exist!")
cannam@48 76 endif()
cannam@48 77 get_filename_component(file_path "${schema_file}" ABSOLUTE)
cannam@48 78 get_filename_component(file_dir "${file_path}" PATH)
cannam@48 79
cannam@48 80 # Figure out where the output files will go
cannam@48 81 if (NOT DEFINED CAPNPC_OUTPUT_DIR)
cannam@48 82 set(CAPNPC_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/")
cannam@48 83 endif()
cannam@48 84 # Output files are placed in CAPNPC_OUTPUT_DIR, at a location as if they were
cannam@48 85 # relative to CAPNPC_SRC_PREFIX.
cannam@48 86 string(LENGTH "${CAPNPC_SRC_PREFIX}" prefix_len)
cannam@48 87 string(SUBSTRING "${file_path}" 0 ${prefix_len} output_prefix)
cannam@48 88 if(NOT "${CAPNPC_SRC_PREFIX}" STREQUAL "${output_prefix}")
cannam@48 89 message(SEND_ERROR "Could not determine output path for '${schema_file}' ('${file_path}') with source prefix '${CAPNPC_SRC_PREFIX}' into '${CAPNPC_OUTPUT_DIR}'.")
cannam@48 90 endif()
cannam@48 91
cannam@48 92 string(SUBSTRING "${file_path}" ${prefix_len} -1 output_path)
cannam@48 93 set(output_base "${CAPNPC_OUTPUT_DIR}${output_path}")
cannam@48 94
cannam@48 95 add_custom_command(
cannam@48 96 OUTPUT "${output_base}.c++" "${output_base}.h"
cannam@48 97 COMMAND "${CAPNP_EXECUTABLE}"
cannam@48 98 ARGS compile
cannam@48 99 -o ${CAPNPC_CXX_EXECUTABLE}${output_dir}
cannam@48 100 --src-prefix ${CAPNPC_SRC_PREFIX}
cannam@48 101 ${include_path}
cannam@48 102 ${CAPNPC_FLAGS}
cannam@48 103 ${file_path}
cannam@48 104 DEPENDS "${schema_file}" ${tool_depends}
cannam@48 105 COMMENT "Compiling Cap'n Proto schema ${schema_file}"
cannam@48 106 VERBATIM
cannam@48 107 )
cannam@48 108
cannam@48 109 list(APPEND ${SOURCES} "${output_base}.c++")
cannam@48 110 list(APPEND ${HEADERS} "${output_base}.h")
cannam@48 111 endforeach()
cannam@48 112
cannam@48 113 set_source_files_properties(${${SOURCES}} ${${HEADERS}} PROPERTIES GENERATED TRUE)
cannam@48 114 set(${SOURCES} ${${SOURCES}} PARENT_SCOPE)
cannam@48 115 set(${HEADERS} ${${HEADERS}} PARENT_SCOPE)
cannam@48 116 endfunction()