【发布时间】:2018-05-17 21:13:41
【问题描述】:
这似乎是一个没有明确答案的常见问题。
情况是:当构建依赖它的目标时,我们想要在构建时安装第 3 方依赖项。大致是这样的:
ExternalProject_Add(target-ep
DOWNLOAD_COMMAND <whatever>
BUILD_COMMAND ""
INSTALL_COMMAND ""
CONFIGURE_COMMAND "")
add_library(target-imp STATIC IMPORTED)
set_target_properties(target-imp PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES /path/to/install/include
IMPORTED_LOCATION /path/to/install/lib/libwhatever.a)
add_library(target INTERFACE)
target_link_libraries(target INTERFACE target-imp)
add_dependencies(target target-ep)
(因为cmake issue 15052,这里探戈需要三个)
当使用 Unix Makefiles 作为生成器时,效果很好。仅按需安装依赖项,所有构建都正常工作。
但是,在 Ninja 上,这会立即失败,如下所示:
ninja: error: '/path/to/install/lib/libwhatever.a', needed by 'something', missing and no known rule to make it
这是因为 Ninja 扫描依赖项的方式与 Make 不同(请参阅 ninja issue 760)。所以我们要做的实际上就是告诉 Ninja 这个外部依赖是存在的。我们可以这样做:
ExternalProject_Add(target-ep
DOWNLOAD_COMMAND <whatever>
BUILD_BYPRODUCTS /path/to/install/lib/libwhatever.a
BUILD_COMMAND ""
INSTALL_COMMAND ""
CONFIGURE_COMMAND "")
不幸的是,这也失败了:
No build step for 'target-ep'ninja: error: mkdir(/path/to/install): Permission denied
这是因为我的下载步骤有权写入该路径,但无论 mkdir 命令由底层 add_custom_command() 和 ExternalProject_Add() 运行,都没有。
所以:
- 这可能在所有与 Ninja 和 CMake 吗? (版本不是问题,如果能解决问题,我可以使用最新的 CMake)
- 如果有某种方法可以解决明确列出
BUILD_BYPRODUCTS的问题,有没有一种方法可以简单地传达将要安装的整个目录是副产品?也就是说,/path/to/install/*是副产品?
【问题讨论】:
-
您指定了构建副产品,但给出了一个空的构建命令。如果您让构建步骤执行某些操作,错误会改变吗?
-
@CraigScott 我尝试将
echo hi用作BUILD_COMMAND。我的忍者输出现在更友好了,但仍然功能失调。 -
如果我的
IMPORTED_LOCATION中有错字,我只能重现您原来的问题。我无法重现权限问题。也许如果您可以发布一个重现您的问题的最小工作示例,我们可以从那里进行调查。 -
@CraigScott 这绝对与打字错误无关。这对 make 非常有用,如果我预先运行下载步骤,它会非常有用。很难发布一个演示权限问题的最小示例 - 需要从权限问题开始......