См. Команды make и все вызываемые файлы make после этого - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь разложить систему сборки make с очень большой базой кода, однако я не могу увидеть каждую команду, которую вызывает make, потому что она вызывает различные файлы make в многочисленных каталогах за пределами текущего каталога. Я следил за этим и другими ответами Создание команд make print перед выполнением, когда НЕ используется CMake

Хотя приведенное выше дало некоторый прогресс и довольно ярко показало, что это был не тот запуск, который мне нужен. Он предлагает решения для просмотра команд, выполняющих вызовы. Что лучше, чем отлично. Однако проблема заключается в том, что после этого вызываются различные подкоманды make. Я вижу только эти команды как напечатанные без дополнительной информации о том, что происходит sub make. Я попытался создать псевдоним make таким образом, чтобы

alias make='make SHELL='\''/bin/bash -x'\'''

# or

alias make='make -n'

Однако приведенное выше не может заменить вызванные команды make псевдонимом. Есть ли другой способ проанализировать систему сборки сборки с большой базой кода?

> make
rmdir --ignore-fail-on-non-empty /somefolder* 2> /dev/null; true
cd /someotherfolder/; make cur-dir=somefolder dirs-to-build=somemorefolders/ env_variable another_variable someMakeRule # no output from this  make
make  TARGET=someTarget env_variable gdbinit source_dir someMakeRule; # no output from this  make
# ...
# output from first top makefile
# ...
make[1]: Nothing to be done for 'someMakeRule'.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы не можете использовать псевдоним, потому что псевдонимы существуют только в интерактивных оболочках и не присутствуют в неинтерактивных оболочках, подобных той, которую make использует для вызова комментариев в рецептах. То же самое с функциями оболочки.

Вы также не можете установить переменную SHELL для команды, которая использует аргументы: значение SHELL должно быть только именем команды. Однако вы можете установить для переменной .SHELLFLAGS дополнительные параметры, которые будут передаваться в оболочку. Не забывайте, что вам понадобится опция -c в дополнение к любым добавляемым вами флагам!

Что-то вроде .SHELLFLAGS=-xc

Если все ваши make-файлы правильно вызывают свои подмейки, используйте make -n поскольку первоначальный вызов должен работать.

Под «правильным вызовом» я подразумеваю, что они должны всегда использовать переменную $(MAKE) при вызове подделок и никогда не использовать необработанные make command.

Если они не вызывают подделку должным образом, и вы не можете это исправить, то лучшее, что вы можете сделать, это написать сценарий оболочки с именем make, который выполняет то же, что и ваши псевдонимы, указанные выше, а затем добавить его в ваш PATH так что он найден первым. Очевидно, что внутри сценария вам нужно будет использовать полностью определенный путь для запуска «настоящей» программы make, иначе вы получите бесконечную рекурсию :)

0 голосов
/ 28 мая 2020

Вы можете легко отследить исполнение с помощью опции --trace. Рассмотрим следующий пример, в котором кому-то пришла в голову идея показать чистый вывод только без какой-либо опции для подробного описания:

$ cat Makefile
all: foo
        @echo Done with $@

foo: bar
        @echo Done with $@

bar:
        @$(MAKE) -f Makefile2 bar

.SILENT:

$ cat Makefile2
bar: baz
        @echo Done with $@

baz:
        @echo Done with $@

Обычная сборка не позволяет проверить, что происходит:

$ make
Done with baz
Done with bar
Done with foo
Done with all

Но --trace покажет, что происходит и почему:

$ make --trace
Makefile:8: target 'bar' does not exist
make -f Makefile2 bar
Makefile2:5: target 'baz' does not exist
echo Done with baz
Done with baz
Makefile2:2: update target 'bar' due to: baz
echo Done with bar
Done with bar
Makefile:5: update target 'foo' due to: bar
echo Done with foo
Done with foo
Makefile:2: update target 'all' due to: foo
echo Done with all
Done with all
...