首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CMAKE :只构建下载的外部项目的一个目录

CMAKE :只构建下载的外部项目的一个目录
EN

Stack Overflow用户
提问于 2014-07-02 01:35:25
回答 1查看 4.3K关注 0票数 1

CMAKE :我只想构建一个可下载的外部项目的一部分

我想使用的外部项目具有以下结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- ExternalProject
    - Subproject A  <- this i care for
    - Subproject B

所有这些都在可供下载的同一个存档中。问题是,子项目B有更多的依赖项,我不希望在我的项目中,而且它与我正在做的事情无关。这些子项目是可以自己构建的,所以现在我把子项目A从归档文件中拿出来,放到我的主要项目中,这个项目运行得很好,但是我不想用我的项目部署外部项目,而是允许用户在运行cmake时自己下载外部项目。遗憾的是,每个子项目都没有单独的存档,所以我只能下载完整的外部项目。

我想要的是告诉CMAKE下载并解压缩整个存档ExternalProject,但只向我的项目添加子项目A。我阅读了关于ExternalProject_add的所有文档,但是它主要允许对项目的构建参数进行详细的配置。也许我只是寻找错误的关键字,我的问题真的很简单的回答-或者这是不可能的。

如果有人能给我指点正确的方法,我会非常感激的。

实际项目:上述档案有两个子文件夹"octomap“和"octovis”。octomap是我想要构建的,而如果不满足依赖项,octovis将产生很多错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExternalProject_Add(octomap-1.6.5
    URL https://github.com/OctoMap/octomap/archive/v1.6.5.tar.gz
    URL_MD5 de09b1189a03ac8cbe4f813951e86605
     SOURCE_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/octomap/
    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}"
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-02 03:50:48

可以显式定义所有命令。例如,您有一个目录结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FooBar/
        - CMakeLists.txt
        - Foo/
        -      - CMakeLists.txt # You wanna build
        - Bar/
        -      - CMakeLists.txt # You wanna ignore

使用硬编码路径的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(ext_dir "${CMAKE_BINARY_DIR}/third-party-activities/ExternalProject/")
set(foobar_dir "${ext_dir}/FooBar")

ExternalProject_Add(
    FooBar
    URL "your-url-here"
    SOURCE_DIR "${foobar_dir}/Source"
    CONFIGURE_COMMAND
        "${CMAKE_COMMAND}"
        "-H${foobar_dir}/Source/Foo"
        "-B${foobar_dir}/Builds"
        "-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}"
    BUILD_COMMAND
        "${CMAKE_COMMAND}" --build "${foobar_dir}/Builds"
    INSTALL_COMMAND
        "${CMAKE_COMMAND}" --build "${foobar_dir}/Builds" --target install
)

更新

请注意,这样修补父项目要容易得多:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# FooBar/CMakeLists.txt
option(BUILD_BAR_SUBPROJECT "Build targets from subproject Bar" ON)
...
add_subdirectory(Foo)
if(BUILD_BAR_SUBPROJECT)
  add_subdirectory(Bar)
endif()

..。现在你不需要那么多地黑ExternalProject_Add了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExternalProject_Add(
    FooBar
    URL "your-url-here"
    CMAKE_ARGS -DBUILD_BAR_SUBPROJECT=OFF "-DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_DIR}"
)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24527656

复制
相关文章
Python中*args和**kwargs
在python开发的过程中,经常会遇到了*args和**kwargs这两个魔法变量,那么它们是什么呢?
SEian.G
2021/07/07
1.1K0
解决SystemExit: 2,args = parser.parse_args() 的问题,
报错原因: argparse 是一个旨在解析从命令行传递的参数的模块,您可以使用 argparse 来编译 参数内容。如果 argparse 认为参数无效,则退出,这通常在 python 中通过调用 sys.exit() 来完成,这会引发 SystemExit 错误,这就是您所看到的。 所以问题是你试图从交互式解释器(看起来像 ipython)中使用 argparse,此时程序已经启动,所以应该已经解析了 args。
汀丶人工智能
2022/12/21
1.8K0
python中的*args和**kwar
python支持可变参数:可以使用*args、**kwargs实现 *args是可变的positional arguments列表,是一个tuple。 **kwargs是可变的keyword arguments列表,是一个dict。 *args必须位于 **kwargs之前,因为positional arguments必须位于keyword arguments之前。 *args、**kwargs的使用: 函数定义:是一个将参数pack的过程 函数调用:将参数unpack 例子: def foo(*args,
py3study
2020/01/16
6540
Python函数中的*、*args、**kwargs
当函数需要的参数数量不确定的时候,可以使用args 和 kwargs , 所有的位置参数保存在args中,以元组的形式保存,调用时直接用args,不需要带 * 所有的关键参数保存在kwargs中,以字典的形式保存,调用时也直接使用kwargs
神秘的寇先森
2020/02/19
9570
Spring-AOP @AspectJ切点函数之args()和@args()
虽然args()允许在类名后使用“+”通配符,但该通配符在此处没有意义,添加和不添加的效果都一样。
小小工匠
2021/08/17
1.1K0
Python中 *args 和 **kwargs 的含义?
答:在python中,*args和**kwargs通常使用在函数定义里。*args 和 **kwargs 都允许你给函数传不定数量的参数,即使在定义函数的时候不知道调用者会传递几个参数。ps: *args和**kwargs只是一个大家都遵守的习惯,名字可以任意写的 。
用户1564362
2019/11/12
1.2K0
*args 和 **kwargs的用法
一 简介 *args 和 **kwargs 主要用于函数定义。 当我们需要定义的函数的传入参数个数不确定时,可以使用*args 和 **kwargs 代替不确定的参数个数。其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 我们可以写成*var和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 二 使用 2.1 *args 当函数的参数个数不确定且不需要指定参数名称时,*args的格式是常规的参数 val1[,val2,val3....]
用户1278550
2018/08/09
4790
python中*args和**kwargs的区别
*args是函数使用者可以发送任意数量非键值对的参数传给这个函数,*args在接收参数后,将返回值以元组tuple的形式返回。
用户7886150
2020/12/19
4690
Python中 *args 和 **kwargs 的含义?
小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
程序员小猿
2021/01/19
7450
Python中 *args 和 **kwargs的用法
总是会在一些代码中看到*args和**kwargs,一直不知道具体怎么用,今天整理了一下:
BigYoung小站
2020/07/02
5920
python: *args & **kwargs
Python是支持 可变参数 的,实现手段之一就是使用 *args 和 **kwargs 语法。
JNingWei
2018/09/28
9810
*args和**kwargs
*args 和**kwargs常用于方法定义,*args 和**kwargs允许你传递可变数量的参数到函数里,可变数量在这里的意思是,你事先不知道有多少个参数可以传递给你的函数,所以在这种情况下,你使用这两个关键字。*args 用于传递一个non-keyword的参数list给函数,看示例
Helloted
2022/06/07
2770
什么是*args和**kwargs?
可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: positional argument follows keyword argument”。
狼啸风云
2020/05/14
1.3K0
python中的参数传递*args与**kwargs
*args与**kwargs可以将任意数目的参数传递给函数,主要用在函数定义中,最常见的是在装饰器中使用。
生信编程日常
2020/05/26
1.8K0
[C语言] #、##、__VA_ARGS__的使用
从网上借鉴了一些内容,然后整理了一下三者的区别,记录一下。 #include <iostream> // #: 用来把参数转换成字符串 #define LOG1(x) do { printf("%s=%d\n",#x,x); }while(0) // ##:用于将带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串;但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元; #define LOG2(x) log##x() // __VA_ARGS_
轻舞飞扬SR
2021/03/15
1.1K0
python *args,**kwargs参数
实际上,关键的是*和** 我们以三个例子来解释: 普通的使用参数: def test1(arg): print(arg) test1("a") 输出: a *是将剩下的参数用元祖表示 def test1(arg1,arg2,*args): print(arg1) print(arg2) print(args) test1(1,2,3,"a","b") 输出: 1 2 (3, 'a', 'b') **是将参数转换成字典进行表示 def test2(**kwargs):
西西嘛呦
2020/08/26
5060
[Go] 获取Go二进制文件的真正执行路径os.Args
os.Args是个[]string 里面存着路径和全部参数 直接拼接一下就获取到完整路径了 func GetAllExecutePath()string{ allPath:="" f
唯一Chat
2021/04/26
8420
[Go] 获取Go二进制文件的真正执行路径os.Args
python函数——形参中的:*args和**kwargs
多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现
菲宇
2019/06/13
1.1K0
Python 拓展之 *args & **kwargs
我们在前几天的文章中写的函数,它们的参数的个数都是确定的,我们知道世界是不确定的,那么函数的参数当然也有不固定的时候,那么当我们碰到这个问题的时候,该怎么解决呢?请看接下来的文章。
编程文青李狗蛋
2019/11/07
5050
点击加载更多

相似问题

const funcName = (args) => {}和const funcName = (args) => ( );?

33

char* const args[]定义

21

调用请求(const char *args)的函数

20

错误:不匹配operator<<中的std::operator<< <std::char_traits<char> >(*&std::cout),((const *)

13

错误:与‘boost::operator+系统::path::filename() const() +“/”“中的’‘不匹配

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文