summaryrefslogtreecommitdiff
blob: f776af525b22e613af73ce5e07d1aaf89f0bb887 (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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8
PYTHON_COMPAT=( python3_{8..11} )
DISABLE_AUTOFORMATTING=1
FORCE_PRINT_ELOG=1

inherit gnome.org gnome2-utils llvm meson optfeature python-single-r1 readme.gentoo-r1 virtualx xdg

DESCRIPTION="An IDE for writing GNOME-based software"
HOMEPAGE="https://wiki.gnome.org/Apps/Builder https://gitlab.gnome.org/GNOME/gnome-builder"

# FIXME: Review licenses at some point
LICENSE="GPL-3+ GPL-2+ LGPL-3+ LGPL-2+ MIT CC-BY-SA-3.0 CC0-1.0"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="clang doc +d-spy flatpak +git gtk-doc spell +sysprof test +webkit"
REQUIRED_USE="
	${PYTHON_REQUIRED_USE}
	flatpak? ( git )
"

# When bumping, pay attention to all the included plugins/*/meson.build (and other) build files and the requirements within.
# `grep -rI dependency * --include='meson.build'` can give a good initial idea for external deps and their double checking.
# The listed RDEPEND order should roughly match that output as well, with toplevel one first then sorted by file path.
# Most plugins have no extra requirements and default to enabled; we need to handle the ones with extra requirements. Many of
# them have optional runtime dependencies, for which we try to at least notify the user via DOC_CONTENTS (but not all small
# things); `grep -rI -e 'command-pattern.*=' -e 'push_arg'` can give a (spammy) idea, plus python imports in try/except.

# Editorconfig needs old pcre, with vte migrating away, might want it optional or ported to pcre2?
# An introspection USE flag of a dep is required if any introspection based language plugin wants to use it (grep for gi.repository). Last full check at 3.28.4

# TODO: Handle llvm slots via llvm.eclass; see plugins/clang/meson.build
RDEPEND="
	>=dev-libs/glib-2.73.3:2
	>=gui-libs/gtk-4.7.1:4[introspection]
	>=gui-libs/libadwaita-1.2.0:1
	>=gui-libs/libpanel-1.0.0:1
	>=gui-libs/gtksourceview-5.5.2:5[introspection]
	>=dev-libs/json-glib-1.2.0
	>=dev-libs/jsonrpc-glib-3.42.0:=
	>=dev-libs/libpeas-1.34.0[python,${PYTHON_SINGLE_USEDEP}]
	dev-libs/libportal:=[gtk,introspection]
	>=dev-libs/template-glib-3.36.0:=[introspection]
	>=gui-libs/vte-0.70.0:2.91-gtk4[introspection]
	>=dev-libs/libxml2-2.9.0
	webkit? ( >=net-libs/webkit-gtk-2.38.0:5=[introspection] )
	>=app-text/cmark-0.29.0:0=
	d-spy? ( >=dev-util/d-spy-1.4.0:1 )
	app-text/editorconfig-core-c
	flatpak? (
		dev-util/ostree
		>=net-libs/libsoup-3:3.0
		>=sys-apps/flatpak-1.10.2
	)
	git? (
		dev-libs/libgit2:=[ssh,threads]
		>=dev-libs/libgit2-glib-1.1.0[ssh]
	)

	>=dev-libs/gobject-introspection-1.54.0:=
	$(python_gen_cond_dep '
		>=dev-python/pygobject-3.22.0:3[${PYTHON_USEDEP}]
	')
	${PYTHON_DEPS}
	clang? ( sys-devel/clang:= )
	spell? (
		app-text/enchant:2
		dev-libs/icu:=
	)
	sysprof? (
		>=dev-util/sysprof-capture-3.46.0:4
		>=dev-util/sysprof-3.46.0:0/4
	)
"
DEPEND="${RDEPEND}"
# TODO: runtime ctags path finding..

# desktop-file-utils required for tests, but we have it in deptree for xdg update-desktop-database anyway, so be explicit and unconditional
# appstream-glib needed for validation with appstream-util with FEATURES=test
BDEPEND="
	doc? (
		$(python_gen_cond_dep '
			dev-python/sphinx[${PYTHON_USEDEP}]
			dev-python/sphinx_rtd_theme[${PYTHON_USEDEP}]
		')
	)
	gtk-doc? (
		dev-util/gi-docgen
		app-text/docbook-xml-dtd:4.3
	)
	test? (
		dev-libs/appstream-glib
		sys-apps/dbus
	)
	dev-util/desktop-file-utils
	dev-util/glib-utils
	>=sys-devel/gettext-0.19.8
	virtual/pkgconfig
"

DOC_CONTENTS='gnome-builder can use various other dependencies on runtime to provide
extra capabilities beyond these expressed via USE flags. Some of these
that are currently available with packages include:

* dev-util/ctags with exuberant-ctags selected via "eselect ctags" for
  C, C++, Python, JavaScript, CSS, HTML and Ruby autocompletion, semantic
  highlighting and symbol resolving support.
* dev-python/jedi and dev-python/lxml for more accurate Python
  autocompletion support.
* dev-util/valgrind for integration with valgrind.
* dev-util/meson for integration with the Meson build system.
* dev-util/cargo for integration with the Rust Cargo build system.
* dev-util/cmake for integration with the CMake build system.
* net-libs/nodejs[npm] for integration with the NPM package system.
'
# FIXME: Package codespell and mention here
# FIXME: Package gnome-code-assistance and mention here, or maybe USE flag and default enable because it's rather important
# eslint for additional diagnostics in JavaScript files (what package has this? At least something via NPM..)
# jhbuild support
# rust support via rust-analyzer; Go via go-langserver
# autotools stuff for autotools plugin; gtkmm/autoconf-archive for C++ template
# gjs/gettext/mono/PHPize stuff, but most of these are probably installed for other reasons anyways, when needed inside IDE
# stylelint for stylesheet (CSS and co) linting
# gvls for vala language-server integration

llvm_check_deps() {
	has_version "sys-devel/clang:${LLVM_SLOT}"
}

pkg_setup() {
	python-single-r1_pkg_setup
	use clang && llvm_pkg_setup
}

src_configure() {
	local emesonargs=(
		-Dchannel=other

		-Ddevelopment=false
		-Dtracing=false
		-Dprofiling=false # not passing -pg to CFLAGS
		-Dtcmalloc=false
		-Dwith_safe_path=''
		-Dgnome_sdk_version=master
		$(meson_use doc help)
		$(meson_use gtk-doc docs)
		-Dnetwork_tests=false
		-Dctags_path=''
		$(meson_feature webkit)

		-Dplugin_autotools=true
		-Dplugin_bash_language_server=true
		-Dplugin_blueprint=true
		-Dplugin_buildstream=true
		-Dplugin_c_pack=true
		-Dplugin_cargo=true
		$(meson_use clang plugin_clang)
		$(meson_use clang plugin_clangd)
		$(meson_use clang plugin_clang_format)
		-Dplugin_cmake=true
		-Dplugin_codespell=true
		-Dplugin_code_index=true
		-Dplugin_copyright=true
		-Dplugin_ctags=true
		-Dplugin_deviced=false # libdeviced not packaged?
		$(meson_use d-spy plugin_dspy)
		-Dplugin_editorconfig=true
		-Dplugin_eslint=true
		-Dplugin_file_search=true
		$(meson_use flatpak plugin_flatpak)
		-Dplugin_gdb=true
		-Dplugin_gdiagnose=true
		-Dplugin_gettext=true
		$(meson_use git plugin_git)
		-Dplugin_gopls=true
		-Dplugin_gradle=true
		-Dplugin_grep=true
		-Dplugin_html_completion=true
		$(meson_use webkit plugin_html_preview)
		-Dplugin_intelephense=true
		-Dplugin_jdtls=true
		-Dplugin_jedi_language_server=true
		-Dplugin_jhbuild=true
		-Dplugin_make=true
		-Dplugin_make_templates=true
		$(meson_use webkit plugin_markdown_preview)
		-Dplugin_maven=true
		-Dplugin_meson=true
		-Dplugin_meson_templates=true
		-Dplugin_modelines=true
		-Dplugin_mono=true
		-Dplugin_newcomers=true
		-Dplugin_notification=true
		-Dplugin_npm=true
		-Dplugin_phpize=true
		-Dplugin_podman=true
		-Dplugin_pygi=true
		# -Dplugin_python_lsp_server=true # isn't recognized by meson even though it's in meson.build and meson-options.txt. See also: https://gitlab.gnome.org/GNOME/gnome-builder/-/issues/1842
		-Dplugin_qemu=true
		-Dplugin_quick_highlight=true
		-Dplugin_retab=true
		-Dplugin_rstcheck=true
		-Dplugin_rubocop=true
		-Dplugin_rust_analyzer=false # rust-analyzer not packaged
		-Dplugin_shellcmd=true
		-Dplugin_shellcheck=true
		$(meson_use spell plugin_spellcheck)
		$(meson_use webkit plugin_sphinx_preview)
		-Dplugin_stylelint=true
		$(meson_use sysprof plugin_sysprof)
		-Dplugin_sysroot=true
		-Dplugin_todo=true
		-Dplugin_ts_language_server=true
		-Dplugin_update_manager=true
		-Dplugin_valac=true
		-Dplugin_vala_indenter=true
		-Dplugin_valgrind=true
		-Dplugin_vls=true
		-Dplugin_waf=true
		-Dplugin_words=true
		-Dplugin_xml_pack=true
	)
	meson_src_configure
}

src_install() {
	meson_src_install
	python_optimize
	if use doc; then
		rm "${ED}"/usr/share/doc/gnome-builder/en/.buildinfo || die
		rm "${ED}"/usr/share/doc/gnome-builder/en/objects.inv || die
		# custom docdir in build system, blocked by https://github.com/mesonbuild/meson/issues/825
		mv "${ED}"/usr/share/doc/gnome-builder/en "${ED}"/usr/share/doc/${PF}/html || die
		# _sources subdir left in on purpose, as HTML links to the rst files as "View page source". Additionally default docompress exclusion of /html/ already ensures they aren't compressed, thus linkable as-is.
		rmdir "${ED}"/usr/share/doc/gnome-builder/ || die
	fi
	readme.gentoo_create_doc
}

pkg_postinst() {
	xdg_pkg_postinst
	gnome2_schemas_update
	readme.gentoo_print_elog

	optfeature_header "Language support"
	optfeature "Rust's Cargo build system" virtual/rust
	optfeature "CMake" dev-util/cmake
	optfeature "Java Maven build system" dev-java/maven-bin
	optfeature "Meson Build system" dev-util/meson
}

pkg_postrm() {
	xdg_pkg_postrm
	gnome2_schemas_update
}

src_test() {
	virtx dbus-run-session meson test -C "${BUILD_DIR}"
}