Обновление make-файла для связи файлов зависимостей - PullRequest
0 голосов
/ 01 октября 2018

Я использую инфраструктуру модульного тестирования Unity C (http://www.throwtheswitch.org/unity). Я использую предоставленный ими примерный make-файл (http://www.throwtheswitch.org/build/make).

Мой вопрос: как мне объявить зависимости вэтот make-файл.

Например: у меня есть файл ac, и у него есть заголовок bh, у меня есть файл bc, и у него есть заголовок, bhbc реализует функцию foo (). ac использует функцию foo (). Какмне настроить связывание следующим образом, используя make-файл ниже:

CLEANUP = rm -f
MKDIR = mkdir -p
TARGET_EXTENSION=out

.PHONY: clean
.PHONY: test

PATHU = unity/
PATHS = src/
PATHT = test/
PATHB = build/
PATHD = build/depends/
PATHO = build/objs/
PATHR = build/results/

BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) $(PATHR)

SRCT = $(wildcard $(PATHT)*.c)

COMPILE=gcc -c
LINK=gcc
DEPEND=gcc -MM -MG -MF
CFLAGS=-I. -I$(PATHU) -I$(PATHS) -DTEST

RESULTS = $(patsubst $(PATHT)Test%.c,$(PATHR)Test%.txt,$(SRCT) )

PASSED = `grep -s PASS $(PATHR)*.txt`
FAIL = `grep -s FAIL $(PATHR)*.txt`
IGNORE = `grep -s IGNORE $(PATHR)*.txt`

test: $(BUILD_PATHS) $(RESULTS)
    @echo "-----------------------\nIGNORES:\n-----------------------"
    @echo "$(IGNORE)"
    @echo "-----------------------\nFAILURES:\n-----------------------"
    @echo "$(FAIL)"
    @echo "-----------------------\nPASSED:\n-----------------------"
    @echo "$(PASSED)"
    @echo "\nDONE"

$(PATHR)%.txt: $(PATHB)%.$(TARGET_EXTENSION)
    -./$< > $@ 2>&1

$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHU)unity.o #$(PATHD)Test%.d
    $(LINK) -o $@ $^

$(PATHO)%.o:: $(PATHT)%.c
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHO)%.o:: $(PATHS)%.c
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHO)%.o:: $(PATHU)%.c $(PATHU)%.h
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHD)%.d:: $(PATHT)%.c
    $(DEPEND) $@ $<

$(PATHB):
    $(MKDIR) $(PATHB)

$(PATHD):
    $(MKDIR) $(PATHD)

$(PATHO):
    $(MKDIR) $(PATHO)

$(PATHR):
    $(MKDIR) $(PATHR)

clean:
    $(CLEANUP) $(PATHO)*.o
    $(CLEANUP) $(PATHB)*.$(TARGET_EXTENSION)
    $(CLEANUP) $(PATHR)*.txt

.PRECIOUS: $(PATHB)Test%.$(TARGET_EXTENSION)
.PRECIOUS: $(PATHD)%.d
.PRECIOUS: $(PATHO)%.o
.PRECIOUS: $(PATHR)%.txt

Итак, каталог моего проекта настроен с

  • src / node.c
  • src/node.h
  • src / lca.c
  • lca.c использует функцию newNode, определенную в node.h (которая реализована в node.c)
  • test /Testlca.c - это тестовая функция, которую Unity тестирует lca.c с

. Я получаю следующую ошибку:

cc -I. -Iunity/ -Isrc/ -DTEST   -c -o unity/unity.o unity/unity.c
gcc -o build/Testlca.out build/objs/Testlca.o build/objs/lca.o unity/unity.o
Undefined symbols for architecture x86_64:
  "_newNode", referenced from:
      _test_newNode_should_nodePointer in Testlca.o
     (maybe you meant: _test_newNode_should_nodePointer)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see     invocation)
make: *** [build/Testlca.out] Error 1

Я полагаю, что это связано с ошибками в make-файле и чтоЯ должен настроить make-файл.

1 Ответ

0 голосов
/ 02 октября 2018

Первое, на что следует обратить внимание, это то, что вы, возможно, идете по пути создания некоторых сложных для управления тестов.Целью модульного тестирования является тестирование одного модуля за раз, но здесь у вас есть тест, который потребует, чтобы два модуля были скомпилированы вместе для правильного тестирования.Хотя иногда это отличное решение (как правило, когда два устройства чрезмерно тесно связаны, и вы не можете изменить их), обычно это не лучшее решение.

Один из вариантов - использовать макет вместоnode.c вместо вызова реальной версии функции.Это дает вам большой контроль при тестировании lca.c как отдельного устройства.

Это еще не решает вашу проблему напрямую, но я просто чувствовал, что должен указать на это, прежде чем вы продвинетесь намного дальше.

В заключение, Job Vranish из Atomic Object написал действительно хорошую статью о написании простого make-файла с отслеживанием зависимостей.Вы можете найти его здесь: https://spin.atomicobject.com/2016/08/26/makefile-c-projects/

Он предлагает, чтобы, если вы используете Clang или gcc, вы генерировали файлы зависимостей как побочный эффект компиляции, добавляя флаги -MMD -MP.Затем вам нужно вытащить зависимости в ваш проект следующим образом:

DEPS := $(OBJS:.o=.d)
-include $(DEPS)

Это может быть просто в нижней части вашего make-файла, и все зависимости (после их генерации) должны быть извлечены автоматически.

Если вы НЕ используете gcc, вам нужно добавить генерацию зависимостей либо в ваш шаг сборки, либо в отдельный шаг.

Счастливого тестирования!

...