summaryrefslogtreecommitdiff
blob: 77aab2a2ddcab3051c2da6b339cc59f3874f6007 (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
# Copyright 2017-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

PYTHON_COMPAT=( python3_{9..10} )

inherit desktop flag-o-matic python-any-r1 scons-utils toolchain-funcs xdg

if [[ "${PV}" = 9999 ]]; then
	inherit git-r3
	EGIT_REPO_URI="https://github.com/dxx-rebirth/dxx-rebirth"
else
	S="${WORKDIR}/${PN}_${PV##*_pre}-src"
	SRC_URI="https://www.dxx-rebirth.com/download/dxx/rebirth/${PN}_${PV##*_pre}-src.tar.xz"

	# Games under Gentoo are marked as 'testing' by convention
	#
	# Other architectures are reported to work, but not tested regularly by
	# the core team.
	#
	# Raspberry Pi support is tested by an outside contributor, and his
	# fixes are merged into the main source by upstream.
	#
	# Cross-compilation to Windows is also supported.
	KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86"
fi

DESCRIPTION="Descent Rebirth - enhanced Descent 1 & 2 engine"
HOMEPAGE="https://www.dxx-rebirth.com/"

LICENSE="DXX-Rebirth GPL-3"
SLOT="0"

# Default to building both game engines.  The total size is relatively
# small.
IUSE="+d1x +d2x +data debug editor +flac ipv6 +joystick l10n_de +midi +mp3 +music +opengl opl3-musicpack +png sc55-musicpack sdl2 tracker valgrind +vorbis"

# Game data is stored in HOG files.
# Game movies are in MVL files.
# Various add-ons use zip files to bundle their content together.
#
# PNG support enables writing screenshots as PNG instead of TGA (for
# USE=opengl) or PCX (for USE=-opengl).
DEPEND="dev-games/physfs[hog,mvl,zip]
	opengl? (
		virtual/opengl
		virtual/glu )
	png? ( media-libs/libpng )
"

# As of this writing, there is no Portage shorthand syntax to express:
# "
# 	flag1? ( package[flag1] )
# 	flag2? ( package[flag2] )
# 	...
# 	flagN? ( package[flagN] )
# ", such that unsetting all flags removes the dependency on package.
# Fake it by using a text fragment that is repeatedly expanded with
# differing substitutions.
#
# The use of single quotes is intentional here.  The ${word} is a
# placeholder to be matched by text substitution when the fragment is
# expanded, not a shell variable reference.
#
# For each flag, depend on freedata using the same flag.  If none of the
# flags are set, freedata is not needed.
DXX_RDEPEND_USE_FREEDATA_FRAGMENT='
	${USE}? ( games-action/descent${ENGINE}-freedata[${USE}] )
'
# Block <0.59.100 due to file collision.
#
# If USE=data, then require a game data package.
# The build process does not use the game data, nor change how the game
# is built based on what game data will be used.  At startup, the game
# will search for both types of game data and use what it finds.  Users
# can switch between shareware/retail data at any time by
# adding/removing the appropriate data packages.  A rebuild is _not_
# required after swapping the data files.
#
# USE-depend on freedata for various extras, but only if any of those
# extras are enabled.
DXX_RDEPEND_ENGINE_FRAGMENT='
	d${ENGINE}x? (
		!<games-action/d${ENGINE}x-rebirth-0.59.100
		data? (
			|| (
				games-action/descent${ENGINE}-data
				games-action/descent${ENGINE}-demodata
			)
		)
		'"
		${DXX_RDEPEND_USE_FREEDATA_FRAGMENT//\$\{USE\}/l10n_de}
		${DXX_RDEPEND_USE_FREEDATA_FRAGMENT//\$\{USE\}/opl3-musicpack}
		${DXX_RDEPEND_USE_FREEDATA_FRAGMENT//\$\{USE\}/sc55-musicpack}
		"'
	)
'

DXX_DEPEND_USE_SDL_VERSION_FRAGMENT='
	media-libs/lib${SDL_version}[joystick?,opengl?,sound,video]
	media-libs/${SDL_version}-image
	music? ( media-libs/${SDL_version}-mixer )
'
DXX_RDEPEND_USE_SDL_VERSION_FRAGMENT='
	music? ( media-libs/${SDL_version}-mixer[flac?,midi?,mp3?,vorbis?] )
'
DEPEND="${DEPEND}
	!sdl2? ( ${DXX_DEPEND_USE_SDL_VERSION_FRAGMENT//\$\{SDL_version\}/sdl} )
	sdl2? ( ${DXX_DEPEND_USE_SDL_VERSION_FRAGMENT//\$\{SDL_version\}/sdl2} )
"
unset DXX_DEPEND_USE_SDL_VERSION_FRAGMENT

unset DXX_RDEPEND_USE_FREEDATA_FRAGMENT
RDEPEND="${DEPEND}
	!sdl2? ( ${DXX_RDEPEND_USE_SDL_VERSION_FRAGMENT//\$\{SDL_version\}/sdl} )
	sdl2? ( ${DXX_RDEPEND_USE_SDL_VERSION_FRAGMENT//\$\{SDL_version\}/sdl2} )
	${DXX_RDEPEND_ENGINE_FRAGMENT//\$\{ENGINE\}/1}
	${DXX_RDEPEND_ENGINE_FRAGMENT//\$\{ENGINE\}/2}
"
unset DXX_RDEPEND_ENGINE_FRAGMENT
unset DXX_RDEPEND_USE_SDL_VERSION_FRAGMENT

# USE=valgrind enables use of a Valgrind header.  A build with valgrind
# instrumentation can be run without installing Valgrind, so this
# dependency is only in DEPEND, instead of being in both DEPEND and
# RDEPEND.
DEPEND+='
	valgrind? ( dev-util/valgrind )
'

# This ebuild builds d1x-rebirth, d2x-rebirth, or both.  Building none
# would mean this ebuild installs zero files.
#
# For each of the supported music flags, require USE=music, so that the
# package is built with sdl-mixer support.  Individual music types can be
# changed without a Rebirth rebuild by rebuilding sdl-mixer with
# appropriate support, but Rebirth must have sdl-mixer support at build
# time in order to support any of these music formats at runtime.
#
# All music files in the optional musicpack downloads are .ogg, so
# require USE=vorbis if those packs are enabled.
REQUIRED_USE='
	|| ( d1x d2x )
	flac? ( music )
	midi? ( music )
	mp3? ( music )
	vorbis? ( music )
	opl3-musicpack? ( vorbis )
	sc55-musicpack? ( vorbis )
	sdl2? ( opengl )
'

BDEPEND="virtual/pkgconfig"

# As of this writing, IUSE_RUNTIME is a GLEP, but not an implemented
# feature.  This variable is stored here to be ready to activate when
# Portage implements this feature.
#
# Note that while individual music formats can be switched without a
# rebuild, the master flag USE=music controls whether sdl-mixer is used,
# and therefore requires a rebuild when changed.
#IUSE_RUNTIME="flac l10n_de midi mp3 opl3-musicpack sc55-musicpack vorbis"

PATCHES=(
	"${FILESDIR}"/${P}-gcc-12.patch
	"${FILESDIR}"/${P}-gcc-12-editor.patch
	"${FILESDIR}"/${P}-scons-4.5.patch
)

dxx_scons() {
	# Always build profile `m`.  If use editor, also build profile `e`.
	# Set most variables in the default anonymous profile.  Only
	# `builddir` and `editor` are set in the named profiles, since those
	# must be different between the two builds.
	#
	# Notes for end users:
	# - Per-engine options can be set with an engine prefix, as shown
	#   for sharepath.  Such options are used in place of
	#   engine-unqualified options.  For example, to disable sdlmixer
	#   for Descent 2: Rebirth, but use the setting below for Descent 1:
	#   Rebirth, set EXTRA_ESCONS="d2x_sdlmixer=0".
	# - Profile `site` is searched before the anonymous profile, and is
	#   deliberately unused in this ebuild.  Set options in the site
	#   profile to affect both engines:
	#   EXTRA_ESCONS="site_verbosebuild=0".
	local scons_build_profile=m mysconsargs=(
		sdl2=$(usex sdl2 1 0)
		sdlmixer=$(usex music 1 0)
		verbosebuild=1
		debug=$(usex debug 1 0)
		ipv6=$(usex ipv6 1 0)
		opengl=$(usex opengl 1 0)
		use_tracker=$(usex tracker 1 0)
		prefix="${EPREFIX}"/usr
		screenshot=$(usex png png legacy)
		m_builddir=build/main/
		m_editor=0
	)
	if use editor; then
		scons_build_profile+=+e
		mysconsargs+=( \
			e_builddir=build/editor/
			e_editor=1
		)
	fi
	if ! use joystick; then
		mysconsargs+=( \
			max_joysticks=0
		)
	fi
	# Add sharepath and enable build of selected games.  The trailing
	# comma after `$scons_build_profile` is required to cause scons to
	# search the anonymous profile.  If omitted, only settings from the
	# named profile would be used.
	use d1x && mysconsargs+=( d1x_sharepath="/usr/share/games/d1x" d1x="$scons_build_profile,site," )
	use d2x && mysconsargs+=( d2x_sharepath="/usr/share/games/d2x" d2x="$scons_build_profile,site," )
	use valgrind && mysconsargs+=( poison=valgrind )
	escons "${mysconsargs[@]}" "$@"
}

src_compile() {
	tc-export CXX PKG_CONFIG
	replace-flags -O3 -O2 #831896
	dxx_scons register_install_target=0 build
}

src_install() {
	# Use upstream install target to handle the various combinations of
	# enabled/disabled engines and optional editor support.
	dxx_scons register_compile_target=0 register_install_target=1 DESTDIR="${D}" "${D}"
	local DV
	for DV in 1 2; do
		if ! use d${DV}x; then
			continue
		fi
		local PROGRAM=d${DV}x-rebirth
		docinto "${PROGRAM}"
		dodoc "${PROGRAM}"/*.txt
		make_desktop_entry "${PROGRAM}" "Descent ${DV} Rebirth" "${PROGRAM}"
		doicon "${PROGRAM}/${PROGRAM}.xpm"
	done
}

pkg_postinst() {
	xdg_pkg_postinst
	if ! use data; then
		elog "${PN} requires game data to play."
		elog "Game data is not included in this package.  To play the game,"
		elog "emerge the packages required by USE=data or install the game"
		elog "data by hand."
		elog
		elog "Changing USE=data does not change how this package is built,"
		elog "only its runtime dependencies."
	fi
}