summaryrefslogtreecommitdiff
blob: b073548f96073af0d46650d19c021c54c3d3649e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

PYTHON_COMPAT=( python3_{10..13} )
inherit cmake llvm.org multilib-minimal python-any-r1

DESCRIPTION="Multi-Level Intermediate Representation (library only)"
HOMEPAGE="https://mlir.llvm.org/"

LICENSE="Apache-2.0-with-LLVM-exceptions"
SLOT="${LLVM_MAJOR}/${LLVM_SOABI}"
IUSE="+debug test"
RESTRICT="!test? ( test )"

DEPEND="
	~llvm-core/llvm-${PV}[debug=,${MULTILIB_USEDEP}]
"
RDEPEND="
	${DEPEND}
"
BDEPEND="
	${PYTHON_DEPS}
	llvm-core/llvm:${LLVM_MAJOR}
	test? (
		$(python_gen_any_dep 'dev-python/lit[${PYTHON_USEDEP}]')
	)
"

LLVM_COMPONENTS=( mlir cmake )
# tablegen tests use *.td files there
LLVM_TEST_COMPONENTS=( llvm/include )
llvm.org_set_globals

python_check_deps() {
	if use test; then
		python_has_version "dev-python/lit[${PYTHON_USEDEP}]"
	fi
}

src_prepare() {
	llvm.org_src_prepare

	# https://github.com/llvm/llvm-project/issues/120902
	sed -i -e '/LINK_LIBS/s:PUBLIC:PRIVATE:' \
		lib/ExecutionEngine/CMakeLists.txt || die
}

check_distribution_components() {
	if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]]; then
		local all_targets=() my_targets=() l
		cd "${BUILD_DIR}" || die

		while read -r l; do
			if [[ ${l} == install-*-stripped:* ]]; then
				l=${l#install-}
				l=${l%%-stripped*}

				case ${l} in
					# meta-targets
					mlir-libraries|distribution)
						continue
						;;
					# dylib
					MLIR)
						;;
					# static libraries
					MLIR*)
						continue
						;;
				esac

				all_targets+=( "${l}" )
			fi
		done < <(${NINJA} -t targets all)

		while read -r l; do
			my_targets+=( "${l}" )
		done < <(get_distribution_components $"\n")

		local add=() remove=()
		for l in "${all_targets[@]}"; do
			if ! has "${l}" "${my_targets[@]}"; then
				add+=( "${l}" )
			fi
		done
		for l in "${my_targets[@]}"; do
			if ! has "${l}" "${all_targets[@]}"; then
				remove+=( "${l}" )
			fi
		done

		if [[ ${#add[@]} -gt 0 || ${#remove[@]} -gt 0 ]]; then
			eqawarn "get_distribution_components() is outdated!"
			eqawarn "   Add: ${add[*]}"
			eqawarn "Remove: ${remove[*]}"
		fi
		cd - >/dev/null || die
	fi
}

get_distribution_components() {
	local sep=${1-;}

	local out=(
		mlir-cmake-exports
		mlir-headers

		# the dylib
		MLIR

		# shared libraries
		mlir_arm_runner_utils
		mlir_arm_sme_abi_stubs
		mlir_async_runtime
		mlir_c_runner_utils
		mlir_float16_utils
		mlir_runner_utils
	)

	if multilib_is_native_abi; then
		out+=(
			# tools
			mlir-cpu-runner
			mlir-linalg-ods-yaml-gen
			mlir-lsp-server
			mlir-opt
			mlir-pdll
			mlir-pdll-lsp-server
			mlir-query
			mlir-reduce
			mlir-rewrite
			mlir-tblgen
			mlir-translate
			tblgen-lsp-server
			tblgen-to-irdl
		)
	fi

	printf "%s${sep}" "${out[@]}"
}

multilib_src_configure() {
	local mycmakeargs=(
		-DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}"
		-DLLVM_ROOT="${ESYSROOT}/usr/lib/llvm/${LLVM_MAJOR}"

		-DBUILD_SHARED_LIBS=OFF
		# this controls building libMLIR.so
		-DLLVM_BUILD_LLVM_DYLIB=ON
		-DMLIR_BUILD_MLIR_C_DYLIB=OFF
		-DMLIR_LINK_MLIR_DYLIB=ON
		-DMLIR_INCLUDE_TESTS=$(usex test)
		-DMLIR_INCLUDE_INTEGRATION_TESTS=OFF
		-DLLVM_DISTRIBUTION_COMPONENTS=$(get_distribution_components)
		# this enables installing mlir-tblgen and mlir-pdll
		-DLLVM_BUILD_UTILS=ON

		-DPython3_EXECUTABLE="${PYTHON}"

		-DLLVM_BUILD_TOOLS=ON
		# TODO
		-DMLIR_ENABLE_CUDA_RUNNER=0
		-DMLIR_ENABLE_ROCM_RUNNER=0
		-DMLIR_ENABLE_SYCL_RUNNER=0
		-DMLIR_ENABLE_SPIRV_CPU_RUNNER=0
		-DMLIR_ENABLE_VULKAN_RUNNER=0
		-DMLIR_ENABLE_BINDINGS_PYTHON=0
		-DMLIR_INSTALL_AGGREGATE_OBJECTS=OFF
	)
	use test && mycmakeargs+=(
		-DLLVM_EXTERNAL_LIT="${EPREFIX}/usr/bin/lit"
		-DLLVM_LIT_ARGS="$(get_lit_flags)"
	)

	# LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
	use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
	cmake_src_configure

	multilib_is_native_abi && check_distribution_components
}

multilib_src_compile() {
	cmake_build distribution
}

multilib_src_test() {
	# respect TMPDIR!
	local -x LIT_PRESERVES_TMP=1
	cmake_build check-mlir
}

multilib_src_install() {
	DESTDIR=${D} cmake_build install-distribution
}