Как я могу игнорировать присвоение переменной командной строки в рекурсивной сборке?

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

Я назову их "A" и "B", где "A" создает приложение, а "B" - библиотеки, используемые "A".

Makefile верхнего уровня в A вызывает "make TARGET= что угодно", что означает, что все рекурсивно вызываемые биты сборки наследуют значение TARGET как переменную только для чтения, включая систему сборки из B, которая вызывается как часть рекурсивная сборка.

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

Я могу видеть только два решения этого, ни одно из которых не является палитрой;

1) Переименуйте TARGET во что-то другое в make-файле в A, который его устанавливает, и в make-файлах в A, которые его используют, чтобы избежать конфликта с нижними уровнями системы сборки.

2) Используйте директиву override везде в make-файлах в B, где установлена ​​переменная TARGET, чтобы переопределить ее состояние только для чтения.

У кого-нибудь есть идеи получше? - в идеале я не хочу, чтобы система сборки B унаследовала от A ничего, кроме тех опций, которые я явно передал в систему сборки B от A.

Я, кстати, использую GNU Make v3.80.

4 ответа

Вы можете установить MAKEOVERRIDES на ничего в make- файле второго уровня в A.

callb:
      cd subdir && $(MAKE) MAKEOVERRIDES=

Это передает обычные параметры командной строки, такие как -k и -s, но не определения переменных командной строки.

Или вы используете исторический MFLAGS, который совпадает с MAKEFLAGS, за исключением того, что MFLAGS не содержит определения переменных командной строки.

callb:
     cd subdir && $(MAKE) $(MFLAGS)

Подробности об этих двух вариантах можно прочитать здесь: Руководство по GNU Make

В тот момент, когда система сборки A вызывает систему сборки B, не используйте '${MAKE}'напрямую; вызвать сценарий оболочки, который вызывает сборку системы B (возможно, после очистки среды).

Для достижения поведения, при котором команды выполняютсяmake -n', префикс командной строки в make-файле с помощью'+'(похоже на префикс строки'@' или же '-").

Похоже, вы изменили make-файл A, чтобы рекурсивно вызывать make-файл B, и, следовательно, вашу проблему. Почему бы вместо этого не ввести новый make-файл верхнего уровня, который рекурсивно вызывает make-файл B, а затем рекурсивно вызывает make-файл A? Например, комбинированный.

all:
    $(MAKE) -f Makefile.B
    $(MAKE) -f Makefile.A

Таким образом, make-файл B ничего не наследует от make-файла A.

Возможно, вы можете использовать директиву "не экспортировать", чтобы предотвратить распространение TARGET на make-файл B?

Другие вопросы по тегам