mbed-simulator
Version:
Mbed OS 5 simulator
122 lines (98 loc) • 4.49 kB
JavaScript
#!/usr/bin/env node
/**
* Builds a complete Mbed OS project
*/
const fs = require('fs');
const Path = require('path');
const spawn = require('child_process').spawn;
const { isDirectory, getDirectories, getCFiles, getAllDirectories, getAllCFiles, ignoreAndFilter } = require('./build-tools/helpers');
const helpers = require('./build-tools/helpers');
const libmbed = require('./build-tools/build-libmbed');
const application = require('./build-tools/build-application');
const opn = require('opn');
const commandExistsSync = require('command-exists').sync;
const launchServer = require('./server/launch-server');
var program = require('commander');
program
.version('1.0.0')
.option('-i --input-dir <dir>', 'Input directory')
.option('-f --input-file <file>', 'Input file')
.option('-o --output-file <file>', 'Output file (or directory)')
.option('-v --verbose', 'Verbose logging')
.option('-c --compiler-opts <opts>', 'Compiler options (e.g. -std=c++11)')
.option('-l --launch', 'Launch the simulator for this project after building')
.option('--emterpretify', 'Enable emterpretify mode (required if projects take a long time to compile)')
.allowUnknownOption(true)
.parse(process.argv);
// shorthand so you can run `mbed simulator .`
if (process.argv.length === 3 && fs.existsSync(process.argv[2]) && fs.statSync(process.argv[2]).isDirectory()) {
program.inputDir = Path.resolve(process.argv[2]);
program.launch = true;
}
if (program.inputDir && program.inputFile) {
console.log('Cannot specify both --input-dir and --input-file');
process.exit(1);
}
if (!program.inputDir && !program.inputFile) {
console.log(`Argument '--input-dir' or '--input-file' is required`);
process.exit(1);
}
if (program.inputDir && !fs.existsSync(program.inputDir)) {
console.log('Input directory', program.inputDir, 'does not exist');
process.exit(1);
}
if (program.inputDir && !fs.statSync(program.inputDir).isDirectory()) {
console.log('Input directory', program.inputDir, 'is not a directory');
process.exit(1);
}
if (program.inputFile && !fs.existsSync(program.inputFile)) {
console.log('Input file', program.inputFile, 'does not exist');
process.exit(1);
}
if (program.inputFile && !fs.statSync(program.inputFile).isFile()) {
console.log('Input file', program.inputFile, 'is not a file');
process.exit(1);
}
if (!program.outputFile) {
if (program.inputDir) {
program.inputDir = Path.resolve(program.inputDir);
program.outputFile = Path.join(program.inputDir, 'BUILD', 'SIMULATOR', Path.basename(program.inputDir) + '.js');
}
else {
console.log(`Argument '--output-file' is required`);
process.exit(1);
}
}
if (!commandExistsSync('emcc')) {
console.log('Cannot find emcc');
console.log('\tEmscripten is not installed (or not in your PATH)');
console.log('\tFollow: https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html');
process.exit(1);
}
let inputDir = program.inputDir ? Path.resolve(program.inputDir) : Path.resolve(Path.dirname(program.inputFile));
program.inputFile = program.inputFile ? Path.resolve(program.inputFile) : null;
program.outputFile = Path.resolve(program.outputFile);
if (fs.existsSync(program.outputFile) && fs.statSync(program.outputFile).isDirectory()) {
program.outputFile = Path.join(program.outputFile, Path.basename(inputDir) + '.js');
}
const outputDir = Path.dirname(program.outputFile);
helpers.mkdirpSync(outputDir);
// extra arguments that are passed in, but need to remove ones already covered in program...
let extraArgs = (program.compilerOpts || '').split(' ');
let fn = program.inputDir ? application.buildDirectory : application.buildFile;
fn(program.inputDir || program.inputFile, program.outputFile, extraArgs, program.emterpretify, program.verbose)
.then(() => {
console.log('Building application succeeded, output file is', program.outputFile);
if (program.launch) {
let port = process.env.PORT || 7900;
launchServer(outputDir, port, function(err) {
if (err) return console.error('Failed to launch server', err);
let name = Path.basename(program.outputFile, '.js');
opn(`http://localhost:${port}/view/${name}`);
});
}
})
.catch(err => {
console.error(err);
console.error('Building application failed');
});