Как правило сборки Qbs может использовать продукт

Я хочу использовать Qbs для компиляции существующего проекта. Этот проект уже содержит инструмент преобразования кода (my_tool), который интенсивно используется в этом проекте.

Пока что я (упрощенно):

import qbs 1.0

Project {
    Application {
        name: "my_tool"
        files: "my_tool/main.cpp"
        Depends { name: "cpp" }
    }

    Application {
        name: "my_app"
        Group {
            files: 'main.cpp.in'
            fileTags: ['cpp_in']
        }
        Depends { name: "cpp" }

        Rule {
            inputs: ["cpp_in"]
            Artifact {
                fileName: input.baseName
                fileTags: "cpp"
            }
            prepare: {

                var mytool = /* Reference to my_tool */;

                var cmd = new Command(mytool, input.fileName, output.fileName);
                cmd.description = "Generate\t" + input.baseName;
                cmd.highlight = "codegen";
                return cmd;
            }
        }
    }
}

Как я могу получить ссылку на my_tool для команды?

2 ответа

Решение

Этот ответ основан на электронном письме от автора Qbs Йерга Борнеманна, который позволил мне процитировать его здесь.

Недвижимость usings Правила позволяют добавлять артефакты из зависимостей продуктов к входам. В этом случае нас интересуют "прикладные" артефакты.

Список приложений может быть доступен как input.application,

Application {
    name: "my_app"
    Group {
        files: 'main.cpp.in'
        fileTags: ['cpp_in']
    }
    Depends { name: "cpp" }

    // we need this dependency to make sure that my_tool exists before building my_app
    Depends { name: "my_tool" }

    Rule {
        inputs: ["cpp_in"]
        usings: ["application"] // dependent "application" products appear in inputs
        Artifact {
            fileName: input.completeBaseName
            fileTags: "cpp"
        }
        prepare: {
            // inputs["application"] is a list of "application" products
            var mytool = inputs["application"][0].fileName;
            var cmd = new Command(mytool, [inputs["cpp_in"][0].fileName, output.fileName]);
            cmd.description = "Generate\t" + input.baseName;
            cmd.highlight = "codegen";
            return cmd;
        }
    }
}

К сожалению usings недвижимость в Rule устарела начиная с QBS 1.5.0. На данный момент у меня такое же требование. Использование артефакта продукта в не мультиплексе Rule,

Проблема с мультиплексом Rule в случае изменения одного файла во входном наборе все входные артефакты будут повторно обработаны. Что довольно много времени в моем случае.

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