【问题标题】:During build, how to create a directory for a file which is generated by some COMMAND?在构建过程中,如何为某个命令生成的文件创建一个目录?
【发布时间】:2018-09-27 06:05:51
【问题描述】:

我正在 CMake 中编写一个自定义命令,以便在构建时将文件转换为二进制格式。但是,我使用的工具需要预先存在文件的目录;它不会自动创建目录。

目前我的 CMake 宏如下所示:

MACRO(ConvertToBinary _name)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_BINARY_DIR}/${_name}.bin
        COMMAND ${EXE_DIR}/toBinary -i ${CMAKE_CURRENT_SOURCE_DIR}/${_name} -o ${CMAKE_BINARY_DIR}/${_name}.bin
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
    )
ENDMACRO(ConvertToBinary)

此宏不适用于等于 _name 参数,例如“test/sample.txt”,因为该工具在 ${CMAKE_BINARY_DIR} 下的 test/ 文件夹不存在的情况下运行。

如何在生成文件的工具运行前创建目录?


我试图通过在 CMake 的帮助下预先创建文件(和目录)来解决这个问题。因此该工具将在创建的目录下运行,并且可以覆盖输出文件。我尝试了以下方法:

MACRO(ConvertToBinary _name)
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_BINARY_DIR}/${_name}.bin
        FILE(WRITE ${CMAKE_BINARY_DIR}/${_name}.bin "Dummy")
        COMMAND ${EXE_DIR}/toBinary -i ${CMAKE_CURRENT_SOURCE_DIR}/${_name} -o ${CMAKE_BINARY_DIR}/${_name}.bin
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name}
    )
ENDMACRO(ConvertToBinary)

但它没有工作。我找不到有关如何在构建时使用 CMake 创建文件的信息,因此感谢您提供任何帮助。

【问题讨论】:

  • 使用 CMake 的 command line tool mode.
  • @Florian:引用的问题描述了如何创建目录,但没有描述如何从文件中提取目录组件。 (嗯,我知道get_filename_component 很简单)。但是由于不为输出文件创建目录的工具非常普遍,因此有一个关于该问题的完整解决方案的问题/答案会很有用。 (另一种方法可能是为相关问题添加相应的答案,但不改变该问题本身似乎效率不高)。
  • @Cyril:我稍微重新排列了您的问题帖子,以便将您的 主要问题(为文件创建目录)与您克服该问题的尝试(创建文件本身)分开.随意对问题进行更多改进,以便将来的读者会发现它很有用。

标签: cmake


【解决方案1】:

在 CMake 中,您可以提取文件的目录组件并创建此目录。

以下代码可用于生成文件但不为其创建目录的工具。

# Assume some tool generates file '${file}', but don't create directory for it.
#
# Extract directory component for a file
get_filename_component(_dir ${file} DIRECTORY)
add_custom_command(OUTPUT ${file}
    COMMAND ${CMAKE_COMMAND} -E make_directory ${_dir} # Create output directory
    COMMAND <tool-which-generates-file> ... ${file}
)

另请参阅that question,了解在 CMake 中创建目录的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多