在cmake文件中,将分号分隔的列表作为cmake命令。

4

我正在我的应用程序中构建亚马逊的aws-sdk-cpp。因此,我正在从 aws-sdk-cpp.tar.gz 文件中提取内容,并作为ExternalProject运行。

ExternalProject_Add(awssdk
    PREFIX DIR
    URL ${CMAKE_CURRENT_SOURCE_DIR}/${AWS_SDK_SRC_TAR}
    BUILD_COMMAND ${CMAKE_COMMAND} cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_ONLY='dynamodb;kenisis' -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/Ext/Aws/CtcInstall/${CMAKE_INSTALL_PREFIX} -DENABLE_TESTING=OFF ${CMAKE_BINARY_DIR}/source

但是,当我传递-DBUILD_ONLY='dynamodb;kenisis'(由AWS CMake文件支持)时,构建失败。如果我只传递-DBUILD_ONLY=dynamodb,则仅生成与DynamoDB相关的目标。但我也需要与kenisis相关的目标。如何在ExternalProject_Add中传递分号分隔的列表。


你只是打错了吗?应该是“kinesis”,对吧? - ydaetskcoR
请尝试使用双引号。有关CMake命令行中单引号/双引号问题的更多详细信息,请参见此处。 - Florian
你尝试过使用\;吗? - usr1234567
是的,Florian,我已经尝试过使用双引号了。但是错误显示为“add_subdirectory给定的源'aws-cpp-sdk-'dynamodb'不是一个现有的目录。” 因此,它正在搜索aws-cpp-sdk-"dynamodb而不是搜索aws-cpp-sdk-dynamodb - Tejaswi Burgula
我已经尝试过使用\"(错误:如上评论所述)和\'(错误:无效的转义序列')。 - Tejaswi Burgula
你尝试过将参数存储在缓存文件中,并通过“-C”进行传递吗? - usr1234567
1个回答

7

我自己也做了一些测试,包括@usr1234567评论中的提示。成功运行了以下代码(为了更方便地复现,我在示例中放置了Git地址):

ExternalProject_Add(
    awssdk
    PREFIX DIR
    GIT_REPOSITORY https://github.com/aws/aws-sdk-cpp.git
    CMAKE_CACHE_ARGS
        -DCMAKE_BUILD_TYPE:String=${CMAKE_BUILD_TYPE}
        -DBUILD_ONLY:String=dynamodb\\;kinesis
        -DCMAKE_INSTALL_PREFIX:String=${CMAKE_BINARY_DIR}/Ext/Aws/CtcInstall
        -DENABLE_TESTING:String=OFF
)

为了让ExternalProject_Add()这个CMake脚本函数在参数扩展的几个循环中正常运行,需要使用尴尬的双反斜杠。

替代方法

一种更通用的方法是使用像这样的$<SEMICOLON>生成表达式:

ExternalProject_Add(
    awssdk
    PREFIX DIR
    GIT_REPOSITORY https://github.com/aws/aws-sdk-cpp.git
    CMAKE_ARGS
        -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
        -DBUILD_ONLY=dynamodb$<SEMICOLON>kinesis
        -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/Ext/Aws/CtcInstall
        -DENABLE_TESTING=OFF
)

仅为演示目的,我这里还使用了另一种传递参数的方式。


此外,当您不将参数放在适当的位置,而是从一个变量中扩展它时,您可能还需要转义 ;,以确保变量扩展不会在参数列表中引入断点。因此,在这种情况下,您需要一个包含三个反斜杠的字符串:dynamodb\\\;kinesis - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接