2016-08-17 2 views
1

У меня есть куча qmake -генерированных make-файлов, каждый из которых вызывает make внутри них (рекурсивный make) в цепном виде.GNU recursive make - как захватить make-переменные для выполнения вложенного make-файла

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

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

За исключением переменных, каждый созданный make-файл qmake довольно автономный.

ВОПРОС

Как я могу имитировать «нормальный» среды для данной рекурсивной make так, что я могу назвать это в одиночку?

Я думаю, что мне нужно что-то сделать с выходом --print-data-base: проанализируйте его, а затем позвоните по номеру make с теми же самыми знаками и значениями, которые были у него во время нормальной сборки.

ПОЧЕМУ

Я делаю это потому, что мне нужно изменить команды компиляции для ONE Makefile, но это все под контролем верхнего уровня .conf, и я получаю в слишком глубоко.

+0

Разве вы не можете просто вызвать сделать на верхней Makefile и указать конкретную цель, которую вы заинтересованы в ('сделать что-я-want')? –

+0

@ RenaudPacalet нет, потому что они прикованы. На верхнем уровне выполняются вызовы Qmake, которые генерируют make-файл, вызовы делают на нем, вызывают qmake изнутри этого, чтобы сгенерировать еще один make-файл, а затем нажимают make на этом. – Adrian

+0

@Adrian, вы знаете, что Make не предназначен для рекурсии и единственной ситуации, когда рекурсивный Make работает правильно, если вы вызываете Make на подмодуле «черного ящика», то есть изолированный от остальной части сборки, явно не ваш случай ? –

ответ

0

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

После запуска вашей сборки, в первый раз, использовать что-то вроде:

ps -ef | head -1 
ps -ef | grep make 

найти делают процессы, участвующие в сборке. В столбце PID указан ИД процесса процесса make, в то время как столбец PPID содержит список его родителя. Используйте эту информацию, чтобы найти процесс создания верхнего уровня. Затем запустите:

strings /proc/<pid>/environ | sort > /tmp/make_env 
env | sort > /tmp/normal_env 
diff /tmp/normal_env /tmp/make_env 

Это покажет вам, как среда make-процесса отличается от среды вашей текущей оболочки.

Теперь это может не решить вашу проблему, поскольку GNU Make позволяет указывать переменные в качестве параметров командной строки. Таким образом, вы должны также проверить, как это бежится:

strings /proc/<pid>/cmdline 

Это будет печатать каждый аргумент командной строки <Pid>, на отдельной строке.

BTW, когда переменные передаются в GNU Make через аргументы командной строки, они обрабатываются путем переопределения любого экземпляра той же переменной, который может содержаться в make-файле.


в пределах Makefile, вы можете увидеть его окружение, используя:

$(info My environment is $(shell env)) 

Вы можете увидеть его параметры командной строки с помощью:

$(info MAKEFLAGS = $(MAKEFLAGS)) 

Если вы только хотят видеть переопределение , использовать МАКЬЕВЕРРИДЫ:

$(info MAKEOVERRIDES = $(MAKEOVERRIDES)) 

Наконец, цели можно увидеть с помощью:

$(info MAKECMDGOALS = $(MAKECMDGOALS)) 
Смежные вопросы