如何在CMake中的多行分割string?
我通常在我的项目中有一个策略,不要在超过80行的文本文件中创build行,所以在各种编辑器(你知道这个交易)中它们都很容易编辑。 但是用CMake,我得到的问题是,我不知道如何将一个简单的string分成多行来避免一个庞大的行。 考虑这个基本的代码:
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 ...)
等)呢?
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.\ ")
CMake版本的可用性:
Debian Wheezy(2013):2.8.9
Debian Wheezy-backports:2.8.11
Debian Jessy(2015):3.0.2
Ubuntu 14.04(LTS):2.8.12
Ubuntu 15.04:3.0.2
Mac OSX:可通过Homebrew , Macports和Fink获得cmake-3
Windows:cmake-3可通过Chocolatey获得
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}")
尽pipeCMake 3.0和更新的支持行继续引用的参数 ,您不能缩进您的string中包含的缩进空白的第二行或后续行。
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,你可以先将列表转换为一个string:
string(REPLACE ";" "" MYPROJ_VERSION "${MYPROJ_VERSION_LIST}") message(STATUS "Version: ${MYPROJ_VERSION}") -- Version: 1.0.0-rc1
原始string中的任何分号都将被视为列表元素分隔符,并被删除。 他们必须逃脱:
set(MY_LIST "Hello World " "with a \;semicolon")
它仍然有点冗长,但是如果80个字符的限制真的出错,那么你可以重复追加到相同的variables:
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
没有办法在CMakeLists.txt文件或CMake脚本的多行中分割string文字。 如果你在一个string中包含一个换行符,string本身就会有一个新的换行符。
# 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}")
但是,CMake使用空白来分隔参数,所以你可以在不改变行为的情况下,将一个参数分隔符的空间改变成一个换行符。
你可以重新短语这个更长的行:
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
因为这两个较短的行:
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
他们完全相同。