【问题标题】:clion run cmake on each buildclion 在每个构建上运行 cmake
【发布时间】:2015-08-05 15:38:41
【问题描述】:

我不确定是否可以使用 clion 来执行此操作,我正在测试该程序并喜欢使用它来编写 c 代码,因为 ctags 和 etags 支持非常好。

我正在将一些文件从 cmake 源代码树复制到每个构建的 bin 位置。使用 clion 时,如果我更新了一些我正在复制的文件,结果不会在 clion 中更新。

如果我改为返回终端并运行典型的 cmake 步骤

cmake ../ && make && bin/./program

复制更新的文件,我可以看到我的结果。

这是我在构建中使用的 CMake 命令。

FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/resources/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/bin/resources/)

我也许可以重组 cmake 命令以使其每次都复制,或者这可能只是一个 clion 问题。我不确定并且希望能够从 clion 中处理这一切,而不是返回终端运行 cmake 命令以使更新生效。

【问题讨论】:

    标签: c++ c cmake clion


    【解决方案1】:

    如果您希望 CMake 在更改某些文件时执行某些操作,则应使用 add_custom_command 创建规则并通过 DEPENDS 参数传递文件。请注意,CMake 仅支持文件级依赖项,对于目录的 make 依赖项,您需要列出其中的所有文件。

    # Collect list of files within directory.
    FILES(GLOB files_list RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/resources/
        "${CMAKE_CURRENT_SOURCE_DIR}/resources/*") 
    # This will contain full paths to files in binary directory. 
    set(binary_files_list)
    foreach(file ${files_list})
        set(source_file ${CMAKE_CURRENT_SOURCE_DIR}/resources/${file})
        set(binary_file ${CMAKE_CURRENT_BINARY_DIR}/bin/resources/${file})
        add_custom_command(OUTPUT ${binary_file}
            COMMAND cmake -E ${source_file} ${binary_file}
            DEPENDS ${source_file})
        list(APPEND binary_files_list ${binary_file})
    endforeach()
    add_custom_target(resources DEPENDS ${binary_files_list})
    

    请注意,在添加/删除文件的情况下,您应该明确地运行cmake。这就是为什么硬编码文件列表优于GLOBing。

    【讨论】:

    • 一个矿石问题,因为我知道我在源代码中访问了哪些文件。有没有办法制作一个文件列表并将它们传递给 cmake 然后可以使用?例如,在我的 c 代码中,我引用了 filea.txt,我可以将它传递回 cmake 吗?然后我只是让构建自动读取文件列表并相应地更新,而不是遍历文件?
    • 您可以从 CMakeLists.txt 创建类似于 set(files_list ...)include 的文件。每当此文件将被更改(例如,在构建项目时),下一个 make 调用将触发重新配置步骤。如果您需要更详细的信息,请提出新问题。
    • 谢谢,如果我无法解决问题,我会提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2016-04-30
    • 2021-01-01
    • 1970-01-01
    • 2019-02-13
    • 2018-03-26
    相关资源
    最近更新 更多