【问题标题】:How to create directory using External_Add in cmake如何在 cmake 中使用 External_Add 创建目录
【发布时间】:2019-04-21 08:26:25
【问题描述】:

我的安装格式如下:

git clone ...
mkdir build
cd build
cmake ..
make

但我无法做到这一点。我试过类似的东西:

ExternalProject_Add(my_ext_project
    GIT_REPOSITORY repo...
    SOURCE_DIR "project_src"
    CONFIGURE_COMMAND  mkdir build
    BINARY_DIR "project_src/build"
    BUILD_COMMAND cmake .. COMMAND make
 )

但是当我尝试构建时,我不断得到

/bin/sh: cd: .../build: No such file or directory

如何使用 ExternalProject_Add 创建目录?

【问题讨论】:

  • 删除mkdir build 周围的双引号。另请参阅该问题:stackoverflow.com/questions/55711749/…
  • 删除引号只会让我得到错误“cd:.../build:没有这样的文件或目录”编辑问题以反映这一点。
  • 在您的ExternalProject_Add 调用中,我看不到执行cd ../build 的命令。另外,这个命令看起来没什么用:CMake 会自动从二进制目录调用BUILD_COMMAND
  • 在 cmake 尝试 cd 进入 BINARY_DIR 后似乎正在调用“mkdir build”
  • 嗯,我第一次看到有人为在 ExternalProject 中创建二进制目录而烦恼——我假设 CMake 自己来处理这个问题。尝试将BINARY_DIR 设置高于 CONFIGURE_COMMAND

标签: cmake


【解决方案1】:

好的,终于想通了。 “mkdir build”命令应该放在“PATCH_COMMAND”标签之后,如下所示:

ExternalProject_Add(my_ext_project
    GIT_REPOSITORY repo...
    SOURCE_DIR "project_src"
    #CONFIGURE_COMMAND  mkdir build ### wrong place for it! ###
    PATCH_COMMAND  mkdir build
    BINARY_DIR "project_src/build"
    BUILD_COMMAND cmake .. COMMAND make
 )

【讨论】:

    【解决方案2】:

    似乎ExternalProject_Add 不喜欢 二进制 目录 之一。来自ExternalProject documentation

    注意:如果指定了下载方式,则可能会删除源目录的任何现有内容。只有 URL 下载方法会在开始下载之前检查此目录是否丢失或为空,如果不为空则停止并显示错误。所有其他下载方法都会默默地丢弃源目录的任何先前内容。

    幸运的是,对于大多数项目来说,binary 目录实际上不需要 位于 源代码 中:项目的 README 提供 @ 987654323@ 目录只是构建目录的示例

    对于源目录之外的二进制目录,ExternalProject_Add自动创建二进制目录。

    只需要确保BINARY_DIR 选项出现在任何依赖该目录设置的选项之前:

    ExternalProject_Add(my_ext_project
        GIT_REPOSITORY repo...
        SOURCE_DIR "project_src"
        # Setting BINARY_DIR should come **before** CONFIGURE_COMMAND and BUILD_COMMAND
        BINARY_DIR "project_bin"
        # It is a way to refer to source directory in the ExternalProject_Add COMMAND.
        CONFIGURE_COMMAND cmake <SOURCE_DIR>
        BUILD_COMMAND make
    )
    

    请注意,对于ExternalProject_Add,此类 CONFIGURE 和 BUILD 命令是默认,因此您可以省略它们:

    ExternalProject_Add(my_ext_project
        GIT_REPOSITORY repo...
        SOURCE_DIR "project_src"
        BINARY_DIR "project_bin"
        # "Standard" CMake project doesn't require to specify any COMMAND.
    )
    

    【讨论】:

    • 谢谢!但不幸的是,这对我不起作用。发生的事情是 cmake 会创建目录,但是在 git repo 步骤之后目录会消失。我想这与克隆有关。
    • 是的,它似乎是一个特定的 ExternalProject_Add 关于源代码中的构建目录。实际上,您并没有强制这样做:您可以使用任何您想要的构建目录。我已经更新了答案帖。
    • 哇,再次感谢!但是我可以通过指定一个补丁命令在源目录中创建一个目录,如下所示:“PATCH_COMMAND mkdir build”。这似乎有效,因为 1)补丁命令在 git 克隆之后运行,2)它发生在源目录而不是二进制目录中,3)它发生在配置命令之前。是否可以将此添加到您的答案中,以便更完整?
    • 用不同的方法得到不同的答案非常适合 Stack Overflow。无需做出一个描述所有方法的单一答案
    猜你喜欢
    • 2011-04-11
    • 2015-12-14
    • 2016-04-24
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多