будет ли $ @ работать с vpath

#makefile #gnu-make

#makefile #gnu-make

Вопрос:

 SRC_DIRS  = $(CMM_DIR)
SRC_DIRS  = $(ABC_DIR)

VPATH = $(SRC_FILES)

tear_abc123: $(OBJ)/ur23.o
    $(CC) $(CFLAGS) -c $(subst tear_,,$@.c) $@.c $@_compiletime.c -o $@
  

В этом случае $ @_compiletime.c (скажем, tear_abc123_compiletime.c) генерируется перед $(CC). make выдает ошибку, что abc123.c не найден. где abc123.c присутствует в $(ABC_DIR). Почему vpath не может найти файл c.

Комментарии:

1. 1) Строка vpath $@.c $(SRC_FILES) не имеет смысла, в ней нет символа равенства, поэтому присвоения нет. 2) VPATH должен содержать путь к папкам, содержащим исходные файлы, а не путь к источникам. 3) Прочитайте правила Makefile . 4) То, что вы хотите VPATH = $(SRC_DIRS) , — это то, где SRC_DIRS хранятся разные папки, содержащие ваши исходники.

2. Я изменился, и VPATH по-прежнему не может найти файл. Выдает ошибку abc123.c нет такого файла или каталога

3. В вашей правке VPATH принимает значение SRC_FILES not SRC_DIRS . Пожалуйста, ознакомьтесь с документацией VPATH. VPATH — это список мест, где make будут искать ваши исходные файлы. Если вы не укажете make , где находятся ваши источники, он их не найдет.

Ответ №1:

Основная проблема заключается в том, что VPATH работает только для предварительных условий. И он не работает из «командной» части цели.

Для выполнения VPATH работы вы должны указать список источников в предварительных требованиях и ссылаться на него в команде, используя $^ .

Пожалуйста, смотрите следующий пример (для дерева файлов, как показано ниже)

 .
|-- abc
|   |-- abc123.c
|   |-- tear_abc123.c
|   `-- tear_abc123_compiletime.c
`-- Makefile
  

Makefile содержит

 SRC_DIRS := abc
VPATH := $(SRC_DIRS)

TARGET := tear_abc123

SOURCE_FILES := $(TARGET).c $(TARGET)_compiletime.c $(subst tear_,,$(TARGET).c)

tear_abc123: $(SOURCE_FILES)
        @echo "SOURCE_FILES := $(SOURCE_FILES)"
        @echo "prerequisites = $^"
  

Вывод будет

 $ make
SOURCE_FILES := tear_abc123.c tear_abc123_compiletime.c abc123.c
prerequisites = abc/tear_abc123.c abc/tear_abc123_compiletime.c abc/abc123.c
  

Как вы можете видеть

  • на самом SOURCE_FILES деле содержит только имена исходных файлов
  • предварительные условия автоматически заменяются правильным путем