cmake_minimum_required(VERSION 2.6) project(biboumi) set(${PROJECT_NAME}_VERSION_MAJOR 0) set(${PROJECT_NAME}_VERSION_MINOR 1) 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_SOURCE_DIR}/cmake/Modules/") include(FindEXPAT) find_package(EXPAT REQUIRED) find_package(Iconv REQUIRED) find_package(Libuuid REQUIRED) find_package(Libidn) find_package(SystemdDaemon) # To be able to include the config.h file generated by cmake include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/") include_directories("${CMAKE_CURRENT_BINARY_DIR}/src/") include_directories(${EXPAT_INCLUDE_DIRS}) include_directories(${ICONV_INCLUDE_DIRS}) include_directories(${LIBUUID_INCLUDE_DIRS}) if(LIBIDN_FOUND) include_directories(${LIBIDN_INCLUDE_DIRS}) endif() if(SYSTEMDDAEMON_FOUND) include_directories(${SYSTEMDDAEMON_INCLUDE_DIRS}) endif() set(POLLER_DOCSTRING "Choose the poller between POLL and EPOLL (Linux-only)") if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(POLLER "EPOLL" CACHE STRING ${POLLER_DOCSTRING}) else() set(POLLER "POLL" CACHE STRING ${POLLER_DOCSTRING}) endif() if((NOT ${POLLER} MATCHES "POLL") AND (NOT ${POLLER} MATCHES "EPOLL")) message(FATAL_ERROR "POLLER must be either POLL or EPOLL") endif() # ## 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() # ## utils # file(GLOB source_utils src/utils/*.[hc]pp) add_library(utils STATIC ${source_utils}) target_link_libraries(utils ${ICONV_LIBRARIES}) # ## config # file(GLOB source_config src/config/*.[hc]pp) add_library(config STATIC ${source_config}) target_link_libraries(config utils) # ## logger # file(GLOB source_logger src/logger/*.[hc]pp) add_library(logger STATIC ${source_logger}) target_link_libraries(logger config) # ## network # file(GLOB source_network src/network/*.[hc]pp) add_library(network STATIC ${source_network}) target_link_libraries(network logger) # ## irclib # file(GLOB source_irc src/irc/*.[hc]pp) add_library(irc STATIC ${source_irc}) target_link_libraries(irc network utils logger) # ## xmpplib # file(GLOB source_xmpp src/xmpp/*.[hc]pp) add_library(xmpp STATIC ${source_xmpp}) target_link_libraries(xmpp bridge network utils logger ${EXPAT_LIBRARIES} ${LIBUUID_LIBRARIES}) if(LIBIDN_FOUND) target_link_libraries(xmpp ${LIBIDN_LIBRARIES}) 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(SYSTEMDDAEMON_FOUND) target_link_libraries(xmpp ${SYSTEMDDAEMON_LIBRARIES}) endif() if(WITH_DOC) add_dependencies(${PROJECT_NAME} doc) endif() # ## Tests # add_executable(test src/test.cpp) target_link_libraries(test xmpp irc bridge utils config logger) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/src/config.h) # ## Install target # install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) if(WITH_DOC) install(FILES ${MAN_PAGE} DESTINATION man/man1) endif()