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 ;
Другие вопросы по тегам