cmake_minimum_required(VERSION 3.16) project( uIRC VERSION 0.3.0 DESCRIPTION "Simple and lightweight IRC protocol helper" LANGUAGES C ) include(GNUInstallDirs) set(UIRC_VERSION "${PROJECT_VERSION}") add_compile_definitions(UIRC_VERSION="${UIRC_VERSION}") OPTION(BUILD_IRCV3 "Build IRCv3 components" OFF) OPTION(BUILD_VALIDATORS "Build message validators" OFF) OPTION(BUILD_DOCS "Build documentation with doxygen" OFF) OPTION(BUILD_TESTS "Build tests that check the library compliance" OFF) OPTION(CODE_ANALYZER "Analyze the code statically" OFF) OPTION(CODE_COVERAGE "Build with coverage tools" OFF) set(UIRC_SOURCE src/assemblers/message.c src/assemblers/user.c src/tokenizers/message.c src/tokenizers/user.c src/memory/allocators.c src/memory/free.c src/memory/listmgrs.c ) set(UIRC_HEADERS include/assemblers.h include/ctcp.h include/memory.h include/modes.h include/replies.h include/tokenizers.h include/types.h include/uirc.h include/validators.h ) # Libraries used find_library(LLIST_PATH NAMES llist REQUIRED) find_library(STRINGEXT_PATH NAMES stringext REQUIRED) set(UIRC_LIBS ${STRINGEXT_PATH} ${LLIST_PATH}) # # Features # if (BUILD_IRCV3) message(STATUS "IRCv3 capabilities enabled") add_compile_definitions(UIRC_FEATURE_IRCV3) set(UIRC_SOURCE ${UIRC_SOURCE} src/assemblers/tag.c src/tokenizers/tag.c ) endif() if (BUILD_VALIDATORS) message(STATUS "Message validators enabled") add_compile_definitions(UIRC_FEATURE_VALIDATORS) set(UIRC_SOURCE ${UIRC_SOURCE} src/validators/validators.c ) set(UIRC_HEADERS ${UIRC_HEADERS} src/validators/validators.h ) endif() if(BUILD_DOCS) find_package(Doxygen REQUIRED) if (DOXYGEN_FOUND) set(DOXYGEN_SOURCE_BROWSER YES) set(DOXYGEN_MACRO_EXPANSION YES) set(DOXYGEN_EXPAND_ONLY_PREDEF YES) set(DOXYGEN_PREDEFINED "UIRC_FEATURE_IRCV3" "UIRC_FEATURE_VALIDATORS" ) doxygen_add_docs(docgen src/doc/main.doc README.md ALL ) endif() endif() if (BUILD_TESTS) message(STATUS "Tests are going to be built.") add_subdirectory(tests) enable_testing() add_test(NAME "FullLoop" COMMAND "fullloop") endif() add_library(uirc ${UIRC_SOURCE}) target_link_libraries(uirc ${UIRC_LIBS}) target_include_directories(uirc PUBLIC $ $ ) separate_arguments(UIRC_HEADERS) set_target_properties(uirc PROPERTIES C_STANDARD 99 VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} PUBLIC_HEADER "${UIRC_HEADERS}" ) install( TARGETS uirc LIBRARY PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/uirc" ) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Werror") if (CMAKE_C_COMPILER_ID STREQUAL "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat-overflow=2 -Wformat-security -Winit-self -Wstrict-overflow=2 -Wstringop-overflow=2 -Walloc-zero -Wduplicated-branches -Wduplicated-cond -Wtrampolines -Wfloat-equal -Wshadow -Wunsafe-loop-optimizations -Wparentheses -fstack-check -pedantic") if (CODE_ANALYZER) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fanalyzer") endif() elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Weverything -Wno-padded -Wno-disabled-macro-expansion -pedantic") if (CODE_COVERAGE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-instr-generate -fcoverage-mapping") endif() endif()