Commit f7d685be authored by Alex Richardson's avatar Alex Richardson Committed by Branislav Katreniak

Add a cmake package config module

This makes it a lot easier for CMake based projects to use Cap'n Proto.

Example usage:

find_package(CapnProto)
capnp_generate_cpp(FOO_SRCS FOO_HDRS foo.capnp)
add_executable(foo main.cpp ${FOO_SRCS})
target_link_libraries(foo CapnProto::capnp CapnProto::capnp-rpc)

This is a lot better than the previous variable based solution since
linking to nonexistent targets is an error whereas an empty variable
expansion (e.g. due to typos) will be silently ignored. It also makes
sure that the right compiler flags, include directories, defines and
link libraries are passed to the compiler for that target without
needing any other include_directories(), etc.
parent 29b2e0c4
...@@ -64,7 +64,6 @@ endif() ...@@ -64,7 +64,6 @@ endif()
if(MSVC) if(MSVC)
# TODO(cleanup): Enable higher warning level in MSVC, but make sure to test # TODO(cleanup): Enable higher warning level in MSVC, but make sure to test
# build with that warning level and clean out false positives. # build with that warning level and clean out false positives.
set(CMAKE_CXX_FLAGS "${CAPNP_LITE_FLAG} ${CMAKE_CXX_FLAGS}")
else() else()
# Note that it's important to add new CXXFLAGS before ones specified by the # Note that it's important to add new CXXFLAGS before ones specified by the
# user, so that the user's flags override them. This is particularly # user, so that the user's flags override them. This is particularly
...@@ -79,15 +78,44 @@ else() ...@@ -79,15 +78,44 @@ else()
# #
# We have to use -std=gnu++0x isntead of -std=c++11 because otherwise we lose # We have to use -std=gnu++0x isntead of -std=c++11 because otherwise we lose
# GNU extensions that we need. # GNU extensions that we need.
set(CMAKE_CXX_FLAGS "-std=gnu++0x -Wall -Wextra -Wno-strict-aliasing -Wno-sign-compare -Wno-unused-parameter -pthread ${CAPNP_LITE_FLAG} ${CMAKE_CXX_FLAGS}") add_compile_options(-std=gnu++0x -Wall -Wextra -Wno-strict-aliasing -Wno-sign-compare -Wno-unused-parameter -pthread)
endif() endif()
# Source ======================================================================= # Source =======================================================================
include(CapnProtoMacros)
add_subdirectory(src) add_subdirectory(src)
# Install ====================================================================== # Install ======================================================================
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/CapnProtoConfigVersion.cmake"
VERSION ${VERSION}
COMPATIBILITY AnyNewerVersion
)
set(CONFIG_PACKAGE_LOCATION ${LIB_INSTALL_DIR}/cmake/CapnProto)
configure_package_config_file(cmake/CapnProtoConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/CapnProtoConfig.cmake
INSTALL_DESTINATION ${CONFIG_PACKAGE_LOCATION}
PATH_VARS INCLUDE_INSTALL_DIR
)
export(EXPORT CapnProtoTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/CapnProtoTargets.cmake"
NAMESPACE CapnProto::
)
install(EXPORT CapnProtoTargets
FILE CapnProtoTargets.cmake
NAMESPACE CapnProto::
DESTINATION ${CONFIG_PACKAGE_LOCATION}
)
install(FILES
cmake/CapnProtoMacros.cmake
${CMAKE_CURRENT_BINARY_DIR}/CapnProtoConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/CapnProtoConfigVersion.cmake
DESTINATION ${CONFIG_PACKAGE_LOCATION}
)
if(NOT MSVC) # Don't install pkg-config files when building with MSVC if(NOT MSVC) # Don't install pkg-config files when building with MSVC
# Variables for pkg-config files # Variables for pkg-config files
set(prefix "${CMAKE_INSTALL_PREFIX}") set(prefix "${CMAKE_INSTALL_PREFIX}")
......
# Example usage:
# find_package(CapnProto)
# capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS schema.capnp)
# add_executable(foo main.cpp ${CAPNP_SRCS})
# target_link_libraries(foo CapnProto::capnp CapnProto::capnp-rpc)
#
# If you are using not using the RPC features you can remove
# 'CapnProto::capnp-rpc' from the target_link_libraries call
#
@PACKAGE_INIT@
set(CapnProto_VERSION @VERSION@)
set(CAPNP_EXECUTABLE $<TARGET_FILE:CapnProto::capnp_tool>)
set(CAPNPC_CXX_EXECUTABLE $<TARGET_FILE:CapnProto::capnpc_cpp>)
set(CAPNP_INCLUDE_DIRECTORY "@PACKAGE_INCLUDE_INSTALL_DIR@")
# work around http://public.kitware.com/Bug/view.php?id=15258
if(NOT _IMPORT_PREFIX)
set(_IMPORT_PREFIX ${PACKAGE_PREFIX_DIR})
endif()
include("${CMAKE_CURRENT_LIST_DIR}/CapnProtoTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/CapnProtoMacros.cmake")
# CAPNP_GENERATE_CPP ===========================================================
#
# Example usage:
# find_package(CapnProto)
# capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS schema.capnp)
# add_executable(foo main.cpp ${CAPNP_SRCS})
# target_link_libraries(foo CapnProto::capnp)
# #
# Finds the Cap'n Proto libraries, and compiles schema files. # If you are using not using the RPC features you can remove
# 'CapnProto::capnp-rpc' from the target_link_libraries call
# #
# Configuration variables (optional): # Configuration variables (optional):
# CAPNPC_OUTPUT_DIR # CAPNPC_OUTPUT_DIR
# Directory to place compiled schema sources (default: the same directory as the schema file). # Directory to place compiled schema sources (default: CMAKE_CURRENT_BINARY_DIR).
# CAPNPC_IMPORT_DIRS # CAPNPC_IMPORT_DIRS
# List of additional include directories for the schema compiler. # List of additional include directories for the schema compiler.
# (CMAKE_CURRENT_SOURCE_DIR and CAPNP_INCLUDE_DIRS are always included.) # (CMAKE_CURRENT_SOURCE_DIR and CAPNP_INCLUDE_DIRECTORY are always included.)
# CAPNPC_SRC_PREFIX # CAPNPC_SRC_PREFIX
# Schema file source prefix (default: CMAKE_CURRENT_SOURCE_DIR). # Schema file source prefix (default: CMAKE_CURRENT_SOURCE_DIR).
# CAPNPC_FLAGS # CAPNPC_FLAGS
# Additional flags to pass to the schema compiler. # Additional flags to pass to the schema compiler.
# #
# Variables that are discovered: # TODO: convert to cmake_parse_arguments
# CAPNP_EXECUTABLE
# Path to the `capnp` tool (can be set to override).
# CAPNPC_CXX_EXECUTABLE
# Path to the `capnpc-c++` tool (can be set to override).
# CAPNP_INCLUDE_DIRS
# Include directories for the library's headers (can be set to override).
# CANP_LIBRARIES
# The Cap'n Proto library paths.
# CAPNP_LIBRARIES_LITE
# Paths to only the 'lite' libraries.
# CAPNP_DEFINITIONS
# Compiler definitions required for building with the library.
# CAPNP_FOUND
# Set if the libraries have been located.
#
# Example usage:
#
# find_package(CapnProto REQUIRED)
# include_directories(${CAPNP_INCLUDE_DIRS})
# add_definitions(${CAPNP_DEFINITIONS})
#
# capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS schema.capnp)
# add_executable(a a.cc ${CAPNP_SRCS} ${CAPNP_HDRS})
# target_link_library(a ${CAPNP_LIBRARIES})
#
# For out-of-source builds:
#
# set(CAPNPC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
# include_directories(${CAPNPC_OUTPUT_DIR})
# capnp_generate_cpp(...)
#
# CAPNP_GENERATE_CPP ===========================================================
function(CAPNP_GENERATE_CPP SOURCES HEADERS) function(CAPNP_GENERATE_CPP SOURCES HEADERS)
if(NOT ARGN) if(NOT ARGN)
...@@ -57,12 +32,12 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS) ...@@ -57,12 +32,12 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS)
if(NOT CAPNPC_CXX_EXECUTABLE) if(NOT CAPNPC_CXX_EXECUTABLE)
message(SEND_ERROR "Could not locate capnpc-c++ executable (CAPNPC_CXX_EXECUTABLE).") message(SEND_ERROR "Could not locate capnpc-c++ executable (CAPNPC_CXX_EXECUTABLE).")
endif() endif()
if(NOT CAPNP_INCLUDE_DIRS) if(NOT CAPNP_INCLUDE_DIRECTORY)
message(SEND_ERROR "Could not locate capnp header files (CAPNP_INCLUDE_DIRS).") message(SEND_ERROR "Could not locate capnp header files (CAPNP_INCLUDE_DIRECTORY).")
endif() endif()
# Default compiler includes # Default compiler includes
set(include_path -I ${CMAKE_CURRENT_SOURCE_DIR} -I ${CAPNP_INCLUDE_DIRS}) set(include_path -I ${CMAKE_CURRENT_SOURCE_DIR} -I ${CAPNP_INCLUDE_DIRECTORY})
if(DEFINED CAPNPC_IMPORT_DIRS) if(DEFINED CAPNPC_IMPORT_DIRS)
# Append each directory as a series of '-I' flags in ${include_path} # Append each directory as a series of '-I' flags in ${include_path}
...@@ -87,29 +62,31 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS) ...@@ -87,29 +62,31 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS)
set(${SOURCES}) set(${SOURCES})
set(${HEADERS}) set(${HEADERS})
foreach(schema_file ${ARGN}) foreach(schema_file ${ARGN})
if(NOT EXISTS "${CAPNPC_SRC_PREFIX}/${schema_file}")
message(FATAL_ERROR "Cap'n Proto schema file '${CAPNPC_SRC_PREFIX}/${schema_file}' does not exist!")
endif()
get_filename_component(file_path "${schema_file}" ABSOLUTE) get_filename_component(file_path "${schema_file}" ABSOLUTE)
get_filename_component(file_dir "${file_path}" PATH) get_filename_component(file_dir "${file_path}" PATH)
# Figure out where the output files will go # Figure out where the output files will go
if (NOT DEFINED CAPNPC_OUTPUT_DIR) if (NOT DEFINED CAPNPC_OUTPUT_DIR)
set(output_base "${file_path}") set(CAPNPC_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/")
else()
# Output files are placed in CAPNPC_OUTPUT_DIR, at a location as if they were
# relative to CAPNPC_SRC_PREFIX.
string(LENGTH "${CAPNPC_SRC_PREFIX}" prefix_len)
string(SUBSTRING "${file_path}" 0 ${prefix_len} output_prefix)
if(NOT "${CAPNPC_SRC_PREFIX}" STREQUAL "${output_prefix}")
message(SEND_ERROR "Could not determine output path for '${schema_file}' ('${file_path}') with source prefix '${CAPNPC_SRC_PREFIX}' into '${CAPNPC_OUTPUT_DIR}'.")
endif()
string(SUBSTRING "${file_path}" ${prefix_len} -1 output_path)
set(output_base "${CAPNPC_OUTPUT_DIR}${output_path}")
endif() endif()
# Output files are placed in CAPNPC_OUTPUT_DIR, at a location as if they were
# relative to CAPNPC_SRC_PREFIX.
string(LENGTH "${CAPNPC_SRC_PREFIX}" prefix_len)
string(SUBSTRING "${file_path}" 0 ${prefix_len} output_prefix)
if(NOT "${CAPNPC_SRC_PREFIX}" STREQUAL "${output_prefix}")
message(SEND_ERROR "Could not determine output path for '${schema_file}' ('${file_path}') with source prefix '${CAPNPC_SRC_PREFIX}' into '${CAPNPC_OUTPUT_DIR}'.")
endif()
string(SUBSTRING "${file_path}" ${prefix_len} -1 output_path)
set(output_base "${CAPNPC_OUTPUT_DIR}${output_path}")
add_custom_command( add_custom_command(
OUTPUT "${output_base}.c++" "${output_base}.h" OUTPUT "${output_base}.c++" "${output_base}.h"
COMMAND "${CAPNP_EXECUTABLE}" COMMAND "${CAPNP_EXECUTABLE}"
ARGS compile ARGS compile
-o ${CAPNPC_CXX_EXECUTABLE}${output_dir} -o ${CAPNPC_CXX_EXECUTABLE}${output_dir}
--src-prefix ${CAPNPC_SRC_PREFIX} --src-prefix ${CAPNPC_SRC_PREFIX}
${include_path} ${include_path}
...@@ -119,6 +96,7 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS) ...@@ -119,6 +96,7 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS)
COMMENT "Compiling Cap'n Proto schema ${schema_file}" COMMENT "Compiling Cap'n Proto schema ${schema_file}"
VERBATIM VERBATIM
) )
list(APPEND ${SOURCES} "${output_base}.c++") list(APPEND ${SOURCES} "${output_base}.c++")
list(APPEND ${HEADERS} "${output_base}.h") list(APPEND ${HEADERS} "${output_base}.h")
endforeach() endforeach()
...@@ -127,71 +105,3 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS) ...@@ -127,71 +105,3 @@ function(CAPNP_GENERATE_CPP SOURCES HEADERS)
set(${SOURCES} ${${SOURCES}} PARENT_SCOPE) set(${SOURCES} ${${SOURCES}} PARENT_SCOPE)
set(${HEADERS} ${${HEADERS}} PARENT_SCOPE) set(${HEADERS} ${${HEADERS}} PARENT_SCOPE)
endfunction() endfunction()
# Find Libraries/Paths =========================================================
# Use pkg-config to get path hints and definitions
find_package(PkgConfig QUIET)
pkg_check_modules(PKGCONFIG_CAPNP capnp)
pkg_check_modules(PKGCONFIG_CAPNP_RPC capnp-rpc QUIET)
pkg_check_modules(PKGCONFIG_CAPNP_JSON capnp-json QUIET)
find_library(CAPNP_LIB_KJ kj
HINTS "${PKGCONFIG_CAPNP_LIBDIR}" ${PKGCONFIG_CAPNP_LIBRARY_DIRS}
)
find_library(CAPNP_LIB_KJ-ASYNC kj-async
HINTS "${PKGCONFIG_CAPNP_RPC_LIBDIR}" ${PKGCONFIG_CAPNP_RPC_LIBRARY_DIRS}
)
find_library(CAPNP_LIB_CAPNP capnp
HINTS "${PKGCONFIG_CAPNP_LIBDIR}" ${PKGCONFIG_CAPNP_LIBRARY_DIRS}
)
find_library(CAPNP_LIB_CAPNP-RPC capnp-rpc
HINTS "${PKGCONFIG_CAPNP_RPC_LIBDIR}" ${PKGCONFIG_CAPNP_RPC_LIBRARY_DIRS}
)
find_library(CAPNP_LIB_CAPNP-JSON capnp-json
HINTS "${PKGCONFIG_CAPNP_JSON_LIBDIR}" ${PKGCONFIG_CAPNP_JSON_LIBRARY_DIRS}
)
mark_as_advanced(CAPNP_LIB_KJ CAPNP_LIB_KJ-ASYNC CAPNP_LIB_CAPNP CAPNP_LIB_CAPNP-RPC CAPNP_LIB_CAPNP-JSON)
set(CAPNP_LIBRARIES_LITE
${CAPNP_LIB_CAPNP}
${CAPNP_LIB_KJ}
)
set(CAPNP_LIBRARIES
${CAPNP_LIB_CAPNP-JSON}
${CAPNP_LIB_CAPNP-RPC}
${CAPNP_LIB_CAPNP}
${CAPNP_LIB_KJ-ASYNC}
${CAPNP_LIB_KJ}
)
# Was only the 'lite' library found?
if(CAPNP_LIB_CAPNP AND NOT CAPNP_LIB_CAPNP-RPC)
set(CAPNP_DEFINITIONS -DCAPNP_LITE)
else()
set(CAPNP_DEFINITIONS)
endif()
find_path(CAPNP_INCLUDE_DIRS capnp/generated-header-support.h
HINTS "${PKGCONFIG_CAPNP_INCLUDEDIR}" ${PKGCONFIG_CAPNP_INCLUDE_DIRS}
)
find_program(CAPNP_EXECUTABLE
NAMES capnp
DOC "Cap'n Proto Command-line Tool"
HINTS "${PKGCONFIG_CAPNP_PREFIX}/bin"
)
find_program(CAPNPC_CXX_EXECUTABLE
NAMES capnpc-c++
DOC "Capn'n Proto C++ Compiler"
HINTS "${PKGCONFIG_CAPNP_PREFIX}/bin"
)
# Only *require* the include directory, libkj, and libcapnp. If compiling with
# CAPNP_LITE, nothing else will be found.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CAPNP DEFAULT_MSG
CAPNP_INCLUDE_DIRS
CAPNP_LIB_KJ
CAPNP_LIB_CAPNP
)
...@@ -7,8 +7,36 @@ if(BUILD_TESTING) ...@@ -7,8 +7,36 @@ if(BUILD_TESTING)
include(CTest) include(CTest)
# Setup CAPNP_GENERATE_CPP for compiling test schemas # Setup CAPNP_GENERATE_CPP for compiling test schemas
find_package(CapnProto QUIET) find_package(CapnProto CONFIG QUIET)
set(CAPNP_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}") if (NOT CapnProto_FOUND)
# Try and find the executables from an autotools-based installation
# Setup paths to the schema compiler for generating ${test_capnp_files}
if(NOT EXTERNAL_CAPNP AND NOT CAPNP_LITE)
set(CAPNP_EXECUTABLE $<TARGET_FILE:capnp_tool>)
set(CAPNPC_CXX_EXECUTABLE $<TARGET_FILE:capnpc_cpp>)
else()
# Allow paths to tools to be set with either environment variables or find_program()
if (NOT CAPNP_EXECUTABLE)
if (DEFINED ENV{CAPNP})
set(CAPNP_EXECUTABLE "$ENV{CAPNP}")
else()
find_program(CAPNP_EXECUTABLE capnp)
endif()
endif()
if(NOT CAPNPC_CXX_EXECUTABLE)
if (DEFINED ENV{CAPNPC_CXX})
set(CAPNPC_CXX_EXECUTABLE "$ENV{CAPNPC_CXX}")
else()
# Also search in the same directory that `capnp` was found in
get_filename_component(capnp_dir "${CAPNP_EXECUTABLE}" DIRECTORY)
find_program(CAPNPC_CXX_EXECUTABLE capnpc-c++ HINTS "${capnp_dir}")
endif()
endif()
endif()
endif()
set(CAPNP_INCLUDE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
# Sadly, we can't use the 'test' target, as that's coopted by ctest # Sadly, we can't use the 'test' target, as that's coopted by ctest
add_custom_target(check "${CMAKE_CTEST_COMMAND}" -V) add_custom_target(check "${CMAKE_CTEST_COMMAND}" -V)
......
...@@ -57,8 +57,9 @@ set(capnp_schemas ...@@ -57,8 +57,9 @@ set(capnp_schemas
) )
add_library(capnp ${capnp_sources}) add_library(capnp ${capnp_sources})
target_link_libraries(capnp kj) target_link_libraries(capnp kj)
#make sure external consumers don't need to manually set the include dirs
install(TARGETS capnp ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") target_include_directories(capnp INTERFACE $<INSTALL_INTERFACE:include>)
install(TARGETS capnp EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${capnp_headers} ${capnp_schemas} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp") install(FILES ${capnp_headers} ${capnp_schemas} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp")
set(capnp-rpc_sources set(capnp-rpc_sources
...@@ -90,7 +91,7 @@ set(capnp-rpc_schemas ...@@ -90,7 +91,7 @@ set(capnp-rpc_schemas
if(NOT CAPNP_LITE) if(NOT CAPNP_LITE)
add_library(capnp-rpc ${capnp-rpc_sources}) add_library(capnp-rpc ${capnp-rpc_sources})
target_link_libraries(capnp-rpc kj-async kj) target_link_libraries(capnp-rpc kj-async kj)
install(TARGETS capnp-rpc ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") install(TARGETS capnp-rpc EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${capnp-rpc_headers} ${capnp-rpc_schemas} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp") install(FILES ${capnp-rpc_headers} ${capnp-rpc_schemas} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp")
endif() endif()
...@@ -110,7 +111,7 @@ set(capnp-json_schemas ...@@ -110,7 +111,7 @@ set(capnp-json_schemas
if(NOT CAPNP_LITE) if(NOT CAPNP_LITE)
add_library(capnp-json ${capnp-json_sources}) add_library(capnp-json ${capnp-json_sources})
target_link_libraries(capnp-json capnp kj-async kj) target_link_libraries(capnp-json capnp kj-async kj)
install(TARGETS capnp-json ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") install(TARGETS capnp-json EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${capnp-json_headers} ${capnp-json_schemas} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp/compat") install(FILES ${capnp-json_headers} ${capnp-json_schemas} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp/compat")
endif() endif()
...@@ -131,7 +132,8 @@ set(capnpc_sources ...@@ -131,7 +132,8 @@ set(capnpc_sources
if(NOT CAPNP_LITE) if(NOT CAPNP_LITE)
add_library(capnpc ${capnpc_sources}) add_library(capnpc ${capnpc_sources})
target_link_libraries(capnpc capnp kj) target_link_libraries(capnpc capnp kj)
install(TARGETS capnpc ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") install(TARGETS capnpc EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${capnpc_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/capnp")
endif() endif()
if(BUILD_TOOLS AND NOT CAPNP_LITE) if(BUILD_TOOLS AND NOT CAPNP_LITE)
...@@ -154,10 +156,10 @@ if(BUILD_TOOLS AND NOT CAPNP_LITE) ...@@ -154,10 +156,10 @@ if(BUILD_TOOLS AND NOT CAPNP_LITE)
target_link_libraries(capnpc_capnp capnp kj) target_link_libraries(capnpc_capnp capnp kj)
set_target_properties(capnpc_capnp PROPERTIES OUTPUT_NAME capnpc-capnp) set_target_properties(capnpc_capnp PROPERTIES OUTPUT_NAME capnpc-capnp)
install(TARGETS capnp_tool capnpc_cpp capnpc_capnp RUNTIME DESTINATION "${BIN_INSTALL_DIR}") install(TARGETS capnp_tool capnpc_cpp capnpc_capnp EXPORT CapnProtoTargets RUNTIME DESTINATION "${BIN_INSTALL_DIR}")
# Symlink capnpc -> capnp # Symlink capnpc -> capnp
install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink capnp \"${BIN_INSTALL_DIR}/capnpc\")") install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink capnp \"\$ENV{DESTDIR}${BIN_INSTALL_DIR}/capnpc\")")
endif() # BUILD_TOOLS AND NOT CAPNP_LITE endif() # BUILD_TOOLS AND NOT CAPNP_LITE
# Tests ======================================================================== # Tests ========================================================================
...@@ -169,32 +171,6 @@ if(BUILD_TESTING) ...@@ -169,32 +171,6 @@ if(BUILD_TESTING)
test-import2.capnp test-import2.capnp
) )
# Setup paths to the schema compiler for generating ${test_capnp_files}
if(NOT EXTERNAL_CAPNP)
set(CAPNP_EXECUTABLE $<TARGET_FILE:capnp_tool>)
set(CAPNPC_CXX_EXECUTABLE $<TARGET_FILE:capnpc_cpp>)
else()
# Allow paths to tools to be set with one of: (1) the CMake variables from the
# the FindCapnProto module; (2) environment variables; or (3) find_program()
if (NOT CAPNP_EXECUTABLE)
if (DEFINED ENV{CAPNP})
set(CAPNP_EXECUTABLE "$ENV{CAPNP}")
else()
find_program(CAPNP_EXECUTABLE capnp)
endif()
endif()
if(NOT CAPNPC_CXX_EXECUTABLE)
if (DEFINED ENV{CAPNPC_CXX})
set(CAPNPC_CXX_EXECUTABLE "$ENV{CAPNPC_CXX}")
else()
# Also search in the same directory that `capnp` was found in
get_filename_component(capnp_dir "${CAPNP_EXECUTABLE}" DIRECTORY)
find_program(CAPNPC_CXX_EXECUTABLE capnpc-c++ HINTS "${capnp_dir}")
endif()
endif()
endif()
# Add "/capnp" to match the path used to import the files in the test sources # Add "/capnp" to match the path used to import the files in the test sources
set(CAPNPC_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/test_capnp/capnp") set(CAPNPC_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/test_capnp/capnp")
include_directories("${CMAKE_CURRENT_BINARY_DIR}/test_capnp") # Note: no "/capnp" include_directories("${CMAKE_CURRENT_BINARY_DIR}/test_capnp") # Note: no "/capnp"
......
...@@ -57,7 +57,14 @@ set(kj-std_headers ...@@ -57,7 +57,14 @@ set(kj-std_headers
std/iostream.h std/iostream.h
) )
add_library(kj ${kj_sources}) add_library(kj ${kj_sources})
install(TARGETS kj ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") if(UNIX)
target_link_libraries(kj PUBLIC pthread)
endif()
#make sure the lite flag propagates to all users (internal + external) of this library
target_compile_definitions(kj PUBLIC ${CAPNP_LITE_FLAG})
#make sure external consumers don't need to manually set the include dirs
target_include_directories(kj INTERFACE $<INSTALL_INTERFACE:include>)
install(TARGETS kj EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${kj_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj") install(FILES ${kj_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj")
install(FILES ${kj-parse_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj/parse") install(FILES ${kj-parse_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj/parse")
install(FILES ${kj-std_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj/std") install(FILES ${kj-std_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj/std")
...@@ -73,7 +80,7 @@ set(kj-test-compat_headers ...@@ -73,7 +80,7 @@ set(kj-test-compat_headers
) )
add_library(kj-test ${kj-test_sources}) add_library(kj-test ${kj-test_sources})
target_link_libraries(kj-test kj) target_link_libraries(kj-test kj)
install(TARGETS kj-test ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") install(TARGETS kj-test EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${kj-test_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj") install(FILES ${kj-test_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj")
install(FILES ${kj-test-compat_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj/compat") install(FILES ${kj-test-compat_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj/compat")
...@@ -94,7 +101,11 @@ set(kj-async_headers ...@@ -94,7 +101,11 @@ set(kj-async_headers
if(NOT CAPNP_LITE) if(NOT CAPNP_LITE)
add_library(kj-async ${kj-async_sources}) add_library(kj-async ${kj-async_sources})
target_link_libraries(kj-async kj) target_link_libraries(kj-async kj)
install(TARGETS kj-async ARCHIVE DESTINATION "${LIB_INSTALL_DIR}") if(UNIX)
# external clients of this library need to link to pthreads
target_compile_options(kj-async INTERFACE "-pthread")
endif()
install(TARGETS kj-async EXPORT CapnProtoTargets ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
install(FILES ${kj-async_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj") install(FILES ${kj-async_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/kj")
endif() endif()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment