Backtrace для GNU make

Есть ли способ заставить GNU make напечатать «обратную трассировку» целей, которые привели к выполнению команды в случае сбоя? Я регулярно сталкиваюсь с сильно запутанными make-файлами, решая проблемы с переносимостью, создавая программное обеспечение в новой системе, и мне кажется, что это должно быть чрезвычайно простой задачей для 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
...

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

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


person R.. GitHub STOP HELPING ICE    schedule 17.02.2011    source источник
comment
Как бы то ни было, обратная трассировка может быть нелинейной, потому что в целом граф зависимостей make представляет собой DAG, а не дерево. Это может быть создание bar для цели foo и цели subdir, и это может быть создание цели foo для цели subdir и цели all, и создание subdir для цели all. Я не думаю, что это усложняет создание, чем трассировку стека, просто труднее читать...   -  person Steve Jessop    schedule 17.02.2011
comment
Если вы думаете об этом как о попытке зависимости, то да, это DAG. Однако в обходе GNU Make существует строго стек зависимостей. Таким образом, в то время как обратная трассировка обычно относится к стеку вызовов, здесь аналогичная вещь — это стек зависимостей.   -  person rocky    schedule 27.04.2015


Ответы (3)


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

person Eldar Abusalimov    schedule 06.02.2012

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

person Robᵩ    schedule 17.02.2011
comment
ОП также может найти make -n полезным. - person Carl Norum; 17.02.2011
comment
Да, это твои друзья. Если ваши make-файлы не используют какие-либо встроенные правила make, вы можете уменьшить количество выводов с помощью -Rr (вам нужен только один из них, но я никогда не могу вспомнить, какой именно, поэтому я всегда использую оба). - person bobbogo; 04.03.2011

Да, remake может дать вам обратную связь. Вот пример использования Makefile римейка, показывающий это:

    remake --debugger Makefile
    GNU Make 4.1+dbg0.91
    Built for x86_64-unknown-linux-gnu
    Copyright (C) 1988-2014 Free Software Foundation, Inc.
    Copyright (C) 2015 Rocky Bernstein.
    License GPLv3+: GNU GPL version 3 or later 
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Reading makefiles...
    Updating makefiles....
    -> (/src/github/remake/Makefile:608)
    Makefile: Makefile.in config.status
    remake<0> bt
    =>#0  Makefile at /src/github/remake/Makefile:608
    remake<1> s
    -> (/src/github/remake/Makefile:594)
    Makefile.in: 
    remake<2> bt
    =>#0  Makefile.in at /src/github/remake/Makefile:594
      #1  Makefile at /src/github/remake/Makefile:608
    remake<3> s
    -> (/src/github/remake/Makefile:618)
    config.status: configure
    remake<4> bt
    =>#0  config.status at /src/github/remake/Makefile:618
      #1  Makefile at /src/github/remake/Makefile:608
    remake<5> s
    -> (/src/github/remake/Makefile:621)
    configure: 
    remake<6> bt
    =<#0  configure at /src/github/remake/Makefile:621
      #1  config.status at /src/github/remake/Makefile:618
      #2  Makefile at /src/github/remake/Makefile:608
    remake<7> 

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

person Community    schedule 27.04.2015