Skip to content

Commit

Permalink
Support building with local dependencies (no Hunter)
Browse files Browse the repository at this point in the history
Restructure the build system to follow CMake conventions: use import
libraries consistently, separate CMakeLists.txt for targets, etc.

Add Find packages to discover local dependencies not already supported
by CMake natively. These are used when Hunter is disabled to allow
jaeger cpp-client to use locally installed libraries.

This is a preliminary step in splitting the test sources out of the
library.

Improves jaegertracing#38 Offline builds

This introduces support for building with

   cmake -DHUNTER_ENABLED=0

Limitations for local dependency builds:

  - Requires a locally installed Thrift 0.9.2 or 0.9.3 EXACTLY,
    not newer or older. These versions are not widely packaged
    so a local install is necessary.  (jaegertracing#45)

  - Requires nlohmann json 2.1.0 or newer, which is not widely
    packaged in Linux distros. Install a local copy. (jaegertracing#47)

Signed-off-by: Craig Ringer <craig@2ndquadrant.com>
  • Loading branch information
ringerc committed Feb 2, 2018
1 parent c36adcf commit a1063de
Show file tree
Hide file tree
Showing 9 changed files with 513 additions and 369 deletions.
309 changes: 33 additions & 276 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
cmake_minimum_required(VERSION 3.3)

# See https://cmake.org/cmake/help/v3.3/manual/cmake-packages.7.html
# See https://rix0r.nl/blog/2015/08/13/cmake-guide/

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchain.cmake"
Expand All @@ -14,7 +17,16 @@ HunterGate(
LOCAL
)

project(jaegertracing VERSION 0.3.0)
project(jaegertracing VERSION 0.3.0 LANGUAGES CXX)

# Layout. This works for all platforms:
# * <prefix>/lib/cmake/<PROJECT-NAME>
# * <prefix>/lib/
# * <prefix>/include/
set(config_install_dir "lib/cmake/${PROJECT_NAME}")
set(include_install_dir "include")

set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
CMAKE_CXX_COMPILER_ID MATCHES "Clang")
Expand All @@ -33,40 +45,22 @@ else()
set(hunter_config "")
endif()

set(package_deps)

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND
CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9")
set(boost_components regex)
hunter_add_package(Boost COMPONENTS regex)
list(APPEND LIBS Boost::regex)
else()
set(boost_components)
hunter_add_package(Boost)
endif()
find_package(Boost ${hunter_config} REQUIRED ${boost_components})
list(APPEND package_deps Boost)
hunter_add_package(Boost COMPONENTS regex)
find_package(Boost ${hunter_config} REQUIRED regex)

hunter_add_package(thrift)
find_package(thrift ${hunter_config} REQUIRED)
if(HUNTER_ENABLED)
list(APPEND LIBS thrift::thrift_static)
else()
list(APPEND LIBS ${THRIFT_LIBRARIES})
find_package(thrift 0.9.2 ${hunter_config} REQUIRED)
if(thrift_VERSION VERSION_GREATER "0.9.3")
message(WARNING "jaeger-cpp is only known to work with Thrift 0.9.2 and Thrift 0.9.3")
endif()
list(APPEND package_deps thrift)

hunter_add_package(opentracing-cpp)
# Not `${hunter_config}` because OpenTracing provides its own
# OpenTracingConfig.cmake file
find_package(OpenTracing CONFIG REQUIRED)
list(APPEND LIBS OpenTracing::opentracing-static)
list(APPEND package_deps opentracing-cpp)
find_package(OpenTracing ${hunter_config} REQUIRED)

hunter_add_package(nlohmann_json)
find_package(nlohmann_json CONFIG REQUIRED)
list(APPEND LIBS nlohmann_json)
list(APPEND package_deps nlohmann_json)
find_package(nlohmann_json 2.1.0 ${hunter_config} REQUIRED)

option(JAEGERTRACING_COVERAGE "Build with coverage" $ENV{COVERAGE})
option(JAEGERTRACING_BUILD_CROSSDOCK "Build crossdock" $ENV{CROSSDOCK})
Expand All @@ -76,233 +70,15 @@ cmake_dependent_option(

if(JAEGERTRACING_WITH_YAML_CPP)
hunter_add_package(yaml-cpp)
# Not `${hunter_config}` because yaml-cpp provides its own
# yaml-cpp-config.cmake file
find_package(yaml-cpp CONFIG REQUIRED)
if(HUNTER_ENABLED)
list(APPEND LIBS yaml-cpp::yaml-cpp)
else()
list(APPEND LIBS yaml-cpp)
endif()
list(APPEND package_deps yaml-cpp)
find_package(yaml-cpp ${hunter_config} REQUIRED)
endif()

include(CTest)
if(BUILD_TESTING)
hunter_add_package(GTest)
find_package(GTest ${hunter_config} REQUIRED)

if(JAEGERTRACING_COVERAGE)
include(CodeCoverage)
append_coverage_compiler_flags()
set(COVERAGE_EXCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/src/jaegertracing/thrift-gen/*"
"*Test.cpp")
endif()
endif()

if(JAEGERTRACING_BUILD_CROSSDOCK)
set(CROSSDOCK_SRC crossdock/Server.cpp)
add_executable(crossdock ${CROSSDOCK_SRC})
target_include_directories(crossdock PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/crossdock>)
target_link_libraries(crossdock PUBLIC jaegertracing-static)

set(JAEGER_CROSSDOCK_URL
"https://raw.githubusercontent.com/jaegertracing/jaeger/master/docker-compose/\
jaeger-docker-compose.yml")
file(DOWNLOAD ${JAEGER_CROSSDOCK_URL}
"${PROJECT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml")
find_program(DOCKER_COMPOSE_EXE docker-compose REQUIRED)
set(DOCKER_COMPOSE_CMD ${DOCKER_COMPOSE_EXE}
-f ${PROJECT_SOURCE_DIR}/crossdock/docker-compose.yml
-f ${PROJECT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml)
add_custom_target(crossdock-kill
COMMAND ${DOCKER_COMPOSE_CMD} kill
COMMAND ${DOCKER_COMPOSE_CMD} rm --force)
add_custom_target(crossdock-run
COMMAND ${DOCKER_COMPOSE_CMD} build
COMMAND ${DOCKER_COMPOSE_CMD} run crossdock
DEPENDS crossdock-kill)
add_custom_target(crossdock-fresh
COMMAND ${DOCKER_COMPOSE_CMD} pull
COMMAND ${DOCKER_COMPOSE_CMD} build
COMMAND ${DOCKER_COMPOSE_CMD} run crossdock
DEPENDS crossdock-kill)
add_custom_target(crossdock-logs
COMMAND ${DOCKER_COMPOSE_CMD} logs)
endif()

set(SRC
src/jaegertracing/Config.cpp
src/jaegertracing/LogRecord.cpp
src/jaegertracing/Logging.cpp
src/jaegertracing/Reference.cpp
src/jaegertracing/Span.cpp
src/jaegertracing/SpanContext.cpp
src/jaegertracing/Tag.cpp
src/jaegertracing/TraceID.cpp
src/jaegertracing/Tracer.cpp
src/jaegertracing/Transport.cpp
src/jaegertracing/UDPTransport.cpp
src/jaegertracing/baggage/BaggageSetter.cpp
src/jaegertracing/baggage/RemoteRestrictionJSON.cpp
src/jaegertracing/baggage/RemoteRestrictionManager.cpp
src/jaegertracing/baggage/Restriction.cpp
src/jaegertracing/baggage/RestrictionManager.cpp
src/jaegertracing/baggage/RestrictionsConfig.cpp
src/jaegertracing/metrics/Counter.cpp
src/jaegertracing/metrics/Gauge.cpp
src/jaegertracing/metrics/InMemoryStatsReporter.cpp
src/jaegertracing/metrics/Metric.cpp
src/jaegertracing/metrics/Metrics.cpp
src/jaegertracing/metrics/NullCounter.cpp
src/jaegertracing/metrics/NullGauge.cpp
src/jaegertracing/metrics/NullStatsFactory.cpp
src/jaegertracing/metrics/NullStatsReporter.cpp
src/jaegertracing/metrics/NullTimer.cpp
src/jaegertracing/metrics/StatsFactory.cpp
src/jaegertracing/metrics/StatsFactoryImpl.cpp
src/jaegertracing/metrics/StatsReporter.cpp
src/jaegertracing/metrics/Timer.cpp
src/jaegertracing/net/IPAddress.cpp
src/jaegertracing/net/Socket.cpp
src/jaegertracing/net/URI.cpp
src/jaegertracing/net/http/Error.cpp
src/jaegertracing/net/http/Header.cpp
src/jaegertracing/net/http/Method.cpp
src/jaegertracing/net/http/Request.cpp
src/jaegertracing/net/http/Response.cpp
src/jaegertracing/platform/Endian.cpp
src/jaegertracing/platform/Hostname.cpp
src/jaegertracing/propagation/Extractor.cpp
src/jaegertracing/propagation/HeadersConfig.cpp
src/jaegertracing/propagation/Injector.cpp
src/jaegertracing/propagation/Propagator.cpp
src/jaegertracing/reporters/CompositeReporter.cpp
src/jaegertracing/reporters/Config.cpp
src/jaegertracing/reporters/InMemoryReporter.cpp
src/jaegertracing/reporters/LoggingReporter.cpp
src/jaegertracing/reporters/NullReporter.cpp
src/jaegertracing/reporters/RemoteReporter.cpp
src/jaegertracing/reporters/Reporter.cpp
src/jaegertracing/samplers/AdaptiveSampler.cpp
src/jaegertracing/samplers/Config.cpp
src/jaegertracing/samplers/ConstSampler.cpp
src/jaegertracing/samplers/GuaranteedThroughputProbabilisticSampler.cpp
src/jaegertracing/samplers/ProbabilisticSampler.cpp
src/jaegertracing/samplers/RateLimitingSampler.cpp
src/jaegertracing/samplers/RemoteSamplingJSON.cpp
src/jaegertracing/samplers/RemotelyControlledSampler.cpp
src/jaegertracing/samplers/Sampler.cpp
src/jaegertracing/samplers/SamplingStatus.cpp
src/jaegertracing/thrift-gen/Agent.cpp
src/jaegertracing/thrift-gen/AggregationValidator.cpp
src/jaegertracing/thrift-gen/BaggageRestrictionManager.cpp
src/jaegertracing/thrift-gen/Collector.cpp
src/jaegertracing/thrift-gen/Dependency.cpp
src/jaegertracing/thrift-gen/SamplingManager.cpp
src/jaegertracing/thrift-gen/TracedService.cpp
src/jaegertracing/thrift-gen/ZipkinCollector.cpp
src/jaegertracing/thrift-gen/agent_constants.cpp
src/jaegertracing/thrift-gen/agent_types.cpp
src/jaegertracing/thrift-gen/aggregation_validator_constants.cpp
src/jaegertracing/thrift-gen/aggregation_validator_types.cpp
src/jaegertracing/thrift-gen/baggage_constants.cpp
src/jaegertracing/thrift-gen/baggage_types.cpp
src/jaegertracing/thrift-gen/dependency_constants.cpp
src/jaegertracing/thrift-gen/dependency_types.cpp
src/jaegertracing/thrift-gen/jaeger_constants.cpp
src/jaegertracing/thrift-gen/jaeger_types.cpp
src/jaegertracing/thrift-gen/sampling_constants.cpp
src/jaegertracing/thrift-gen/sampling_types.cpp
src/jaegertracing/thrift-gen/tracetest_constants.cpp
src/jaegertracing/thrift-gen/tracetest_types.cpp
src/jaegertracing/thrift-gen/zipkincore_constants.cpp
src/jaegertracing/thrift-gen/zipkincore_types.cpp
src/jaegertracing/utils/ErrorUtil.cpp
src/jaegertracing/utils/HexParsing.cpp
src/jaegertracing/utils/RateLimiter.cpp
src/jaegertracing/utils/Regex.cpp
src/jaegertracing/utils/UDPClient.cpp
src/jaegertracing/utils/YAML.cpp)

add_library(jaegertracing SHARED ${SRC})
target_include_directories(jaegertracing PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src>)
target_link_libraries(jaegertracing ${LIBS})
set_target_properties(jaegertracing PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR})

add_library(jaegertracing-static STATIC ${SRC})
target_include_directories(jaegertracing-static PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/src>)
target_link_libraries(jaegertracing-static ${LIBS})
set_target_properties(jaegertracing-static PROPERTIES
OUTPUT_NAME jaegertracing)

configure_file(
src/jaegertracing/Constants.h.in
src/jaegertracing/Constants.h
@ONLY)
set(CMAKE_INSTALL_CURRENT_DIR ON)

if(BUILD_TESTING)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/jaegertracing/testutils")
set(TEST_SRC
src/jaegertracing/ConfigTest.cpp
src/jaegertracing/ReferenceTest.cpp
src/jaegertracing/SpanContextTest.cpp
src/jaegertracing/SpanTest.cpp
src/jaegertracing/TagTest.cpp
src/jaegertracing/TraceIDTest.cpp
src/jaegertracing/TracerTest.cpp
src/jaegertracing/UDPTransportTest.cpp
src/jaegertracing/baggage/BaggageTest.cpp
src/jaegertracing/metrics/MetricsTest.cpp
src/jaegertracing/metrics/NullStatsFactoryTest.cpp
src/jaegertracing/net/IPAddressTest.cpp
src/jaegertracing/net/SocketTest.cpp
src/jaegertracing/net/URITest.cpp
src/jaegertracing/net/http/HeaderTest.cpp
src/jaegertracing/net/http/MethodTest.cpp
src/jaegertracing/net/http/ResponseTest.cpp
src/jaegertracing/propagation/PropagatorTest.cpp
src/jaegertracing/reporters/ReporterTest.cpp
src/jaegertracing/samplers/SamplerTest.cpp
src/jaegertracing/testutils/MockAgentTest.cpp
src/jaegertracing/testutils/TracerUtil.cpp
src/jaegertracing/testutils/TUDPTransportTest.cpp
src/jaegertracing/utils/ErrorUtilTest.cpp
src/jaegertracing/utils/RateLimiterTest.cpp
src/jaegertracing/utils/UDPClientTest.cpp)
add_executable(UnitTest ${TEST_SRC})
target_compile_definitions(UnitTest PUBLIC
GTEST_HAS_TR1_TUPLE=0
GTEST_USE_OWN_TR1_TUPLE=0)
target_link_libraries(
UnitTest testutils GTest::main jaegertracing-static ${LIBS})
add_test(NAME UnitTest COMMAND UnitTest)
if(JAEGERTRACING_COVERAGE)
setup_target_for_coverage(NAME UnitTestCoverage
EXECUTABLE UnitTest
DEPENDENCIES UnitTest)
endif()
if(JAEGERTRACING_COVERAGE)
include(CodeCoverage)
endif()

# Installation (https://github.com/forexample/package-example)

# Layout. This works for all platforms:
# * <prefix>/lib/cmake/<PROJECT-NAME>
# * <prefix>/lib/
# * <prefix>/include/
set(config_install_dir "lib/cmake/${PROJECT_NAME}")
set(include_install_dir "include")

set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")

# Installation and CMake package
#
# Configuration
set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake")
set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake")
Expand All @@ -329,33 +105,6 @@ configure_package_config_file(
INSTALL_DESTINATION "${config_install_dir}"
)

# Targets:
# * <prefix>/lib/libjaegertracing.a
# * <prefix>/lib/libjaegertracing.so
# * header location after install: <prefix>/include/jaegertracing/Tracer.h
# * headers can be included by C++ code `#include <jaegertracing/Tracer.h>`
install(
TARGETS jaegertracing jaegertracing-static
EXPORT "${TARGETS_EXPORT_NAME}"
LIBRARY DESTINATION "lib"
ARCHIVE DESTINATION "lib"
RUNTIME DESTINATION "bin"
INCLUDES DESTINATION "${include_install_dir}"
)

# Headers:
# * src/jaegertracing/Tracer.h -> <prefix>/include/jaegertracing/Tracer.h
install(DIRECTORY "src/jaegertracing"
DESTINATION "${include_install_dir}"
FILES_MATCHING
PATTERN "*.h"
PATTERN "testutils/*.h" EXCLUDE)

# * build/src/jaegertracing/Constants.h ->
# <prefix>/include/jaegertracing/Constants.h
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/src/jaegertracing/Constants.h"
DESTINATION "${include_install_dir}/jaegertracing")

# Config
# * <prefix>/lib/cmake/jaegertracing/jaegertracingConfig.cmake
# * <prefix>/lib/cmake/jaegertracing/jaegertracingConfigVersion.cmake
Expand All @@ -371,3 +120,11 @@ install(
NAMESPACE "${namespace}"
DESTINATION "${config_install_dir}"
)

if (BUILD_TESTING)
enable_testing()
add_custom_target(check COMMAND echo "run make test instead")
endif()

add_subdirectory(src/jaegertracing)
add_subdirectory(crossdock)
Loading

0 comments on commit a1063de

Please sign in to comment.