set ( CMAKE_EXPORT_COMPILE_COMMANDS ON )
find_program ( CCACHE_PROGRAM ccache )
if ( CCACHE_PROGRAM )
foreach ( lang C CXX )
if ( NOT DEFINED CMAKE_ ${ lang } _COMPILER_LAUNCHER AND NOT CMAKE_ ${ lang } _COMPILER MATCHES ".*/ccache" )
message ( STATUS "Enabling ccache for ${lang}" )
set ( CMAKE_ ${ lang } _COMPILER_LAUNCHER ${ CCACHE_PROGRAM } CACHE STRING "" )
endif ( )
endforeach ( )
endif ( )
cmake_minimum_required ( VERSION 3.7 )
# Has to be set before `project()`, and ignored on non-macos:
set ( CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "macOS deployment target (Apple clang only)" )
project ( liboxenmq
V E R S I O N 1 . 2 . 7
L A N G U A G E S C X X C )
include ( GNUInstallDirs )
message ( STATUS "oxenmq v${PROJECT_VERSION}" )
set ( OXENMQ_LIBVERSION 0 )
if ( CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME )
set ( oxenmq_IS_TOPLEVEL_PROJECT TRUE )
else ( )
set ( oxenmq_IS_TOPLEVEL_PROJECT FALSE )
endif ( )
option ( BUILD_SHARED_LIBS "Build shared libraries instead of static ones" ON )
set ( oxenmq_INSTALL_DEFAULT OFF )
if ( BUILD_SHARED_LIBS OR oxenmq_IS_TOPLEVEL_PROJECT )
set ( oxenmq_INSTALL_DEFAULT ON )
endif ( )
option ( OXENMQ_BUILD_TESTS "Building and perform oxenmq tests" ${ oxenmq_IS_TOPLEVEL_PROJECT } )
option ( OXENMQ_INSTALL "Add oxenmq libraries and headers to cmake install target; defaults to ON if BUILD_SHARED_LIBS is enabled or we are the top-level project; OFF for a static subdirectory build" ${ oxenmq_INSTALL_DEFAULT } )
option ( OXENMQ_INSTALL_CPPZMQ "Install cppzmq header with oxenmq/ headers (requires OXENMQ_INSTALL)" ON )
option ( OXENMQ_LOKIMQ_COMPAT "Install lokimq compatibility headers and pkg-config for rename migration" ON )
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
configure_file ( oxenmq/version.h.in oxenmq/version.h @ONLY )
configure_file ( liboxenmq.pc.in liboxenmq.pc @ONLY )
if ( OXENMQ_LOKIMQ_COMPAT )
configure_file ( liblokimq.pc.in liblokimq.pc @ONLY )
endif ( )
add_library ( oxenmq
o x e n m q / a d d r e s s . c p p
o x e n m q / a u t h . c p p
o x e n m q / b t _ s e r i a l i z e . c p p
o x e n m q / c o n n e c t i o n s . c p p
o x e n m q / j o b s . c p p
o x e n m q / o x e n m q . c p p
o x e n m q / p r o x y . c p p
o x e n m q / w o r k e r . c p p
)
set_target_properties ( oxenmq PROPERTIES SOVERSION ${ OXENMQ_LIBVERSION } )
set ( THREADS_PREFER_PTHREAD_FLAG ON )
find_package ( Threads REQUIRED )
target_link_libraries ( oxenmq PRIVATE Threads::Threads )
# libzmq is nearly impossible to link statically from a system-installed static library: it depends
# on a ton of other libraries, some of which are not all statically available. If the caller wants
# to mess with this, so be it: they can set up a libzmq target and we'll use it. Otherwise if they
# asked us to do things statically, don't even try to find a system lib and just build it.
set ( oxenmq_build_static_libzmq OFF )
if ( TARGET libzmq )
target_link_libraries ( oxenmq PUBLIC libzmq )
elseif ( BUILD_SHARED_LIBS )
include ( FindPkgConfig )
pkg_check_modules ( libzmq libzmq>=4.3 IMPORTED_TARGET )
if ( libzmq_FOUND )
# Debian sid includes a -isystem in the mit-krb package that, starting with pkg-config 0.29.2,
# breaks cmake's pkgconfig module because it stupidly thinks "-isystem" is a path, so if we find
# -isystem in the include dirs then hack it out.
get_property ( zmq_inc TARGET PkgConfig::libzmq PROPERTY INTERFACE_INCLUDE_DIRECTORIES )
list ( FIND zmq_inc "-isystem" broken_isystem )
if ( NOT broken_isystem EQUAL -1 )
list ( REMOVE_AT zmq_inc ${ broken_isystem } )
set_property ( TARGET PkgConfig::libzmq PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${ zmq_inc } )
endif ( )
target_link_libraries ( oxenmq PUBLIC PkgConfig::libzmq )
else ( )
set ( oxenmq_build_static_libzmq ON )
endif ( )
else ( )
set ( oxenmq_build_static_libzmq ON )
endif ( )
if ( oxenmq_build_static_libzmq )
message ( STATUS "libzmq >= 4.3 not found or static build requested, building bundled version" )
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/local-libzmq" )
include ( LocalLibzmq )
target_link_libraries ( oxenmq PUBLIC libzmq_vendor )
endif ( )
target_include_directories ( oxenmq
P U B L I C
$ < I N S T A L L _ I N T E R F A C E : >
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } >
$ < B U I L D _ I N T E R F A C E : $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c p p z m q >
)
target_compile_options ( oxenmq PRIVATE -Wall -Wextra )
option ( WARNINGS_AS_ERRORS "treat all warnings as errors" ON )
if ( WARNINGS_AS_ERRORS )
target_compile_options ( oxenmq PRIVATE -Werror )
endif ( )
set_target_properties ( oxenmq PROPERTIES
C X X _ S T A N D A R D 1 7
C X X _ S T A N D A R D _ R E Q U I R E D O N
C X X _ E X T E N S I O N S O F F
P O S I T I O N _ I N D E P E N D E N T _ C O D E O N
)
function ( link_dep_libs target linktype libdirs )
foreach ( lib ${ ARGN } )
find_library ( link_lib- ${ lib } NAMES ${ lib } PATHS ${ libdirs } )
if ( link_lib- ${ lib } )
target_link_libraries ( ${ target } ${ linktype } ${ link_lib-${lib } } )
endif ( )
endforeach ( )
endfunction ( )
# If the caller has already set up a sodium target then we will just link to it, otherwise we go
# looking for it.
if ( TARGET sodium )
target_link_libraries ( oxenmq PUBLIC sodium )
if ( oxenmq_build_static_libzmq )
target_link_libraries ( libzmq_vendor INTERFACE sodium )
endif ( )
else ( )
include ( FindPkgConfig )
pkg_check_modules ( sodium REQUIRED libsodium IMPORTED_TARGET )
if ( BUILD_SHARED_LIBS )
target_link_libraries ( oxenmq PUBLIC PkgConfig::sodium )
if ( oxenmq_build_static_libzmq )
target_link_libraries ( libzmq_vendor INTERFACE PkgConfig::sodium )
endif ( )
else ( )
link_dep_libs ( oxenmq PUBLIC "${sodium_STATIC_LIBRARY_DIRS}" ${ sodium_STATIC_LIBRARIES } )
target_include_directories ( oxenmq PUBLIC ${ sodium_STATIC_INCLUDE_DIRS } )
if ( oxenmq_build_static_libzmq )
link_dep_libs ( libzmq_vendor INTERFACE "${sodium_STATIC_LIBRARY_DIRS}" ${ sodium_STATIC_LIBRARIES } )
target_link_libraries ( libzmq_vendor INTERFACE ${ sodium_STATIC_INCLUDE_DIRS } )
endif ( )
endif ( )
endif ( )
add_library ( oxenmq::oxenmq ALIAS oxenmq )
if ( OXENMQ_LOKIMQ_COMPAT )
add_library ( lokimq::lokimq ALIAS oxenmq )
endif ( )
export (
T A R G E T S o x e n m q
N A M E S P A C E o x e n m q : :
F I L E o x e n m q T a r g e t s . c m a k e
)
if ( OXENMQ_INSTALL )
install (
T A R G E T S o x e n m q
E X P O R T o x e n m q C o n f i g
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R }
)
install (
F I L E S o x e n m q / a d d r e s s . h
o x e n m q / a u t h . h
o x e n m q / b a s e 3 2 z . h
o x e n m q / b a s e 6 4 . h
o x e n m q / b a t c h . h
o x e n m q / b t _ s e r i a l i z e . h
o x e n m q / b t _ v a l u e . h
o x e n m q / b y t e _ t y p e . h
o x e n m q / c o n n e c t i o n s . h
o x e n m q / h e x . h
o x e n m q / o x e n m q . h
o x e n m q / m e s s a g e . h
o x e n m q / v a r i a n t . h
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / o x e n m q / v e r s i o n . h
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } / o x e n m q
)
if ( OXENMQ_INSTALL_CPPZMQ )
install (
F I L E S c p p z m q / z m q . h p p
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } / o x e n m q
)
endif ( )
install (
F I L E S $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / l i b o x e n m q . p c
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } / p k g c o n f i g
)
if ( OXENMQ_LOKIMQ_COMPAT )
install (
F I L E S l o k i m q / a d d r e s s . h
l o k i m q / a u t h . h
l o k i m q / b a s e 3 2 z . h
l o k i m q / b a s e 6 4 . h
l o k i m q / b a t c h . h
l o k i m q / b t _ s e r i a l i z e . h
l o k i m q / b t _ v a l u e . h
l o k i m q / c o n n e c t i o n s . h
l o k i m q / h e x . h
l o k i m q / l o k i m q . h
l o k i m q / m e s s a g e . h
l o k i m q / v a r i a n t . h
l o k i m q / v e r s i o n . h
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } / l o k i m q
)
install (
F I L E S $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / l i b l o k i m q . p c
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } / p k g c o n f i g
)
endif ( )
endif ( )
if ( OXENMQ_BUILD_TESTS )
add_subdirectory ( tests )
endif ( )