# Copyright 1999-2026 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 inherit git-r3 prefix toolchain-funcs DESCRIPTION="Free Pascal Compiler live ebuild" HOMEPAGE="https://www.freepascal.org/" EGIT_REPO_URI="https://gitlab.com/freepascal.org/fpc/source.git" BOOTSTRAP_PV="3.2.2" SRC_URI=" amd64? ( https://downloads.freepascal.org/fpc/dist/${BOOTSTRAP_PV}/x86_64-linux/fpc-${BOOTSTRAP_PV}.x86_64-linux.tar ) arm64? ( https://downloads.freepascal.org/fpc/dist/${BOOTSTRAP_PV}/aarch64-linux/fpc-${BOOTSTRAP_PV}.aarch64-linux.tar ) sparc? ( https://downloads.freepascal.org/fpc/dist/${BOOTSTRAP_PV}/sparc64-linux/fpc-${BOOTSTRAP_PV}.sparc64-linux.tar ) x86? ( https://downloads.freepascal.org/fpc/dist/${BOOTSTRAP_PV}/i386-linux/fpc-${BOOTSTRAP_PV}.i386-linux.tar ) " LICENSE="GPL-2 LGPL-2.1-with-linking-exception" SLOT="0" IUSE="doc source" KEYWORDS="" PROPERTIES="live" RESTRICT="strip" # fpc is special: it can't use CFLAGS and LDFLAGS directly # since those are geared for running through gcc's frontend QA_FLAGS_IGNORED=" usr/bin/.* usr/lib.*/.*" BDEPEND=" dev-vcs/git dev-build/make " pkg_pretend() { if $(tc-getLD) --version | grep -q "GNU gold"; then eerror "fpc has several issues with the gold linker and does not easily" eerror "permit selection. Please do not use USE=default-gold on binutils." die "GNU gold detected from $(tc-getLD)" fi } src_unpack() { case ${ARCH} in amd64) BOOTSTRAP_FPC_ARCH="x86_64" ;; arm64) BOOTSTRAP_FPC_ARCH="aarch64" ;; sparc) BOOTSTRAP_FPC_ARCH="sparc64" ;; x86) BOOTSTRAP_FPC_ARCH="i386" ;; *) die "This ebuild doesn't support ${ARCH}" ;; esac git-r3_src_unpack unpack "fpc-${BOOTSTRAP_PV}.${BOOTSTRAP_FPC_ARCH}-linux.tar" unpack "${WORKDIR}/fpc-${BOOTSTRAP_PV}.${BOOTSTRAP_FPC_ARCH}-linux/binary.${BOOTSTRAP_FPC_ARCH}-linux.tar" unpack "${WORKDIR}/base.${BOOTSTRAP_FPC_ARCH}-linux.tar.gz" } src_prepare() { default find "${S}" -name Makefile -exec sed -i 's/ -Xs / /' {} + || die # let Portage compress man pages if [[ -f "${S}/install/man/Makefile" ]]; then sed -i '/find man.* gzip /d' "${S}/install/man/Makefile" || die fi # make the compiled binary check for fpc.cfg under prefixed /etc hprefixify "${S}/compiler/options.pas" # pas2js currently fails here when building libpas2jslib.so on some systems # with errors like: /usr/bin/ld: read-only segment has dynamic relocations. # To keep the live ebuild usable, skip pas2js for now instead of failing the # whole compiler build. cat > "${S}/utils/pas2js/Makefile" <<-'EOF' || die all: @true install: @true distinstall: @true clean: @true realclean: @true EOF } set_fpc_arch() { case ${ARCH} in amd64) FPC_ARCH="x64" FPC_PARCH="x86_64" BOOTSTRAP_FPC_ARCH="x86_64" ;; arm64) FPC_ARCH="a64" FPC_PARCH="aarch64" BOOTSTRAP_FPC_ARCH="aarch64" ;; sparc) FPC_ARCH="sparc64" FPC_PARCH="sparc64" BOOTSTRAP_FPC_ARCH="sparc64" ;; x86) FPC_ARCH="386" FPC_PARCH="i386" BOOTSTRAP_FPC_ARCH="i386" ;; *) die "This ebuild doesn't support ${ARCH}" ;; esac } set_bootstrap_pp() { set_fpc_arch pp="${WORKDIR}/lib/fpc/${BOOTSTRAP_PV}/ppc${FPC_ARCH}" [[ -x ${pp} ]] || die "Bootstrap compiler not found: ${pp}" } set_new_pp() { set_fpc_arch pp="${S}/compiler/ppc${FPC_ARCH}" } src_compile() { local pp set_bootstrap_pp # First build with unpacked bootstrap compiler emake PP="${pp}" compiler_cycle AS="$(tc-getAS)" # Save new compiler from cleaning... cp "${S}/compiler/ppc${FPC_ARCH}" "${S}/ppc${FPC_ARCH}.new" || die # ...rebuild with freshly built compiler... emake PP="${S}/ppc${FPC_ARCH}.new" AS="$(tc-getAS)" compiler_cycle # ...and clean up afterwards rm "${S}/ppc${FPC_ARCH}.new" || die # Using the new compiler set_new_pp emake PP="${pp}" AS="$(tc-getAS)" rtl_clean # ide is in packages and built unconditionally emake PP="${pp}" AS="$(tc-getAS)" rtl packages_all utils } src_install() { local pp set_new_pp set -- \ PP="${pp}" \ FPCMAKE="${S}/utils/fpcm/bin/${FPC_PARCH}-linux/fpcmake" \ INSTALL_PREFIX="${ED}/usr" \ INSTALL_DOCDIR="${ED}/usr/share/doc/${PF}" \ INSTALL_MANDIR="${ED}/usr/share/man" \ INSTALL_SOURCEDIR="${ED}/usr/lib/fpc/${PV}/source" emake "$@" compiler_install rtl_install packages_install utils_install dosym "../lib/fpc/${PV}/ppc${FPC_ARCH}" "/usr/bin/ppc${FPC_ARCH}" if [[ -d "${S}/install/doc" ]]; then emake -C "${S}/install/doc" "$@" installdoc fi if [[ -d "${S}/install/man" ]]; then emake -C "${S}/install/man" "$@" installman fi use doc && [[ -d "${S}/doc" ]] && dodoc -r "${S}/doc/." if use source; then shift emake PP="${ED}/usr/bin/ppc${FPC_ARCH}" "$@" sourceinstall find "${ED}/usr/lib/fpc/${PV}/source" -name '*.o' -delete || die fi "${ED}/usr/lib/fpc/${PV}/samplecfg" "${ED}/usr/lib/fpc/${PV}" "${ED}/etc" || die # set correct prefixed path in config files sed -i "s:${ED}:${EPREFIX}:g" "${ED}/etc/fpc.cfg" || die if [[ -f "${ED}/etc/fppkg.cfg" ]]; then sed -i "s:${ED}::g" "${ED}/etc/fppkg.cfg" || die fi if [[ -f "${ED}/etc/fppkg/default" ]]; then sed -i "s:${ED}::g" "${ED}/etc/fppkg/default" || die fi if [[ -f "${ED}/usr/lib/fpc/${PV}/ide/text/fp.cfg" ]]; then sed -i "s:${ED}::g" "${ED}/usr/lib/fpc/${PV}/ide/text/fp.cfg" || die fi if [[ -d "${ED}/usr/lib/fpc/lexyacc" ]]; then rm -r "${ED}/usr/lib/fpc/lexyacc" || die fi case ${ARCH} in amd64|arm64) mkdir -p "${ED}/usr/$(get_libdir)" || die if compgen -G "${ED}/usr/lib/*.so" > /dev/null; then mv "${ED}"/usr/lib/*.so "${ED}/usr/$(get_libdir)/" || die fi ;; esac } pkg_postinst() { if ! use doc; then elog "To read the documentation in the fpc IDE, enable the doc USE flag" fi }