paraview-glance
Version:
Web application for Visualizing Scientific and Medical datasets
168 lines (134 loc) • 5.01 kB
JavaScript
#!/usr/bin/env node
"use strict";
const fs = require('fs-extra');
const path = require('path');
const spawnSync = require('child_process').spawnSync;
const program = require('commander');
const build = sourceDir => {
// Check that the source directory exists and chdir to it.
if (!fs.existsSync(sourceDir)) {
console.error('The source directory: ' + sourceDir + ' does not exist!');
process.exit(1);
}
process.chdir(sourceDir); // Make the 'web-build' directory to hold the dockcross script and the CMake
// build.
try {
fs.mkdirSync('web-build');
} catch (err) {
if (err.code !== 'EEXIST') throw err;
} // Check that we have docker and can run it.
const dockerVersion = spawnSync('docker', ['--version'], {
env: process.env,
stdio: ['ignore', 'ignore', 'ignore']
});
if (dockerVersion.status !== 0) {
console.error("Could not run the 'docker' command.");
console.error('This tool requires Docker.');
console.error('');
console.error('Please find installation instructions at:');
console.error('');
console.error(' https://docs.docker.com/install/');
console.error('');
process.exit(dockerVersion.status);
}
let dockerImage = 'insighttoolkit/itk-js:20200518-2906428';
if (program.commands[0].image) {
dockerImage = program.commands[0].image;
} // Ensure we have the 'dockcross' Docker build environment driver script
const dockcrossScript = 'web-build/itk-js-build-env';
try {
fs.statSync(dockcrossScript);
} catch (err) {
if (err.code === 'ENOENT') {
const output = fs.openSync(dockcrossScript, 'w');
const dockerCall = spawnSync('docker', ['run', '--rm', dockerImage], {
env: process.env,
stdio: ['ignore', output, null]
});
if (dockerCall.status !== 0) {
process.exit(dockerCall.status);
}
fs.closeSync(output);
fs.chmodSync(dockcrossScript, '755');
} else {
throw err;
}
}
const hypenIndex = program.rawArgs.findIndex(arg => arg === '--');
let cmakeArgs = [];
if (hypenIndex !== -1) {
cmakeArgs = program.rawArgs.slice(hypenIndex + 1);
}
if (process.platform === "win32") {
var dockerBuild = spawnSync('"C:\\Program Files\\Git\\bin\\sh.exe"', ["--login", "-i", "-c", '"web-build/itk-js-build-env web-build ' + cmakeArgs + '"'], {
env: process.env,
stdio: 'inherit',
shell: true
});
if (dockerBuild.status !== 0) {
console.error(dockerBuild.error);
}
process.exit(dockerBuild.status);
} else {
const dockerBuild = spawnSync('bash', [dockcrossScript, 'web-build'].concat(cmakeArgs), {
env: process.env,
stdio: 'inherit'
});
if (dockerBuild.status !== 0) {
console.error(dockerBuild.error);
}
process.exit(dockerBuild.status);
}
};
const test = sourceDir => {
// Check that the source directory exists and chdir to it.
if (!fs.existsSync(sourceDir)) {
console.error('The source directory: ' + sourceDir + ' does not exist!');
process.exit(1);
}
process.chdir(sourceDir);
const dockcrossScript = path.join('web-build/itk-js-build-env');
try {
fs.statSync(dockcrossScript);
} catch (err) {
console.error('Could not find ' + sourceDir + '/web-build/itk-js-build-env');
console.error('');
console.error('Has');
console.error('');
console.error(' itk-js build ' + sourceDir);
console.error('');
console.error('been executed?');
process.exit(1);
}
const hypenIndex = program.rawArgs.findIndex(arg => arg === '--');
let ctestArgs = '';
if (hypenIndex !== -1) {
ctestArgs = program.rawArgs.slice(hypenIndex + 1).join(' ');
}
if (process.platform === "win32") {
var dockerBuild = spawnSync('"C:\\Program Files\\Git\\bin\\sh.exe"', ["--login", "-i", "-c", '"web-build/itk-js-build-env bash -c cd web-build && ctest ' + cmakeArgs + '"'], {
env: process.env,
stdio: 'inherit',
shell: true
});
if (dockerBuild.status !== 0) {
console.error(dockerBuild.error);
}
process.exit(dockerBuild.status);
} else {
const dockerBuild = spawnSync('bash', [dockcrossScript, 'bash', '-c', 'cd web-build && ctest ' + ctestArgs], {
env: process.env,
stdio: 'inherit'
});
process.exit(dockerBuild.status);
}
};
program.command('build <sourceDir>').usage('[options] <sourceDir> [-- <cmake arguments>]').description('build the CMake project found in the given source directory').action(build).option('-i, --image <image>', 'build environment Docker image, defaults to insighttoolkit/itk-js'); // todo: needs a wrapper in web_add_test that 1) mount /work into the emscripten filesystem
// and 2) invokes the runtime
// program
// .command('test <sourceDir>')
// .usage('[options] <sourceDir> [-- <ctest arguments>]')
// .description('run ctest on the project previously built from the given source directory')
// .action(test)
program.parse(process.argv);
program.help();