如何在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}") 

他们完全相同。