将automake配置为目标程序集

时间:2018-02-16 15:22:33

标签: c gcc assembly autotools automake

是否可以将automake配置为生成Makefile,除了构建.o文件和链接二进制文件之外,还有%.s的目标?我希望能够以文本格式查看编译器输出,而无需在.o文件上调用binutils。

具体来说,如果我有main.c作为源文件,我希望能够运行make main.s。所需的配方与main.o的配方相同,但使用CC1 := $(CC) -S

2 个答案:

答案 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.omain.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

我发现这在开发中很有用,可以查看特定configureCCCFLAGS选项的汇编输出。

COMPILE变量将被定义为:

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

同样,对于C ++源代码,我们有:

.cc.s:
        $(CXXCOMPILE) -c -S $<