How do you concatenate string in cmake
if you just want to deal with a string value see @nonexplosive's answer.
However if you wish to have a Cmake variable in your CMakeLists.txt
and set that variable to some value do use either: [string()
] for Cmake 3.0+ (https://cmake.org/cmake/help/v3.0/command/string.html) or set()
for Cmake 2.0+.
The reason you have two options is because older cmake doesn't support the CONCAT
feature.
Example CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(Hello)
string(CONCAT x "hello" "goodbye")
set(y "hellogoodbye")
message(STATUS "DEBUG: x=${x}")
message(STATUS "DEBUG: y=${y}")
Full stdout:
-- DEBUG: x=hellogoodbye
-- DEBUG: y=hellogoodbye
-- Configuring done
-- Generating done
-- Build files have been written to: /home/_______/testing/_______
Three typical CMake string concatenation methods
While the answer to this particular question will be best handled via set
or string
, there is a third possibility which is list
if you want to join strings with an arbitrary character.
set()
Just combine strings like in bash
set(FILE file)
set(FILE_TXT ${FILE}.txt)
message(STATUS "FILE_TXT: ${FILE_TXT}")
string(CONCAT)
Concatenate all the input arguments together and store the result in the named output variable.
string(CONCAT [...])
string(CONCAT MULTI "xxxx" "YYYY" "xxxx")
message(STATUS "MULTI: ${MULTI}")
list(APPEND)
Appends elements to the list.
list(APPEND [ ...])
When it comes to things like compiler flags, this is the tool of choice. Lists in CMake are just semicolon separated strings and when you quote them, you get the list joined with semicolons.
list(APPEND FLAGS "-D option1")
list(APPEND FLAGS "-D option2")
list(APPEND FLAGS "-D option3")
list(JOIN FLAGS " " FLAGS)
message(STATUS "FLAGS: " ${FLAGS})
"${src}.out"
should work fine, so you can write set(NAME "${src}.out")
and use ${NAME}
wherever you need to.
There are 5 general methods for your question.
- use
set()
set(MY_FLAGS "")
set(MY_FLAGS "${MY_FLAGS} -Werror=shadow")
set(MY_FLAGS "${MY_FLAGS} -Werror=return-local-addr")
- use
list(APPEND)
and replace;
with space
set(MY_FLAGS "")
list(APPEND MY_FLAGS "-Werror=shadow")
list(APPEND MY_FLAGS "-Werror=return-local-addr")
string(REPLACE ";" " " MY_FLAGS "${MY_FLAGS}")
- use
string(CONCAT)
. Note: this not means "append"
set(MY_FLAGS "")
string(CONCAT MY_FLAGS "-Werror=shadow") #You get "-Werror=shadow"
string(CONCAT MY_FLAGS "-Werror=return-local-addr") #You get "-Werror=return-local-addr" instead of "-Werror=shadow -Werror=return-local-addr"
- use
string(APPEND)
.
set(MY_FLAGS "")
string(APPEND MY_FLAGS " -Werror=shadow") #Notice the leading space
string(APPEND MY_FLAGS " -Werror=return-local-addr") #Notice the leading space
- use
string(JOIN)
set(MY_FLAGS "")
string(JOIN " " MY_FLAGS "-Werror=shadow" "-Werror=return-local-addr")