Как определить граф зависимостей с неизвестными именами промежуточных узлов? - PullRequest
0 голосов
/ 25 февраля 2012

Я использую цепочку инструментов, в которой я не знаю имен всех промежуточных файлов.

например. Я знаю, что начинаю с foo.s и прошёл несколько этапов, чтобы получить foo.XXXX.sym и foo.XXXX.hex, скрытые глубоко в себе. А затем, запустив другие инструменты на foo.XXXX.hex и foo.XXXX.sym, я в итоге получаю что-то вроде final.results.

Но проблема в том, что я не знаю, что такое ХХХХ. Он получен из некоторых других параметров, но может быть значительно преобразован из них.

Теперь, после запуска инструмента / шагов, генерирующих foo.XXXX. {Sym, hex}, я теперь обычно сканирую весь каталог результатов в поисках foo. *. {Sym, hex}. То есть У меня есть код, который может распознавать промежуточные выходы, я просто не знаю точно, какими будут имена.

Я обычно использую make или scons - на самом деле, я предпочитаю scons, но моя команда очень предпочитает make. Я открыт для других инструментов сборки.

Что я хочу сделать, так это уметь сказать (1) «сделать final.results» или «scons final.results», (2) и заставить его сканировать частичное дерево; (3) выяснить, что, хотя он и не знает полный путь, он определенно знает, что ему нужно выполнить первый шаг, (4) после этого первого шага найдите и найдите файлы foo.XXX. *; (5) и включите их в дерево зависимостей.

т.е. Я хочу завершить построение дерева зависимостей после того, как сборка уже началась.

Друг достаточно расстроился из-за ограничений scons в этой области, что он написал свой собственный инструмент для сборки. К сожалению, это собственность.

Полагаю, что я могу создать первый граф сборки, скажем, в make со многими целями .PHONY, а затем, после того как я выполню первый шаг, сгенерировать новый make-файл с новыми именами, и первый make вызовет вновь сгенерированный второй make-файл. Кажется неуклюжим Есть ли более элегантный способ?

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

В GNU make есть функция «auto-rexec», которую вы можете использовать.См. Как восстанавливаются make-файлы

После того, как make завершит чтение всех make-файлов (как найденных автоматически и / или в командной строке, так и всех включенных make-файлов), он попытаетсяперестройте все его make-файлы (используя правила, о которых он знает).Если какой-либо из этих make-файлов будет автоматически перестроен, то make выполнит сам себя, чтобы он мог перечитать новейшие версии make-файлов / включенных файлов и начать заново (включая повторную попытку сборки всех make-файлов).

Мне кажется, вы должны быть в состоянии что-то с этим сделать.Вы можете написать в своем главном make-файле и, например, «-include foo.sym.mk», а затем иметь правило, которое создает «foo.sym.mk», вызывая инструмент на foo.s, а затем запускать «распознал следующеешаг "code" и сгенерируйте файл "foo.sym.mk", который определяет правило для промежуточного вывода, который был создан.Примерно так (из-за отсутствия конкретики в вашем вопросе я не могу привести истинные примеры, которые вы понимаете):

SRCS = foo.s bar.s baz.s
-include $(patsubst %.s,%.sym.mk,$(SRCS))
%.sym.mk: %.s
        <compile> '$<'
        <recognize output and generate makefile> > '$@'

Теперь, когда запускается make, он увидит, что foo.sym.mk устарел (еслиэто так) с использованием обычных алгоритмов, и он перестроит foo.sym.mk, что в качестве «побочного эффекта» приводит к компиляции файла foo.s.

И, конечно же, «foo.sym.mk"файл может включать ДРУГОЙ файл, который может распознавать следующий шаг, если это необходимо.

Я не говорю, что это будет тривиально, но, кажется, выполнимо на основе вашего описания.

0 голосов
/ 27 февраля 2012

Make строит график перед выполнением любого правила, поэтому не будет идеального ответа. Вот несколько достаточно чистых решений.

1) использовать в командах промежуточные звенья и подстановочные знаки PHONY. (Вы не можете использовать шаблоны подстановки Make, потому что make раскрывает их перед запуском правил.)

final.results: middle                                                         
    # build $@ using $(shell ls foo.*.sym) and $(shell ls foo.*.hex)

.PHONY: middle
middle: foo.s
    # build foo.XXXX.sym and foo.XXXX.hex from $<

2) Используйте рекурсивный Make (который не так плох, как говорят люди, а иногда очень полезен).

SYM = $(wildcard foo.*.sym)
HEX = $(wildcard foo.*.hex)

# Note that this is is the one you should "Make".
# I've put it first so it'll be the default.
.PHONY: first-step
first-step: foo.s
    # build foo.XXXX.sym and foo.XXXX.hex from $<
    @$(MAKE) -s final.results                                               

final.results:                                                                
    # build $@ using $(SYM) and $(HEX)

3) Аналогично 2, но есть правило для make-файла, которое заставит Make запускаться второй раз.

SYM = $(wildcard foo.*.sym)
HEX = $(wildcard foo.*.hex)

final.results:                                                                
    # build $@ using $(SYM) and $(HEX)

Makefile: foo.s
    # build foo.XXXX.sym and foo.XXXX.hex from $<
    @touch $@
...