Makefile:为什么我看不到编译输出?

时间:2012-03-01 12:03:57

标签: makefile gnu-make automake

我有一个主人Makefile,可以调用目录中的子制作文件。 这些子制作文件由autotools从Makefile.amconfigure.ac文件开始生成。

整个项目的第一个目标是共享库,而其他目标是链接它的可执行文件(因此主Makefile中存在依赖关系。)

问题是我只能看到共享库的编译输出,而其他项目只是打印警告和错误(我相信只有stderr文本)。

我无法理解导致此行为的原因,因为所有项目都是从主Makefile中的相同规则调用的,并且所有子制造文件都是从非常似乎的配置文件中自动生成的。

编译所有目标的主人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为规则中的每一行调用shell(sh),$(MAKE)等于“make”,默认情况下为make是详细的,为什么submake没有将其输出打印到stdout?

可以传递哪些标志以便发生这种情况?

2 个答案:

答案 0 :(得分:2)

这取决于子目录中的Makefile。例如,如果你在应用程序Makefile中的编译命令前面有一个@,那么它们就不会输出正在运行的命令(也可以查找$(Q),当你想要启用时,它会很常用/禁用makefile中的详细信息)。或者,您在apps目录中的make命令可能会将stdout推送到某些文件(这仍然可以让您看到警告)。

出于同样的原因,你的库makefile可能会错误地将stderr重定向到其他位置,这可以解释为什么你没有看到任何错误输出(或者它只是没有任何错误......)

如果您需要更多帮助,请在其他目录(以及所有相关变量定义)中发布构建规则。

答案 1 :(得分:1)

好吧,我的主makefile包含另一个放置.SILENT规则的文件。

直到今天我才注意到这一点。 删除此规则可以按预期进行工作。

哦,我的......