- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这似乎是一个没有明确答案的常见问题。
情况是:我们有一个第三方依赖项,我们希望在构建依赖于它的目标时在构建时安装它。大致是:
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
这是因为我的下载步骤有权写入该路径,但是底层 add_custom_command()
正在使用 ExternalProject_Add 运行任何
没有。mkdir
命令()
所以:
BUILD_BYPRODUCTS
,是否有办法简单地表明将要安装的整个目录是副产品?也就是说,/path/to/install/*
是副产品?最佳答案
隐藏的mkdir
步骤ExternalProject
(所有其他步骤直接或间接依赖于此)始终尝试创建完整的目录集,即使它们不会被使用。你可以看到这个here 。作为引用,它执行以下操作:
ExternalProject_Add_Step(${name} mkdir
COMMENT "Creating directories for '${name}'"
COMMAND ${CMAKE_COMMAND} -E make_directory ${source_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${binary_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${install_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${tmp_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${stamp_dir}${cfgdir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${download_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${log_dir} # This one only since CMake 3.13
)
Unix 系统上的默认安装位置可能是 /usr/local
,因此,如果您没有对其尝试创建的所有目录的写入权限,那么这可能与您的问题有关。我建议您检查每个位置的权限,并确保它们已经存在或可写。或者,您可以指定构建树本地的安装目录,这样即使不会使用它,也至少可以始终创建它(请参阅下面的示例)。
如果你使用Ninja,它的依赖性检查会比make更严格。您有target-ep
进行提供 libwhatever.a
的下载,所以你确实需要BUILD_BYPRODUCTS
告诉 Ninja target-ep
是什么创建了该文件。正如您所发现的,如果您不这样做,那么 target-imp
会指向一个最初不存在的库,Ninja 正确地提示它丢失了并且不知道如何创建它。如果您提供BUILD_BYPRODUCTS
,构建步骤不应该为空是有道理的,因此您可能需要执行一些操作作为构建步骤,即使它只是 BUILD_COMMAND
这实际上并没有做任何有意义的事情。
以下 target-ep
的修改定义应该希望能让事情为你工作:
ExternalProject_Add(target-ep
INSTALL_DIR ${CMAKE_CURRENT_BUILD_DIR}/dummyInstall
DOWNLOAD_COMMAND <whatever>
BUILD_BYPRODUCTS /path/to/install/lib/libwhatever.a
BUILD_COMMAND ${CMAKE_COMMAND} -E echo_append
INSTALL_COMMAND ""
CONFIGURE_COMMAND "")
您原来的问题还创建了对错误目标的依赖。 target-imp
应该取决于target-ep
,但你有target
取决于target-ep
反而。正确的依赖关系可以这样表达:
add_dependencies(target-imp target-ep)
与 BUILD_BYPRODUCTS
选项,Ninja 已经知道上述依赖关系,但其他生成器(包括 make)需要它。
您还没有指定您的 <whatever>
download 命令确实如此,但我假设它负责确保该库存在于 /path/to/install/lib/libwhatever.a
当它执行时。您也可以尝试制作DOWNLOAD_COMMAND
空并放置<whatever>
作为BUILD_COMMAND
相反。
解决您的具体问题:
- Is this possible at all with Ninja and CMake? (Version is not an issue, I can use the latest CMake if that solves the problem)
是的,我验证了上述方法适用于 Ninja 1.8.2,使用 CMake 3.11.0 在 macOS 上进行虚拟测试项目。我希望它能够与 CMake 3.2 或更高版本一起使用(此时添加了对 BUILD_BYPRODUCTS
选项的支持)。
- If there is some way to workaround with explicitly listing BUILD_BYPRODUCTS, is there a way to simply communicate that the entire directory that will get installed is a byproduct? That is, /path/to/install/* is a byproduct?
不太可能。 Ninja 如何知道这样的目录中应该有什么内容?获得可靠依赖关系的唯一方法是显式列出预期存在的每个文件,您可以使用 BUILD_BYPRODUCTS
来执行此操作。在你的情况下。
关于cmake - 将ExternalProject 下载步骤与Ninja 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50400592/
我想要的是能够在输入获得焦点或失去焦点时执行某些操作(两个事件)。 我尝试了以下方法,但这按事件单独工作(单独编码时):仅在焦点上,或仅在失去焦点时。 另外,我希望它尽可能跨平台(包括触摸设备),这是
我分别研究了TableView的Filtering和Pagination。 过滤: this帖子帮助我满足了我的需要 分页: this , this帖子也帮助了我 我想像这样将它们组合在一起: 详情-
我是 TDD 方法的新手,所以我想知道是否有人经历过这种机智可以启发我一点。我想获得一些关于如何一起使用 UML 和 TDD 方法的线索。 我已经习惯了:用 UML 设计 --> 生成骨架类(然后保持
我尝试使用入口点和 cmd 设置 Docker。 FROM debian:stretch RUN apt-get update && \ apt install gnupg ca-certificat
我想要一个 Class 对象,但我想强制它所代表的任何类扩展类 A 并实现接口(interface) B。 我能做到: Class 或者: Class 但我不能两者兼得。有办法做到这一点吗? 最佳答案
我是 Rubymine 的长期用户。 Rubymine 非常适合基于 html 的 Rails 应用程序,但我现在正在做更多的 SPA 客户端工作(例如 javascript/react)。我发现我真
我注意到我使用的某个脚本依赖于原型(prototype)。 (Lightbox 2) 它会与 jQuery 在同一页面上一起工作吗?有没有办法确保它们不冲突? 最佳答案 可以,但你需要采取 speci
我需要对表中显示的数据进行分页并通过 ajax 调用获取它 - 这是我通过使用具有以下配置的 dataTables 插件来完成的 - bServerSide : true; sAjaxSource :
我是 gtk 新手,所以想知道在 C 语言中归档和 gtk 是否可以一起使用?例如,我可以从 .txt 文件中读取,然后在相同的代码中使用 gtk 在标签或其他内容中显示它吗?如果是,怎么办? 谢谢!
有没有人设法得到Bck2Brwsr最近与 Java 8/JavaFX 8 一起工作?有没有兼容的机会?我找不到太多关于它的信息,也没有一个好的起点。使用给定的 Maven archetype我遇到了几
在我的应用程序中,用户通过 openid(与 stackoverflow 相同)登录/注销。 我想通过 oauth 向第三方应用程序开放我的应用程序。 如何创建我的 openid-consumer 应
我在启动和运行 Hibernate 和 Spring 时遇到一些问题。我有一个网络服务器项目,它使用了其他几个具有持久实体的项目。我遇到的问题是,对于存储在 WEB-INF/libs 内的另一个 ja
我有 @ControllerAdvice 类,它处理一组异常。我们还有一些其他异常,这些异常用 @ResponseStatus 注释进行注释。为了结合这两种方法,我们使用博客文章中描述的技术:http
我想在屏幕上使用进度条而不是 progressDialog。 我在我的 XML View 文件中插入了一个进度条,我想让它在加载时显示并在不加载时禁用它。 所以我使用的是可见的,但它发生了,所以其余的
CREATE TABLE `users` ( `id` int(11) AUTO_INCREMENT, `academicdegree` varchar(255),
IN() 中使用的查询返回:1, 2。然而,整个查询返回 0 行,这是不可能的,因为它们存在。我在这里做错了什么? SELECT DISTINCT li.auto_id FROM links
亲们, 我如何在使用 Jade 生成的表单上实现 jQuery 样式?我想做的是美化 表单并使它们可点击。我在 UI 方面很糟糕。期间。 我如何在表单上实现这个可选择的方法? http://jquer
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我可以: auto o1 = new Content; 但不能: std::shared_ptr o1(new Content); std::unique_ptr o1(new Content); 我
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!