Циркулярная зависимость от файла упала странность - PullRequest
0 голосов
/ 16 ноября 2018

Я запускаю небольшую утилиту из файла make (используя GNU Make 3.81).Утилита конвертирует один тип файла в другой.Например, файл ' thefile.x ' преобразуется в ' thefile.xy '.

Правило назначения и создания:

%.x.y: %.x
    convertfile $< $@

all: file1.x.y file2.x.y

Это на самом деле работает (файл .xy создается, но я всегда получаю сообщение:

make: Circular thefile.x <- зависимость thefile.xy удалена. </strong>

Это всего лишь небольшая проблема, так как мы не хотим видеть сообщения, когда все на самом деле работает.

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

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

%.js.c: %.js
    js2c $< $@

all: test1.js.c test2.js.c

Вот вывод, когда я его запускаю, и у него есть что делать:

C:\work\timtest>make
make: Circular test1.js <- test1.js.c dependency dropped.
js2c test1.js test1.js.c
[RomFs] test1.js => test1.js.c
make: Circular test2.js <- test2.js.c dependency dropped.
js2c test2.js test2.js.c
[RomFs] test2.js => test2.js.c

Вот вывод, когда ничего не делать:

make: Circular test1.js <- test1.js.c dependency dropped.
make: Circular test2.js <- test2.js.c dependency dropped.
make: Nothing to be done for `all'.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы видите это, потому что GNU make имеет ряд встроенных правил . Вы можете увидеть их частичный список в руководстве по GNU make или запустить make -p -f/dev/null, чтобы увидеть полный список.

Одно из этих встроенных правил указывает, как скомпилировать программу из файла .c. В системах POSIX программы не имеют специальных суффиксов, поэтому это встроенное правило гласит:

%: %.c ; $(LINK.c) ...

Таким образом, это правило говорит make, как создать любой файл foo из файла foo.c ... это также означает, что make может определить, как построить файл foo.js из файла foo.js.c. Поскольку вы также определили правило для сборки foo.js.c из foo.js, это циклическая зависимость, и вы исключаете одно из правил (встроенное правило).

Вам необходимо предотвратить сопоставление файлов .js с помощью шаблонов с любым соответствием , как показано выше. Есть два способа сделать это, как описано в руководстве. Один из них с наименьшим количеством побочных эффектов - добавить пустое правило шаблона, в котором будет указан ваш новый суффикс, например:

%.js:

Вот и все. Полная информация доступна в руководстве.

...