forked from LeenkxTeam/Kmake
165 lines
5.6 KiB
JavaScript
165 lines
5.6 KiB
JavaScript
|
|
"use strict";
|
||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
|
exports.CMakeExporter = void 0;
|
||
|
|
const path = require("path");
|
||
|
|
const Exporter_1 = require("kmake/Exporters/Exporter");
|
||
|
|
class CMakeExporter extends Exporter_1.Exporter {
|
||
|
|
constructor(options) {
|
||
|
|
super(options);
|
||
|
|
}
|
||
|
|
async exportSolution(project, from, to, platform, vrApi, options) {
|
||
|
|
let name = project.getSafeName();
|
||
|
|
this.writeFile(path.resolve(to, name, 'CMakeLists.txt'));
|
||
|
|
let cmakeVersion = '3.10';
|
||
|
|
switch (project.cppStd) {
|
||
|
|
case 'gnu++03':
|
||
|
|
case 'c++03':
|
||
|
|
case 'gnu++11':
|
||
|
|
case 'c++11':
|
||
|
|
case 'gnu++14':
|
||
|
|
case 'c++14':
|
||
|
|
case 'gnu++17':
|
||
|
|
case 'c++17':
|
||
|
|
break;
|
||
|
|
case 'gnu++2a':
|
||
|
|
case 'c++2a':
|
||
|
|
case 'gnu++20':
|
||
|
|
case 'c++20':
|
||
|
|
cmakeVersion = '3.12';
|
||
|
|
break;
|
||
|
|
case 'gnu++2b':
|
||
|
|
case 'c++2b':
|
||
|
|
case 'gnu++23':
|
||
|
|
case 'c++23':
|
||
|
|
cmakeVersion = '3.20';
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
switch (project.cStd) {
|
||
|
|
case 'gnu9x':
|
||
|
|
case 'gnu99':
|
||
|
|
case 'c9x':
|
||
|
|
case 'c99':
|
||
|
|
case 'gnu1x':
|
||
|
|
case 'gnu11':
|
||
|
|
case 'c1x':
|
||
|
|
case 'c11':
|
||
|
|
break;
|
||
|
|
case 'gnu18':
|
||
|
|
case 'gnu17':
|
||
|
|
case 'c18':
|
||
|
|
case 'c17':
|
||
|
|
case 'gnu2x':
|
||
|
|
case 'c2x':
|
||
|
|
cmakeVersion = '3.21';
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
this.p('cmake_minimum_required(VERSION ' + cmakeVersion + ')');
|
||
|
|
this.p('project(' + name + ')');
|
||
|
|
switch (project.cppStd) {
|
||
|
|
case 'gnu++03':
|
||
|
|
case 'c++03':
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 03)');
|
||
|
|
break;
|
||
|
|
case 'gnu++11':
|
||
|
|
case 'c++11':
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 11)');
|
||
|
|
break;
|
||
|
|
case 'gnu++14':
|
||
|
|
case 'c++14':
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 14)');
|
||
|
|
break;
|
||
|
|
case 'gnu++17':
|
||
|
|
case 'c++17':
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 17)');
|
||
|
|
break;
|
||
|
|
case 'gnu++2a':
|
||
|
|
case 'c++2a':
|
||
|
|
case 'gnu++20':
|
||
|
|
case 'c++20':
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 20)');
|
||
|
|
break;
|
||
|
|
case 'gnu++2b':
|
||
|
|
case 'c++2b':
|
||
|
|
case 'gnu++23':
|
||
|
|
case 'c++23':
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 23)');
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
this.p('set(CMAKE_CXX_STANDARD 98)');
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
switch (project.cStd) {
|
||
|
|
case 'gnu9x':
|
||
|
|
case 'gnu99':
|
||
|
|
case 'c9x':
|
||
|
|
case 'c99':
|
||
|
|
this.p('set(CMAKE_C_STANDARD 99)');
|
||
|
|
break;
|
||
|
|
case 'gnu1x':
|
||
|
|
case 'gnu11':
|
||
|
|
case 'c1x':
|
||
|
|
case 'c11':
|
||
|
|
this.p('set(CMAKE_C_STANDARD 11)');
|
||
|
|
break;
|
||
|
|
case 'gnu18':
|
||
|
|
case 'gnu17':
|
||
|
|
case 'c18':
|
||
|
|
case 'c17':
|
||
|
|
this.p('set(CMAKE_C_STANDARD 17)');
|
||
|
|
break;
|
||
|
|
case 'gnu2x':
|
||
|
|
case 'c2x':
|
||
|
|
this.p('set(CMAKE_C_STANDARD 23)');
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
this.p('set(CMAKE_C_STANDARD 99)');
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
this.p('set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -static-libgcc -static-libstdc++")');
|
||
|
|
let debugDefines = '';
|
||
|
|
for (const def of project.getDefines()) {
|
||
|
|
if (!def.config || def.config.toLowerCase() === 'debug') {
|
||
|
|
debugDefines += ' -D' + def.value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.p('set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}' + debugDefines + '")');
|
||
|
|
this.p('set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}' + debugDefines + '")');
|
||
|
|
let releaseDefines = '';
|
||
|
|
for (const def of project.getDefines()) {
|
||
|
|
if (!def.config || def.config.toLowerCase() === 'release') {
|
||
|
|
releaseDefines += ' -D' + def.value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
releaseDefines += ' -DNDEBUG';
|
||
|
|
this.p('set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}' + releaseDefines + '")');
|
||
|
|
this.p('set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}' + releaseDefines + '")');
|
||
|
|
let includes = '';
|
||
|
|
for (let inc of project.getIncludeDirs()) {
|
||
|
|
includes += ' "' + path.resolve(inc).replace(/\\/g, '/') + '"\n';
|
||
|
|
}
|
||
|
|
this.p('include_directories(\n' + includes + ')');
|
||
|
|
let files = '';
|
||
|
|
for (let file of project.getFiles()) {
|
||
|
|
if (file.file.endsWith('.c') || file.file.endsWith('.cc') || file.file.endsWith('.cpp') || file.file.endsWith('.h')) {
|
||
|
|
if (file.options && file.options.nocompile) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
files += ' "' + path.resolve(file.file).replace(/\\/g, '/') + '"\n';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.p('set(SOURCE_FILES\n' + files + ')');
|
||
|
|
this.p('add_executable(' + name + ' ${SOURCE_FILES})');
|
||
|
|
let libraries = '';
|
||
|
|
for (let lib of project.getLibs()) {
|
||
|
|
libraries += ' ' + lib + '\n';
|
||
|
|
}
|
||
|
|
this.p('target_link_libraries(' + name + '\n' + libraries + ')');
|
||
|
|
this.closeFile();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.CMakeExporter = CMakeExporter;
|
||
|
|
//# sourceMappingURL=CMakeExporter.js.map
|