Boost-build - зависимость от цели подпроекта

У меня есть проект на основе jamfile, где один из этапов сборки компилирует пользовательский инструмент (называемый "codegen"), который я хочу использовать на следующем этапе сборки. Инструмент codegen встроен в projects/codegen/Jamfile.jam относительно корня, и цель исполняемого файла в конечном итоге объявляется строкой:

install codegen-tool : $(full-exe-target) : <location>$(install-dir) ;

В Jamroot.jam у меня есть следующее:

rule codegen ( target : source : properties * )
{
    COMMAND on $(target) = projects/codegen//codegen-tool ;
    DEPENDS $(target) : projects/codegen//codegen-tool ;
}

actions codegen bind COMMAND
{
    $(COMMAND) $(<) $(>)
}

project.load projects/codegen//codegen-tool ;
local codegen-input = <blah> ;
local codegen-output = <blah> ;

make $(codegen-output) : $(codegen-input) : @codegen ;
alias codegen-output : $(codegen-output) ;

Когда я запускаю команду "b2 codegen-output", я получаю ошибку:

don't know how to make project projects/codegen//codegen-tool

Но выполнение команды "b2 projects/codegen//codegen-tool" прошло успешно. Почему я не могу сослаться на цель codegen-tool из Jamroot.jam?

1 ответ

Решение

Ключевая проблема, с которой вы столкнулись, состоит в том, что правило codegen этого инструмента:

rule codegen ( target : source : properties * )
{
    COMMAND on $(target) = projects/codegen//codegen-tool ;
    DEPENDS $(target) : projects/codegen//codegen-tool ;
}

Предназначены для мета-цели вместо реальной цели (так называемой файловой цели), сгенерированной в результате создания мета-цели Codegen-tool. "Простой" способ заставить работать такие зависимости инструмента - это использовать функцию в вашей цели make, чтобы сообщить ей о том, каков полный путь к инструменту. И функция, которую вы используете для этого, является функцией "зависимости". Например, вы бы добавили в свой джамрут что-то вроде:

import feature ;

feature.feature codegen : : dependency free ;

И установите и используйте эту функцию для обращения к инструменту codegent:

project : requirements <codegen>projects/codegen//codegen-tool ;

В вашем вопросе недостаточно информации, чтобы ответить полным примером. Но вы должны обратиться к полностью работающему примеру built_tool, чтобы узнать, как работает функция зависимости для варианта использования пользовательских инструментов.

Другие вопросы по тегам