Сделать как инструмент, который поддерживает автоматическое удаление временных файлов и правил шаблонов регулярных выражений? - PullRequest
2 голосов
/ 23 августа 2010

Я ищу инструмент сборки make like, который поддерживает (помимо обычных функций make):

  1. Автоматическое удаление временно созданных файлов (как, например, в GNU make)
  2. Регулярные выражения в шаблонах правил (например, в Cook

О 1: По умолчанию GNU make удаляет временные файлы. Например, есть эти правила:

%.c: %.y
          some-comand

%.o: %.c
          some-comand

Если у вас есть файл foo.y и вызывается make foo.o, то make-производные должны сначала создать foo.c, а затем foo.o. После того, как он будет готов, удалите временный файл foo.c.

Кук не поддерживает это.

О 2: Сделайте так, чтобы поддержка суффиксов поддерживала правила стиля паттернов. Например, вот так (эквивалентные обозначения):

%.o: %.c
          some-comand

.c.o: некоторые-COMAND

Допускается использование регулярных выражений в правилах шаблонов. Примеры псевдокода:

foo.+bar.o: foo.+bar.c
          some-comand

foo\1bar.o: foo(.+)bar.c
          some-comand

Первое правило совпадает (и его команда выполняется), если, например, необходим файл fooXXXbar.o и существует файл fooYYYbar.c (или make знает, как его создать. Второе правило соответствует, если, например, нужен файл fooXXXbar.o и fooXXXbar.c существует.

Знаете ли вы сборку, которая поддерживает эти функции?

Ответы [ 3 ]

1 голос
/ 26 августа 2010

GNU Make, очевидно, имеет 1 и нуждается в 2 ( его сопровождающие, похоже, согласны ), но для него нет полного дизайна, не говоря уже о патче.

Вы можетеэмулируйте эту функциональность в GNU make, используя такие функции, как $ (call), $ (eval) или даже $ (shell), и / или генерируя вспомогательные файлы Makefile и включая их, но результаты довольно сложно прочитать.

1 голос
/ 26 августа 2010

Я не очень знаком с каким-либо инструментом сборки, кроме GNUMake; он не обрабатывает регулярные выражения, но он может обрабатывать эти случаи. Второе правило легко:

foo%bar.o: foo%bar.c
    @echo trying to make $@, found $^

Первый требует некоторой хитрости:

PPP = $(firstword $(filter-out foobar.c, $(wildcard foo*bar.c)))

ifneq ($(PPP),)
foo%bar.o: $(PPP)
    @echo found $^
else
WAR = $(warning no match to the regex)
foo%bar.o:
    $(WAR)
endif
0 голосов
/ 09 сентября 2010

.SECONDEXPANSION расширение может очень помочь. Например:

  .SECONDEXPANSION:

  1.o another.o dir/3rd.o: $$(call munge,$$@)
    gcc blah blah -o $@
    ∶

В основном, $munge должен возвращать источник, заданный целью. Вы можете определить, что ваша функция делает практически все, даже вызывая perl через $(shell...) (хотя $shell несколько снижает производительность). Простой может быть:

munge = $(patsubst %.o,%.cpp,$(notdir $1))
...