"use strict"; // Called from entry point, e.g. Kha/make.js // This is where options are processed: // e.g. '-t html5 --server' Object.defineProperty(exports, "__esModule", { value: true }); const os = require("os"); const path = require("path"); const GraphicsApi_1 = require("./GraphicsApi"); const Architecture_1 = require("./Architecture"); const AudioApi_1 = require("./AudioApi"); const VrApi_1 = require("./VrApi"); const RayTraceApi_1 = require("./RayTraceApi"); const Options_1 = require("./Options"); const Platform_1 = require("./Platform"); const VisualStudioVersion_1 = require("./VisualStudioVersion"); let defaultTarget; if (os.platform() === 'linux') { defaultTarget = Platform_1.Platform.Linux; } else if (os.platform() === 'win32') { defaultTarget = Platform_1.Platform.Windows; } else if (os.platform() === 'freebsd') { defaultTarget = Platform_1.Platform.FreeBSD; } else { defaultTarget = Platform_1.Platform.OSX; } let options = [ { full: 'from', value: true, description: 'Location of your project', default: '.' }, { full: 'to', value: true, description: 'Build location', default: 'build' }, { full: 'projectfile', value: true, description: 'Name of your project file, defaults to "khafile.js"', default: 'khafile.js' }, { full: 'target', short: 't', value: true, description: 'Target platform', default: defaultTarget }, { full: 'vr', value: true, description: 'Target VR device', default: VrApi_1.VrApi.None }, { full: 'raytrace', value: true, description: 'Target raytracing api', default: RayTraceApi_1.RayTraceApi.None }, { full: 'main', value: true, description: 'Entrypoint for the haxe code (-main argument), defaults to "Main".', default: 'Main' }, { full: 'intermediate', description: 'Intermediate location for object files.', value: true, default: '', hidden: true }, { full: 'graphics', short: 'g', description: 'Graphics api to use. Possible parameters are direct3d9, direct3d11, direct3d12, metal, vulkan and opengl.', value: true, default: GraphicsApi_1.GraphicsApi.Default }, { full: 'arch', description: 'Target architecture to use. Possible parameters are arm7, arm8, x86, x86_64.', value: true, default: Architecture_1.Architecture.Default }, { full: 'audio', short: 'a', description: 'Audio api to use. Possible parameters are directsound and wasapi.', value: true, default: AudioApi_1.AudioApi.Default }, { full: 'visualstudio', short: 'v', description: 'Version of Visual Studio to use. Possible parameters are vs2010, vs2012, vs2013, vs2015, vs2017, vs2019 and vs2022.', value: true, default: VisualStudioVersion_1.VisualStudioVersion.VS2022 }, { full: 'kha', short: 'k', description: 'Location of Kha directory', value: true, default: '' }, { full: 'haxe', description: 'Location of Haxe directory', value: true, default: '' }, { full: 'nohaxe', description: 'Do not compile Haxe sources', value: false, }, { full: 'ffmpeg', description: 'Location of ffmpeg executable', value: true, default: '' }, { full: 'ogg', description: 'Commandline for running the ogg encoder', value: true, default: '' }, { full: 'mp3', description: 'Commandline for running the mp3 encoder', value: true, default: '' }, { full: 'aac', description: 'Commandline for running the ffmpeg executable', value: true, default: '' }, { full: 'krafix', description: 'Location of krafix shader compiler', value: true, default: '' }, { full: 'kraffiti', description: 'Location of kraffiti image processing tool', value: true, default: '' }, { full: 'noshaders', description: 'Do not compile shaders', value: false }, { full: 'noproject', description: 'Only source files. Don\'t generate project files.', value: false, }, { full: 'onlydata', description: 'Only assets/data. Don\'t generate project files.', value: false, }, { full: 'embedflashassets', description: 'Embed assets in swf for flash target', value: false }, { full: 'compile', description: 'Compile executable', value: false }, { full: 'run', description: 'Run executable', value: false }, { full: 'init', description: 'Init a Kha project inside the current directory', value: false }, { full: 'name', description: 'Project name to use when initializing a project', value: true, default: 'Project' }, { full: 'server', description: 'Run local http server for html5 target', value: false }, { full: 'port', description: 'Running port for the server', value: true, default: 8080 }, { full: 'debug', description: 'Compile in debug mode.', value: false }, { full: 'silent', description: 'Silent mode.', value: false }, { full: 'quiet', description: 'Quiet mode. Like silent mode but prints error messages.', value: false }, { full: 'watch', short: 'w', description: 'Watch files and recompile on change.', value: false }, { full: 'watchport', short: 'wp', description: 'Port for the compilation server (default value is 7000).', value: true, default: '7000', }, { full: 'livereload', description: 'Reload http server page on watch mode recompilations.', value: false }, { full: 'glsl2', description: 'Use experimental SPIRV-Cross glsl mode.', value: false }, { full: 'shaderversion', description: 'Set target shader version manually.', value: true, default: null }, { full: 'parallelAssetConversion', description: 'Experimental - Spawn multiple processes during asset and shader conversion. Possible values:\n 0: disabled (default value)\n -1: choose number of processes automatically\n N: specify number of processes manually', value: true, default: 0 }, { full: 'slowgc', description: 'Disables generational garbage collection.', value: false }, { full: 'nosigning', value: false, description: 'Disable code signing for iOS' } ]; let parsedOptions = new Options_1.Options(); function printHelpLine(options, description) { let helpLine = options; while (helpLine.length < 30) { helpLine += ' '; } helpLine += '' + description; console.log(helpLine); console.log(); } function printHelp() { console.log('khamake options:\n'); for (let option of options) { if (option.hidden) { continue; } if (option.short) { printHelpLine('-' + option.short + ' ' + '--' + option.full, option.description); } else { printHelpLine('--' + option.full, option.description); } } } function isTarget(target) { if (target.trim().length < 1) return false; return true; } for (let option of options) { if (option.value) { parsedOptions[option.full] = option.default; } else { parsedOptions[option.full] = false; } } let targetIsDefault = true; let args = process.argv; for (let i = 2; i < args.length; ++i) { let arg = args[i]; if (arg === '--') break; if (arg[0] === '-') { if (arg[1] === '-') { if (arg.substr(2) === 'help') { printHelp(); process.exit(0); } for (let option of options) { if (arg.substr(2) === option.full) { if (option.value) { ++i; parsedOptions[option.full] = args[i]; if (option.full === 'target') { targetIsDefault = false; } else if (option.full === 'parallelAssetConversion') { parsedOptions[option.full] = parseInt(parsedOptions[option.full]); } } else { parsedOptions[option.full] = true; } } } } else { if (arg[1] === 'h') { printHelp(); process.exit(0); } for (let option of options) { if (option.short && arg[1] === option.short) { if (option.value) { ++i; parsedOptions[option.full] = args[i]; if (option.full === 'target') { targetIsDefault = false; } } else { parsedOptions[option.full] = true; } } } } } else { if (isTarget(arg)) { parsedOptions.target = arg.toLowerCase(); targetIsDefault = false; } } } if (parsedOptions.run) { parsedOptions.compile = true; } async function runKhamake() { try { let logInfo = function (text, newline) { if (newline) { console.log(text); } else { process.stdout.write(text); } }; let logError = function (text, newline) { if (newline) { console.error(text); } else { process.stderr.write(text); } }; await require('./main.js').run(parsedOptions, { info: logInfo, error: logError }); } catch (error) { if (error) { console.log(error); } process.exit(1); } } if (parsedOptions.init) { console.log('Initializing Kha project.\n'); require('./init').run(parsedOptions.name, parsedOptions.from, parsedOptions.projectfile); console.log('If you want to use the git version of Kha, execute "git init" and "git submodule add https://github.com/Kode/Kha.git".'); } else if (parsedOptions.server) { console.log('Running server on ' + parsedOptions.port); let nstatic = require('node-static'); let fileServer = new nstatic.Server(path.join(parsedOptions.from, 'build', targetIsDefault ? 'html5' : parsedOptions.target), { cache: 0 }); let server = require('http').createServer(function (request, response) { request.addListener('end', function () { fileServer.serve(request, response); }).resume(); }); server.on('error', function (e) { if (e.code === 'EADDRINUSE') { console.log('Error: Port ' + parsedOptions.port + ' is already in use.'); console.log('Please close the competing program (maybe another instance of khamake?)'); console.log('or switch to a different port using the --port argument.'); } }); server.listen(parsedOptions.port); if (parsedOptions.watch) runKhamake(); } else { runKhamake(); } //# sourceMappingURL=khamake.js.map