【问题标题】:Call shell command after asm file generation in cmake在cmake中生成asm文件后调用shell命令
【发布时间】:2017-02-01 19:12:48
【问题描述】:

在 android mk 文件中,可以在使用 LOCAL_FILTER_ASM 生成程序集文件后立即调用 shell 命令。

我想知道在 cmake 中是否有类似的解决方法?

【问题讨论】:

    标签: android assembly makefile cmake


    【解决方案1】:

    我承认我曾查找过 what LOCAL_FILTER_ASM does

    以下是我的一段代码(仅在 CMake 中具有相同的功能):

    cmake_minimum_required(VERSION 3.0)
    project(LocalFilterASM C ASM)
    
    set(LOCAL_FILTER_ASM "cp")
    
    string(
        REPLACE 
            "<ASSEMBLY_SOURCE>" "<OBJECT>.S.original" 
            MY_CREATE_ASSEMBLY "${CMAKE_C_CREATE_ASSEMBLY_SOURCE}"
    )
    string(
       REPLACE 
            "<SOURCE>" "<OBJECT>.S" 
             MY_COMPILE_OBJECT "${CMAKE_ASM_COMPILE_OBJECT}"
    )
    
    set(
        CMAKE_C_COMPILE_OBJECT 
            "${MY_CREATE_ASSEMBLY}"
            "${LOCAL_FILTER_ASM} <OBJECT>.S.original <OBJECT>.S"
            "${MY_COMPILE_OBJECT}"
    ) 
    
    file(WRITE main.c "int main(void) { return 0; }")
    add_executable(${PROJECT_NAME} main.c)
    

    这只是采用了一些现有的 CMake 编译器规则并将其组合成一个新的多行规则 CMAKE_C_COMPILE_OBJECT。请注意,这只适用于 CMake 的 makefile 生成器。

    【讨论】:

    • 很好的答案!我不知道 CMAKE_C_COMPILE_OBJECT。
    • 我在一个更大的项目上执行,似乎它生成了带有“o.s”和“o.S.original”扩展名的程序集文件,因为我相信 代表目标文件。它工作得很好,但是看到这些“o.s”扩展有点令人困惑。
    • @loz 这就是 CMake 的expansion rules 的问题。他们没有“仅源名称”的内容,因此我无法在二进制输出目录中引用/创建自定义内容。作为后备,我扩展了对象的输出路径。
    【解决方案2】:

    这很难说,因为你没有提供任何你目前拥有的例子。

    但是,您可以使用 add_custom_command() 函数将前后脚本添加到任何目标(有关所需语法,请参阅页面底部的“构建事件”部分)。

    【讨论】:

    • 感谢您的回答。我尝试使用 add_custom_command(),但它只有三个构建事件(prebuild、prelink、postbuild)。在我的情况下,我需要一个在 asm 文件生成后立即触发的构建事件。
    • 好吧,就像说的那样,因为你没有展示你当前的 cmake 规则,所以我们无话可说。我(至少)不熟悉 Android makefile 或 LOCAL_FILTER_ASM。您是否尝试在每个源文件的编译中间插入一些操作,该操作将对生成的程序集进行操作,然后使用该操作的结果来生成目标文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2011-06-06
    • 2017-11-14
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多