我有一个主人Makefile
,可以调用目录中的子制作文件。
这些子制作文件由autotools从Makefile.am
和configure.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?
可以传递哪些标志以便发生这种情况?
答案 0 :(得分:2)
这取决于子目录中的Makefile。例如,如果你在应用程序Makefile中的编译命令前面有一个@,那么它们就不会输出正在运行的命令(也可以查找$(Q),当你想要启用时,它会很常用/禁用makefile中的详细信息)。或者,您在apps目录中的make命令可能会将stdout推送到某些文件(这仍然可以让您看到警告)。
出于同样的原因,你的库makefile可能会错误地将stderr重定向到其他位置,这可以解释为什么你没有看到任何错误输出(或者它只是没有任何错误......)
如果您需要更多帮助,请在其他目录(以及所有相关变量定义)中发布构建规则。
答案 1 :(得分:1)
好吧,我的主makefile包含另一个放置.SILENT
规则的文件。
哦,我的......