У меня есть проект с некоторыми требованиями, одним из которых является установка флагов компилятора / компоновщика c ++ 11:
jamroot.jam:
project
: requirements
<toolset>clang:<cxxflags>"-stdlib=libc++ -std=c++11"<toolset>clang:<linkflags>"-lc++"# ... etc
;
lib mylibrary
: #sources
[ glob source/*.cpp ]
/boost/filesystem
/boost/system
/boost/thread//boost_thread
;
Библиотечные источники являются компилируется с необходимыми флагами c ++ 11, однако библиотеки Boost упоминали не делайте. Это не вызывает конца двоичных несовместимостей и ошибок компоновщика.
Я не хочу указывать cxxflags
явно в пользовательской конфигурации или в командной строке. Я хотел бы убедиться, что jamroot / jamfiles — это все, что необходимо для правильной сборки проекта.
Как мне «передать» желаемое cxxflags
в зависимые библиотеки Boost?
Обновить: Я недавно пытался использовать alias
для достижения моей цели. От документы:
Другое использование правила псевдонимов — изменение свойств сборки. Например, если вы хотите статически использовать ссылку на библиотеку Boost Threads, вы можете написать следующее:
alias threads : /boost/thread//boost_thread : <link>static ;
Однако настройка этого для boost_filesystem
и восстановить, скажем, path.cpp
все еще опускает свойства, которые я пытаюсь построить.
Это было решено настройка функции (спасибо Стивену Ватанабе):
feature.feature cpp11 :
on :
composite optional propagated
;
feature.compose <cpp11>on :
<cxxflags>"-stdlib=libc++ -std=c++11"<define>BOOST_NO_CXX11_NUMERIC_LIMITS=1
<linkflags>"-lc++";
project
: requirements
<cpp11>on
# ... etc
;
По-видимому, это единственный способ заставить переменные распространяться в зависимые библиотеки.
Других решений пока нет …