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);
 | 
						|
}
 |