bjam: использовать одни и те же действия для нескольких правил
У меня есть определенное действие, которое генерирует файлы покрытия, оно требует некоторых опций.
actions coverage {
echo coverage $(OPTIONS) >> $(<)
}
Мне нужно правило, чтобы установить $(OPTIONS)
переменная:
rule coverage ( targets * : sources * : properties * ) {
OPTIONS on $(targets) = ... # Get from environment variables
}
После этого я могу использовать правило для генерации файлов покрытия:
make cov.xml : : @coverage ;
То, что я хочу, это второе правило (которое вычисляет $(OPTIONS)
переменная по-другому), который использует те же действия. Это возможно без дублирования самого действия? Другими словами, возможно ли связать два правила с одним и тем же действием?
Я хочу что-то вроде этого:
actions coverage-from-features {
# AVOID HAVING TO REPEAT THIS
echo coverage $(OPTIONS) >> $(<)
}
rule coverage-from-features ( targets * : sources * : properties * ) {
OPTIONS on $(targets) = ... # Get from feature values
}
make cov2.xml : : @coverage-from-features ;
Очевидно, без повторения действий команды себя (СУХОЙ и все такое).
1 ответ
Ключевой аспект, который вам нужен, заключается в следующем: вам не нужно использовать действия, которые отражают вызванное правило. Правило может вызывать любое и несколько действий для выполнения работы. В вашем случае вы можете сделать что-то вроде:
actions coverage-action {
echo coverage $(OPTIONS) >> $(<)
}
rule coverage ( targets * : sources * : properties * ) {
OPTIONS on $(targets) = ... ; # Get from environment variables
coverage-action $(target) : $(sources) ;
}
rule coverage-from-features ( targets * : sources * : properties * ) {
OPTIONS on $(targets) = ... ; # Get from feature values
coverage-action $(target) : $(sources) ;
}
make cov.xml : : @coverage ;
make cov2.xml : : @coverage-from-features ;