#[[
We need to be able to set the C version in a standard way, which was not
added until CMake 3.1 with the C_STANDARD property.
The feature c_std_99 was added to CMake 3.8. The feature is more desirable
than C_STANDARD because it's a minimum rather than an exact. This way if a
compiler prefers a newer version it is free to do so, and most compilers on
the latest releases do prefer a newer C standard.
Operating System Matrix
OS OS_VERSION OS_CODENAME CMAKE_VERSION
Debian 8 Jessie 3.0.2
Debian 9 Stretch 3.7.2
Debian 10 Buster 3.13
CentOS 6 2.8.12
CentOS 7 2.8.12
CentOS 8 3.11
Ubuntu 14.04 Trusty 2.8.12
Ubuntu 16.04 Xenial 3.5
Ubuntu 18.04 Bionic 3.10
I decided to pick the next lowest version after 3.8 that is supported by a
major operating system: 3.10.
#]]
cmake_minimum_required(VERSION 3.10)
project(DogstatsdClient
VERSION 0.1.0
LANGUAGES C
)
add_library(DogstatsdClient client.c)
target_include_directories(DogstatsdClient PUBLIC
$
$
)
target_compile_features(DogstatsdClient PRIVATE c_std_99)
set_target_properties(DogstatsdClient PROPERTIES
OUTPUT_NAME dogstatsd_client # It should be named libdogstatsd_client.{a,so}, not libDogstatsdClient.{a,so}
PUBLIC_HEADER dogstatsd_client/client.h
VERSION ${PROJECT_VERSION}
)
#[[
We want to be able to use the namespaced name everywhere, including in this project's tests;
this is a pattern described in the talk Effective CMake that allows that
#]]
add_library(DogstatsdClient::DogstatsdClient ALIAS DogstatsdClient)
# Add infrastructure for enabling tests
option(BUILD_TESTING "Enable tests" OFF)
include(CTest)
if (${BUILD_TESTING})
enable_testing()
add_subdirectory(test)
endif()
# Everything below this line is for usage in other projects via CMake or pkg-config
install(
TARGETS DogstatsdClient
EXPORT DogstatsdClientTargets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include/dogstatsd_client
INCLUDES DESTINATION include/dogstatsd_client
)
install(
EXPORT DogstatsdClientTargets
NAMESPACE DogstatsdClient::
DESTINATION share/cmake/DogstatsdClient
)
# This allows the exports to be used from the build tree, instead of only after installing
export(
TARGETS DogstatsdClient
FILE DogstatsdClientExports.cmake
)
include(CMakePackageConfigHelpers)
# When the library is more stable, change ExactVersion to SameMajorVersion
write_basic_package_version_file("DogstatsdClientVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY ExactVersion
)
install(
FILES "${PROJECT_BINARY_DIR}/DogstatsdClientVersion.cmake"
DESTINATION share/cmake/DogstatsdClient
)
# pkg-config support
configure_file(${PROJECT_SOURCE_DIR}/dogstatsd_client.pc.in
${PROJECT_BINARY_DIR}/share/pkgconfig/dogstatsd_client.pc @ONLY
)
install(
FILES ${PROJECT_BINARY_DIR}/share/pkgconfig/dogstatsd_client.pc
DESTINATION share/pkgconfig
)