GNU Составлять расширенные подстановочные знаки явные списки целей и порядка предпосылок - PullRequest
1 голос
/ 17 апреля 2019

Есть простая задача.

Есть две директории - в и в .

Исходное состояние

$ tree .
.
├── in
│   ├── 1
│   ├── 2
│   └── 3
├── Makefile
└── out
    ├── 1
    ├── 2
    └── 3

где 1, 2, 3 - пустые файлы.

Теперь,

$ touch in/*

Цель состоит в том, чтобы напечатать имя файла в каталоге в , который является новым, чем соответствующийфайл в каталоге out , например: in / 2 -> out / 2 .

Makefile is

out/* : in/*
    @ echo $?

запустите его

$ make -rd

...
 Prerequisite 'in/3' is newer than target 'out/3'.
 Prerequisite 'in/2' is newer than target 'out/3'.
 Prerequisite 'in/1' is newer than target 'out/3'.
...

Порядок не сохраняется.

Может кто-нибудь помочь исправить это?

1 Ответ

0 голосов
/ 17 апреля 2019

Ваш make-файл не делает то, что вы надеетесь. Это расширится до:

out/1 out/2 out/3 : in/1 in/2 in/3
        @ echo $?

Это НЕ то же самое, что сказать, что каждый in файл является предпосылкой его конкретного out файла. Вышесказанное идентично письму:

out/1 : in/1 in/2 in/3
        @ echo $?
out/2 : in/1 in/2 in/3
        @ echo $?
out/3 : in/1 in/2 in/3
        @ echo $?

, то есть каждый out файл зависит от ALL in файлов. Вот почему вы получаете результат, который вы делаете.

Также обратите внимание, что make создает только первую цель, найденную в make-файле (и, конечно, все предпосылки этой цели), поэтому вы не видите никакой информации для других файлов out. Вам нужна первая цель, такая как all, которая зависит от всех файлов out.

Вам нужно либо использовать три явных правила:

.PHONY: all
all: out/1 out/2 out/3

out/1 : in/1
        @ echo $?
out/2 : in/2
        @ echo $?
out/3 : in/3
        @ echo $?

(для этого необходимо заранее знать, какие файлы) или использовать шаблонное правило:

.PHONY: all
all: out/*

out/% : in/%
        @ echo $?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...