【问题标题】:cmake run script for install target?cmake 为安装目标运行脚本?
【发布时间】:2021-01-26 00:06:26
【问题描述】:

我有一个项目,其中“安装”代码并不像复制一些文件那么简单。使用传统的 Makefile,我只需创建一个 make install 目标,它会运行一系列 shell 命令来执行我需要的操作。

但是谷歌搜索并没有导致这样的例子(有些事情很接近,但不完全......我认为)。所以基本上,我想要一个自定义命令,它取决于目标可执行文件,但不产生任何内容并运行不需要可移植的脚本来完成“安装”

谁有类似的例子?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    CMake 的install 命令允许自定义脚本。见官方文档:install - Custom Installation Logic

    install([[SCRIPT <file>] [CODE <code>]]
            [COMPONENT <component>] [...])
    

    SCRIPT 表单将在安装期间调用给定的 CMake 脚本文件。如果脚本文件名是相对路径,它将根据当前源目录进行解释。 CODE 表单将在安装期间调用给定的 CMake 代码。代码被指定为双引号字符串内的单个参数。比如代码

    install(CODE "MESSAGE(\"Sample install message.\")")
    

    将在安装过程中打印一条消息。

    要运行自定义 shell 脚本(或任何程序),请将 install(CODE ...)execute_process 结合起来:

    install(CODE "execute_process(COMMAND my_script.sh)")
    

    【讨论】:

    • 当然,这会让我运行一个 cmake 脚本。但是在此期间我可以执行任意 bash 命令吗?
    【解决方案2】:

    这对我有用:使用add_custom_target,然后将主目标作为依赖项添加到自定义目标目标。

    # create custom target for setcap to be executed
    add_custom_target(setcap ALL
        WORKING_DIRECTORY ${OUTPUT_DIR}/bin
        COMMAND ${CMAKE_COMMAND} -E 'sudo setcap cap_net_raw,cap_net_admin+eip ${}/bin/<executable name>)
    # create a dependency on the custom target for main target, setcap depends on ${proj_name}
    add_dependencies(setcap ${proj_name})
    

    【讨论】:

    • 不应该是add_dependencies(${PROJECT_NAME} setcat)吗?
    • 请编辑您的答案并直接在您的答案中交换它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多