是否可以将automake配置为生成Makefile,除了构建.o文件和链接二进制文件之外,还有%.s的目标?我希望能够以文本格式查看编译器输出,而无需在.o文件上调用binutils。
具体来说,如果我有main.c
作为源文件,我希望能够运行make main.s
。所需的配方与main.o
的配方相同,但使用CC1 := $(CC) -S
。
答案 0 :(得分:1)
问题有点XY。
您希望能够制作中间装配文件default:
,其中
源文件foo.s
是自动化项目中的一个源,使用
由项目的foo.c
脚本生成的makefile。您
假设要做到这一点,你必须对automake输入做一些事情 -
./configure
s? - 这将导致Makefile.am
生成Makefile
其中包括与所有对象目标./configure
匹配的装配目标*.s
。
嗯,你可以,但那时你的项目不会是一个常规的自动课程 项目通常是分布式的,没有必要使其不规范 得到你想要的东西。
GCC选项-save-temps
让开发人员看到编译的中间文件 - 预处理器
输出,组装。
*.o
输出$ gcc -c -o foo.o foo.c
foo.o
输出:
$ gcc -save-temps -c -o foo.o foo.c
正如我所料,GNU Make从make-variable接收编译器选项
foo.o
foo.i # preprocessed source
foo.s # assembly
和automake尊重此约定,独立于任何编译器,并且除了任何编译器之外
项目自动调整规定的选项。所以,如果你原本会产生
makefile:
CFLAGS
然后,要将$ ./configure ...
添加到C编译器选项,请生成makefile
用:
-save-temps
如果您已经在使用$ ./configure CFLAGS=-save-temps ...
,例如
CFLAGS
然后附加$ ./configure CFLAGS="-g -O0" ...
:
-save-temps
然后,
$ ./configure CFLAGS="-g -O0 -save-temps" ...
将使$ make main.o
,main.o
和main.i
保持最新状态。
要禁用main.s
,请重新运行-save-temps
,将其从中删除
./configure
。
如果项目涉及C ++编译,那么CFLAGS
会影响C ++
编译器的方式与CXXFLAGS
影响C编译器的方式相同。注意
生成的预处理C ++源代码将被称为CFLAGS
,而不是*.ii
。
启用*.i
后,-save-temps
将不删除make clean
和*.i
文件。您可能不在乎,因为编译总是会破坏它们。如果你
要小心,你可以利用automake的标准虚假目标*.s
,
支持让autotooling维护者扩展行为
clean-local
。将以下配方添加到每个源目录的clean
在项目中:
Makefile.am
然后更新autotooling并重新生成Makefile:
clean-local:
$(RM) *.i *.ii *.s
答案 1 :(得分:1)
虽然生成的COMPILE
中的Makefile.in
变量在技术上是内部细节,但此解决方案依赖编译器来理解-c -S
,添加:
.c.s:
$(COMPILE) -c -S $<
只要我一直在使用autotools,{p>到Makefile.am
就已经工作了。添加可能也很方便:
clean-local:
rm -f *.s
我发现这在开发中很有用,可以查看特定configure
和CC
,CFLAGS
选项的汇编输出。
COMPILE
变量将被定义为:
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
同样,对于C ++源代码,我们有:
.cc.s:
$(CXXCOMPILE) -c -S $<