将 automake 配置为目标程序集

标签 c gcc assembly autotools automake

是否可以配置 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.omain.imain.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/

相关文章:

c - STM32 HAL SPI 中断处理

windows - 是否有任何支持 GCC 插件的 mingw-w64 版本?

c++ - AVR - 中断 vector 和全局变量

windows - 是基于现有语言的定制编程语言编译器吗?

c - 从字符串中提取不确定数量的整数

c - Azure IoT 中心协议(protocol)开销和使用 AMQP 的批处理

c++ - 无法将 google::sparse_hash_map 的值编译为 unique_ptr

assembly - 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

c - 了解反编译的汇编代码

c - 类型 "char (*)[16]"的参数与类型 "const char *"的参数不兼容