diff options
Diffstat (limited to 'dev-lang/mlton/mlton-20180207.ebuild')
-rw-r--r-- | dev-lang/mlton/mlton-20180207.ebuild | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/dev-lang/mlton/mlton-20180207.ebuild b/dev-lang/mlton/mlton-20180207.ebuild new file mode 100644 index 000000000000..b8df540a09ff --- /dev/null +++ b/dev-lang/mlton/mlton-20180207.ebuild @@ -0,0 +1,264 @@ +# Copyright 1999-2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +inherit check-reqs eutils multibuild pax-utils + +DESCRIPTION="Standard ML optimizing compiler and libraries" +BASE_URI="mirror://sourceforge/${PN}" +SRC_URI="!binary? ( ${BASE_URI}/${P}.src.tgz ) + !bootstrap-smlnj? ( amd64? ( ${BASE_URI}/${P}-1.amd64-linux.tgz ) )" +HOMEPAGE="http://www.mlton.org" + +LICENSE="HPND MIT" +SLOT="0/${PV}" +KEYWORDS="~amd64 ~x86" +IUSE="binary bootstrap-smlnj stage3 doc pax_kernel" + +DEPEND="dev-libs/gmp:* + bootstrap-smlnj? ( dev-lang/smlnj ) + !bootstrap-smlnj? ( + !amd64? ( dev-lang/smlnj ) + ) + pax_kernel? ( sys-apps/elfix ) + doc? ( virtual/latex-base )" +RDEPEND="dev-libs/gmp:*" + +QA_PRESTRIPPED="binary? ( + usr/lib64/${PN}/bin/mlnlffigen + usr/lib64/${PN}/bin/mllex + usr/lib64/${PN}/bin/mlprof + usr/lib64/${PN}/bin/mlyacc + usr/lib64/${PN}/lib/mlton-compile + usr/lib/${PN}/bin/mlnlffigen + usr/lib/${PN}/bin/mllex + usr/lib/${PN}/bin/mlprof + usr/lib/${PN}/bin/mlyacc + usr/lib/${PN}/lib/mlton-compile +)" + +B="${P}-1.${ARCH}-${KERNEL}" +R="${WORKDIR}/${B}" + +mlton_subdir() { + echo $(get_libdir)/${PN} +} + +mlton_dir() { + echo "${EPREFIX%/}"/usr/$(mlton_subdir) +} + +mlton_memory_requirement() { + # The resident set size of compiling mlton with mlton is almost 14GB on amd64. + # http://mlton.org/SelfCompiling + # Compiling MLton requires at least 1GB of RAM for 32-bit platforms (2GB is + # preferable) and at least 2GB RAM for 64-bit platforms (4GB is preferable). + # If your machine has less RAM, self-compilation will likely fail, or at least + # take a very long time due to paging. Even if you have enough memory, there + # simply may not be enough available, due to memory consumed by other + # processes. In this case, you may see an Out of memory message, or + # self-compilation may become extremely slow. The only fix is to make sure + # that enough memory is available. + [[ ${ARCH} == "x86" ]] && echo "2G" || echo "4G" +} + +pkg_pretend() { + if use !binary; then + local CHECKREQS_MEMORY=$(mlton_memory_requirement) + check-reqs_pkg_pretend + fi +} + +pkg_setup() { + if use !binary; then + local CHECKREQS_MEMORY=$(mlton_memory_requirement) + check-reqs_pkg_setup + fi +} + +mlton_bootstrap_variant() { + local b="" + if use bootstrap-smlnj || ! use amd64; then + b="bootstrap-smlnj" + else + b="bootstrap" + fi + echo "${b}" +} + +mlton_bootstrap_build_dir() { + echo $(basename ${S})"-"$(mlton_bootstrap_variant) +} + +mlton_bootstrap_bin_dir() { + local b=$(mlton_bootstrap_build_dir) + if use bootstrap-smlnj || ! use amd64; then + b+="/build/bin" + else + b+="/bin" + fi + echo "${b}" +} + +# Return the array of multilib build variants +mlton_multibuild_variants() { + local MULTIBUILD_VARIANTS=() + if ! use binary; then + if use bootstrap-smlnj || ! use amd64; then + MULTIBUILD_VARIANTS+=( $(mlton_bootstrap_variant) ) + use stage3 && MULTIBUILD_VARIANTS+=( build-with-mlton ) + else + MULTIBUILD_VARIANTS+=( build-with-mlton ) + fi + fi + echo ${MULTIBUILD_VARIANTS[*]} +} + +# Return the last multibuild variant +mlton_last_multibuild_variant() { + local vs=( $(mlton_multibuild_variants) ) + echo ${vs[${#vs[@]}-1]} +} + +src_unpack() { + default + if use binary; then + mkdir -p "${S}" || die + fi +} + +BIN_STUBS=( mllex mlnlffigen mlprof mlton mlyacc ) + +mlton_create_bin_stubs() { + local SUBDIR=$(mlton_subdir) + mkdir "${S}"/bin_stubs || die + pushd "${S}"/bin_stubs || die + for i in ${BIN_STUBS[*]}; do + cat <<- EOF >> ${i} + #!/bin/bash + exec ${EPREFIX%/}/usr/${SUBDIR}/bin/${i} \$* + EOF + chmod a+x ${i} || die + done + popd || die +} + +src_prepare() { + if ! use binary; then + # For Gentoo hardened: paxmark the mlton-compiler, mllex and mlyacc executables + epatch "${FILESDIR}/${PN}-20180207-paxmark.patch" + # Fix the bootstrap-smlnj and bootstrap-polyml Makefile targets + epatch "${FILESDIR}/${PN}-20180207-bootstrap.patch" + fi + default + $(mlton_create_bin_stubs) + if use binary; then + pax-mark m "${R}/lib/${PN}/mlton-compile" + pax-mark m "${R}/bin/mllex" + pax-mark m "${R}/bin/mlyacc" + ln -s ${R} ../$(mlton_bootstrap_build_dir) || die + gunzip ${R}/share/man/man1/*.gz || die + else + local MULTIBUILD_VARIANTS=( $(mlton_multibuild_variants) ) + multibuild_copy_sources + if ! use bootstrap-smlnj && [[ ${ARCH} == "amd64" ]]; then + ln -s ${B} ../$(mlton_bootstrap_build_dir) || die + fi + fi +} + +mlton_src_compile() { + if [[ ${MULTIBUILD_VARIANT} == $(mlton_bootstrap_variant) ]]; then + emake -j1 \ + "bootstrap-smlnj" \ + PAXMARK=$(usex pax_kernel "paxmark.sh" "true") \ + CFLAGS="${CFLAGS}" \ + WITH_GMP_INC_DIR="${EPREFIX}"/usr/include \ + WITH_GMP_LIB_DIR="${EPREFIX}"/$(get_libdir) + else + export PATH="${WORKDIR}/"$(mlton_bootstrap_bin_dir)":${PATH}" + einfo "${MULTIBUILD_VARIANT}: Building mlton with mlton in PATH=$PATH" + emake -j1 \ + CFLAGS="${CFLAGS}" \ + WITH_GMP_INC_DIR="${EPREFIX}"/usr/include \ + WITH_GMP_LIB_DIR="${EPREFIX}"/$(get_libdir) + fi + if [[ ${MULTIBUILD_VARIANT} == $(mlton_last_multibuild_variant) ]]; then + if use doc; then + export VARTEXFONTS="${T}/fonts" + emake docs + fi + fi +} + +src_compile() { + if ! use binary; then + local MULTIBUILD_VARIANTS=( $(mlton_multibuild_variants) ) + multibuild_foreach_variant run_in_build_dir mlton_src_compile + fi +} + +mlton_src_test() { + emake check +} + +src_test() { + if ! use binary; then + local MULTIBUILD_VARIANTS=( $(mlton_last_multibuild_variant) ) + multibuild_foreach_variant run_in_build_dir mlton_src_test + fi +} + +mlton_src_install() { + local DIR=$(mlton_dir) + emake \ + install-no-strip install-strip \ + DESTDIR="${D}" \ + PREFIX="${DIR}" + if use doc; then + emake TDOC="${D}"/usr/share/doc/${PF} install-docs \ + DESTDIR="${D}" \ + PREFIX="${DIR}" + fi +} + +mlton_install_bin_stubs() { + exeinto /usr/bin + for i in ${BIN_STUBS[*]}; do + doexe "${S}"/bin_stubs/${i} + done +} + +src_install() { + $(mlton_install_bin_stubs) + if use binary; then + local DIR=$(mlton_dir) + exeinto "${DIR}"/bin + doexe "${R}"/bin/* + insinto "${DIR}"/lib + doins -r "${R}"/lib/${PN} + exeinto "${DIR}"/lib/${PN} + doexe "${R}"/lib/${PN}/mlton-compile + doman "${R}"/share/man/man1/* + if use doc; then + local DOCS=( "${R}"/share/doc/${PN}/. ) + einstalldocs + fi + else + local MULTIBUILD_VARIANTS=( $(mlton_last_multibuild_variant) ) + multibuild_foreach_variant run_in_build_dir mlton_src_install + fi +} + +pkg_postinst() { + # There are PIC objects in libmlton-pic.a. -link-opt -lmlton-pic does not help as mlton + # specifies -lmlton before -lmlton-pic. It appears that it would be necessary to patch mlton + # to convince mlton to use the lib*-pic.a libraries when linking an executable. + ewarn 'PIE in Gentoo hardened requires executables to be linked with -fPIC. mlton by default links' + ewarn 'executables against the non PIC objects in libmlton.a. http://mlton.org/MLtonWorld notes:' + ewarn 'Executables that save and load worlds are incompatible with address space layout' + ewarn 'randomization (ASLR) of the executable.' + ewarn 'To suppress the generation of position-independent executables.' + ewarn '-link-opt -fno-PIE' +} |