Я использую цепочку инструментов, которая больше похожа на сеть. Существует множество альтернативных начальных точек, все из которых приводят к единому конечному результату.
Я обычно использую make или scons - на самом деле, я предпочитаю scons, но моя команда очень предпочитает make. Я открыт для других инструментов сборки.
например. final_result зависит от предпоследнего
final_result: penultimate
предпоследний может быть выполнен любым из нескольких способов:
Если начинать с file1, то
penultimate: file1 ; rule1
Если начать с файла2, то
penultimate: file2 ; rule2
В: как мне указать, чтобы начать с файла2, а не с файла1?
Полагаю, я мог бы использовать переключатель командной строки и ifdeffing. Но я бы предпочел, чтобы make или scons выяснили: «Эй, вокруг есть файл2, поэтому я должен использовать rule2, а не fil1 / rule1». Частично потому, что сеть намного сложнее, чем эта ...
Хуже того, иногда промежуточное звено на одном пути может быть началом на другом. Давайте посмотрим:
A .s производит .diag
foo.diag: foo.s
Но иногда нет .s, и у меня просто есть .diag, который кто-то другой дал мне уже построенный.
.diag создает .heximg и .hwresult
foo.hwresult: hwsim foo.heximg
foo.heximg: foo.diag
Но иногда мне дают .img напрямую
1032 * Etc. *
Я просто хочу написать общий график зависимостей и сказать: «Хорошо, теперь вот что мне дали - теперь, как вы доберетесь до конечного результата?»
С тем, что у меня есть сейчас, когда мне дают, скажем, foo.img, мне говорят (в данном случае make) "foo.s not dfound". Потому что make хочет пройти весь путь назад в графе зависимостей, чтобы сказать, устарел ли foo.img, а я хочу сказать: «предположим, что foo.img обновлен, и работает для пересылок для вещей, которые зависят от foo.img». вместо того, чтобы возвращаться к вещам, от которых зависит foo.img. "