cmake_minimum_required(VERSION 3.16) project(torrent_tracker C) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() option(TRACKER_NATIVE "Optimize for the build host (-march=native)" ON) option(TRACKER_ASAN "Build with AddressSanitizer/UBSan" OFF) option(TRACKER_TESTS "Build protocol tests" ON) add_library(torrenttracker SHARED src/tracker_http.c src/tracker_udp.c src/tracker_store.c src/dht.c ) target_include_directories(torrenttracker PUBLIC include) target_compile_options(torrenttracker PRIVATE -O3 -Wall -Wextra -Wno-unused-parameter ) if(TRACKER_NATIVE AND NOT TRACKER_ASAN) target_compile_options(torrenttracker PRIVATE -march=native) endif() if(TRACKER_ASAN) target_compile_options(torrenttracker PRIVATE -O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer) target_link_options(torrenttracker PRIVATE -fsanitize=address,undefined) endif() option(TRACKER_LTO "Enable link-time optimization" ON) if(TRACKER_LTO AND NOT TRACKER_ASAN) include(CheckIPOSupported) check_ipo_supported(RESULT _ipo_ok OUTPUT _ipo_msg) if(_ipo_ok) set_target_properties(torrenttracker PROPERTIES INTERPROCEDURAL_OPTIMIZATION ON) endif() endif() set_target_properties(torrenttracker PROPERTIES OUTPUT_NAME torrenttracker) if(TRACKER_TESTS) enable_testing() add_executable(test_tracker tests/test_tracker.c) target_link_libraries(test_tracker PRIVATE torrenttracker) add_test(NAME tracker_protocols COMMAND test_tracker) endif()