gentoo-ebuilds/games-strategy/freeciv/freeciv-9999.ebuild
Matt Jolly c86eccf8fe
games-strategy/freeciv: use meson-format-array
Also include logic to prevent duplicate `cli` modpack array members
built with `sdl2` and `sdl3` clients.

Signed-off-by: Matt Jolly <kangie@gentoo.org>
2025-04-16 15:52:31 +10:00

259 lines
7 KiB
Bash

# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
LUA_COMPAT=( lua5-4 )
inherit desktop lua-single meson xdg
DESCRIPTION="Multiplayer strategy game (Civilization Clone)"
HOMEPAGE="https://www.freeciv.org/ https://github.com/freeciv/freeciv/"
if [[ ${PV} == 9999 ]] ; then
inherit git-r3
EGIT_REPO_URI="https://github.com/freeciv/freeciv/"
else
MY_PV="R${PV//./_}"
SRC_URI="https://github.com/freeciv/freeciv/archive/refs/tags/${MY_PV}.tar.gz -> ${P}.tar.gz"
if [[ ${PV} != *_beta* ]]; then
KEYWORDS="~amd64 ~ppc64 ~x86"
fi
MY_P="${PN}-${MY_PV}"
S="${WORKDIR}/${MY_P}"
fi
LICENSE="GPL-2+"
SLOT="0"
IUSE="authentication dedicated gtk3 gtk4 json mapimg mariadb modpack nls odbc qt6"
IUSE+=" readline rule-editor sdl +sdl3 +server +sound sqlite svg +system-lua web-server"
REQUIRED_USE="
authentication? ( || ( mariadb odbc sqlite ) )
!dedicated? ( || ( gtk3 gtk4 qt6 sdl sdl3 ) )
dedicated? ( !gtk3 !gtk4 !mapimg !nls !qt6 !sdl !sdl3 !sound )
modpack? ( sqlite )
sound? ( || ( sdl3 sdl ) )
system-lua? ( ${LUA_REQUIRED_USE} )
"
RDEPEND="
app-arch/bzip2
app-arch/xz-utils
app-arch/zstd:=
dev-build/libtool
dev-libs/icu:=
net-misc/curl
sys-libs/zlib
!dedicated? (
media-libs/libpng
gtk3? ( x11-libs/gtk+:3 )
gtk4? ( gui-libs/gtk:4 )
mapimg? ( media-gfx/imagemagick:= )
nls? ( virtual/libintl )
qt6? ( dev-qt/qtbase:6[gui,widgets] )
sdl? (
media-libs/libsdl2[video]
media-libs/sdl2-gfx
media-libs/sdl2-image[png]
media-libs/sdl2-ttf
)
sdl3? (
media-libs/libsdl3
media-libs/sdl3-ttf
media-libs/sdl3-image[png]
)
sound? (
sdl? (
media-libs/libsdl2[sound]
media-libs/sdl2-mixer[vorbis]
)
sdl3? (
media-libs/libsdl3
media-libs/sdl3-mixer[vorbis]
)
)
)
json? ( dev-libs/jansson:= )
readline? ( sys-libs/readline:= )
mariadb? ( || (
dev-db/mariadb:*
dev-db/mariadb-connector-c
)
)
odbc? ( dev-db/unixODBC )
sqlite? ( dev-db/sqlite:3 )
system-lua? (
${LUA_DEPS}
)
"
DEPEND="${RDEPEND}
!dedicated? ( x11-base/xorg-proto )
"
# Calls gzip during build
BDEPEND="
app-arch/gzip
virtual/pkgconfig
nls? ( sys-devel/gettext )
"
pkg_setup() {
use system-lua && lua-single_pkg_setup
use svg && use !qt6 && einfo "SVG flags only supported in qt6 client, ignoring"
}
src_prepare() {
# Upstream's meson.build is not very friendly to our needs
sed -i -e "s:doc/freeciv:doc/${PF}:" meson.build || die
sed -i -e "/custom_target('gzip_ChangeLog/,+6d" meson.build || die
default
}
src_configure() {
# Docs here: https://github.com/freeciv/freeciv/blob/main/doc/INSTALL.meson
local myclient=() emesonargs=() myfcmp=()
if use dedicated || use server ; then
emesonargs+=( -Dserver=enabled )
elif use web-server; then
emesonargs+=( -Dserver=freeciv-web )
else
emesonargs+=( -Dserver=disabled )
fi
# Select any client backends that we want enabled; dedicated server shouldn't build a UI
# for sanity we'll build the modpack bin with the same UIs as the client.
# 'fcmp' = freeciv modpack (client) - gtk3, qt, cli, gtk4
freeciv_enable_ui() {
local flag=$1
local client_name=${2:-${flag}}
local fcmp_name=${3:-${client_name}}
if use ${flag} ; then
myclient+=( ${client_name} )
# Avoid duplicate `cli` entries; meson will complain
if use modpack && [[ ! " ${myfcmp[*]} " =~ " ${fcmp_name} " ]]; then
myfcmp+=( ${fcmp_name} )
fi
fi
}
if ! use dedicated ; then
# there's no SDL modpack backend; rather than incidentally pull in GTK3 (as is default)
# let's explicitly set the backend to CLI
freeciv_enable_ui sdl sdl2 cli
freeciv_enable_ui sdl3 sdl3 cli
freeciv_enable_ui gtk3 gtk3.22 gtk3
freeciv_enable_ui gtk4
freeciv_enable_ui qt6 qt
use qt6 && emesonargs+=( -Dqtver=qt6 )
use qt6 && emesonargs+=( $(meson_use svg svgflags) )
else
if use modpack ; then
myfcmp+=( cli )
fi
fi
# the client and fpmc arrays are now populated (or not for dedicated); let's add them to emesonargs
emesonargs+=(
-Dclients="$(meson-format-array "${myclient[*]}")"
-Dfcmp="$(meson-format-array "${myfcmp[*]}")"
)
if use authentication; then
local myfcdb=()
use sqlite && myfcdb+=( sqlite3 )
use mariadb && myfcdb+=( mariadb )
use odbc && myfcdb+=( odbc )
emesonargs+=(
-Dfcdb="$(meson-format-array "${myfcdb[*]}")"
)
else
# If we don't want authentication
emesonargs+=( -Dfcdb="" )
fi
if use sound; then
# We can only select one, prefer the newer SDL3
if use sdl3 ; then
emesonargs+=( -Daudio=sdl3 )
elif use sdl ; then
emesonargs+=( -Daudio=sdl2 )
fi
else
# We don't want any audio support; probably a dedicated server
emesonargs+=( -Daudio=none )
fi
# If we're building a live ebuild, we want to include the git revision in the version string
if [[ ${PV} == 9999 ]] ; then
emesonargs+=( -Dgitrev=true )
fi
local tools=( manual ) # We always want this
# ruleup is the rule-updater; if you're building the editor you probably want this too
# default-enabled upstream
use rule-editor && tools+=( ruledit ruleup )
emesonargs+=(
-Dtools=$(meson-format-array ${tools[*]})
)
# Anything that can be trivially set by meson_use goes here
emesonargs+=(
$(meson_use json json-protocol)
$(meson_use mapimg mwand)
$(meson_use nls)
$(meson_use readline)
$(meson_use system-lua syslua)
)
meson_src_configure
}
src_install() {
meson_src_install
# Create and install the html manual and then cleanup the tool because it's useless.
# TODO: for proper localisation this should be run during postinst but
# that would require a lot of work to avoid orphan files.
# freeciv-manual only supports one ruleset argument at a time.
elog "Generating html manual..."
for RULESET in alien civ1 civ2 civ2civ3 classic goldkeep multiplayer sandbox
do
$(find "${WORKDIR}" -type d -maxdepth 1 -mindepth 1 -iname '*-build')/freeciv-manual -r ${RULESET} ||
die "Unable to generate HTML output for ${RULESET}"
docinto html/rulesets/${RULESET}
dodoc ${RULESET}*.html
done
find "${ED}" -name "freeciv-manual*" -delete || die "Failed to remove freeciv-manual"
if use dedicated ; then
elog "Tidying up dedicated server installation..."
find "${ED}"/usr/share/man/man6/ \
-not \( -name 'freeciv.6' -o -name 'freeciv-ruledit.6' \
-o -name 'freeciv-ruleup.6' -o -name 'freeciv-server.6' \) -mindepth 1 -delete || die
else
# sdl client needs some special handling
if use sdl ; then
make_desktop_entry freeciv-sdl "Freeciv (SDL)" freeciv-client
else
rm "${ED}"/usr/share/man/man6/freeciv-sdl2.6 || die
fi
fi
}
pkg_postinst() {
xdg_pkg_postinst
if [[ -z ${REPLACING_VERSIONS} ]] && use authentication; then
einfo "There are a number of supported authentication backends."
einfo "sqlite3 is the default, however dedicated servers may wish to"
einfo "use another supported backend. Additional configuration is required,"
einfo "to do so, even if the relevant USE was selected at build time."
einfo "please consult the documentation for instructions on configuring"
einfo "freeciv for a particular backend:"
einfo "https://github.com/freeciv/freeciv/blob/main/doc/README.fcdb"
fi
}