GNU Сделать игнорирование фальшивого правила, указанного подстановочным знаком? - PullRequest
0 голосов
/ 07 февраля 2019

Я изучаю некоторые курсы по компиляции кода C в конкретную сборку.Я решил, что сгенерированная сборка должна быть проверена вручную, поэтому я выбрал less something.s в качестве правила "test".

Как фанат, но новичок в Make, я написал этот Makefile:

CODES := a

LESS ?= less
CODES_TEST := $(patsubst %,%-test,${CODES})

.PHONY: all test ${CODES_TEST} clean

all: $(patsubst %,%.s,${CODES})

test: all

%-test: %.s
        ${LESS} $^

%.s: %.c
        ${CC} ${CFLAGS} -S -o $@ $^

clean:
        rm -f *.o *.s

И у меня есть этот минимальный a.c файл:

int asdfg(void) { return 54321; }

Затем я набрал make a-test в Bash, ожидая, что less появится с содержимым a.s, только дляскажи так:

make: Nothing to be done for 'a-test'.

Я получил вышеуказанный ответ независимо от наличия a.s, который генерируется нормально, если я выполняю make a.s или просто make (неявно запускает первое правило, all).

Я проверил свой Makefile и не думаю, что допустил опечатку или другую простую ошибку.

  1. Что я пропустил с вышеприведенным Makefile?
  2. Как заставить Make выполнить less a.s при запуске make a-test?

1 Ответ

0 голосов
/ 07 февраля 2019

Ничего не поделаешь для a-test, потому что единственное правило, которое сделает это, - неявное шаблонное правило:

%-test: %.s
        ${LESS} $^

и, согласно инструкции 4.6 Phony Targets :

Неявный поиск правил (см. Неявные правила) пропускается для целей .PHONY.

и, поскольку это .PHONY, его простое несуществование делаетсделать его устаревшим.

Чтобы обойти это, сохранив фишность, замените:

%-test: %.s
        ${LESS} $^

на:

${CODES_TEST}: %-test: %.s
    ${LESS} $^

Тогда правилоправило статического шаблона и больше не является неявным.

...