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

Мне нужно скомпилировать библиотеки повышения с ExternalProject_Addи нужна команда сборки
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, когда он обнаружил пространство внутри аргумента и обернул его кавычками, но это не то, что я хочу.

Я искал в Интернете, но не нашел никакой помощи. Есть ли совет по этому вопросу?

3

Решение

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

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++"
2

Другие решения

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

1

По вопросам рекламы [email protected]