package spirv-headers {
	description = "machine-readable files for the SPIR-V Registry";
	website = "https://github.com/KhronosGroup/SPIRV-Headers";
	anitya = 230542;
	// upstream changed version scheme, anitya incapable of filtering them
	latest = anityaFilterSPIRV;

	version# = "1.4.350.1";
	source = remoteGitHub {
		suffix = "KhronosGroup/SPIRV-Headers";
		tag = "vulkan-sdk-"+version;
		checksum = "6cmvMCH5aiHykXcozckfMOVA0nm0am4Xr2g9swBB9FtOV1vYBHgats5aRv4uQ9Kq";
	};

	patches = [
		"0001-grammar-and-header-changes-for-SPV_INTEL_predicated_.patch",
		"0002-header-updates-for-SPV_INTEL_rounded_divide_sqrt-582.patch",
		"0003-Add-SPV_MESA_fragment_coverage_mask-enumerants-580.patch",
		"0004-Update-headers-for-spirv-issue-373-584.patch",
		"0005-Reserve-some-tokens-for-Samsung-586.patch",
		"0006-Fix-OpCompositeConstructContinuedINTEL-operands-587.patch",
		"0007-Update-spirv.core.grammar.json-revision-593.patch",
		"0008-Reserve-ImageOperand-17-for-Google-589.patch",
		"0009-Fix-OpReadPipeBlockingINTEL-OpWritePipeBlockingINTEL.patch",
		"0010-Add-SPV_AMD_weak_linkage-extension-583.patch",
		"0011-Add-SPV_KHR_opacity_micromap-599.patch",
		"0012-Add-NonSemanticGraphDebugInfo-instruction-set-591.patch",
		"0013-Revert-Add-SPV_MESA_fragment_coverage_mask-enumerant.patch",
		"0014-SPV_EXT_split_barrier-600.patch",
		"0015-SPV_NV_cooperative_matrix_decode_vector-601.patch",
		"0016-Add-ArmExperimentalMLOperations-instruction-set-602.patch",
		"0017-Add-Pred-as-a-new-SPIR-V-source-language-606.patch",
		"0018-added-source-language-entry-ApilaJai-607.patch",
		"0019-license-Add-or-update-REUSE-compliance-609.patch",
		"0020-chore-Add-CONTRIBUTING-file-608.patch",
	];

	exec = cmake {
		// upstream has no tests
		skipTest = true;
	};
}

package spirv-tools {
	description = "an API and commands for processing SPIR-V modules";
	website = "https://github.com/KhronosGroup/SPIRV-Tools";
	anitya = 14894;
	latest = anityaFallback;

	version# = "2026.2";
	source = remoteGitHub {
		suffix = "KhronosGroup/SPIRV-Tools";
		tag = "v"+version;
		checksum = "pJ78inb4VzLy8CjQOESpIHHGYVVOR6qN-ZqB-2MzGTcKaoYb3bqhSjkKupiaJzIk";
	};

	exec = cmake {
		cache = {
			"SPIRV-Headers_SOURCE_DIR": "/system";
		};
	};

	inputs = [
		python,

		spirv-headers,
	];

	runtime = [ spirv-headers ];
}

package spirv-llvm-translator {
	description = "bi-directional translation between SPIR-V and LLVM IR";
	website = "https://github.com/KhronosGroup/SPIRV-LLVM-Translator";
	anitya = 227273;

	version# = "22.1.4";
	source = remoteGitHub {
		suffix = "KhronosGroup/SPIRV-LLVM-Translator";
		tag = "v"+version;
		checksum = "xh5ReZ2_i2vX56dZBnizXdHjwsl1y4D32Ptu5IrBdqoCzBqxOlynSj83FvlkcphS";
	};

	// litArgs emits shell syntax
	early = "rm -f /system/bin/clang++.cfg\nexport LIT_OPTS=" + litArgs {
		verbose = true;

		skipChecks = arch {
			default = [
				// error: line 13: OpTypeCooperativeMatrixKHR Scope is limited to Workgroup and Subgroup
				"cooperative_matrix_constant_null.spvasm",
				// error: line 66: NonSemantic.Shader.DebugInfo.200 DebugTypeFunction: expected operand Return Type is not a valid debug type
				"DebugInfo/NonSemantic/Shader200/DebugLineOnlyOnce.ll",
				// error: line 52: End of input reached while decoding OpExtInst starting at word 236: expected more operands after 8 words.
				"DebugInfo/NonSemantic/Shader200/DebugLinePriority.spt",
				// error: line 28: FPRoundingMode decoration can be applied only to a conversion instruction to or from a floating-point type.
				"llvm-intrinsics/constrained-arithmetic.ll",
				// error: line 78: OpLifetimeStart pointer operand type must be a OpTypePointer.
				"llvm-intrinsics/lifetime.ll",
				// error: line 61: FPRoundingMode decoration can be applied only to a conversion instruction to or from a floating-point type.
				"transcoding/OpenCL/convert_functions.ll",
				// error: line 56: OpConstantComposite must not have spec constant operands: <id> '30[%30]'
				"transcoding/constant-vars.ll",
				// error: line 61: Expected input and Result Type to point to the same type: SpecConstantOp
				"transcoding/global_block.cl",
				// error: line 55: OpConstantComposite must not have spec constant operands: <id> '16[%16]'
				"type-scavenger/globals.ll",
			];

			arm64 = [
				// error: line 13: OpTypeCooperativeMatrixKHR Scope is limited to Workgroup and Subgroup
				"cooperative_matrix_constant_null.spvasm",

				// error: line 66: NonSemantic.Shader.DebugInfo.200 DebugTypeFunction: expected operand Return Type is not a valid debug type
				"DebugInfo/NonSemantic/Shader200/DebugLineOnlyOnce.ll",
				// error: line 52: End of input reached while decoding OpExtInst starting at word 236: expected more operands after 8 words.
				"DebugInfo/NonSemantic/Shader200/DebugLinePriority.spt",
				// error: line 78: OpLifetimeStart pointer operand type must be a OpTypePointer.
				"llvm-intrinsics/lifetime.ll",
				// error: line 61: FPRoundingMode decoration can be applied only to a conversion instruction to or from a floating-point type.
				"transcoding/OpenCL/convert_functions.ll",
				// error: line 56: OpConstantComposite must not have spec constant operands: <id> '30[%30]'
				"transcoding/constant-vars.ll",
				// error: line 61: Expected input and Result Type to point to the same type: SpecConstantOp
				"transcoding/global_block.cl",
				// error: line 55: OpConstantComposite must not have spec constant operands: <id> '16[%16]'
				"type-scavenger/globals.ll",

				// LLVM ERROR: unsupported calling convention
				"DebugInfo/COFF/no-cus.ll",
				"DebugInfo/Generic/2009-11-05-DeadGlobalVariable.ll",
				"DebugInfo/Generic/2009-11-10-CurrentFn.ll",
				"DebugInfo/Generic/2010-01-05-DbgScope.ll",
				"DebugInfo/Generic/2010-03-12-llc-crash.ll",
				"DebugInfo/Generic/2010-03-24-MemberFn.ll",
				"DebugInfo/Generic/2010-04-19-FramePtr.ll",
				"DebugInfo/Generic/2010-06-29-InlinedFnLocalVar.ll",
				"DebugInfo/Generic/2010-10-01-crash.ll",
				"DebugInfo/Generic/PR20038.ll",
				"DebugInfo/Generic/constant-pointers.ll",
				"DebugInfo/Generic/dead-argument-order.ll",
				"DebugInfo/Generic/debug-info-eis-option.ll",
				"DebugInfo/Generic/def-line.ll",
				"DebugInfo/Generic/discriminator.ll",
				"DebugInfo/Generic/dwarf-public-names.ll",
				"DebugInfo/Generic/enum.ll",
				"DebugInfo/Generic/func-using-decl.ll",
				"DebugInfo/Generic/global.ll",
				"DebugInfo/Generic/imported-name-inlined.ll",
				"DebugInfo/Generic/incorrect-variable-debugloc1.ll",
				"DebugInfo/Generic/inline-scopes.ll",
				"DebugInfo/Generic/inlined-arguments.ll",
				"DebugInfo/Generic/inlined-vars.ll",
				"DebugInfo/Generic/linear-dbg-value.ll",
				"DebugInfo/Generic/linkage-name-abstract.ll",
				"DebugInfo/Generic/member-order.ll",
				"DebugInfo/Generic/missing-abstract-variable.ll",
				"DebugInfo/Generic/multiline.ll",
				"DebugInfo/Generic/namespace_function_definition.ll",
				"DebugInfo/Generic/namespace_inline_function_definition.ll",
				"DebugInfo/Generic/noscopes.ll",
				"DebugInfo/Generic/ptrsize.ll",
				"DebugInfo/Generic/restrict.ll",
				"DebugInfo/Generic/two-cus-from-same-file.ll",
				"DebugInfo/Generic/version.ll",
				"DebugInfo/LocalAddressSpace.ll",
				"DebugInfo/UnknownBaseType.ll",
				"DebugInfo/expr-opcode.ll",
			];
		};
	} + "\n";

	exec = cmake {
		cache = {
			"CMAKE_SKIP_BUILD_RPATH": "ON";
			"BUILD_SHARED_LIBS": "ON";
			"LLVM_SPIRV_ENABLE_LIBSPIRV_DIS": "ON";
			"LLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR": "/system";
			"LLVM_EXTERNAL_LIT": "/system/bin/lit";
			"LLVM_INCLUDE_TESTS": "ON";
		};
	};

	inputs = [
		bash,
		lit,

		spirv-tools,
	];

	runtime = [ spirv-tools ];
}
