# Copyright 2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

inherit autotools

# NOTE: PV is the libtool version number current:revision:age

DESCRIPTION="Library with missing functions based on GNUlib"
HOMEPAGE="https://prefix.gentoo.org"
GIT_TAG="b451121ab45497e78cb6f612c8673a9705193391"
SRC_URI="https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-${GIT_TAG}.tar.gz"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~ppc-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
#IUSE="static-libs"  # dynamic won't work :(

DEPEND=""
RDEPEND="${DEPEND}"
BDEPEND=""

S="${WORKDIR}/gnulib-${GIT_TAG}"

src_prepare() {
	default

	# create a config file with just the definitions we need
	mkdir extern-inline || die
	cd extern-inline || die

	cat > configure.ac <<- EOS
		AC_PREREQ([2.69])
		AC_INIT([${PN}], [${PV}], [prefix@gentoo.org])

		AC_CONFIG_MACRO_DIR([../m4])
		AC_CONFIG_HEADER([missing-include.h])

		gl_EXTERN_INLINE
	EOS

	eautoreconf
	sed -e '1,/PACKAGE_VERSION/d' missing-include.h.in \
		> "${T}"/missing-include.h
	cd .. || die

	mkdir "${PN}" || die
	cd "${PN}" || die
	cat > configure.ac <<- EOS
		AC_PREREQ([2.69])
		AC_INIT([${PN}], [${PV}], [prefix@gentoo.org])
		AM_INIT_AUTOMAKE
		LT_INIT

		AC_CONFIG_MACRO_DIR([m4])
		AC_CONFIG_HEADER([config.h])

		AC_PROG_CC
		gl_INIT
		gl_EARLY

		AC_CONFIG_FILES([Makefile lib/Makefile])

		AC_OUTPUT
	EOS

	cat > Makefile.am <<- EOS
		SUBDIRS = lib
	EOS

	local modules
	local platform
	local rev

	case "${CHOST}" in
		*-apple-darwin*)
			rev=${CHOST##*-darwin}
			platform="Mac OS X 10.$((rev - 4))"
			;;
		*-solaris2.*)
			rev=${CHOST##*-solaris2.}
			# we only support Solaris 10 (and perhaps 9) and up, so we
			# don't have to bother about 2.x, just X
			platform="Solaris ${rev}"
			;;
	esac

	# blacklist some modules that cause collisions
	# iconv      provided by virtual/iconv -> sys-libs/libiconv
	modules=( $(
		cd "${S}"/doc/posix-functions
		grep -A1 "This function is missing" *.texi | \
			grep "${platform}" | \
			sed -e 's:^\(.[^-]*\)-.*$:\1:' | \
			xargs sed -n 's/^Gnulib module: \([a-z].*\)$/\1/p' | \
			sed -e 's: or .*$::' -e 's:, :\n:g' | \
			sort -u | \
			grep -v "iconv"
	) )

	# get platform specific set of missing functions
	einfo "Including sources for missing functions on ${platform}:"
	einfo "${modules[*]}"
	"${S}"/gnulib-tool -S \
		--import \
		--lib=libmissing \
		--libtool \
		--no-vc-files \
		--no-cache-modules \
		"${modules[@]}"

	sed -i -e '/^noinst_LTLIBRARIES /s/noinst_/lib_/' lib/Makefile.am || die
	echo "libmissing_la_LDFLAGS += -version-info ${PV//./:}" >> lib/Makefile.am
	cat >> lib/Makefile.am << 'EOS'
install-data-local: $(BUILT_SOURCES)
	@for hdr in $(BUILT_SOURCES); do \
		$(INSTALL_HEADER) -D "$$hdr" $(DESTDIR)$(includedir)/$${hdr}; \
	done;
EOS

	eautoreconf
}

src_configure() {
	cd "${PN}" || die

	# ensure we don't pick up installed libmissing
	export CPPFLAGS+="-DDISABLE_LIBMISSING"   # disable libmissing headers
	export BINUTILS_CONFIG_DISABLE_MISSING=1  # disable -lmissing from ldwrapper
	export CPPFLAGS="${CPPFLAGS/-I${EPREFIX}\/usr\/include\/missing/}"
	export LIBS="${LIBS/-lmissing/}"
	einfo "CPPFLAGS: ${CPPFLAGS}"
	einfo "LIBS: ${LIBS}"

	# gnulib cannot be used a shared library, doing so results in stack
	# protector checks failing for reasons yet unknown to me
	econf --disable-shared --enable-static
}

src_compile() {
	cd "${PN}" || die
	default
}

src_install() {
	cd "${PN}" || die

	default

	rm -f "${ED}"/usr/lib/libmissing.la || die

	cd "${ED}/usr/include" || die

	# fix config.h dependency so we can can distribute it without
	local f
	for f in $(grep "_GL_INLINE_HEADER_BEGIN" -l *.h */*.h) ; do
		cat "${T}"/missing-include.h "${f}" > "${f}.new"
		[[ -s "${f}.new" ]] && mv "${f}.new" "${f}"
	done

	# modify all header-files so we can disable them and that they won't
	# clash with gnulib-based packages
	for f in *.h */*.h ; do
		sed -i \
			-e '1i#ifdef DISABLE_LIBMISSING\n# include_next <'"${f}"'>\n#else' \
			-e '$a#endif /* DISABLE_LIBMISSING */' \
			-e 's/_GL_/_LIBMISSING_/g' \
			"${f}" || die
	done
}