427 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			427 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "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
 |