Makefile: Почему я не вижу вывод компиляции? - PullRequest
2 голосов
/ 01 марта 2012

У меня есть мастер Makefile, который вызывает submakefiles внутри каталогов.Эти вложенные файлы создаются автоматическими инструментами, начиная с файлов Makefile.am и configure.ac.

Первой целью всего проекта является разделяемая библиотека, в то время как остальные являются исполняемыми файлами, которые ссылаются на нее (поэтому существует зависимостьв основном Makefile).

Проблема в том, что я вижу только результаты компиляции общей библиотеки, в то время как другие проекты просто печатают предупреждения и ошибки (я полагаю, просто текст stderr).

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

Фрагмент master Makefile, который компилирует все цели, выглядит следующим образом:

SUBDIRS = libMylib app1 app2 app3

$(SUBDIRS):
    $(ECHO) "-> Building $@"
    $(MAKE) -C $@
    $(ECHO) "-> Build of $@ finished."

Вывод «libMylib» выглядит так:

-> Building libMylib
libtool: compile:  ppc-linux-gcc -DHAVE_CONFIG_H -I. -I/opt/ELDK/ppc_8xx/usr/include/ -I/opt/ELDK/ppc_8xx/include/ -Wall -std=gnu99 -O2 -MT libMylibF1.lo -MD -MP -MF .deps/libMylibF1.Tpo -c libMylibF1.c  -fPIC -DPIC -o .libs/libMylibF1.o
...
libtool: link: ppc-linux-gcc -shared  -fPIC -DPIC  .libs/libMylibF1.o .libs/libMylibF2.o .libs/libMylibF3.o -Wl,-rpath -Wl,/opt/ELDK/ppc_8xx/lib -Wl,-rpath -Wl,/opt/ELDK/ppc_8xx/lib -lz -lpthread  -O2   -Wl,-soname -Wl,libMylib.so.0 -o .libs/libMylib.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libMylib.so.0" && ln -s "libMylib.so.0.0.0" "libawmg.so.0")
libtool: link: (cd ".libs" && rm -f "libMylib.so" && ln -s "libMylib.so.0.0.0" "libMylib.so")
libtool: link: ( cd ".libs" && rm -f "libMylib.la" && ln -s "../libMylib.la" "libMylib.la" )
-> Build of libAwmg finished.

В то время как вывод любого"appN" это:

-> Building app1
app1F1.c: In function `app1F1Func1':
app1F1.c:161: warning: unused variable `varA'
app1F2.c:85: warning: `app1F2FuncX' defined but not used
-> Build of app1 finished.

Может кто-нибудь, пожалуйста, помогите мне?


РЕДАКТИРОВАТЬ:

Я обнаружил, что я мог видеть компиляциив "libMylib", потому что это "libtoolized".Если я "libtoolize" другой проект, я могу видеть компоновщик часть вывода (libtool: link:...).

Таким образом, учитывая, что make вызывает оболочку (sh) для каждой строки в правиле, что $ (MAKE) равно просто «make» и, по умолчанию, make является многословным, почему субмаке не печатает свой вывод на стандартный вывод?

Какие флаги могут быть переданы ему, чтобыэто происходит?

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Это зависит от Make-файлов в подкаталогах.Если, например, у вас есть @ перед командами компиляции в Makefiles приложения, то они не будут выводить команды, которые выполнялись (также ищите $ (Q), который используется довольно часто, когда вы хотите включить/ отключить многословность в make-файлах).В качестве альтернативы ваши команды make в каталогах приложений могут выдвигать stdout в некоторые файлы (что все равно позволит вам увидеть предупреждения).

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

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

1 голос
/ 19 апреля 2012

Ну, мой основной make-файл включает в себя другой файл, который вставляет правило .SILENT.

Я не заметил этого до сегодняшнего дня. Удаление этого правила делает вечную работу ожидаемой.

О, мой ...

...