2016-08-12 2 views
1

Предисловие:GNU Make - ссылки на цели в другом Makefile

Да, мои Makefiles написаны плохо.
Нет, мы/не писали их; мы унаследовали эту базу кода от другой компании.
Я хочу знать, можно ли исправить мою проблему БЕЗ переписывания.

Вопрос

Есть ли способ, чтобы ссылаться на цели из другого Makefile и использовать их в качестве предварительных условий?

Скажем, у вас есть:

all: libs binary 

binary: # I need to add prereqs here 
    blah 
    blah2 
    blah3 

Для binary, мне нужно целей в других Makefiles как PreReqs.
Я не могу просто include эти make-файлы, и поэтому эти цели, потому что эти make-файлы определяют одинаковые переменные, но с разными значениями.

Можно ли сделать что-то вроде:

binary: C:/mk1:foo C:/mk2:bar 
    blah 
    blah2 
    blah3 

UPDATE

В случае, если это не ясно, Makefiles C:/mk1 и C:/mk2 являются частью одного и того же Makefile проект, который выполняется с помощью какой-то сверху уровневого файла с make --jobs=X, поэтому теоретически все make-файлы могут быть сделаны параллельно.

+1

Короткий ответ: нет. Длинный ответ: да, но вы можете без необходимости перенастроить цели. Это приемлемо? – Beta

+0

@Beta да. Первичная цель - минимальная модификация make-файлов, поэтому, очевидно, будет компромисс. Пожалуйста, продолжайте. – Adrian

ответ

0

Периоды Рекурсивные меры [duhn-duhn- duhnnnn!] является правильным инструментом для работы:

binary: foo bar 
    blah 
    blah2 
    blah3 

.PHONY: foo bar 

foo: 
    $(MAKE) -f mk1 [email protected] 

bar: 
    $(MAKE) -f mk2 [email protected] 

PHONY В силы сделать, чтобы выполнить эти правила и вызывать другие мейкфайлы к (возможно) восстановить foo и bar, даже если они уже существуют (потому что это Makefile не знать, какие предпосылки они могут иметь).

+0

Что касается условий гонки: что произойдет, если рецепт 'foo' в этом make-файле будет выполнен, а одновременно другой' make' в параллели будет 'make'-ing' foo' в файле 'mk1'? – Adrian

+0

@Adrian: Нецелесообразно пытаться распараллелить рекурсивный Make. – Beta

+0

Я не следую. Вы имеете в виду не использовать '--jobs'? – Adrian

0

Как насчет использования механизма include makefile (или sinclude) для включения унаследованного файла makefile? Это должно работать до тех пор, пока ваши собственные цели имеют разные имена.

Вы также можете конкатенировать make-файлы, указав несколько опций -f makefile. Они объединены по порядку.

+0

Но у меня около 40 make-файлов, которые имеют одинаковые переменные, но разные значения для них, поэтому, когда я 'включаю их ', я буду иметь:« объявления переменных »\ n« target »\ n« те же переменные, исправленные «\ n», возможно, цели с таким же именем, как указано выше » – Adrian

+0

Не будут ли более поздние переменные переопределения более ранними?И я получаю откровенные ошибки, потому что многие из этих make-файлов имеют одинаковые имена задач, такие как 'all' – Adrian

+0

@Adrian Ну, с теми же переменными, очевидно, что первоначальный make-процесс не мог быть вызван одновременно или параллельно, чтобы создать все в одном идти. Тогда вы также не должны пытаться. Поскольку вы не хотите их переписывать, вам придется использовать их так, как они были разработаны. Может быть, вы могли бы написать сценарий и сделать вызов этого скрипта командой в рецепте? Это может быть не идеально с минималистской точки зрения, но может быть намного проще, чем сложный хакерский подход. – Jens

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