Cmake и много-много тестов
В последнее время в проекте накопилось порядочно юнит-тестов для функций. Настолько, что они начали собираться дольше, чем основная программа.
Cmake предлагает собственную систему тестирования, с упором на написание мелких, простых программ тестирующих какой-то отдельный модуль или функцию.
Сейчас у меня 32 подобных теста, и 8 файлов с функциями из которых они собираются. Каждый тест использует от 2х до 7 из них.
Проблема в том, что для каждого теста в отдельности оно прогоняет полный цикл сборки: сначала собирает объектный файл для каждого исходника, потом линкует их вместе. Это приблизительно ~5 x 32 + 32 операций. Каждая - с запуском компилятора, компоновщика и прочей обвязки.
Сделано это - для того, чтобы иметь возможность для каждой отдельной цели поставить свой набор флагов и определений препроцессора. Но в нашем случае это избыточно.
Частичное решение - собрать разделяемую библиотеку с функциями и линковать все тесты с ней. Это позволить уменьшить количество операций для каждого теста до двух - компиляция специфичного для теста исходника и линковка. Более "прямого" решения не нашёл.
Добавление библиотеки:
+SET(SRC_FILES "../src")
+
+ADD_LIBRARY(tests SHARED
+ "${SRC_FILES}/common.c"
+ "${SRC_FILES}/buf.c"
+ "${SRC_FILES}/file.c"
+ "${SRC_FILES}/list.c"
+ "${SRC_FILES}/log.c"
+ "${SRC_FILES}/proto.c"
+ "${SRC_FILES}/search.c"
+ "${SRC_FILES}/uuid.c")
+
Изменения в CMakeLists.txt одной из директорий с тестами:
-SET(SRC_DIR "../../src")
-SET(SRC_FILES
- "${SRC_DIR}/log.c"
- "${SRC_DIR}/buf.c"
- )
-ADD_EXECUTABLE("buf_extend" ${SRC_FILES} "buf_extend.c")
-ADD_EXECUTABLE("buf_reduce" ${SRC_FILES} "buf_reduce.c")
+ADD_EXECUTABLE("buf_extend" "buf_extend.c")
+ADD_EXECUTABLE("buf_reduce" "buf_reduce.c")
+
+TARGET_LINK_LIBRARIES("buf_extend" "tests")
+TARGET_LINK_LIBRARIES("buf_reduce" "tests")
ADD_TEST("buf/buf_extend" "buf_extend")
ADD_TEST("buf/buf_reduce" "buf_reduce")
Ускорение сборки - с 25 секунд до 3х.