2012-02-25 1 views
0

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

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

Э.Г. final_result зависит от предпоследней

final_result: penultimate 

предпоследнем могут быть сделаны в любом из нескольких различных способов:

Если начиная с file1, затем

penultimate: file1 ; rule1 

Если начиная с file2, то

penultimate: file2 ; rule2 

В: Как указать, чтобы начать с file2, а не file1?

Я полагаю, что я мог бы использовать переключатель командной строки и ifdeffing. Но я предпочел бы, чтобы make или scons выяснили: «Эй, там есть файл2, поэтому я должен использовать rule2, а не fil1/rule1». Отчасти из-за того, что сеть намного сложнее, чем это ...

Хуже, иногда промежуточное звено на одном пути может начинаться с другого. Давайте посмотрим:

.с производит .diag

foo.diag: foo.s 

Но иногда нет .с, и у меня просто .diag, что кто-то дал мне уже построили.

.diag производит .heximg, и .hwresult

foo.hwresult: hwsim foo.heximg 

foo.heximg: foo.diag 

Но иногда мне дают .img непосредственно

И т.д.

Я просто хочу, чтобы написать общую зависимость граф и скажите «ОК, теперь вот что мне дано - теперь как вы доберетесь до конечного результата?»

С тем, что у меня есть сейчас, когда мне дано, скажем, foo.img, мне говорят (сделав в этом случае) «foo.s not dfound». Поскольку make хочет вернуться на график зависимости, чтобы узнать, устарел ли foo.img, тогда как я хочу сказать: «Предположите, что foo.img обновлен, и работайте над файлами, которые зависят от foo.img , вместо того, чтобы возвращаться к тому, что зависит от foo.img ».

+0

Фактически, есть несколько конечных выходов. Я просто хотел упростить. –

ответ

2

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

Если вы используете неявное правило, тогда make будет считать, что ВОЗМОЖНЫЙ способ построения цели. Если этот способ не работает (потому что некоторые предпосылки не существуют и делают, не знают, как его построить) make попробует другой способ. Если никакой способ не работает, и цель уже существует, make будет использовать эту цель без необходимости ее обновления.

Также вы говорите: «.diag производит .heximg и a.hwresult», а затем дал странный пример Makefile синтаксис, что я не узнал, но FYI с шаблонные правила можно указать, что одна команда генерирует множество выходных сигналов (вы не можете сделать это с явными правилами):

%.heximg %.hwresult: %.diag 

Вот плохая новость: единственный способ определить неявное правило в GNU make - это если в имени файла существует общая «основа». То есть вы можете написать неявное правило, которое преобразует foo.diag в foo.heximg, написав шаблонное правило «% .heximg:% .diag», потому что у них есть общий стебель «foo», но нет способа создать правило шаблона для компиляции с «foo1» до «предпоследнего», потому что они не разделяют общая основа.

+0

Спасибо. Исправлена ​​опечатка в псевдо-примере: «.diag создает .heximg и .hwresult» (это псевдо-пример, потому что я не предоставлял правил, пытаясь эликсировать вещи). –

+0

Должен признаться, что могу поклясться, что с явными правилами вы можете указать несколько выходов. Должен читать/тестировать. –

+1

Нет. Вы можете написать правило типа «foo bar biz: baz; command», но это НЕ означает, что один вызов преобразует «baz» в файлы «foo», «bar» и «biz». Вышеприведенное краткое описание трех правил: «foo: baz; command», «bar: baz; command» и «biz: baz; command». Другими словами, будет выполняться 3 раза, один раз для каждого выхода. Иногда вы можете избежать этого, потому что когда make идет, чтобы построить второй, он видит, что он уже обновлен. Но если вы включите параллельные сборки, вы получите 3 вызова чаще всего. И если вы используете -d, вы увидите, что проверите все 3. – MadScientist

1

Я не уверен, но, возможно, вы ищете Double-Colon Rules:

Дважды двоеточие правила явные правила, написанные с :: вместо : после целевых имен. Они обрабатываются иначе, чем обычные правила, когда одна и та же цель появляется в нескольких правилах.

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

Смежные вопросы