【问题标题】:Configure automake to target assembly将 automake 配置为目标程序集
【发布时间】:2018-07-27 13:04:33
【问题描述】:

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

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

【问题讨论】:

    标签: c gcc assembly autotools automake


    【解决方案1】:

    问题有点儿XY

    您希望能够制作中间程序集文件foo.s,其中 源文件foo.c 是自动工具项目中的源之一,使用 由项目的./configure 脚本生成的makefile。你 假设要做到这一点,您必须对 automake 输入做一些事情 - Makefile.ams? - 这将导致./configure 生成 Makefiles 包括与所有对象目标 *.o 匹配的程序集目标 *.s

    你可以,但是你的项目不会是常规的自动工具 项目通常分布,无需使其不规则 得到你想要的。

    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-variable 接收编译器选项 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, 支持让自动工具维护者扩展 clean。将以下配方添加到每个源目录的Makefile.am 在项目中:

    clean-local:
        $(RM) *.i *.ii *.s
    

    然后更新自动工具并重新生成 Makefile:

    $ autoreconf
    $ ./configure ...
    

    【讨论】:

    • 是的,-save-temps 是比将.s 步骤烘焙到构建系统中更好的方法。或者作为一次性的,从构建日志中复制构建命令并从正确的目录手动运行它,-S -o- | less 在命令行末尾。 (也许还有其他选项可以使 asm 更易于阅读:How to remove “noise” from GCC/clang assembly output?
    【解决方案2】:

    虽然生成的Makefile.in 中的COMPILE 变量在技术上是一个内部细节,并且此解决方案依赖于编译器来理解-c -S,但添加:

    .c.s:
            $(COMPILE) -c -S $<
    

    只要我一直在使用自动工具,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 $<
    

    【讨论】:

    • 这个比rm foo.o/make方便,然后复制/粘贴编译命令行手动编辑? (最后是-S -o- | less,所以它通过管道进入寻呼机)。你必须cd 进入正确的目录,如果构建系统没有发出完整的命令行,你必须去挖掘,但这仍然是我通常做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多