使用包含空格的命令的ExternalProject_Add的奇怪行为

时间:2013-06-17 09:29:38

标签: c++ macos cmake clang external-project

我需要使用ExternalProject_Add编译boost库,并且需要build命令 带有Clang的MacOS平台上的c ++ 11标志。

该命令应如下所示:

./bin/b2 debug release cxxflags="-std=c++11 -stdlib=libc++" linkflags=-stdlib=libc++

但我的引号和空格有问题。

set(BOOST_CXX_FLAGS cxxflags="-std=c++11 -stdlib=libc++")
set(BOOST_TOOL_SET toolset=clang ${BOOST_CXX_FLAGS}
linkflags=-stdlib=libc++)
ExternalProject_Add(boost
  ....
  BUILD_COMMAND ./bin/b2 debug release
    ${BOOST_TOOL_SET} 
  ....
)

${BOOST_TOOL_SET}值是一个列表,cxxflags="-std=c++11 -stdlib=libc++"是其中的一个项目。生成的命令行变得奇怪:

./bin/b2 debug release "cxxflags=\"-std=c++11 -stdlib=libc++\""
linkflags=-stdlib=libc++

看起来这个标志是由CMake在检测到参数内的空间并用引号括起来时翻译的,但这不是我想要的。

我在互联网上搜索,但没有找到任何帮助。关于这个问题是否有任何提示?

2 个答案:

答案 0 :(得分:2)

这应该有效:

set(BOOST_CXX_FLAGS "cxxflags=-std=c++11 -stdlib=libc++")

这应该产生

./bin/b2 debug release "cxxflags=-std=c++11 -stdlib=libc++"

在正常的shell解析规则下,这相当于适用于您的内容:

./bin/b2 debug release cxxflags="-std=c++11 -stdlib=libc++"

答案 1 :(得分:1)

这并没有完全回答你的问题,因为我无法找到一种方法来获取所请求的命令行到b2 exe,cxxflags="-std=c++11 -stdlib=libc++"部分格式正确。

但是,我相信你可以通过两次调用cxxflags=来达到预期的效果。每个参数都附加到最终由b2调用的编译器标志。

所以你应该能够做到:

set(BOOST_CXX_FLAGS cxxflags=-std=c++11 cxxflags=-stdlib=libc++)

并且b2调用的最终命令将类似于

"clang++" ... -std=c++11 -stdlib=libc++ ...

要验证这一点,您可以在命令中添加-d+2

BUILD_COMMAND ./bin/b2 debug release ${BOOST_TOOL_SET} -d+2

这会导致将完整命令写入boost-stamp目录中的boost-build-out.log文件。