[QBS] Error at using multiple artifacts for module's rule
Denis Shienkov
denis.shienkov at gmail.com
Fri May 16 13:44:59 CEST 2014
Hi all..
My new question is continuation of previous issue:
http://lists.qt-project.org/pipermail/qbs/2014-May/000703.html
Where I trying to adapt an Keil (C51) compiler to Qbs.
Now I want to create multiple artifacts:
- one to generate the object file (*.obj)
- one to genetate the listings file (*.lst)
from source file *.c.
I take as example the WiX module with their linker Rule, with adaptation to
my specific, where now my KeilModule has this content:
import qbs
import qbs.File
import qbs.FileInfo
import "../utils.js" as ModUtils
Module {
//additionalProductTypes: [ "keil_obj", "keil_lst" ]
condition: qbs.hostOS.contains("windows")
property path toolchainInstallPath: ""
property path toolchainInstallRoot: toolchainInstallPath +
platform + "/bin/"
property string compilerName: "c51.exe"
property string compilerPath: compilerName
property string linkerName: "bl51.exe"
property string linkerPath: linkerName
property string platform: ""
property string vendor: ""
property bool generateListing: true
PropertyOptions {
name: "generateListing"
description: "generate listing files"
}
property string memoryModel: "small"
PropertyOptions {
name: "memoryModel"
description: "this is an compiler option to specify an memory model"
allowedValues: ["small", "compact", "large", "d512k", "d16m" ]
}
property pathList includePaths
PropertyOptions {
name: "includePaths"
description: "directories to add to the include search path"
}
property stringList defines
PropertyOptions {
name: "defines"
description: "variables that are defined when using the compiler"
}
validate: {
if (!toolchainInstallPath)
throw "keil.toolchainInstallPath is not defined. Set
keil.toolchainInstallPath in your profile.";
if (!toolchainInstallRoot)
throw "keil.toolchainInstallRoot is not defined. Set
keil.toolchainInstallRoot in your profile."
}
setupBuildEnvironment: {
var v = new ModUtils.EnvironmentVariable("PATH", ";", true);
v.prepend(toolchainInstallPath);
v.prepend(toolchainInstallRoot);
v.set();
}
FileTagger {
patterns: [ "*.c", "*.cpp" ]
fileTags: ["keil_source"]
}
Rule {
id: compiler
//multiplex: true
inputs: [ "keil_source" ]
Artifact {
fileTags: [ "keil_obj" ]
fileName: ".obj/" + product.name + "/" +
FileInfo.baseName(input.filePath) + ".obj"
}
Artifact {
condition: product.moduleProperty("qbs", "generateListing")
fileTags: [ "keil_lst" ]
fileName: ".lst/" + product.name + "/" +
FileInfo.baseName(input.filePath) + ".lst"
}
prepare: {
var args = [];
// input source file name
args.push(FileInfo.toWindowsSeparators(input.filePath));
// memory model
args.push("rom(" + ModUtils.moduleProperty(product,
"memoryModel") + ")");
if (ModUtils.moduleProperty(product, "generateListing")) {
args.push("print(" +
FileInfo.toWindowsSeparators(outputs.keil_lst[0].fileName) + ")");
} else {
args.push("noprint");
}
// include paths
var userIncludePaths = ModUtils.moduleProperty(product,
"includePaths");
var commonIncludePath = ModUtils.moduleProperty(product,
"toolchainInstallPath") + "/" + ModUtils.moduleProperty(product,
"platform") + "/INC";
userIncludePaths.push(FileInfo.toWindowsSeparators(project.path));
userIncludePaths.push(FileInfo.toWindowsSeparators(commonIncludePath));
userIncludePaths.push(FileInfo.toWindowsSeparators(commonIncludePath
+ "/" + ModUtils.moduleProperty(product, "vendor")));
if (userIncludePaths && userIncludePaths.length > 0)
args.push("incdir(" + userIncludePaths.join(";") + ")");
// user-supplied defines
var defines = ModUtils.moduleProperty(product, "defines");
if (defines && defines.length > 0)
args.push("define(" + defines.join(";") + ")");
// output object file name
args.push("object(" +
FileInfo.toWindowsSeparators(output.filePath) + ")");
var cmd = new Command(ModUtils.moduleProperty(product,
"compilerPath" ), args);
cmd.description = "compiling " + FileInfo.fileName(input.filePath);
cmd.highlight = "compiler";
cmd.workingDirectory = FileInfo.path(output.filePath);
return cmd;
}
}
}
but at attempt to build the project I got an error:
{quote}
evaluating prepare script: TypeError: Result of expression
'outputs.keil_lst' [undefined] is not an object.
{quote}
Using the "multiplex" or "additionalProductTypes" property has no effect.
Say please, what I do wrong?
BR,
Denis
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/qbs/attachments/20140516/14a75870/attachment.html>
More information about the Qbs
mailing list