cmake_minimum_required(VERSION 3.15...4.0) project(dir_monitor LANGUAGES C ) # Although C11 would be sufficient, be safe to set this minimum in order to # prevent errors from unbeknown features, used to and assuming to be there longer... set (CMAKE_C_STANDARD 17) add_compile_options(-Wall -Wextra -Wformat -Wformat=2 -Wconversion -Wimplicit-fallthrough -Werror=format-security -Wbidi-chars=any -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion -fno-delete-null-pointer-checks -fstack-clash-protection -fstack-protector-strong -fstrict-flex-arrays=3) set(SOURCE_DM src/dir_monitor.c src/data_management.c src/options.c src/output.c) add_executable(dir_monitor_debug ${SOURCE_DM}) target_include_directories(dir_monitor_debug PRIVATE include) target_compile_options(dir_monitor_debug PUBLIC -g -DDEBUGBUILD -Werror) add_executable(dir_monitor_debug_asan ${SOURCE_DM}) target_include_directories(dir_monitor_debug_asan PRIVATE include) target_compile_options(dir_monitor_debug_asan PUBLIC -g -DDEBUGBUILD -fsanitize=address -Werror) target_link_libraries(dir_monitor_debug_asan asan) add_executable(dir_monitor_asan ${SOURCE_DM}) target_include_directories(dir_monitor_asan PRIVATE include) target_compile_options(dir_monitor_asan PUBLIC -fsanitize=address) target_link_libraries(dir_monitor_asan asan) add_executable(dir_monitor ${SOURCE_DM}) target_include_directories(dir_monitor PRIVATE include) target_compile_options(dir_monitor PUBLIC -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -FPIE -pie -Wl,-z,noexecstack -Wl,--as-needed -Wl,--no-copy-dt-needed-entries) # The man page generation... find_program(ASCIIDOC_EXEC NAMES asciidoc) if (NOT ASCIIDOC_EXEC) message(WARNING "Can't find asciidoc, skip manpage generation") return() endif() find_program(XMLTO_EXEC NAMES xmlto) if (NOT XMLTO_EXEC) message(WARNING "Can't find xmlto, skip manpage generation") return() endif() find_program(COMPRESS_EXEC NAMES gzip) if (NOT COMPRESS_EXEC) message(WARNING "Can't find gzip, skip manpage generation") return() endif() set(MANPAGE dir_monitor.1) set(ASCIIDOC_GENMAN ${ASCIIDOC_EXEC} -b docbook -d manpage) add_custom_command( OUTPUT ${MANPAGE}.xml COMMAND ${ASCIIDOC_GENMAN} -o ${MANPAGE}.xml ${CMAKE_CURRENT_SOURCE_DIR}/man/${MANPAGE}.adoc COMMENT "Create DocBook XML ${MANPAGE}.xml ..." ) set(XMLTO_GENMAN ${XMLTO_EXEC} man) add_custom_command( OUTPUT ${MANPAGE} COMMAND ${XMLTO_GENMAN} ${MANPAGE}.xml DEPENDS ${MANPAGE}.xml COMMENT "Create man page from DocBook XML ${MANPAGE}.xml ..." ) add_custom_command( OUTPUT ${MANPAGE}.gz COMMAND ${COMPRESS_EXEC} -9 ${MANPAGE} DEPENDS ${MANPAGE} COMMENT "Compressing the manpage via gzip..." ) add_custom_target(man ALL DEPENDS ${MANPAGE}.gz )