motor-control-sdk/.project/genMakefiles.js

411 lines
16 KiB
JavaScript
Raw Permalink Normal View History

const common = require(`./common.js`);
const path = require(`path`);
const fs = require(`fs`);
const _ = require('lodash');
function genMakefileDeviceTop(component_file_list, example_file_list, device, isInternal) {
let component_make_list = [];
let example_make_list = [];
let example_make_projectspec_list = [];
let system_example_make_list = [];
let system_example_make_projectspec_list = [];
let genFolder = ".";
let relPath = ".";
if(isInternal == true) {
genFolder = "./test"
relPath = "..";
}
for(component of component_file_list) {
let component_make = [];
let buildTarget = [];
let buildTargetClean = [];
let buildTargetScrub = [];
property = require(`../${component}`).getComponentProperty(device);
let tag="";
if(property.tag)
{
tag = `.${property.tag}`;
}
component_make.name = property.name;
component_make.tag = tag;
component_make.relpath = common.path.relative(path.normalize(__dirname + `/../${genFolder}`), property.dirPath);
if(property.isSkipTopLevelBuild === true)
{
component_make.isSkipTopLevelBuild = true;
}
if(property.isPrebuilt === true)
{
component_make.isPrebuilt = true;
}
for(buildOption of property.buildOptionCombos) {
buildTarget +=` ${property.name}_${buildOption.cpu}.${buildOption.cgt}`;
buildTargetClean +=` ${property.name}_${buildOption.cpu}.${buildOption.cgt}_clean`;
buildTargetScrub +=` ${property.name}_${buildOption.cpu}.${buildOption.cgt}_scrub`;
}
component_make.buildTarget = buildTarget;
component_make.buildTargetClean = buildTargetClean;
component_make.buildTargetScrub = buildTargetScrub;
if(property.isInternal == isInternal) {
component_make_list.push(component_make);
}
}
for(example of example_file_list) {
property = require(`../${example}`).getComponentProperty(device);
for(buildOption of property.buildOptionCombos) {
let makefileOutPath = common.path.makeExampleOutPath(property.dirPath, buildOption);
let example_make = {};
let buildTarget = {};
let buildTargetClean = {};
let buildTargetScrub = {};
example_make.name = `${property.name}_${buildOption.board}_${buildOption.cpu}_${buildOption.os}_${buildOption.cgt}`;
example_make.relpath = common.path.relative(path.normalize(__dirname + `/../${genFolder}`), makefileOutPath);
if(property.isSkipTopLevelBuild === true)
{
example_make.isSkipTopLevelBuild = true;
}
if(property.isBootLoader === true)
{
example_make.isBootLoader = true;
}
buildTarget =` ${property.name}_${buildOption.board}_${buildOption.cpu}_${buildOption.os}_${buildOption.cgt}`;
buildTargetClean =` ${property.name}_${buildOption.board}_${buildOption.cpu}_${buildOption.os}_${buildOption.cgt}_clean`;
buildTargetScrub =` ${property.name}_${buildOption.board}_${buildOption.cpu}_${buildOption.os}_${buildOption.cgt}_scrub`;
example_make.buildTarget = buildTarget;
example_make.buildTargetClean = buildTargetClean;
example_make.buildTargetScrub = buildTargetScrub;
if(property.isInternal == isInternal) {
let isPartOfSystemProject = false;
if(buildOption.isPartOfSystemProject && buildOption.isPartOfSystemProject === true)
{
isPartOfSystemProject = true;
}
if(isPartOfSystemProject === false)
{
example_make_list.push(example_make);
if(property.skipProjectSpec) {
/* no need to output project spec make commands */
}
else {
example_make_projectspec_list.push(example_make);
}
}
}
}
}
for(example of example_file_list) {
example = require(`../${example}`);
if( ! example.getSystemProjects)
continue;
let property = example.getComponentProperty(device);
let systemProjects = example.getSystemProjects(device);
for ( project of systemProjects)
{
let outPath = `${property.dirPath}/${project.board}/system_${project.tag}`
let system_example_make = {};
system_example_make.name = `${project.name}_${project.board}_system_${project.tag}`;
system_example_make.relpath = common.path.relative(path.normalize(__dirname + `/../${genFolder}`), outPath);
system_example_make.buildTarget = " " + system_example_make.name;
system_example_make.buildTargetClean = " " + system_example_make.name + "_clean";
system_example_make.buildTargetScrub = " " + system_example_make.name + "_scrub";
if(property.isSkipTopLevelBuild === true)
{
system_example_make.isSkipTopLevelBuild = true;
}
if(property.isInternal == isInternal) {
system_example_make_list.push(system_example_make);
if( project.skipProjectSpec && project.skipProjectSpec === true)
{
/* skip project spec */
}
else
{
system_example_make_projectspec_list.push(system_example_make);
}
}
}
}
let args = {
component_list: component_make_list,
example_list: example_make_list,
system_example_list: system_example_make_list,
device: device,
};
common.convertTemplateToFile(
`.project/templates/makefile_device_top.xdt`,
`${genFolder}/makefile.${device}`,
args);
args = {
example_list: example_make_projectspec_list,
system_example_list: system_example_make_projectspec_list,
device: device,
sdkPath: "MOTOR_CONTROL_SDK_PATH",
relPath: relPath
};
common.convertTemplateToFile(
`.project/templates/makefile_device_projectspec_top.xdt`,
`${genFolder}/makefile_projectspec.${device}`,
args);
}
function genMakefileLibrary(component_file_list, device) {
for(component of component_file_list) {
property = require(`../${component}`).getComponentProperty(device);
for(buildOption of property.buildOptionCombos) {
let commonCgtOptions = require(`./cgt/cgt_${buildOption.cgt}`).getCgtOptions(buildOption.cpu, device);
let common_build_property = require(`./device/project_${device}`).getProperty();
build_property = require(`../${component}`).getComponentBuildProperty(buildOption);
let project = [];
project = _.merge({}, project, property);
project.relpath = common.path.relative(path.normalize(__dirname + "/.."), property.dirPath);
project = _.merge({}, project, buildOption);
project = _.merge({}, project, build_property);
project = common.mergeCgtOptions(project, commonCgtOptions);
project = common.mergeCgtOptions(project, common_build_property);
let args = {
sdkPath: "MOTOR_CONTROL_SDK_PATH",
relPath: common.path.relative(project.dirPath, "."),
project: project,
cgtOptions: require(`./cgt/cgt_${project.cgt}`).getCgtOptions(buildOption.cpu, device),
};
let tag="";
if(property.tag)
{
tag = `.${property.tag}`;
}
common.convertTemplateToFile(
`.project/templates/makefile_${project.type}.xdt`,
`${project.dirPath}/makefile${tag}.${project.device}.${project.cpu}.${project.cgt}`,
args);
}
}
}
function cleanMakefileLibrary(component_file_list, device) {
for(component of component_file_list) {
property = require(`../${component}`).getComponentProperty(device);
for(buildOption of property.buildOptionCombos) {
build_property = require(`../${component}`).getComponentBuildProperty(buildOption);
let project = [];
project = _.merge({}, project, property);
project.relpath = common.path.relative(path.normalize(__dirname + "/.."), property.dirPath);
common.deleteFile(`${project.dirPath}/makefile.${buildOption.device}.${buildOption.cpu}.${buildOption.cgt}`);
}
}
}
function genMakefileExample(example_file_list, device) {
for(example of example_file_list) {
property = require(`../${example}`).getComponentProperty(device);
for(buildOption of property.buildOptionCombos) {
let commonCgtOptions = require(`./cgt/cgt_${buildOption.cgt}`).getCgtOptions(buildOption.cpu, device);
let common_build_property = require(`./device/project_${device}`).getProperty();
let project = [];
let makefileOutPath = common.path.makeExampleOutPath(property.dirPath, buildOption);
fs.mkdirSync(makefileOutPath, { recursive: true });
build_property = require(`../${example}`).getComponentBuildProperty(buildOption);
project = _.merge({}, project, property);
project.relpath = common.path.relative(path.normalize(__dirname + "/.."), project.dirPath);
project = _.merge({}, project, buildOption);
project = _.merge({}, project, build_property);
project = common.mergeCgtOptions(project, commonCgtOptions);
project = common.mergeCgtOptions(project, common_build_property);
project.dirPath = makefileOutPath;
let isInstrumentationMode = false;
if(common.isInstrumentationMode()) {
isInstrumentationMode = true;
}
let args = {
sdkPath: "MOTOR_CONTROL_SDK_PATH",
relPath: common.path.relative(project.dirPath, "."),
project: project,
cgtOptions: require(`./cgt/cgt_${project.cgt}`).getCgtOptions(buildOption.cpu, device),
syscfg: {
device: require(`./device/project_${device}.js`).getSysCfgDevice(buildOption.board),
cpu: require(`./device/project_${device}.js`).getSysCfgCpu(buildOption.cpu),
pkg: require(`./device/project_${device}.js`).getSysCfgPkg(buildOption.board),
part: require(`./device/project_${device}.js`).getSysCfgPart(buildOption.board),
},
linuxFwName: require(`./device/project_${device}`).getLinuxFwName(project.cpu),
isInstrumentationMode: isInstrumentationMode,
flashAddr: require(`./device/project_${device}.js`).getFlashAddr(),
};
if(project.makefile) {
common.convertTemplateToFile(
`.project/templates/makefile_${project.makefile}.xdt`,
`${project.dirPath}/makefile`,
args);
} else
common.convertTemplateToFile(
`.project/templates/makefile_${project.type}.xdt`,
`${project.dirPath}/makefile`,
args);
}
}
}
function cleanMakefileExample(example_file_list, device) {
for(example of example_file_list) {
property = require(`../${example}`).getComponentProperty(device);
for(buildOption of property.buildOptionCombos) {
let project = [];
let makefileOutPath = common.path.makeExampleOutPath(property.dirPath, buildOption);
fs.mkdirSync(makefileOutPath, { recursive: true });
project = _.merge({}, project, property);
project.relpath = common.path.relative(path.normalize(__dirname + "/.."), project.dirPath);
project.dirPath = makefileOutPath;
common.deleteFile(`${project.dirPath}/makefile`);
}
}
}
function genMakefileProjectSpec(example_file_list, device) {
for(example of example_file_list) {
property = require(`../${example}`).getComponentProperty(device);
if(property.skipProjectSpec)
continue;
for(buildOption of property.buildOptionCombos) {
let commonCgtOptions = require(`./cgt/cgt_${buildOption.cgt}`).getCgtOptions(buildOption.cpu, device);
let common_build_property = require(`./device/project_${device}`).getProperty();
let project = [];
let makefileOutPath = common.path.makeExampleOutPath(property.dirPath, buildOption);
fs.mkdirSync(makefileOutPath, { recursive: true });
build_property = require(`../${example}`).getComponentBuildProperty(buildOption);
project = _.merge({}, project, property);
project.relpath = common.path.relative(path.normalize(__dirname + "/.."), project.dirPath);
project = _.merge({}, project, buildOption);
project = common.mergeCgtOptions(project, common_build_property);
project = _.merge({}, project, build_property);
project.dirPath = makefileOutPath;
let args = {
sdkPath: "MOTOR_CONTROL_SDK_PATH",
relPath: common.path.relative(project.dirPath, "."),
project: project
};
common.convertTemplateToFile(
`.project/templates/makefile_projectspec.xdt`,
`${project.dirPath}/makefile_projectspec`,
args);
}
}
}
function cleanMakefileProjectSpec(example_file_list, device) {
for(example of example_file_list) {
property = require(`../${example}`).getComponentProperty(device);
if(property.skipProjectSpec)
continue;
for(buildOption of property.buildOptionCombos) {
let project = [];
let makefileOutPath = common.path.makeExampleOutPath(property.dirPath, buildOption);
fs.mkdirSync(makefileOutPath, { recursive: true });
project = _.merge({}, project, property);
project.relpath = common.path.relative(path.normalize(__dirname + "/.."), project.dirPath);
project.dirPath = makefileOutPath;
common.deleteFile(`${project.dirPath}/makefile_projectspec`);
}
}
}
function genMakeImport(device) {
let args = {
device: device,
utils: require(`./genProjectSpec.js`).utils,
common: common,
};
common.convertTemplateToFile(
`.project/templates/imports.mak.xdt`,
`imports.mak`,
args);
}
function genMakefilesDevice(device) {
let component_file_list = require(`./device/project_${device}`).getComponentList();
let example_file_list = require(`./device/project_${device}`).getExampleList();
genMakefileDeviceTop(component_file_list, example_file_list, device, false); /* External libs/examples */
genMakefileDeviceTop(component_file_list, example_file_list, device, false); /* Internal libs/examples */
genMakefileLibrary(component_file_list, device);
genMakefileExample(example_file_list, device);
genMakefileProjectSpec(example_file_list, device);
genMakeImport(device);
}
function cleanMakefilesDevice(device) {
let component_file_list = require(`./device/project_${device}`).getComponentList();
let example_file_list = require(`./device/project_${device}`).getExampleList();
/* Remove top level files */
common.deleteFile(`./makefile.${device}`);
common.deleteFile(`./makefile_projectspec.${device}`);
common.deleteFile(`./test/makefile.${device}`);
common.deleteFile(`./test/makefile_projectspec.${device}`);
cleanMakefileLibrary(component_file_list, device);
cleanMakefileExample(example_file_list, device);
cleanMakefileProjectSpec(example_file_list, device);
}
module.exports = {
genMakefilesDevice,
cleanMakefilesDevice,
}