代码之家  ›  专栏  ›  技术社区  ›  Arnav Borborah

如何将CMake生成器表达式拆分为多行?[副本]

  •  1
  • Arnav Borborah  · 技术社区  · 7 年前

    set(MYPROJ_VERSION_MAJOR "1")
    set(MYPROJ_VERSION_MINOR "0")
    set(MYPROJ_VERSION_PATCH "0")
    set(MYPROJ_VERSION_EXTRA "rc1")
    set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
    

    它已经超过了80行的限制。那么,如何将CMake中的一行拆分为多行,而不进行详细(多行)操作呢 list(APPEND ...)

    0 回复  |  直到 8 年前
        1
  •  90
  •   Hotschke    9 年前

    的更新 CMake 3.0及更新版本

    \ cmake-3.0-doc

    message("\
    This is the first line of a quoted argument. \
    In fact it is the only line but since it is long \
    the source code uses line continuation.\
    ")
    


    Debian喘息后端口:2.8.11

    Ubuntu 14.04(LTS):2.8.12
    Ubuntu 15.04:3.0.2版
    Mac OSX:cmake-3可通过 Homebrew Macports Fink
    Windows:cmake-3可通过 Chocolatey

        2
  •  56
  •   Douglas Royds    8 年前

    CMake 3.0及更新版本

    使用 string(CONCAT) 命令:

    set(MYPROJ_VERSION_MAJOR "1")
    set(MYPROJ_VERSION_MINOR "0")
    set(MYPROJ_VERSION_PATCH "0")
    set(MYPROJ_VERSION_EXTRA "rc1")
    string(CONCAT MYPROJ_VERSION "${MYPROJ_VERSION_MAJOR}"
                                 ".${MYPROJ_VERSION_MINOR}"
                                 ".${MYPROJ_VERSION_PATCH}"
                                 "-${MYPROJ_VERSION_EXTRA}")
    

    line continuation of quoted arguments ,如果字符串中不包含缩进空格,则无法缩进第二行或后续行。

    CMake 2.8及更高版本

    你可以使用列表。列表中的每个元素都可以放在新行上:

    set(MYPROJ_VERSION_MAJOR "1")
    set(MYPROJ_VERSION_MINOR "0")
    set(MYPROJ_VERSION_PATCH "0")
    set(MYPROJ_VERSION_EXTRA "rc1")
    set(MYPROJ_VERSION_LIST "${MYPROJ_VERSION_MAJOR}"
                            ".${MYPROJ_VERSION_MINOR}"
                            ".${MYPROJ_VERSION_PATCH}"
                            "-${MYPROJ_VERSION_EXTRA}")
    

    不带引号的列表不带空格:

    message(STATUS "Version: " ${MYPROJ_VERSION_LIST})
    -- Version: 1.0.0-rc1
    

    如果确实需要字符串,可以先将列表转换为字符串:

    string(REPLACE ";" "" MYPROJ_VERSION "${MYPROJ_VERSION_LIST}")
    message(STATUS "Version: ${MYPROJ_VERSION}")
    -- Version: 1.0.0-rc1
    

    原始字符串中的任何分号都将被视为列表元素分隔符,并被删除。他们必须逃脱:

    set(MY_LIST "Hello World "
                "with a \;semicolon")
    
        3
  •  9
  •   Rian Sanderson    14 年前

    它仍然有点冗长,但是如果80个字符的限制真的让您感到不舒服,那么您可以重复地附加到同一个变量:

    set(MYPROJ_VERSION_MAJOR "1")
    set(MYPROJ_VERSION_MINOR "0")
    set(MYPROJ_VERSION_PATCH "0")
    set(MYPROJ_VERSION_EXTRA "rc1")
    set(MYPROJ_VERSION "${MYPROJ_VERSION_MAJOR}.")
    set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_MINOR}.")
    set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_PATCH}-")
    set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_EXTRA}")
    message(STATUS "version: ${MYPROJ_VERSION}")
    

    $ cmake  ~/project/tmp
    -- version: 1.0.0-rc1
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/rsanderson/build/temp
    
        4
  •  7
  •   DLRdave    14 年前

    无法在中的多行中拆分字符串文字CMakeLists.txt文件文件或在CMake脚本中。如果在字符串中包含换行符,则字符串本身中将有一个文字换行符。

    # Don't do this, it won't work, MYPROJ_VERSION will contain newline characters:
    set(MYPROJ_VERSION "${VERSION_MAJOR}.
      ${VERSION_MINOR}.${VERSION_PATCH}-
      ${VERSION_EXTRA}")
    

    set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
    

    因为这两条较短的线:

    set(MYPROJ_VERSION
      "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
    

    它们完全相等。

        5
  •  6
  •   ingomueller.net rkachach    6 年前

    bracket argument

    [ 后跟零或更多 = 然后 ] 后面跟着同样数量的 = 然后 . 括号不嵌套。打开和关闭括号可始终选择唯一长度,以包含其他长度的关闭括号。

    [...]

    message([=[
    This is the first line in a bracket argument with bracket length 1.
    No \-escape sequences or ${variable} references are evaluated.
    This is always one argument even though it contains a ; character.
    The text does not end on a closing bracket of length 0 like ]].
    It does end in a closing bracket of length 1.
    ]=])```
    
        6
  •  6
  •   Parker Gibson    6 年前

    为了那些从这里来的人 How do I split a CMake generator expression to multiple lines? 我想补充一下。

    行继续方法将不起作用,CMake无法解析由空格(缩进)和行继续组成的生成器列表。

    虽然string(CONCAT)解决方案将提供一个可以计算的生成器表达式,但如果结果包含空格,则计算的表达式将被引号括起来。

    string(CONCAT WARNING_OPTIONS "$<"
        "$<OR:"
            "$<CXX_COMPILER_ID:MSVC>,"
            "$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>"
        ">:"
        "/D_CRT_SECURE_NO_WARNINGS "
    ">$<"
        "$<AND:"
            "$<CXX_COMPILER_ID:Clang,GNU>,"
            "$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
        ">:"
        "-Wall -Werror "
    ">$<"
        "$<CXX_COMPILER_ID:GNU>:"
        "-Wno-multichar -Wno-sign-compare "
    ">")
    add_compile_options(${WARNING_OPTIONS})
    

    /usr/lib64/ccache/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_EXPORTS -I../ThirdParty/googletest/googletest/include -I../ThirdParty/googletest/googletest -std=c++11 -fno-rtti -fno-exceptions -fPIC    -std=c++11 -fno-rtti -fno-exceptions -Wall -Wshadow -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers "-Wall -Werror -Wno-multichar -Wno-sign-compare " -fdiagnostics-color -MD -MT ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -MF ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o.d -o ThirdParty/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o -c ../ThirdParty/googletest/googletest/src/gtest-all.cc
    c++: error: unrecognized command line option ‘-Wall -Werror -Wno-multichar -Wno-sign-compare ’
    

    要计算使用字符串(CONCAT)解决方案表示的冗长生成器表达式,每个生成器表达式必须计算为一个不带空格的选项:

    string(CONCAT WALL "$<"
        "$<AND:"
            "$<CXX_COMPILER_ID:Clang,GNU>,"
            "$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
        ">:"
        "-Wall"
    ">")
    string(CONCAT WERROR "$<"
        "$<AND:"
            "$<CXX_COMPILER_ID:Clang,GNU>,"
            "$<NOT:$<STREQUAL:${CMAKE_CXX_SIMULATE_ID},MSVC>>"
        ">:"
        "-Werror"
    ">")
    message(STATUS "Warning Options: " ${WALL} ${WERROR})
    add_compile_options(${WALL} ${WERROR})
    

    这可能与我发布答案的问题无关,不幸的是,我正在回答的问题被错误地标记为此问题的副本。

        7
  •  3
  •   wardw Joe    6 年前

    为了在代码中保持良好的缩进,只需简单地

    message("These strings " "will all be "
            "concatenated. Don't forget "
            "your trailing spaces!")
    

    或者直接用

    string(CONCAT MYSTR "This and " "that "
                        "and me too!")
    

    Douglas' answer 他有更多的细节。不过,我认为这可能只是对要点的总结。

    推荐文章