2009-06-01 4 views
6

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

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

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

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

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

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

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

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

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

+0

Если вы не хотите устанавливать TARGET в make-файле B, то почему вы передаете TARGET = что-нибудь в make-файле A? – JesperE

+0

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

ответ

0

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

+0

К сожалению, директива unexport только предотвращает экспорт переменных, экспортированных с использованием экспорта, - это не влияет на переменные, переданные в командной строке на текущий процесс make или унаследованные от командной строки родительского make. Похоже, что установка значения через командную строку make делает ее нерушимой для чтения только для всех дочерних элементов. –

+0

Тогда у меня нет идей. – JesperE

3

Вы можете установить MAKEOVERRIDES в ничто в Makefile второго уровня в А.

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

Это проходит вниз нормальные параметры командной строки, как -k и -s но не CommandLine определения переменных ,

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

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

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

0

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

Для достижения поведения, где команды выполняются «make -n», префикс командной строки в Makefile с «+» (по аналогии с префиксом строки с «@» или «-»).

0

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

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

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

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

  • Нет связанных вопросов^_^