Backtrace для GNU make

Есть ли способ заставить GNU сделать печать «backtrace» для целей, которые привели к выполнению команды, когда она терпит неудачу? Я регулярно занимаюсь сильно запутанными make-файлами при решении проблем с переносимостью создания программного обеспечения в новой системе, и кажется, что это должно быть чрезвычайно простой задачей, чтобы сделать это, что очень поможет в отладке, но я не могу найти способ запросить Это. То, что я хотел бы увидеть, это что-то вроде:

gcc: error: ... make[2]: error: gcc ... make[2]: error building target bar make[2]: error building dependency bar for target foo make[1]: error: make -C subdir make[1]: error building target subdir make[1]: error building dependency subdir for target all ... 

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

Есть какой-либо способ сделать это?

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

make -p и make -d предоставить интересную информацию, но не совсем то, о чем вы просите. См . Страницу man man .

Да, римейк может дать вам задний ход. Ниже приведен пример использования Makefile в Makefile:

     remake --debugger Makefile
     GNU Make 4.1 + dbg0.91
     Построен для x86_64-unknown-linux-gnu
     Copyright (C) 1988-2014 Free Software Foundation, Inc.
     Copyright (C) 2015 Rocky Bernstein.
     Лицензия GPLv3 +: GNU GPL версии 3 или более поздней версии 
     Это бесплатное программное обеспечение: вы можете изменять и распространять его.
     ГАРАНТИЙ НИКАКИХ ГАРАНТИЙ, насколько это разрешено законом.
     Чтение make-файлов ...
     Обновление make-файлов ....
     -> (/ src / github / remake / Makefile: 608)
     Makefile: Makefile.in config.status
     римейк <0> bt
     => # 0 Makefile at / src / github / remake / Makefile: 608
     римейк <1> с
     -> (/ src / github / remake / Makefile: 594)
     Makefile.in: 
     римейк <2> bt
     => # 0 Makefile.in at / src / github / remake / Makefile: 594
       # 1 Makefile at / src / github / remake / Makefile: 608
     римейк <3> с
     -> (/ src / github / remake / Makefile: 618)
     config.status: настроить
     римейк <4> bt
     => # 0 config.status at / src / github / remake / Makefile: 618
       # 1 Makefile at / src / github / remake / Makefile: 608
     римейк <5> с
     -> (/ src / github / remake / Makefile: 621)
     настройки: 
     римейк <6> bt
     = <# 0 настроить в / src / github / remake / Makefile: 621
       # 1 config.status at / src / github / remake / Makefile: 618
       # 2 Makefile at / src / github / remake / Makefile: 608
     римейк <7> 

Вы также можете установить точку останова на определенную цель ( break ), перейти туда ( continue ) и backtrace . И по ошибке вы получите обратную линию от того, где вы были, когда вы разбились.