Přemysl Eric Janouch
ba1c2357af
Not sure about how well it works yet. Lua 5.3 is still made preferential by the order of pkgconfig lookup.
253 lines
9.3 KiB
CMake
253 lines
9.3 KiB
CMake
project (uirc3 C)
|
|
cmake_minimum_required (VERSION 2.8.11)
|
|
|
|
# Options
|
|
option (WANT_READLINE "Use GNU Readline for the UI (better)" ON)
|
|
option (WANT_LIBEDIT "Use BSD libedit for the UI" OFF)
|
|
|
|
# Moar warnings
|
|
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
|
|
# -Wunused-function is pretty annoying here, as everything is static
|
|
set (wdisabled "-Wno-unused-function")
|
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall -Wextra ${wdisabled}")
|
|
endif ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
|
|
|
|
# Version
|
|
set (project_version "0.9.7")
|
|
|
|
# Try to append commit ID if it follows a version tag. It might be nicer if
|
|
# we could also detect dirty worktrees but that's very hard to get right.
|
|
# If we didn't need this for CPack, we could use add_custom_command to generate
|
|
# a version source/include file.
|
|
find_package (Git)
|
|
set (git_head "${PROJECT_SOURCE_DIR}/.git/HEAD")
|
|
if (GIT_FOUND AND EXISTS "${git_head}")
|
|
configure_file ("${git_head}" git-head.tag COPYONLY)
|
|
file (READ "${git_head}" git_head_content)
|
|
if (git_head_content MATCHES "^ref: ([^\r\n]+)")
|
|
set (git_ref "${PROJECT_SOURCE_DIR}/.git/${CMAKE_MATCH_1}")
|
|
if (EXISTS "${git_ref}")
|
|
configure_file ("${git_ref}" git-ref.tag COPYONLY)
|
|
endif (EXISTS "${git_ref}")
|
|
endif (git_head_content MATCHES "^ref: ([^\r\n]+)")
|
|
|
|
execute_process (COMMAND ${GIT_EXECUTABLE} describe --tags --match v*
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
RESULT_VARIABLE git_describe_result
|
|
OUTPUT_VARIABLE git_describe OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if (NOT git_describe_result)
|
|
string (REGEX REPLACE "^v" "" project_version "${git_describe}")
|
|
endif (NOT git_describe_result)
|
|
endif (GIT_FOUND AND EXISTS "${git_head}")
|
|
|
|
# Dashes make filenames confusing and upset packaging software
|
|
string (REPLACE "-" "+" project_version_safe "${project_version}")
|
|
|
|
# Dependencies
|
|
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/liberty/cmake)
|
|
include (AddThreads)
|
|
|
|
find_package (PkgConfig REQUIRED)
|
|
pkg_check_modules (libssl REQUIRED libssl libcrypto)
|
|
list (APPEND project_libraries ${libssl_LIBRARIES})
|
|
include_directories (${libssl_INCLUDE_DIRS})
|
|
link_directories (${libssl_LIBRARY_DIRS})
|
|
|
|
if ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD")
|
|
include_directories (/usr/local/include)
|
|
link_directories (/usr/local/lib)
|
|
# Need this for SIGWINCH in FreeBSD and OpenBSD respectively;
|
|
# our POSIX version macros make it undefined
|
|
add_definitions (-D__BSD_VISIBLE=1 -D_BSD_SOURCE=1)
|
|
endif ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD")
|
|
|
|
# -lrt is only for glibc < 2.17
|
|
# -liconv may or may not be a part of libc
|
|
foreach (extra iconv rt)
|
|
find_library (extra_lib_${extra} ${extra})
|
|
if (extra_lib_${extra})
|
|
list (APPEND project_libraries ${extra_lib_${extra}})
|
|
endif (extra_lib_${extra})
|
|
endforeach (extra)
|
|
|
|
include (CheckCSourceRuns)
|
|
set (CMAKE_REQUIRED_LIBRARIES ${project_libraries})
|
|
get_property (CMAKE_REQUIRED_INCLUDES
|
|
DIRECTORY "${PROJECT_SOURCE_DIR}" PROPERTY INCLUDE_DIRECTORIES)
|
|
CHECK_C_SOURCE_RUNS ("#include <iconv.h>
|
|
int main () { return iconv_open (\"UTF-8//TRANSLIT\", \"ISO-8859-1\")
|
|
== (iconv_t) -1; }" ICONV_ACCEPTS_TRANSLIT)
|
|
|
|
# Dependencies for degesch
|
|
pkg_check_modules (libffi REQUIRED libffi)
|
|
list (APPEND degesch_libraries ${libffi_LIBRARIES})
|
|
include_directories (${libffi_INCLUDE_DIRS})
|
|
link_directories (${libffi_LIBRARY_DIRS})
|
|
|
|
# FIXME: other Lua versions may be acceptable, don't know yet
|
|
pkg_search_module (lua lua53 lua5.3 lua-5.3 lua54 lua5.4 lua-5.4 lua>=5.3)
|
|
option (WITH_LUA "Enable support for Lua plugins" ${lua_FOUND})
|
|
|
|
if (WITH_LUA)
|
|
if (NOT lua_FOUND)
|
|
message (FATAL_ERROR "Lua library not found")
|
|
endif (NOT lua_FOUND)
|
|
|
|
list (APPEND degesch_libraries ${lua_LIBRARIES})
|
|
include_directories (${lua_INCLUDE_DIRS})
|
|
link_directories (${lua_LIBRARY_DIRS})
|
|
endif (WITH_LUA)
|
|
|
|
find_package (Curses)
|
|
pkg_check_modules (ncursesw ncursesw)
|
|
if (ncursesw_FOUND)
|
|
list (APPEND degesch_libraries ${ncursesw_LIBRARIES})
|
|
include_directories (${ncursesw_INCLUDE_DIRS})
|
|
elseif (CURSES_FOUND)
|
|
list (APPEND degesch_libraries ${CURSES_LIBRARY})
|
|
include_directories (${CURSES_INCLUDE_DIR})
|
|
else (CURSES_FOUND)
|
|
message (SEND_ERROR "Curses not found")
|
|
endif (ncursesw_FOUND)
|
|
|
|
if ((WANT_READLINE AND WANT_LIBEDIT) OR (NOT WANT_READLINE AND NOT WANT_LIBEDIT))
|
|
message (SEND_ERROR "You have to choose either GNU Readline or libedit")
|
|
elseif (WANT_READLINE)
|
|
# OpenBSD's default readline is too old
|
|
if ("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD")
|
|
include_directories (/usr/local/include/ereadline)
|
|
list (APPEND degesch_libraries ereadline)
|
|
else ("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD")
|
|
list (APPEND degesch_libraries readline)
|
|
endif ("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD")
|
|
elseif (WANT_LIBEDIT)
|
|
pkg_check_modules (libedit REQUIRED libedit)
|
|
list (APPEND degesch_libraries ${libedit_LIBRARIES})
|
|
include_directories (${libedit_INCLUDE_DIRS})
|
|
endif ((WANT_READLINE AND WANT_LIBEDIT) OR (NOT WANT_READLINE AND NOT WANT_LIBEDIT))
|
|
|
|
# Generate a configuration file
|
|
set (HAVE_READLINE "${WANT_READLINE}")
|
|
set (HAVE_EDITLINE "${WANT_LIBEDIT}")
|
|
set (HAVE_LUA "${WITH_LUA}")
|
|
|
|
include (GNUInstallDirs)
|
|
# ZyklonB is currently an odd duck but degesch follows normal XDG rules
|
|
set (zyklonb_plugin_dir ${CMAKE_INSTALL_LIBDIR}/zyklonb/plugins)
|
|
configure_file (${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_BINARY_DIR}/config.h)
|
|
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
|
|
|
|
# Project source files
|
|
set (common_sources)
|
|
set (common_headers ${PROJECT_BINARY_DIR}/config.h)
|
|
|
|
add_custom_command (OUTPUT kike-replies.c kike.msg
|
|
COMMAND ${PROJECT_SOURCE_DIR}/kike-gen-replies.sh
|
|
> kike-replies.c < ${PROJECT_SOURCE_DIR}/kike-replies
|
|
DEPENDS ${PROJECT_SOURCE_DIR}/kike-replies
|
|
COMMENT "Generating files from the list of server numerics")
|
|
set_source_files_properties (${PROJECT_BINARY_DIR}/kike-replies.c
|
|
PROPERTIES HEADER_FILE_ONLY TRUE)
|
|
|
|
# Build
|
|
add_executable (zyklonb zyklonb.c ${common_sources} ${common_headers})
|
|
target_link_libraries (zyklonb ${project_libraries})
|
|
add_threads (zyklonb)
|
|
|
|
add_executable (degesch degesch.c kike-replies.c
|
|
${common_sources} ${common_headers})
|
|
target_link_libraries (degesch ${project_libraries} ${degesch_libraries})
|
|
add_threads (degesch)
|
|
|
|
add_executable (kike kike.c kike-replies.c ${common_sources} ${common_headers})
|
|
target_link_libraries (kike ${project_libraries})
|
|
add_threads (kike)
|
|
|
|
# Tests
|
|
function (make_tests_for target_name)
|
|
get_target_property (sources ${target_name} SOURCES)
|
|
get_target_property (libraries ${target_name} LINK_LIBRARIES)
|
|
get_target_property (options ${target_name} COMPILE_OPTIONS)
|
|
|
|
set (test test-${target_name})
|
|
add_executable (${test} ${sources})
|
|
target_link_libraries (${test} ${libraries})
|
|
set_target_properties (${test} PROPERTIES
|
|
COMPILE_DEFINITIONS TESTING
|
|
COMPILE_OPTIONS "${options}")
|
|
|
|
add_test (NAME ${test} COMMAND ${test})
|
|
endfunction (make_tests_for)
|
|
|
|
include (CTest)
|
|
if (BUILD_TESTING)
|
|
make_tests_for (degesch)
|
|
add_test (NAME custom-static-analysis
|
|
COMMAND ${PROJECT_SOURCE_DIR}/test-static)
|
|
endif (BUILD_TESTING)
|
|
|
|
# Various clang-based diagnostics, loads of fake positives and spam
|
|
file (GLOB clang_tidy_sources *.c)
|
|
set (clang_tidy_checks misc-* readability-*
|
|
-readability-braces-around-statements
|
|
-readability-named-parameter)
|
|
string (REPLACE ";" "," clang_tidy_checks "${clang_tidy_checks}")
|
|
|
|
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
add_custom_target (clang-tidy
|
|
COMMAND clang-tidy -p ${PROJECT_BINARY_DIR} -checks=${clang_tidy_checks}
|
|
${clang_tidy_sources} 1>&2
|
|
USES_TERMINAL
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
|
|
|
|
# Installation
|
|
install (TARGETS zyklonb degesch kike DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
install (DIRECTORY plugins/zyklonb/
|
|
DESTINATION ${zyklonb_plugin_dir} USE_SOURCE_PERMISSIONS)
|
|
install (DIRECTORY plugins/degesch/
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/degesch/plugins)
|
|
|
|
# Generate documentation from program help
|
|
find_program (HELP2MAN_EXECUTABLE help2man)
|
|
if (NOT HELP2MAN_EXECUTABLE)
|
|
message (FATAL_ERROR "help2man not found")
|
|
endif (NOT HELP2MAN_EXECUTABLE)
|
|
|
|
foreach (page zyklonb degesch kike)
|
|
set (page_output "${PROJECT_BINARY_DIR}/${page}.1")
|
|
list (APPEND project_MAN_PAGES "${page_output}")
|
|
add_custom_command (OUTPUT ${page_output}
|
|
COMMAND ${HELP2MAN_EXECUTABLE} -N
|
|
"${PROJECT_BINARY_DIR}/${page}" -o ${page_output}
|
|
DEPENDS ${page}
|
|
COMMENT "Generating man page for ${page}" VERBATIM)
|
|
endforeach (page)
|
|
|
|
add_custom_target (docs ALL DEPENDS ${project_MAN_PAGES})
|
|
|
|
foreach (page ${project_MAN_PAGES})
|
|
string (REGEX MATCH "\\.([0-9])$" manpage_suffix "${page}")
|
|
install (FILES "${page}"
|
|
DESTINATION "${CMAKE_INSTALL_MANDIR}/man${CMAKE_MATCH_1}")
|
|
endforeach (page)
|
|
|
|
# CPack
|
|
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Experimental IRC client, daemon and bot")
|
|
set (CPACK_PACKAGE_VERSION "${project_version_safe}")
|
|
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
|
|
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
|
|
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
|
|
|
set (CPACK_GENERATOR "TGZ;ZIP")
|
|
set (CPACK_PACKAGE_FILE_NAME
|
|
"${PROJECT_NAME}-${project_version_safe}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
|
|
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}-${project_version_safe}")
|
|
|
|
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
|
|
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user")
|
|
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${project_version_safe}")
|
|
|
|
set (CPACK_SET_DESTDIR TRUE)
|
|
include (CPack)
|