View Raw Ebuild
# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
LUA_COMPAT=( lua5-4 )
inherit 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"
fi
MY_P="${PN}-${MY_PV}"
S="${WORKDIR}/${MY_P}"
fi
LICENSE="GPL-2+"
SLOT="0"
IUSE="dedicated gtk3 gtk4 json mapimg modpack nls qt6"
IUSE+=" readline rule-editor +sdl3 +server +sound svg +system-lua web-server"
REQUIRED_USE="
!dedicated? ( || ( gtk3 gtk4 qt6 sdl3 ) )
dedicated? ( !gtk3 !gtk4 !mapimg !nls !qt6 !sdl3 !sound )
sound? ( sdl3 )
system-lua? ( ${LUA_REQUIRED_USE} )
"
RDEPEND="
app-arch/bzip2
app-arch/xz-utils
app-arch/zstd:=
dev-build/libtool
dev-db/sqlite:3
dev-libs/icu:=
net-misc/curl
virtual/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] )
sdl3? (
media-libs/libsdl3
media-libs/sdl3-ttf
media-libs/sdl3-image[png]
)
sound? (
media-libs/libsdl3
>=media-libs/sdl3-mixer-3.1.2_rc1[vorbis]
)
)
json? ( dev-libs/jansson:= )
readline? ( sys-libs/readline:= )
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"
}
PATCHES=(
"${FILESDIR}/${P}-widget_id-truncation.patch"
)
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 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 sound; then
emesonargs+=( -Daudio=sdl3 )
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
fi
}
pkg_postinst() {
xdg_pkg_postinst
if [[ -z ${REPLACING_VERSIONS} ]]; 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; please consult the documentation"
einfo "to configure freeciv for a particular backend:"
einfo "https://github.com/freeciv/freeciv/blob/main/doc/README.fcdb"
fi
}