|
| 1 | +cmake_minimum_required(VERSION 3.15) |
| 2 | +project(c-algorithm-exercises LANGUAGES C) |
| 3 | + |
| 4 | +option(ALGORITHMS_ENABLE_SANITIZERS "Enable AddressSanitizer and UndefinedBehaviorSanitizer" OFF) |
| 5 | + |
| 6 | +set(CMAKE_C_STANDARD 11) |
| 7 | +set(CMAKE_C_STANDARD_REQUIRED ON) |
| 8 | +set(CMAKE_C_EXTENSIONS OFF) |
| 9 | + |
| 10 | +add_executable(eight_queens "八皇后/八皇后问题.c") |
| 11 | +add_executable(knapsack "背包/背包问题.c") |
| 12 | +add_executable(huffman "哈夫曼/哈夫曼编码.c") |
| 13 | +add_executable(skiing "滑雪场/滑雪场问题.c") |
| 14 | +add_executable(wooden_sticks "木棒加工/木棒加工问题.c") |
| 15 | + |
| 16 | +set(ALGORITHM_TARGETS eight_queens knapsack huffman skiing wooden_sticks) |
| 17 | +foreach(target IN LISTS ALGORITHM_TARGETS) |
| 18 | + if(MSVC) |
| 19 | + target_compile_options(${target} PRIVATE /W4) |
| 20 | + else() |
| 21 | + target_compile_options( |
| 22 | + ${target} PRIVATE |
| 23 | + -Wall -Wextra -Wpedantic -Wconversion -Wshadow -Wformat=2 |
| 24 | + ) |
| 25 | + if(ALGORITHMS_ENABLE_SANITIZERS) |
| 26 | + target_compile_options( |
| 27 | + ${target} PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer |
| 28 | + ) |
| 29 | + target_link_options(${target} PRIVATE -fsanitize=address,undefined) |
| 30 | + endif() |
| 31 | + endif() |
| 32 | +endforeach() |
| 33 | + |
| 34 | +include(CTest) |
| 35 | +if(BUILD_TESTING AND UNIX) |
| 36 | + add_test( |
| 37 | + NAME algorithm-smoke-tests |
| 38 | + COMMAND |
| 39 | + bash "${CMAKE_CURRENT_SOURCE_DIR}/tests/run_tests.sh" |
| 40 | + "$<TARGET_FILE:eight_queens>" |
| 41 | + "$<TARGET_FILE:knapsack>" |
| 42 | + "$<TARGET_FILE:huffman>" |
| 43 | + "$<TARGET_FILE:skiing>" |
| 44 | + "$<TARGET_FILE:wooden_sticks>" |
| 45 | + "${CMAKE_CURRENT_SOURCE_DIR}" |
| 46 | + ) |
| 47 | +endif() |
0 commit comments