Утилита<predef_check
>предоставляет возможность для создания программы, которая будет проверять заданный набор выражений против определений, которые она обнаружила при строительстве.
Несмотря на то, что существует только одна программа<predef_check
>, существуют вариации для каждого из языков, которые обнаруживаются Predef, чтобы соответствовать соглашению для файлов источников. Для всех из них один ссылается со списком аргументов выражения. Выражения оцениваются в контексте конкретной программы<predef_check
>, и если все они истинны, возвращается ноль (0). В противном случае индекс первого ложного выражения возвращается.
Синтаксис выражения прост:
predef-definition [ relational-operator version-value ]
<predef-definition
>может быть любым из определений Предефа. Например,<BOOST_COMP_GCC
>.
<relational-operator
>может быть любой из:<>
>,<<
>,<>=
>,<<=
>,<==
>и<!=
>.
<version-number
>может быть полным или частичным тройным значением версии. Если это частичная тройная версия, она завершается нулями. Это<x.y
>эквивалентно<x.y.0
>и<x
>эквивалентно<x.0.0
>.
<relations-operator
>и<version-number
>могут быть опущены. В этом случае он эквивалентен:
predef-definition > 0.0.0
Вы можете использовать<predef_check
>программы непосредственно из Boost Build для настройки целевых требований. Это полезно для управления тем, что создается в рамках вашего проекта, на основе подробной информации о версии, доступной в Predef. Основное использование простое:
import path-to-predef-src/tools/check/predef
: check require
: predef-check predef-require ;
exe my_windows_program : windows_source.cpp
: [ predef-require "BOOST_OS_WINDOWS" ] ;
Этот простой вариант использования пропустит создание<my_windows_program
>, если вы не строите для Windows. Подобно прямому<predef_check
>, вы можете передавать мутные выражения, используя реляционные сравнения. Например:
import path-to-predef-src/tools/check/predef
: check require
: predef-check predef-require ;
lib my_special_lib : source.cpp
: [ predef-require "BOOST_OS_WINDOWS != 0" "BOOST_OS_VMS != 0"] ;
И в этом случае<my_special_lib
>создается только тогда, когда ОС не является Windows или VMS. Правило<requires
>является особым случаем правила<check
>. И определяется в его терминах:
rule require ( expressions + : language ? )
{
return [ check $(expressions) : $(language) : : <build>no ] ;
}
Выражение может также использовать явные «и», «или» логические операторы для более сложных проверок:
import path-to-predef-src/tools/check/predef
: check require
: predef-check predef-require ;
lib my_special_lib : source.cpp
: [ predef-require "BOOST_OS_WINDOWS" or "BOOST_OS_VMS"] ;
Вы можете использовать правило<check
>для большего контроля и для реализации чего-то, кроме контроля того, что создается. Определение для правила<check
>:
rule check ( expressions + : language ? : true-properties * : false-properties * )
При использовании в качестве набора цели ускоренного строительства это правило добавит<true-properties
>к цели, если все<expressions
>оцениваются как истинные. В противном случае<false-properties
>добавляются в качестве требований. Например, вы можете использовать его для включения или отключения функций в ваших программах:
import path-to-predef-src/tools/check/predef
: check require
: predef-check predef-require ;
exe my_special_exe : source.cpp
: [ predef-check "BOOST_OS_WINDOWS == 0"
: : <define>ENABLE_WMF=0
: <define>ENABLE_WMF=1 ] ;
Для<check
>и<require
>аргумент контролирует, какой вариант программы<predef_check
>используется для проверки выражений. Он по умолчанию «c++», но может быть любым из: «c», «cpp», «objc» и «objcpp».