forked from LeenkxTeam/Kmake
158 lines
6.1 KiB
JavaScript
158 lines
6.1 KiB
JavaScript
|
|
"use strict";
|
||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
|
exports.NinjaExporter = void 0;
|
||
|
|
const Exporter_1 = require("kmake/Exporters/Exporter");
|
||
|
|
const fs = require("kmake/fsextra");
|
||
|
|
const path = require("path");
|
||
|
|
class NinjaExporter extends Exporter_1.Exporter {
|
||
|
|
constructor(options, cCompiler, cppCompiler, cFlags, cppFlags, linkerFlags, outputExtension, libsLine = null) {
|
||
|
|
super(options);
|
||
|
|
this.cCompiler = cCompiler;
|
||
|
|
this.cppCompiler = cppCompiler;
|
||
|
|
this.cFlags = cFlags;
|
||
|
|
this.cppFlags = cppFlags;
|
||
|
|
this.linkerFlags = linkerFlags;
|
||
|
|
this.outputExtension = outputExtension;
|
||
|
|
if (libsLine != null) {
|
||
|
|
this.libsLine = libsLine;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
libsLine(project) {
|
||
|
|
let libs = '';
|
||
|
|
for (let lib of project.getLibs()) {
|
||
|
|
libs += ' -l' + lib;
|
||
|
|
}
|
||
|
|
return libs;
|
||
|
|
}
|
||
|
|
async exportSolution(project, from, to, platform, vrApi, options) {
|
||
|
|
let objects = {};
|
||
|
|
let ofiles = {};
|
||
|
|
let outputPath = path.resolve(to, options.buildPath);
|
||
|
|
fs.ensureDirSync(outputPath);
|
||
|
|
for (let fileobject of project.getFiles()) {
|
||
|
|
let file = fileobject.file;
|
||
|
|
if (file.endsWith('.cpp') || file.endsWith('.c') || file.endsWith('.cc') || file.endsWith('.s') || file.endsWith('.S')) {
|
||
|
|
if (fileobject.options && fileobject.options.nocompile) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
let name = file.toLowerCase();
|
||
|
|
if (name.indexOf('/') >= 0)
|
||
|
|
name = name.substr(name.lastIndexOf('/') + 1);
|
||
|
|
name = name.substr(0, name.lastIndexOf('.'));
|
||
|
|
if (!objects[name]) {
|
||
|
|
objects[name] = true;
|
||
|
|
ofiles[file] = name;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
while (objects[name]) {
|
||
|
|
name = name + '_';
|
||
|
|
}
|
||
|
|
objects[name] = true;
|
||
|
|
ofiles[file] = name;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
let ofilelist = '';
|
||
|
|
for (let o in objects) {
|
||
|
|
ofilelist += o + '.o ';
|
||
|
|
}
|
||
|
|
this.writeFile(path.resolve(outputPath, 'build.ninja'));
|
||
|
|
this.p('pool link_pool\n depth = 1\n');
|
||
|
|
let incline = '';
|
||
|
|
for (let inc of project.getIncludeDirs()) {
|
||
|
|
inc = path.relative(outputPath, path.resolve(from, inc));
|
||
|
|
incline += '-I' + inc + ' ';
|
||
|
|
}
|
||
|
|
let linkerline = this.linkerFlags;
|
||
|
|
linkerline += this.libsLine(project);
|
||
|
|
linkerline += ' ';
|
||
|
|
for (let flag of project.linkerFlags) {
|
||
|
|
linkerline += flag + ' ';
|
||
|
|
}
|
||
|
|
let defline = '';
|
||
|
|
for (const def of project.getDefines()) {
|
||
|
|
if (def.config && def.config.toLowerCase() === 'debug' && !options.debug) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
if (def.config && def.config.toLowerCase() === 'release' && options.debug) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
defline += '-D' + def.value.replace(/\"/g, '\\"') + ' ';
|
||
|
|
}
|
||
|
|
if (!options.debug) {
|
||
|
|
defline += '-DNDEBUG ';
|
||
|
|
}
|
||
|
|
let optimization = '';
|
||
|
|
if (!options.debug) {
|
||
|
|
optimization = '-O2';
|
||
|
|
}
|
||
|
|
else
|
||
|
|
optimization = '-g';
|
||
|
|
let cline = this.cCompiler + ' ' + this.cFlags + ' ';
|
||
|
|
if (project.cStd !== '') {
|
||
|
|
cline += '-std=' + project.cStd + ' ';
|
||
|
|
}
|
||
|
|
if (options.dynlib) {
|
||
|
|
cline += '-fPIC ';
|
||
|
|
}
|
||
|
|
for (let flag of project.cFlags) {
|
||
|
|
cline += flag + ' ';
|
||
|
|
}
|
||
|
|
cline += optimization + ' ';
|
||
|
|
cline += incline;
|
||
|
|
cline += defline;
|
||
|
|
this.p('rule cc\n deps = gcc\n depfile = $out.d\n command = ' + cline + '-MD -MF $out.d -c $in -o $out\n');
|
||
|
|
let cppline = this.cppCompiler + ' ' + this.cppFlags + ' ';
|
||
|
|
if (project.cppStd !== '') {
|
||
|
|
cppline += '-std=' + project.cppStd + ' ';
|
||
|
|
}
|
||
|
|
if (options.dynlib) {
|
||
|
|
cppline += '-fPIC ';
|
||
|
|
}
|
||
|
|
for (let flag of project.cppFlags) {
|
||
|
|
cppline += flag + ' ';
|
||
|
|
}
|
||
|
|
cppline += optimization + ' ';
|
||
|
|
cppline += incline;
|
||
|
|
cppline += defline;
|
||
|
|
this.p('rule cxx\n deps = gcc\n depfile = $out.d\n command = ' + cppline + '-MD -MF $out.d -c $in -o $out\n');
|
||
|
|
if (options.dynlib) {
|
||
|
|
this.p('rule link\n pool = link_pool\n command = ' + this.cppCompiler + ' -fPIC -shared -o $out ' + optimization + ' $in ' + linkerline);
|
||
|
|
}
|
||
|
|
else if (options.lib) {
|
||
|
|
this.p('rule link\n pool = link_pool\n command = ar rcs -o $out $in');
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
this.p('rule link\n pool = link_pool\n command = ' + this.cppCompiler + ' -o $out ' + optimization + ' $in ' + linkerline);
|
||
|
|
}
|
||
|
|
for (let fileobject of project.getFiles()) {
|
||
|
|
let file = fileobject.file;
|
||
|
|
if (file.endsWith('.c') || file.endsWith('.cpp') || file.endsWith('.cc') || file.endsWith('.s') || file.endsWith('.S')) {
|
||
|
|
if (fileobject.options && fileobject.options.nocompile) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
this.p();
|
||
|
|
let name = ofiles[file];
|
||
|
|
let realfile = path.relative(outputPath, path.resolve(from, file));
|
||
|
|
let compiler = 'cxx';
|
||
|
|
if (file.endsWith('.c')) {
|
||
|
|
compiler = 'cc';
|
||
|
|
}
|
||
|
|
else if (file.endsWith('.s') || file.endsWith('.S')) {
|
||
|
|
compiler = 'asm';
|
||
|
|
}
|
||
|
|
this.p('build ' + name + '.o: ' + compiler + ' ' + realfile);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.p();
|
||
|
|
let executableName = project.getSafeName();
|
||
|
|
if (project.getExecutableName()) {
|
||
|
|
executableName = project.getExecutableName();
|
||
|
|
}
|
||
|
|
let outputname = this.outputExtension === '.html' ? 'index.html' : executableName + this.outputExtension;
|
||
|
|
this.p('build ' + outputname + ': link ' + ofilelist);
|
||
|
|
this.closeFile();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.NinjaExporter = NinjaExporter;
|
||
|
|
//# sourceMappingURL=NinjaExporter.js.map
|