Странное поведение ExternalProject_Add с командой, содержащей пробел

Мне нужно скомпилировать библиотеки повышения с ExternalProject_Add, а команде build нужны флаги C++11 на платформе MacOS с Clang.

Команда должна выглядеть так:

./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 ответа

Это должно работать:

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

Это должно произвести

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

При обычных правилах синтаксического анализа оболочки это эквивалентно тому, что работает для вас:

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

Это не дает точного ответа на ваш вопрос, так как я не вижу способа получить запрошенную вами командную строку в 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-build-out.log в вашем каталоге boost-stamp.

Другие вопросы по тегам