cmake_minimum_required(VERSION 3.16) project( uIRC VERSION 0.2.2 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_TESTS "Build tests for ctest" OFF) OPTION(BUILD_DOCS "Build documentation with doxygen" 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 ) set(UIRC_HEADERS src/uirc.h src/ctcp.h src/modes.h src/replies.h src/types.h src/assemblers/assemblers.h src/tokenizers/tokenizers.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_TESTS) message(STATUS "Tests are going to be built.") enable_testing() macro(buildtest categ name) add_executable("uirc-test-${categ}-${name}" "src/tests/${categ}/${name}.c" src/tests/common.c) target_link_libraries("uirc-test-${categ}-${name}" uirc) add_test(NAME "${categ}/${name}" COMMAND "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/uirc-test-${categ}-${name}") endmacro() buildtest(tokenizers tag) buildtest(tokenizers user) buildtest(tokenizers message) buildtest(assemblers tag) buildtest(assemblers user) buildtest(assemblers message) buildtest(general fullloop) 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() add_library(uirc ${UIRC_SOURCE}) target_link_libraries(uirc ${UIRC_LIBS}) 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()