584 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			584 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const fs = require('fs');
							 | 
						||
| 
								 | 
							
								const path = require('path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const project = new Project('Kinc');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function addKincDefine(name) {
							 | 
						||
| 
								 | 
							
									project.addDefine('KINC_' + name);
							 | 
						||
| 
								 | 
							
									project.addDefine('KORE_' + name);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const g1 = true;
							 | 
						||
| 
								 | 
							
								addKincDefine('G1');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const g2 = true;
							 | 
						||
| 
								 | 
							
								addKincDefine('G2');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const g3 = true;
							 | 
						||
| 
								 | 
							
								addKincDefine('G3');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let g4 = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let g5 = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const a1 = true;
							 | 
						||
| 
								 | 
							
								addKincDefine('A1');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const a2 = true;
							 | 
						||
| 
								 | 
							
								addKincDefine('A2');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let a3 = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Setting lz4x to false adds a BSD 2-Clause licensed component,
							 | 
						||
| 
								 | 
							
								// which is a little more restrictive than Kinc's zlib license.
							 | 
						||
| 
								 | 
							
								const lz4x = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								project.addFile('Sources/**');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (Options.kong) {
							 | 
						||
| 
								 | 
							
									project.addKongDir('KongShaders');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else {
							 | 
						||
| 
								 | 
							
									project.addFile('GLSLShaders/**');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (lz4x) {
							 | 
						||
| 
								 | 
							
									addKincDefine('LZ4X');
							 | 
						||
| 
								 | 
							
									project.addExclude('Sources/kinc/io/lz4/**');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								project.addIncludeDir('Sources');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function addBackend(name) {
							 | 
						||
| 
								 | 
							
									project.addFile('Backends/' + name + '/Sources/**');
							 | 
						||
| 
								 | 
							
									project.addIncludeDir('Backends/' + name + '/Sources');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let plugin = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (platform === Platform.Windows) {
							 | 
						||
| 
								 | 
							
									addBackend('System/Windows');
							 | 
						||
| 
								 | 
							
									addBackend('System/Microsoft');
							 | 
						||
| 
								 | 
							
									project.addLib('dxguid');
							 | 
						||
| 
								 | 
							
									project.addLib('dsound');
							 | 
						||
| 
								 | 
							
									project.addLib('dinput8');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									project.addDefine('_CRT_SECURE_NO_WARNINGS');
							 | 
						||
| 
								 | 
							
									project.addDefine('_WINSOCK_DEPRECATED_NO_WARNINGS');
							 | 
						||
| 
								 | 
							
									project.addLib('ws2_32');
							 | 
						||
| 
								 | 
							
									project.addLib('Winhttp');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const directshow = (graphics !== GraphicsApi.Direct3D12 && graphics !== GraphicsApi.Default);
							 | 
						||
| 
								 | 
							
									if (directshow) {
							 | 
						||
| 
								 | 
							
										project.addFile('Backends/System/Windows/Libraries/DirectShow/**');
							 | 
						||
| 
								 | 
							
										project.addIncludeDir('Backends/System/Windows/Libraries/DirectShow/BaseClasses');
							 | 
						||
| 
								 | 
							
										project.addLib('strmiids');
							 | 
						||
| 
								 | 
							
										project.addLib('winmm');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										project.addDefine('KINC_NO_DIRECTSHOW');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									project.addLib('wbemuuid');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.OpenGL1) {
							 | 
						||
| 
								 | 
							
										addBackend('Graphics3/OpenGL1');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL1');
							 | 
						||
| 
								 | 
							
										project.addDefine('GLEW_STATIC');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										project.addDefine('GLEW_STATIC');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.Direct3D11) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/Direct3D11');
							 | 
						||
| 
								 | 
							
										addKincDefine('DIRECT3D');
							 | 
						||
| 
								 | 
							
										addKincDefine('DIRECT3D11');
							 | 
						||
| 
								 | 
							
										project.addLib('d3d11');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.Direct3D12 || graphics === GraphicsApi.Default) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/Direct3D12');
							 | 
						||
| 
								 | 
							
										addKincDefine('DIRECT3D');
							 | 
						||
| 
								 | 
							
										addKincDefine('DIRECT3D12');
							 | 
						||
| 
								 | 
							
										project.addLib('dxgi');
							 | 
						||
| 
								 | 
							
										project.addLib('d3d12');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.Vulkan) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/Vulkan');
							 | 
						||
| 
								 | 
							
										addKincDefine('VULKAN');
							 | 
						||
| 
								 | 
							
										project.addDefine('VK_USE_PLATFORM_WIN32_KHR');
							 | 
						||
| 
								 | 
							
										if (!process.env.VULKAN_SDK) {
							 | 
						||
| 
								 | 
							
											throw 'Could not find a Vulkan SDK';
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										project.addLibFor('x64', path.join(process.env.VULKAN_SDK, 'Lib', 'vulkan-1'));
							 | 
						||
| 
								 | 
							
										let libs = fs.readdirSync(path.join(process.env.VULKAN_SDK, 'Lib'));
							 | 
						||
| 
								 | 
							
										for (const lib of libs) {
							 | 
						||
| 
								 | 
							
											if (lib.startsWith('VkLayer_')) {
							 | 
						||
| 
								 | 
							
												project.addLibFor('x64', path.join(process.env.VULKAN_SDK, 'Lib', lib.substr(0, lib.length - 4)));
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										project.addIncludeDir(path.join(process.env.VULKAN_SDK, 'Include'));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.Direct3D9) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/Direct3D9');
							 | 
						||
| 
								 | 
							
										addKincDefine('DIRECT3D');
							 | 
						||
| 
								 | 
							
										addKincDefine('DIRECT3D9');
							 | 
						||
| 
								 | 
							
										project.addLib('d3d9');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for Windows.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (audio === AudioApi.DirectSound) {
							 | 
						||
| 
								 | 
							
										addBackend('Audio2/DirectSound');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (audio === AudioApi.WASAPI || audio === AudioApi.Default) {
							 | 
						||
| 
								 | 
							
										addBackend('Audio2/WASAPI');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Audio API ' + audio + ' is not available for Windows.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (vr === VrApi.Oculus) {
							 | 
						||
| 
								 | 
							
										addKincDefine('VR');
							 | 
						||
| 
								 | 
							
										addKincDefine('OCULUS');
							 | 
						||
| 
								 | 
							
										project.addLibFor('x64', 'Backends/System/Windows/Libraries/OculusSDK/LibOVR/Lib/Windows/x64/Release/VS2017/LibOVR');
							 | 
						||
| 
								 | 
							
										project.addLibFor('Win32', 'Backends/System/Windows/Libraries/OculusSDK/LibOVR/Lib/Windows/Win32/Release/VS2017/LibOVR');
							 | 
						||
| 
								 | 
							
										project.addFile('Backends/System/Windows/Libraries/OculusSDK/LibOVRKernel/Src/GL/**');
							 | 
						||
| 
								 | 
							
										project.addIncludeDir('Backends/System/Windows/Libraries/OculusSDK/LibOVR/Include/');
							 | 
						||
| 
								 | 
							
										project.addIncludeDir('Backends/System/Windows/Libraries/OculusSDK/LibOVRKernel/Src/');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (vr === VrApi.SteamVR) {
							 | 
						||
| 
								 | 
							
										addKincDefine('VR');
							 | 
						||
| 
								 | 
							
										addKincDefine('STEAMVR');
							 | 
						||
| 
								 | 
							
										project.addDefine('VR_API_PUBLIC');
							 | 
						||
| 
								 | 
							
										project.addFile('Backends/System/Windows/Libraries/SteamVR/src/**');
							 | 
						||
| 
								 | 
							
										project.addIncludeDir('Backends/System/Windows/Libraries/SteamVR/src');
							 | 
						||
| 
								 | 
							
										project.addIncludeDir('Backends/System/Windows/Libraries/SteamVR/src/vrcommon');
							 | 
						||
| 
								 | 
							
										project.addIncludeDir('Backends/System/Windows/Libraries/SteamVR/headers');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (vr === VrApi.None) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('VR API ' + vr + ' is not available for Windows.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.WindowsApp) {
							 | 
						||
| 
								 | 
							
									g4 = true;
							 | 
						||
| 
								 | 
							
									addKincDefine('WINDOWSAPP');
							 | 
						||
| 
								 | 
							
									addBackend('System/WindowsApp');
							 | 
						||
| 
								 | 
							
									addBackend('System/Microsoft');
							 | 
						||
| 
								 | 
							
									addBackend('Graphics4/Direct3D11');
							 | 
						||
| 
								 | 
							
									addBackend('Audio2/WASAPI_WinRT');
							 | 
						||
| 
								 | 
							
									project.addDefine('_CRT_SECURE_NO_WARNINGS');
							 | 
						||
| 
								 | 
							
									project.vsdeploy = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (vr === VrApi.HoloLens) {
							 | 
						||
| 
								 | 
							
										addKincDefine('VR');
							 | 
						||
| 
								 | 
							
										addKincDefine('HOLOLENS');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (vr === VrApi.None) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('VR API ' + vr + ' is not available for Windows Universal.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.OSX) {
							 | 
						||
| 
								 | 
							
									addBackend('System/Apple');
							 | 
						||
| 
								 | 
							
									addBackend('System/macOS');
							 | 
						||
| 
								 | 
							
									addBackend('System/POSIX');
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.Metal || graphics === GraphicsApi.Default) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/Metal');
							 | 
						||
| 
								 | 
							
										addKincDefine('METAL');
							 | 
						||
| 
								 | 
							
										project.addLib('Metal');
							 | 
						||
| 
								 | 
							
										project.addLib('MetalKit');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL1) {
							 | 
						||
| 
								 | 
							
										addBackend('Graphics3/OpenGL1');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL1');
							 | 
						||
| 
								 | 
							
										project.addLib('OpenGL');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										project.addLib('OpenGL');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for macOS.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									project.addLib('IOKit');
							 | 
						||
| 
								 | 
							
									project.addLib('Cocoa');
							 | 
						||
| 
								 | 
							
									project.addLib('AppKit');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreAudio');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreData');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreMedia');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreVideo');
							 | 
						||
| 
								 | 
							
									project.addLib('AVFoundation');
							 | 
						||
| 
								 | 
							
									project.addLib('Foundation');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.iOS || platform === Platform.tvOS) {
							 | 
						||
| 
								 | 
							
									if (platform === Platform.tvOS) {
							 | 
						||
| 
								 | 
							
										addKincDefine('TVOS');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									addBackend('System/Apple');
							 | 
						||
| 
								 | 
							
									addBackend('System/iOS');
							 | 
						||
| 
								 | 
							
									addBackend('System/POSIX');
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.Metal || graphics === GraphicsApi.Default) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/Metal');
							 | 
						||
| 
								 | 
							
										addKincDefine('METAL');
							 | 
						||
| 
								 | 
							
										project.addLib('Metal');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL_ES');
							 | 
						||
| 
								 | 
							
										project.addLib('OpenGLES');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for iOS.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									project.addLib('UIKit');
							 | 
						||
| 
								 | 
							
									project.addLib('Foundation');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreGraphics');
							 | 
						||
| 
								 | 
							
									project.addLib('QuartzCore');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreAudio');
							 | 
						||
| 
								 | 
							
									project.addLib('AudioToolbox');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreMotion');
							 | 
						||
| 
								 | 
							
									project.addLib('AVFoundation');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreFoundation');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreVideo');
							 | 
						||
| 
								 | 
							
									project.addLib('CoreMedia');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.Android) {
							 | 
						||
| 
								 | 
							
									addKincDefine('ANDROID');
							 | 
						||
| 
								 | 
							
									addBackend('System/Android');
							 | 
						||
| 
								 | 
							
									addBackend('System/POSIX');
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.Vulkan || graphics === GraphicsApi.Default) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/Vulkan');
							 | 
						||
| 
								 | 
							
										addKincDefine('VULKAN');
							 | 
						||
| 
								 | 
							
										project.addDefine('VK_USE_PLATFORM_ANDROID_KHR');
							 | 
						||
| 
								 | 
							
										project.addLib('vulkan');
							 | 
						||
| 
								 | 
							
										addKincDefine('ANDROID_API=24');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL_ES');
							 | 
						||
| 
								 | 
							
										addKincDefine('ANDROID_API=19');
							 | 
						||
| 
								 | 
							
										project.addDefine('KINC_EGL');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for Android.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									project.addLib('log');
							 | 
						||
| 
								 | 
							
									project.addLib('android');
							 | 
						||
| 
								 | 
							
									project.addLib('EGL');
							 | 
						||
| 
								 | 
							
									if (Options.kong) {
							 | 
						||
| 
								 | 
							
										project.addLib('GLESv3');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										project.addLib('GLESv2');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									project.addLib('OpenSLES');
							 | 
						||
| 
								 | 
							
									project.addLib('OpenMAXAL');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.Emscripten) {
							 | 
						||
| 
								 | 
							
									addKincDefine('EMSCRIPTEN');
							 | 
						||
| 
								 | 
							
									//project.addLib('websocket.js -sPROXY_POSIX_SOCKETS -sUSE_PTHREADS -sPROXY_TO_PTHREAD');
							 | 
						||
| 
								 | 
							
									addBackend('System/Emscripten');
							 | 
						||
| 
								 | 
							
									project.addLib('USE_GLFW=2');
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.WebGPU) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/WebGPU');
							 | 
						||
| 
								 | 
							
										addKincDefine('WEBGPU');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL || graphics === GraphicsApi.Default) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										project.addExclude('Backends/Graphics4/OpenGL/Sources/GL/**');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL_ES');
							 | 
						||
| 
								 | 
							
										if (Options.kong) {
							 | 
						||
| 
								 | 
							
											project.addLib('USE_WEBGL2=1');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for Emscripten.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.Wasm) {
							 | 
						||
| 
								 | 
							
									addKincDefine('WASM');
							 | 
						||
| 
								 | 
							
									addBackend('System/Wasm');
							 | 
						||
| 
								 | 
							
									project.addIncludeDir('miniClib');
							 | 
						||
| 
								 | 
							
									project.addFile('miniClib/**');
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.WebGPU) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/WebGPU');
							 | 
						||
| 
								 | 
							
										addKincDefine('WEBGPU');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL || graphics === GraphicsApi.Default) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										project.addExclude('Backends/Graphics4/OpenGL/Sources/GL/**');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL_ES');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for Wasm.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.Linux || platform === Platform.FreeBSD) {
							 | 
						||
| 
								 | 
							
									if (platform === Platform.FreeBSD) { // TODO
							 | 
						||
| 
								 | 
							
										addKincDefine('LINUX');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									addBackend('System/Linux');
							 | 
						||
| 
								 | 
							
									addBackend('System/POSIX');
							 | 
						||
| 
								 | 
							
									project.addLib('asound');
							 | 
						||
| 
								 | 
							
									project.addLib('dl');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (platform === Platform.Linux) {
							 | 
						||
| 
								 | 
							
										project.addLib('udev');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										try {
							 | 
						||
| 
								 | 
							
											if (!fs.existsSync(targetDirectory)) {
							 | 
						||
| 
								 | 
							
												fs.mkdirSync(targetDirectory);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											if (!fs.existsSync(path.join(targetDirectory, 'wayland'))) {
							 | 
						||
| 
								 | 
							
												fs.mkdirSync(path.join(targetDirectory, 'wayland'));
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											const waylandDir = path.join(targetDirectory, 'wayland', 'wayland-generated');
							 | 
						||
| 
								 | 
							
											if (!fs.existsSync(waylandDir)) {
							 | 
						||
| 
								 | 
							
												fs.mkdirSync(waylandDir);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											const child_process = require('child_process');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											let good_wayland = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											const wayland_call = child_process.spawnSync('wayland-scanner', ['--version'], {encoding: 'utf-8'});
							 | 
						||
| 
								 | 
							
											if (wayland_call.status !== 0) {
							 | 
						||
| 
								 | 
							
												throw 'Could not run wayland-scanner to ask for its version';
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											const wayland_version = wayland_call.stderr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											try {
							 | 
						||
| 
								 | 
							
												const scanner_versions = wayland_version.split(' ')[1].split('.');
							 | 
						||
| 
								 | 
							
												const w_x = parseInt(scanner_versions[0]);
							 | 
						||
| 
								 | 
							
												const w_y = parseInt(scanner_versions[1]);
							 | 
						||
| 
								 | 
							
												const w_z = parseInt(scanner_versions[2]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if (w_x > 1) {
							 | 
						||
| 
								 | 
							
													good_wayland = true;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												else if (w_x === 1) {
							 | 
						||
| 
								 | 
							
													if (w_y > 17) {
							 | 
						||
| 
								 | 
							
														good_wayland = true;
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else if (w_y === 17) {
							 | 
						||
| 
								 | 
							
														if (w_z >= 91) {
							 | 
						||
| 
								 | 
							
															good_wayland = true;
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											catch (err) {
							 | 
						||
| 
								 | 
							
												log.error('Could not parse wayland-version ' + wayland_version);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											let c_ending = '.c';
							 | 
						||
| 
								 | 
							
											if (good_wayland) {
							 | 
						||
| 
								 | 
							
												c_ending = '.c.h';
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											let chfiles = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function wl_protocol(protocol, file) {
							 | 
						||
| 
								 | 
							
												chfiles.push(file);
							 | 
						||
| 
								 | 
							
												const backend_path = path.resolve(waylandDir);
							 | 
						||
| 
								 | 
							
												const protocol_path = path.resolve('/usr/share/wayland-protocols', protocol);
							 | 
						||
| 
								 | 
							
												if (child_process.spawnSync('wayland-scanner', ['private-code', protocol_path, path.resolve(backend_path, file + c_ending)]).status !== 0) {
							 | 
						||
| 
								 | 
							
													throw 'Failed to generate wayland protocol files for' + protocol;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												if (child_process.spawnSync('wayland-scanner', ['client-header', protocol_path, path.resolve(backend_path, file + '.h')]).status !== 0) {
							 | 
						||
| 
								 | 
							
													throw 'Failed to generate wayland protocol header for' + protocol;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (child_process.spawnSync('wayland-scanner', ['private-code', '/usr/share/wayland/wayland.xml', path.resolve(waylandDir, 'wayland-protocol' + c_ending)]).status !== 0) {
							 | 
						||
| 
								 | 
							
												throw 'Failed to generate wayland protocol files for /usr/share/wayland/wayland.xml';
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											if (child_process.spawnSync('wayland-scanner', ['client-header', '/usr/share/wayland/wayland.xml', path.resolve(waylandDir, 'wayland-protocol.h')]).status !== 0) {
							 | 
						||
| 
								 | 
							
												throw 'Failed to generate wayland protocol header for /usr/share/wayland/wayland.xml';
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											wl_protocol('stable/viewporter/viewporter.xml', 'wayland-viewporter');
							 | 
						||
| 
								 | 
							
											wl_protocol('stable/xdg-shell/xdg-shell.xml', 'xdg-shell');
							 | 
						||
| 
								 | 
							
											wl_protocol('unstable/xdg-decoration/xdg-decoration-unstable-v1.xml', 'xdg-decoration');
							 | 
						||
| 
								 | 
							
											wl_protocol('unstable/tablet/tablet-unstable-v2.xml', 'wayland-tablet');
							 | 
						||
| 
								 | 
							
											wl_protocol('unstable/pointer-constraints/pointer-constraints-unstable-v1.xml', 'wayland-pointer-constraint');
							 | 
						||
| 
								 | 
							
											wl_protocol('unstable/relative-pointer/relative-pointer-unstable-v1.xml', 'wayland-relative-pointer');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (good_wayland) {
							 | 
						||
| 
								 | 
							
												let cfile = '#include "wayland-protocol.c.h"\n';
							 | 
						||
| 
								 | 
							
												for (const chfile of chfiles) {
							 | 
						||
| 
								 | 
							
													cfile += '#include "' + chfile + '.c.h"\n';
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												fs.writeFileSync(path.resolve(waylandDir, 'waylandunit.c'), cfile);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											project.addIncludeDir(path.join(targetDirectory, 'wayland'));
							 | 
						||
| 
								 | 
							
											project.addFile(path.resolve(waylandDir, '**'));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										catch (err) {
							 | 
						||
| 
								 | 
							
											log.error('Failed to include wayland-support, setting KINC_NO_WAYLAND.');
							 | 
						||
| 
								 | 
							
											log.error('Wayland error was: ' + err);
							 | 
						||
| 
								 | 
							
											project.addDefine('KINC_NO_WAYLAND');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (platform === Platform.FreeBSD) {
							 | 
						||
| 
								 | 
							
										addBackend('System/FreeBSD');
							 | 
						||
| 
								 | 
							
										project.addExclude('Backends/System/Linux/Sources/kinc/backend/input/gamepad.cpp');
							 | 
						||
| 
								 | 
							
										project.addExclude('Backends/System/Linux/Sources/kinc/backend/input/gamepad.h');
							 | 
						||
| 
								 | 
							
										project.addDefine('KINC_NO_WAYLAND');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (graphics === GraphicsApi.Vulkan || (platform === Platform.Linux && graphics === GraphicsApi.Default)) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										g5 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics5/Vulkan');
							 | 
						||
| 
								 | 
							
										project.addLib('vulkan');
							 | 
						||
| 
								 | 
							
										addKincDefine('VULKAN');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (graphics === GraphicsApi.OpenGL || (platform === Platform.FreeBSD && graphics === GraphicsApi.Default)) {
							 | 
						||
| 
								 | 
							
										g4 = true;
							 | 
						||
| 
								 | 
							
										addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
										project.addExclude('Backends/Graphics4/OpenGL/Sources/GL/glew.c');
							 | 
						||
| 
								 | 
							
										project.addLib('GL');
							 | 
						||
| 
								 | 
							
										addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
										project.addLib('EGL');
							 | 
						||
| 
								 | 
							
										project.addDefine('KINC_EGL');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										throw new Error('Graphics API ' + graphics + ' is not available for Linux.');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (platform === Platform.FreeBSD) { // TODO
							 | 
						||
| 
								 | 
							
										addKincDefine('POSIX');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									project.addDefine('_POSIX_C_SOURCE=200112L');
							 | 
						||
| 
								 | 
							
									project.addDefine('_XOPEN_SOURCE=600');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else if (platform === Platform.Pi) {
							 | 
						||
| 
								 | 
							
									g4 = true;
							 | 
						||
| 
								 | 
							
									addKincDefine('RASPBERRY_PI');
							 | 
						||
| 
								 | 
							
									addBackend('System/Pi');
							 | 
						||
| 
								 | 
							
									addBackend('System/POSIX');
							 | 
						||
| 
								 | 
							
									addBackend('Graphics4/OpenGL');
							 | 
						||
| 
								 | 
							
									project.addExclude('Backends/Graphics4/OpenGL/Sources/GL/**');
							 | 
						||
| 
								 | 
							
									addKincDefine('OPENGL');
							 | 
						||
| 
								 | 
							
									addKincDefine('OPENGL_ES');
							 | 
						||
| 
								 | 
							
									addKincDefine('POSIX');
							 | 
						||
| 
								 | 
							
									project.addDefine('_POSIX_C_SOURCE=200112L');
							 | 
						||
| 
								 | 
							
									project.addDefine('_XOPEN_SOURCE=600');
							 | 
						||
| 
								 | 
							
									project.addIncludeDir('/opt/vc/include');
							 | 
						||
| 
								 | 
							
									project.addIncludeDir('/opt/vc/include/interface/vcos/pthreads');
							 | 
						||
| 
								 | 
							
									project.addIncludeDir('/opt/vc/include/interface/vmcs_host/linux');
							 | 
						||
| 
								 | 
							
									project.addLib('dl');
							 | 
						||
| 
								 | 
							
									project.addLib('GLESv2');
							 | 
						||
| 
								 | 
							
									project.addLib('EGL');
							 | 
						||
| 
								 | 
							
									project.addLib('bcm_host');
							 | 
						||
| 
								 | 
							
									project.addLib('asound');
							 | 
						||
| 
								 | 
							
									project.addLib('X11');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else {
							 | 
						||
| 
								 | 
							
									plugin = true;
							 | 
						||
| 
								 | 
							
									g4 = true;
							 | 
						||
| 
								 | 
							
									g5 = true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (g4) {
							 | 
						||
| 
								 | 
							
									addKincDefine('G4');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else {
							 | 
						||
| 
								 | 
							
									project.addExclude('Sources/Kore/Graphics4/**');
							 | 
						||
| 
								 | 
							
									project.addExclude('Sources/kinc/graphics4/**');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (g5) {
							 | 
						||
| 
								 | 
							
									addKincDefine('G5');
							 | 
						||
| 
								 | 
							
									addKincDefine('G4ONG5');
							 | 
						||
| 
								 | 
							
									addBackend('Graphics4/G4onG5');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else {
							 | 
						||
| 
								 | 
							
									addKincDefine('G5');
							 | 
						||
| 
								 | 
							
									addKincDefine('G5ONG4');
							 | 
						||
| 
								 | 
							
									addBackend('Graphics5/G5onG4');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (!a3) {
							 | 
						||
| 
								 | 
							
									if (cpp) {
							 | 
						||
| 
								 | 
							
										a3 = true;
							 | 
						||
| 
								 | 
							
										addKincDefine('A3');
							 | 
						||
| 
								 | 
							
										addBackend('Audio3/A3onA2');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								project.setDebugDir('Deployment');
							 | 
						||
| 
								 | 
							
								project.kincProcessed = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (plugin) {
							 | 
						||
| 
								 | 
							
									let backend = 'Unknown';
							 | 
						||
| 
								 | 
							
									if (platform === Platform.PS4) {
							 | 
						||
| 
								 | 
							
										backend = 'PlayStation4';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (platform === Platform.XboxOne) {
							 | 
						||
| 
								 | 
							
										backend = 'Xbox';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (platform === Platform.Switch) {
							 | 
						||
| 
								 | 
							
										backend = 'Switch';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (platform === Platform.XboxSeries) {
							 | 
						||
| 
								 | 
							
										backend = 'Xbox';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else if (platform === Platform.PS5) {
							 | 
						||
| 
								 | 
							
										backend = 'PlayStation5'
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									let ancestor = project;
							 | 
						||
| 
								 | 
							
									while (ancestor.parent != null) {
							 | 
						||
| 
								 | 
							
										ancestor = ancestor.parent;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									let pluginPath = path.join(ancestor.basedir, 'Backends', backend);
							 | 
						||
| 
								 | 
							
									if (!fs.existsSync(pluginPath)) {
							 | 
						||
| 
								 | 
							
										pluginPath = path.join(__dirname, '..', 'Backends', backend);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (!fs.existsSync(pluginPath)) {
							 | 
						||
| 
								 | 
							
										log.error('Was looking for a backend in ' + pluginPath + ' but it wasn\'t there.');
							 | 
						||
| 
								 | 
							
										throw 'backend not found';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									await project.addProject(pluginPath);
							 | 
						||
| 
								 | 
							
									resolve(project);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								else {
							 | 
						||
| 
								 | 
							
									resolve(project);
							 | 
						||
| 
								 | 
							
								}
							 |