是否可以配置 automake 生成一个 Makefile,除了构建 .o 文件和链接的二进制文件之外,还有 %.s 的目标?我希望能够以文本格式查看编译器输出,而不必在 .o 文件上调用 binutils。
具体来说,如果我有 main.c
作为源文件,我希望能够运行 make main.s
。所需的配方与 main.o
相同,但使用 CC1 := $(CC) -S
。
最佳答案
问题有点XY .
您希望能够生成中间汇编文件 foo.s
,其中
源文件 foo.c
是自动工具项目中的来源之一,使用
由项目的 ./configure
脚本生成的 makefile。你
假设要做到这一点,你必须对 automake 输入做一些事情 -
Makefile.am
文件? - 这将导致 ./configure
生成 Makefile
包括匹配所有对象目标 *.o
的程序集目标 *.s
。
你可以,但是你的项目将不是一个常规的自动工具 project按正常分布,不需要做成不规则的 得到你想要的。
GCC 选项 -save-temps
存在是为了让开发者看到编译的中间文件——预处理器
输出,组装。
$ gcc -c -o foo.o foo.c
输出foo.o
$ gcc -save-temps -c -o foo.o foo.c
输出:
foo.o
foo.i # preprocessed source
foo.s # assembly
如我所料,GNU Make 从 make 变量接收编译器选项
CFLAGS
,并且 automake 遵守此约定,独立于任何编译器,并且除了任何编译器之外
项目的自动工具规定的选项。所以,如果你不这样生成
生成文件:
$ ./configure ...
然后,将 -save-temps
添加到 C 编译器选项,改为生成 makefile
与:
$ ./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
,将其从
CFLAGS
。
如果项目涉及C++编译,那么CXXFLAGS
会影响C++
编译器的方式与 CFLAGS
影响 C 编译器的方式相同。注意
生成的预处理 C++ 源代码将被称为 *.ii
,而不是 *.i
。
启用-save-temps
后,make clean
将不会删除*.i
和*.s
文件。你可能不在乎,因为编译总是会破坏它们。如果你
请注意,您可以利用 automake 的标准伪造目标 clean-local
,
支持让自动工具维护者扩展的行为
干净
。将以下配方添加到每个源目录的 Makefile.am
在项目中:
clean-local:
$(RM) *.i *.ii *.s
然后更新自动工具并重新生成 Makefiles:
$ autoreconf
$ ./configure ...
关于将 automake 配置为目标程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48829856/