【问题标题】:cmake custom command to copy and renamecmake自定义命令复制和重命名
【发布时间】:2013-09-06 13:54:37
【问题描述】:

我有一个生成 .so 库的现有 cmake 文件。我想修改它,这样它就会复制 .so 命名的其他东西。这大概是我所拥有的:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)
PROJECT(test1)

SET(TEST_SOURCES f1.c)
ADD_LIBRARY(test SHARED ${TEST_SOURCES})
ADD_CUSTOM_COMMAND(
    OUTPUT custom1
    COMMAND cp libtest.so custom1
    DEPENDS libtest.so)

我意识到有比硬编码库名称更好的方法,我只是在尝试弄清楚如何让它工作的同时这样做。 我缺少什么会导致我的复制/重命名自定义命令运行? 注意:这不是安装时的事情。 谢谢

【问题讨论】:

    标签: command cmake


    【解决方案1】:

    您可以考虑使用configure_file

    configure_file("path-to-your-so-file.so" "new-path-to-your-so-file.so" COPYONLY)
    

    【讨论】:

    • 请注意,此命令还会在源文件和目标文件之间创建链接,并且在将来,如果源文件被修改,复制将被重做。这可能需要,也可能不需要。
    • @DinoSaric 你可以提供一个链接来获取你的信息吗?我不认为 configure_file 只是在源文件和目标文件之间创建链接。它将源文件复制到dest。我认为这是用 CMAKE 复制文件的最简单方法。
    • 是的,它会复制,但是如果以后修改了输入文件,CMake会重新配置并将文件复制到输出。来自here:如果输入文件被修改,构建系统将重新运行CMake以重新配置文件并再次生成构建系统。生成的文件会被修改,并且只有在其内容发生更改时才会在后续 cmake 运行时更新其时间戳。
    【解决方案2】:

    我会坚持使用add_custom_command 的最初想法。但是,我建议您使用 add_custom_command(TARGET ...) 表单而不是 add_custom_command(OUTPUT ...)。

    OUTPUT 版本旨在将输出文件用作同一 CMakeLists.txt 中不同 CMake 目标中的源文件。构建此目标时(就在开始时)调用自定义命令,因为目标需要该文件在该点存在。

    在您的情况下,没有目标取决于您的文件 - 它是构建过程的产物。

    如果你使用add_custom_command(TARGET ...),这保证了每次重建目标时都会执行命令。如果原始目标(在本例中为test)更新,使用add_custom_target 需要您记住构建它。它还不必要地添加到您的目标列表中 - 对于小型项目来说可能不是问题,但对于大型项目来说可能是这样。

    这是我设置命令的方式:

    SET(COPY_TO_PATH custom1)
    ADD_CUSTOM_COMMAND(TARGET test POST_BUILD
                       COMMAND ${CMAKE_COMMAND} -E copy
                           $<TARGET_FILE:test>
                           ${COPY_TO_PATH}
                       COMMENT "Copying 'test' library to '${COPY_TO_PATH}'")
    

    这会将命令添加为test 的构建后事件。正如您正确识别的那样,硬编码库名称并不好。因此 CMake 提供了“生成器表达式”来处理这个问题。生成器表达式$&lt;TARGET_FILE:test&gt; 解析为test 创建的库的完整路径,与平台或编译器无关。请注意,生成器表达式只能在 COMMAND 参数中使用;例如,您不能在 COMMENT 部分中使用它们。

    实际的命令是调用 CMake 本身 (${CMAKE_COMMAND}) 及其 -E command line option。这提供了一种实现复制的跨平台方式,因为cp 不是 Windows 命令。要查看所有 -E 选项,请运行 cmake -E help。

    【讨论】:

    【解决方案3】:
    add_custom_target(CopyAndRename
        COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so
    )
    

    add_custom_target 引入了一个名为 CopyAndRename 的新目标。你可以运行它:

    make CopyAndRename
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多