List 更改可能为空的CMake列表的正确方法

List 更改可能为空的CMake列表的正确方法,list,path,cmake,quotes,List,Path,Cmake,Quotes,最近又出现了一个老问题:设置CMAKE_模块路径的正确方法是什么?但这几乎适用于任何列表。然而,对于一般文本可能会有不同,但我只在该文本可能包含分号时才这样做 前提条件:该变量可能未设置、为空或已设置 选项: set(CMAKE\u模块路径${CMAKE\u当前源目录}/cmakeModules${CMAKE\u模块路径}) set(CMAKE\u模块\u路径${CMAKE\u当前源\u目录}/cmakeModules${CMAKE\u模块\u路径}) list(追加CMAKE\u模块\u路径$

最近又出现了一个老问题:设置CMAKE_模块路径的正确方法是什么?但这几乎适用于任何列表。然而,对于一般文本可能会有不同,但我只在该文本可能包含分号时才这样做

前提条件:该变量可能未设置、为空或已设置

选项:

  • set(CMAKE\u模块路径${CMAKE\u当前源目录}/cmakeModules${CMAKE\u模块路径})
  • set(CMAKE\u模块\u路径${CMAKE\u当前源\u目录}/cmakeModules${CMAKE\u模块\u路径})
  • list(追加CMAKE\u模块\u路径${CMAKE\u当前\u源目录}/cmakeModules)
  • list(追加CMAKE_模块路径“${CMAKE_当前源目录}/cmakeModules”)
  • if(非CMAKE_模块_路径)
    设置(CMAKE_模块_路径“${CMAKE_当前_源_目录}/cmakeModules”)
    else()
    集合(CMAKE_模块_路径“${CMAKE_当前_源_目录}/cmakeModules;${CMAKE_模块_路径}”)
    endif()
  • 包括一些推理:

    a) 一,。可能会失败,因为路径中有空格,因此必须使用2。为了避免这种情况。这是正确的吗?
    b) 3/4看起来是更好/更简洁的方式。是否需要空间?
    c) 五,。有1-4避免的(丑陋的)特殊情况处理。这是必需的吗

    相关的:

    但我仍然不确定何时使用引号,尤其是在处理路径和列表时

    奖励:在评估过程中到底发生了什么?如果所有
    ${…}
    在传递给函数之前都会被变量的值替换,那么例如,以下内容将不起作用,并且需要空格。但它确实起到了预期的作用:

    set(FOO_DIR "my space path")
    set(CMAKE_LIST /usr)
    set(CMAKE_LIST ${CMAKE_LIST} ${FOO_DIR}/foo)
    oder: list(APPEND CMAKE_LIST ${FOO_DIR}/foo)
    
    这也适用于对其他函数的调用。例如:

    set_target_properties(MYTARGET PROPERTIES
      IMPORTED_LOCATION ${FOO_DIR}/foo
    )
    
    问题是:为什么?在标准中的什么地方规定了这一点?

    a)正确

    b) 错。是的,我也喜欢这种方式


    c) False

    设置
    列表
    对于将值附加到列表中都是有效的:

    list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmakeModules)
    

    首选第一种形式(带有“list”),因为它较短且不重复变量的名称


    结果列表不受引用附加值的影响。也就是说,在这种情况下,报价只是口味问题

    注1:引用仅对特定情况有效(
    set
    list
    命令)。在其他情况下,引用可能至关重要

    注意2:如果当前路径包含分号(
    ),它将被错误地处理为带引号或不带引号


    为什么引用在这里毫无意义 假设变量
    A
    包含分号,如

    处理

     ${A}/cmakeModules
    

    传递给函数时,它们是不同的:第一种情况被视为两个参数,而第二种情况被视为单个参数。您可以在
    message()
    调用中查看该差异:

    # give: a/bc/d/cmakeModules
    message(STATUS ${A}/cmakeModules)
    # give: a/b;c/d/cmakeModules
    message(STATUS "${A}/cmakeModules")
    
    但这两种处理方法在
    list
    命令中的效果相同:

    set(B "m") # Initial value
    # Either command below sets B to 3(!) values: m;a/b;c/d/cmakeModules
    list(APPEND B ${A}/cmakeModules)
    list(APPEND B "${A}/cmakeModules")
    

    它可以被视为“CMake变量包含扁平列表”。

    我认为这个问题可以推广到“任何可能为空或未设置的列表变量”。但通常情况下,在“一般问题”中,答案中描述了可能性,而不是在问题帖中。你不觉得应该重新考虑你的问题吗?这可能很棒,比如。添加了一点,还有一个额外的问题,这应该有助于推理发生了什么以及正确的方法是什么。从技术上讲,1,2在列表前添加值,而3,4在列表中添加值。有时可能很重要(例如,首先查找…)。是的,你也可以做1,2追加,所以这不重要。只是想展示一下方法
     "${A}/cmakeModules"
    
    # give: a/bc/d/cmakeModules
    message(STATUS ${A}/cmakeModules)
    # give: a/b;c/d/cmakeModules
    message(STATUS "${A}/cmakeModules")
    
    set(B "m") # Initial value
    # Either command below sets B to 3(!) values: m;a/b;c/d/cmakeModules
    list(APPEND B ${A}/cmakeModules)
    list(APPEND B "${A}/cmakeModules")