`make check` is also added to compile and run the tests Catch is fetched with cmake automatically into the build directory when needed
216 lines
5.6 KiB
CMake
216 lines
5.6 KiB
CMake
cmake_minimum_required(VERSION 2.6)
|
|
|
|
project(biboumi)
|
|
|
|
set(${PROJECT_NAME}_VERSION_MAJOR 3)
|
|
set(${PROJECT_NAME}_VERSION_MINOR 0)
|
|
set(${PROJECT_NAME}_VERSION_SUFFIX "~dev")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y -pedantic -Wall -Wextra")
|
|
|
|
# Define a __FILENAME__ macro to get the filename of each file, instead of
|
|
# the full path as in __FILE__
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__FILENAME__='\"$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<))\"'")
|
|
|
|
#
|
|
## Look for external libraries
|
|
#
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
|
|
|
|
#
|
|
## Get the software version
|
|
#
|
|
set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR})
|
|
if(${PROJECT_NAME}_VERSION_SUFFIX MATCHES ".+")
|
|
set(ARCHIVE_NAME ${ARCHIVE_NAME}-${${PROJECT_NAME}_VERSION_SUFFIX})
|
|
endif()
|
|
|
|
if(${PROJECT_NAME}_VERSION_SUFFIX MATCHES "^~dev$")
|
|
# If we are on a dev version, append the hash of the current git HEAD to
|
|
# the version
|
|
include(FindGit)
|
|
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
execute_process(COMMAND git --git-dir=${CMAKE_SOURCE_DIR}/.git rev-parse --short HEAD
|
|
OUTPUT_VARIABLE GIT_REVISION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if(GIT_REVISION)
|
|
set(${PROJECT_NAME}_VERSION_SUFFIX "${${PROJECT_NAME}_VERSION_SUFFIX} (${GIT_REVISION})")
|
|
set(ARCHIVE_NAME ${ARCHIVE_NAME}-${GIT_REVISION})
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
set(SOFTWARE_VERSION
|
|
${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}${${PROJECT_NAME}_VERSION_SUFFIX})
|
|
|
|
include(CheckFunctionExists)
|
|
check_function_exists(ppoll HAVE_PPOLL_FUNCTION)
|
|
|
|
# To be able to include the config.h and other files generated by cmake
|
|
include_directories("${CMAKE_CURRENT_BINARY_DIR}/src/")
|
|
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/")
|
|
include_directories("${CMAKE_CURRENT_BINARY_DIR}/")
|
|
|
|
#
|
|
## Documentation
|
|
#
|
|
set(MAN_PAGE ${CMAKE_CURRENT_BINARY_DIR}/doc/${PROJECT_NAME}.1)
|
|
set(DOC_PAGE ${CMAKE_CURRENT_SOURCE_DIR}/doc/${PROJECT_NAME}.1.md)
|
|
find_program(RONN_EXECUTABLE NAMES ronn
|
|
DOC "The ronn software, to build the man page from the markdown documentation")
|
|
if(RONN_EXECUTABLE)
|
|
set(WITH_DOC true)
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc/)
|
|
add_custom_command(OUTPUT ${MAN_PAGE}
|
|
COMMAND ${RONN_EXECUTABLE} --roff < ${DOC_PAGE} > ${MAN_PAGE}
|
|
DEPENDS ${DOC_PAGE})
|
|
add_custom_target(doc DEPENDS ${MAN_PAGE})
|
|
endif()
|
|
|
|
# Look for litesql and enable the database if found
|
|
if(WITH_LITESQL)
|
|
find_package(LITESQL REQUIRED)
|
|
elseif(NOT WITHOUT_LITESQL)
|
|
find_package(LITESQL)
|
|
endif()
|
|
|
|
if(LITESQL_FOUND)
|
|
LITESQL_GENERATE_CPP("database/database.xml"
|
|
"biboudb"
|
|
LITESQL_GENERATED_SOURCES)
|
|
|
|
add_library(database STATIC src/database/database.cpp
|
|
${LITESQL_GENERATED_SOURCES})
|
|
target_link_libraries(database ${LITESQL_LIBRARIES} ${BOTAN_LIBRARIES})
|
|
set(USE_DATABASE TRUE)
|
|
endif()
|
|
|
|
add_subdirectory("louloulibs")
|
|
include_directories("louloulibs")
|
|
|
|
include_directories(${EXPAT_INCLUDE_DIRS})
|
|
include_directories(${ICONV_INCLUDE_DIRS})
|
|
include_directories(${LIBUUID_INCLUDE_DIRS})
|
|
|
|
# If they are found in louloulibs CMakeLists.txt, we inherite these values
|
|
if(SYSTEMD_FOUND)
|
|
include_directories(${SYSTEMD_INCLUDE_DIRS})
|
|
endif()
|
|
if(BOTAN_FOUND)
|
|
include_directories(SYSTEM ${BOTAN_INCLUDE_DIRS})
|
|
endif()
|
|
if(CARES_FOUND)
|
|
include_directories(${CARES_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
#
|
|
## irclib
|
|
#
|
|
file(GLOB source_irc
|
|
src/irc/*.[hc]pp)
|
|
add_library(irc STATIC ${source_irc})
|
|
target_link_libraries(irc network utils logger)
|
|
|
|
#
|
|
## xmpp
|
|
#
|
|
file(GLOB source_xmpp
|
|
src/xmpp/*.[hc]pp)
|
|
add_library(xmpp STATIC ${source_xmpp})
|
|
target_link_libraries(xmpp xmpplib bridge network utils logger)
|
|
|
|
if(USE_DATABASE)
|
|
target_link_libraries(xmpp database)
|
|
endif()
|
|
|
|
#
|
|
## bridge
|
|
#
|
|
file(GLOB source_bridge
|
|
src/bridge/*.[hc]pp)
|
|
add_library(bridge STATIC ${source_bridge})
|
|
target_link_libraries(bridge xmpp irc utils logger)
|
|
|
|
#
|
|
## Main executable
|
|
#
|
|
add_executable(${PROJECT_NAME} src/main.cpp)
|
|
target_link_libraries(${PROJECT_NAME}
|
|
xmpp
|
|
irc
|
|
bridge
|
|
utils
|
|
config)
|
|
if(SYSTEMD_FOUND)
|
|
target_link_libraries(xmpp ${SYSTEMD_LIBRARIES})
|
|
endif()
|
|
|
|
#
|
|
## Tests
|
|
#
|
|
file(GLOB source_tests
|
|
tests/*.cpp)
|
|
add_executable(test_suite EXCLUDE_FROM_ALL
|
|
${source_tests})
|
|
target_link_libraries(test_suite
|
|
xmpplib
|
|
xmpp
|
|
irc
|
|
bridge
|
|
utils
|
|
config
|
|
logger
|
|
network)
|
|
if(USE_DATABASE)
|
|
target_link_libraries(test_suite
|
|
database)
|
|
endif()
|
|
include(ExternalProject)
|
|
ExternalProject_Add(catch
|
|
GIT_REPOSITORY "https://github.com/philsquared/Catch.git"
|
|
PREFIX "external"
|
|
UPDATE_COMMAND ""
|
|
CONFIGURE_COMMAND ""
|
|
BUILD_COMMAND ""
|
|
INSTALL_COMMAND ""
|
|
)
|
|
ExternalProject_Get_Property(catch SOURCE_DIR)
|
|
target_include_directories(test_suite
|
|
PUBLIC "${SOURCE_DIR}/include/"
|
|
)
|
|
add_dependencies(test_suite catch)
|
|
add_custom_target(check COMMAND "test_suite"
|
|
DEPENDS test_suite)
|
|
|
|
#
|
|
## Install target
|
|
#
|
|
install(TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION bin)
|
|
if(WITH_DOC)
|
|
install(FILES ${MAN_PAGE} DESTINATION share/man/man1 OPTIONAL)
|
|
endif()
|
|
|
|
#
|
|
## Dist target
|
|
## Generate a release tarball from the git sources
|
|
#
|
|
add_custom_target(dist
|
|
COMMAND git archive --prefix=${ARCHIVE_NAME}/ --format=tar HEAD
|
|
| xz > ${CMAKE_CURRENT_BINARY_DIR}/${ARCHIVE_NAME}.tar.xz
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
|
|
if(BOTAN_FOUND)
|
|
set(STR_WITH_BOTAN "Botan: yes")
|
|
else()
|
|
set(STR_WITH_BOTAN "Botan: no")
|
|
endif()
|
|
if(CARES_FOUND)
|
|
set(STR_WITH_CARES "c-ares: yes")
|
|
else()
|
|
set(STR_WITH_CARES "c-ares: no")
|
|
endif()
|
|
add_custom_target(PrintBuildParameters ALL
|
|
${CMAKE_COMMAND} -E cmake_echo_color --cyan "Compiling ${PROJECT_NAME} with ${STR_WITH_BOTAN}, ${STR_WITH_CARES}")
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/biboumi.h.cmake ${CMAKE_BINARY_DIR}/src/biboumi.h) |