summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2015-08-08 13:49:04 -0700
committerRobin H. Johnson <robbat2@gentoo.org>2015-08-08 17:38:18 -0700
commit56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch)
tree3f91093cdb475e565ae857f1c5a7fd339e2d781e /eclass/gnat.eclass
downloadgentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip
proj/gentoo: Initial commit
This commit represents a new era for Gentoo: Storing the gentoo-x86 tree in Git, as converted from CVS. This commit is the start of the NEW history. Any historical data is intended to be grafted onto this point. Creation process: 1. Take final CVS checkout snapshot 2. Remove ALL ChangeLog* files 3. Transform all Manifests to thin 4. Remove empty Manifests 5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$ 5.1. Do not touch files with -kb/-ko keyword flags. Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'eclass/gnat.eclass')
-rw-r--r--eclass/gnat.eclass457
1 files changed, 457 insertions, 0 deletions
diff --git a/eclass/gnat.eclass b/eclass/gnat.eclass
new file mode 100644
index 00000000000..6b786bcdffa
--- /dev/null
+++ b/eclass/gnat.eclass
@@ -0,0 +1,457 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+#
+# Author: George Shapovalov <george@gentoo.org>
+# Belongs to: ada herd <ada@gentoo.org>
+#
+# This eclass provides the framework for ada lib installation with the split and
+# SLOTted gnat compilers (gnat-xxx, gnatbuild.eclass). Each lib gets built once
+# for every installed gnat compiler. Activation of a particular bunary module is
+# performed by eselect-gnat, when the active compiler gets switched
+#
+# The ebuilds should define the lib_compile and lib_install functions that are
+# called from the (exported) gnat_src_compile function of eclass. These
+# functions should operate similarly to the starndard src_compile and
+# src_install. The only difference, that they should use $SL variable instead of
+# $S (this is where the working copy of source is held) and $DL instead of $D as
+# its installation point.
+
+inherit flag-o-matic eutils multilib
+
+# The environment is set locally in src_compile and src_install functions
+# by the common code sourced here and in gnat-eselect module.
+# This is the standard location for this code (belongs to eselect-gnat,
+# since eselect should work even in the absense of portage tree and we can
+# guarantee to some extent presence of gnat-eselect when anything gnat-related
+# gets processed. See #192505)
+#
+# Note!
+# It may not be safe to source this at top level. Only source inside local
+# functions!
+GnatCommon="/usr/share/gnat/lib/gnat-common.bash"
+
+# !!NOTE!!
+# src_install should not be exported!
+# Instead gnat_src_install should be explicitly called from within src_install.
+EXPORT_FUNCTIONS pkg_setup pkg_postinst src_compile
+
+DESCRIPTION="Common procedures for building Ada libs using split gnat compilers"
+
+# make sure we have an appropriately recent eselect-gnat installed, as we are
+# using some common code here.
+DEPEND=">=app-eselect/eselect-gnat-1.3"
+
+
+# ----------------------------------
+# Globals
+
+# Lib install locations
+#
+# Gnat profile dependent files go under ${LibTop}/${Gnat_Profile}/${PN}
+# and common files go under SpecsDir, DataDir..
+# In order not to pollute PATH and LDPATH attempt should be mabe to install
+# binaries and what makes sence for individual packages under
+# ${AdalibLibTop}/${Gnat_Profile}/bin
+PREFIX=/usr
+AdalibSpecsDir=${PREFIX}/include/ada
+AdalibDataDir=${PREFIX}/share/ada
+AdalibLibTop=${PREFIX}/$(get_libdir)/ada
+
+# build-time locations
+# SL is a "localized" S, - location where sources are copied for
+#bi profile-specific build
+SL=${WORKDIR}/LocalSource
+
+# DL* are "localized destinations" where ARCH/SLOT dependent stuff should be
+# installed in lib_install. There are three:
+#
+DL=${WORKDIR}/LocalDest
+# a generic location for the lib (.a, .so) files
+#
+DLbin=${WORKDIR}/LocalBinDest
+# binaries that should be in the PATH, will be moved to common Ada bin dir
+#
+DLgpr=${WORKDIR}/LocalGPRDest
+# gpr's should go here.
+
+# file containing environment formed by gnat-eselect (build-time)
+BuildEnv=${WORKDIR}/BuildEnv
+
+# environment for installed lib. Profile-specific stuff should use %DL% as a top
+# of their location. This (%DL%) will be substituted with a proper location upon
+# install
+LibEnv=${WORKDIR}/LibEnv
+
+
+# env file prepared by gnat.eselect only lists new settings for env vars
+# we need to change that to prepend, rather than replace action..
+# Takes one argument - the file to expand. This file should contain only
+# var=value like lines.. (commenst are Ok)
+expand_BuildEnv() {
+ local line
+ for line in $(cat $1); do
+ EnvVar=$(echo ${line}|cut -d"=" -f1)
+ if [[ "${EnvVar}" == "PATH" ]] ; then
+ echo "export ${line}:\${${EnvVar}}" >> $1.tmp
+ else
+ echo "export ${line}" >> $1.tmp
+ fi
+ done
+ mv $1.tmp $1
+}
+
+
+# ------------------------------------
+# Dependency processing related stuff
+
+# A simple wrapper to get the relevant part of the DEPEND
+# params:
+# $1 - should contain dependency specification analogous to DEPEND,
+# if omitted, DEPEND is processed
+get_ada_dep() {
+ [[ -z "$1" ]] && DEP="${DEPEND}" || DEP="$1"
+ local TempStr
+ for fn in $DEP; do # here $DEP should *not* be in ""
+ [[ $fn =~ "virtual/ada" ]] && TempStr=${fn/*virtual\//}
+ # above match should be to full virtual/ada, as simply "ada" is a common
+ # part of ${PN}, even for some packages under dev-ada
+ done
+# debug-print-function $FUNCNAME "TempStr=${TempStr:0:8}"
+ [[ -n ${TempStr} ]] && echo ${TempStr:0:8}
+}
+
+# This function is used to check whether the requested gnat profile matches the
+# requested Ada standard
+# !!ATTN!!
+# This must match dependencies as specified in vitrual/ada !!!
+#
+# params:
+# $1 - the requested gnat profile in usual form (e.g. x86_64-pc-linux-gnu-gnat-gcc-4.1)
+# $2 - Ada standard specification, as would be specified in DEPEND.
+# Valid values: ada-1995, ada-2005, ada
+#
+# This used to treat ada-1995 and ada alike, but some packages (still
+# requested by users) no longer compile with new compilers (not the
+# standard issue, but rather compiler becoming stricter most of the time).
+# Plus there are some "intermediary versions", not fully 2005 compliant
+# but already causing problems. Therefore, now we do exact matching.
+belongs_to_standard() {
+# debug-print-function $FUNCNAME $*
+ . ${GnatCommon} || die "failed to source gnat-common lib"
+ local GnatSlot=$(get_gnat_SLOT $1)
+ local ReducedSlot=${GnatSlot//\./}
+ #
+ if [[ $2 == 'ada' ]] ; then
+# debug-print-function "ada or ada-1995 match"
+ return 0 # no restrictions imposed
+ elif [[ "$2" == 'ada-1995' ]] ; then
+ if [[ $(get_gnat_Pkg $1) == "gcc" ]]; then
+# debug-print-function "got gcc profile, GnatSlot=${ReducedSlot}"
+ [[ ${ReducedSlot} -le "42" ]] && return 0 || return 1
+ elif [[ $(get_gnat_Pkg $1) == "gpl" ]]; then
+# debug-print-function "got gpl profile, GnatSlot=${ReducedSlot}"
+ [[ ${ReducedSlot} -lt "41" ]] && return 0 || return 1
+ else
+ return 1 # unknown compiler encountered
+ fi
+ elif [[ "$2" == 'ada-2005' ]] ; then
+ if [[ $(get_gnat_Pkg $1) == "gcc" ]]; then
+# debug-print-function "got gcc profile, GnatSlot=${ReducedSlot}"
+ [[ ${ReducedSlot} -ge "43" ]] && return 0 || return 1
+ elif [[ $(get_gnat_Pkg $1) == "gpl" ]]; then
+# debug-print-function "got gpl profile, GnatSlot=${ReducedSlot}"
+ [[ ${ReducedSlot} -ge "41" ]] && return 0 || return 1
+ else
+ return 1 # unknown compiler encountered
+ fi
+ else
+ return 1 # unknown standard requested, check spelling!
+ fi
+}
+
+
+# ------------------------------------
+# Helpers
+#
+
+
+# The purpose of this one is to remove all parts of the env entry specific to a
+# given lib. Usefull when some lib wants to act differently upon detecting
+# itself installed..
+#
+# params:
+# $1 - name of env var to process
+# $2 (opt) - name of the lib to filter out (defaults to ${PN})
+filter_env_var() {
+ local entries=(${!1//:/ })
+ local libName=${2:-${PN}}
+ local env_str
+ for entry in ${entries[@]} ; do
+ # this simply checks if $libname is a substring of the $entry, should
+ # work fine with all the present libs
+ if [[ ${entry/${libName}/} == ${entry} ]] ; then
+ env_str="${env_str}:${entry}"
+ fi
+ done
+ echo ${env_str}
+}
+
+# A simpler helper, for the libs that need to extract active gnat location
+# Returns a first entry for a specified env var. Relies on the (presently true)
+# convention that first gnat's entries are listed and then of the other
+# installed libs.
+#
+# params:
+# $1 - name of env var to process
+get_gnat_value() {
+ local entries=(${!1//:/ })
+ echo ${entries[0]}
+}
+
+
+# Returns a name of active gnat profile. Performs some validity checks. No input
+# parameters, analyzes the system setup directly.
+get_active_profile() {
+ # get common code and settings
+ . ${GnatCommon} || die "failed to source gnat-common lib"
+
+ local profiles=( $(get_env_list) )
+
+ if [[ ${profiles[@]} == "${MARKER}*" ]]; then
+ return
+ # returning empty string
+ fi
+
+ if (( 1 == ${#profiles[@]} )); then
+ local active=${profiles[0]#${MARKER}}
+ else
+ die "${ENVDIR} contains multiple gnat profiles, please cleanup!"
+ fi
+
+ if [[ -f ${SPECSDIR}/${active} ]]; then
+ echo ${active}
+ else
+ die "The profile active in ${ENVDIR} does not correspond to any installed gnat!"
+ fi
+}
+
+
+
+# ------------------------------------
+# Functions
+
+# Checks the gnat backend SLOT and filters flags correspondingly
+# To be called from scr_compile for each profile, before actual compilation
+# Parameters:
+# $1 - gnat profile, e.g. x86_64-pc-linux-gnu-gnat-gcc-3.4
+gnat_filter_flags() {
+ debug-print-function $FUNCNAME $*
+
+ # We only need to filter so severely if backends < 3.4 is detected, which
+ # means basically gnat-3.15
+ GnatProfile=$1
+ if [ -z ${GnatProfile} ]; then
+ # should not get here!
+ die "please specify a valid gnat profile for flag stripping!"
+ fi
+
+ local GnatSLOT="${GnatProfile//*-/}"
+ if [[ ${GnatSLOT} < 3.4 ]] ; then
+ filter-mfpmath sse 387
+
+ filter-flags -mmmx -msse -mfpmath -frename-registers \
+ -fprefetch-loop-arrays -falign-functions=4 -falign-jumps=4 \
+ -falign-loops=4 -msse2 -frerun-loop-opt -maltivec -mabi=altivec \
+ -fsigned-char -fno-strict-aliasing -pipe
+
+ export ADACFLAGS=${ADACFLAGS:-${CFLAGS}}
+ export ADACFLAGS=${ADACFLAGS//-Os/-O2}
+ export ADACFLAGS=${ADACFLAGS//pentium-mmx/i586}
+ export ADACFLAGS=${ADACFLAGS//pentium[234]/i686}
+ export ADACFLAGS=${ADACFLAGS//k6-[23]/k6}
+ export ADACFLAGS=${ADACFLAGS//athlon-tbird/i686}
+ export ADACFLAGS=${ADACFLAGS//athlon-4/i686}
+ export ADACFLAGS=${ADACFLAGS//athlon-[xm]p/i686}
+ # gcc-2.8.1 has no amd64 support, so the following two are safe
+ export ADACFLAGS=${ADACFLAGS//athlon64/i686}
+ export ADACFLAGS=${ADACFLAGS//athlon/i686}
+ else
+ export ADACFLAGS=${ADACFLAGS:-${CFLAGS}}
+ fi
+
+ export ADAMAKEFLAGS=${ADAMAKEFLAGS:-"-cargs ${ADACFLAGS} -margs"}
+ export ADABINDFLAGS=${ADABINDFLAGS:-""}
+}
+
+gnat_pkg_setup() {
+ debug-print-function $FUNCNAME $*
+
+ # check whether all the primary compilers are installed
+ . ${GnatCommon} || die "failed to source gnat-common lib"
+ for fn in $(cat ${PRIMELIST}); do
+ if [[ ! -f ${SPECSDIR}/${fn} ]]; then
+ elog "The ${fn} Ada compiler profile is specified as primary, but is not installed."
+ elog "Please rectify the situation before emerging Ada library!"
+ elog "Please either install again all the missing compilers listed"
+ elog "as primary, or edit /etc/ada/primary_compilers and update the"
+ elog "list of primary compilers there."
+ einfo ""
+ ewarn "If you do the latter, please don't forget to rebuild all"
+ ewarn "affected libs!"
+ die "Primary compiler is missing"
+ fi
+ done
+
+ export ADAC=${ADAC:-gnatgcc}
+ export ADAMAKE=${ADAMAKE:-gnatmake}
+ export ADABIND=${ADABIND:-gnatbind}
+}
+
+
+gnat_pkg_postinst() {
+ einfo "Updating gnat configuration to pick up ${PN} library..."
+ eselect gnat update
+ elog "The environment has been set up to make gnat automatically find files"
+ elog "for the installed library. In order to immediately activate these"
+ elog "settings please run:"
+ elog
+ #elog "env-update"
+ elog "source /etc/profile"
+ einfo
+ einfo "Otherwise the settings will become active next time you login"
+}
+
+
+
+
+# standard lib_compile plug. Adapted from base.eclass
+lib_compile() {
+ debug-print-function $FUNCNAME $*
+ [ -z "$1" ] && lib_compile all
+
+ cd ${SL}
+
+ while [ "$1" ]; do
+ case $1 in
+ configure)
+ debug-print-section configure
+ econf || die "died running econf, $FUNCNAME:configure"
+ ;;
+ make)
+ debug-print-section make
+ emake || die "died running emake, $FUNCNAME:make"
+ ;;
+ all)
+ debug-print-section all
+ lib_compile configure make
+ ;;
+ esac
+ shift
+ done
+}
+
+# Cycles through installed gnat profiles and calls lib_compile and then
+# lib_install in turn.
+# Use this function to build/install profile-specific binaries. The code
+# building/installing common stuff (docs, etc) can go before/after, as needed,
+# so that it is called only once..
+#
+# lib_compile and lib_install are passed the active gnat profile name - may be used or
+# discarded as needed..
+gnat_src_compile() {
+ debug-print-function $FUNCNAME $*
+
+ # We source the eselect-gnat module and use its functions directly, instead of
+ # duplicating code or trying to violate sandbox in some way..
+ . ${GnatCommon} || die "failed to source gnat-common lib"
+
+ compilers=( $(find_primary_compilers ) )
+ if [[ -n ${compilers[@]} ]] ; then
+ local i
+ local AdaDep=$(get_ada_dep)
+ for (( i = 0 ; i < ${#compilers[@]} ; i = i + 1 )) ; do
+ if $(belongs_to_standard ${compilers[${i}]} ${AdaDep}); then
+ einfo "compiling for gnat profile ${compilers[${i}]}"
+
+ # copy sources
+ mkdir "${DL}" "${DLbin}" "${DLgpr}"
+ cp -dpR "${S}" "${SL}"
+
+ # setup environment
+ # As eselect-gnat also manages the libs, this will ensure the right
+ # lib profiles are activated too (in case we depend on some Ada lib)
+ generate_envFile ${compilers[${i}]} ${BuildEnv} && \
+ expand_BuildEnv "${BuildEnv}" && \
+ . "${BuildEnv}" || die "failed to switch to ${compilers[${i}]}"
+ # many libs (notably xmlada and gtkada) do not like to see
+ # themselves installed. Need to strip them from ADA_*_PATH
+ # NOTE: this should not be done in pkg_setup, as we setup
+ # environment right above
+ export ADA_INCLUDE_PATH=$(filter_env_var ADA_INCLUDE_PATH)
+ export ADA_OBJECTS_PATH=$(filter_env_var ADA_OBJECTS_PATH)
+
+ # call compilation callback
+ cd "${SL}"
+ gnat_filter_flags ${compilers[${i}]}
+ lib_compile ${compilers[${i}]} || die "failed compiling for ${compilers[${i}]}"
+
+ # call install callback
+ cd "${SL}"
+ lib_install ${compilers[${i}]} || die "failed installing profile-specific part for ${compilers[${i}]}"
+ # move installed and cleanup
+ mv "${DL}" "${DL}-${compilers[${i}]}"
+ mv "${DLbin}" "${DLbin}-${compilers[${i}]}"
+ mv "${DLgpr}" "${DLgpr}-${compilers[${i}]}"
+ rm -rf "${SL}"
+ else
+ einfo "skipping gnat profile ${compilers[${i}]}"
+ fi
+ done
+ else
+ ewarn "Please note!"
+ elog "Treatment of installed Ada compilers has recently changed!"
+ elog "Libs are now being built only for \"primary\" compilers."
+ elog "Please list gnat profiles (as reported by \"eselect gnat list\")"
+ elog "that you want to regularly use (i.e., not just for testing)"
+ elog "in ${PRIMELIST}, one per line."
+ die "please make sure you have at least one gnat compiler installed and set as primary!"
+ fi
+}
+
+
+# This function simply moves gnat-profile-specific stuff into proper locations.
+# Use src_install in ebuild to install the rest of the package
+gnat_src_install() {
+ debug-print-function $FUNCNAME $*
+
+ # prep lib specs directory
+ . ${GnatCommon} || die "failed to source gnat-common lib"
+ dodir ${SPECSDIR}/${PN}
+
+ compilers=( $(find_primary_compilers) )
+ if [[ -n ${compilers[@]} ]] ; then
+ local i
+ local AdaDep=$(get_ada_dep)
+ for (( i = 0 ; i < ${#compilers[@]} ; i = i + 1 )) ; do
+ if $(belongs_to_standard ${compilers[${i}]} ${AdaDep}); then
+ debug-print-section "installing for gnat profile ${compilers[${i}]}"
+
+ local DLlocation=${AdalibLibTop}/${compilers[${i}]}
+ dodir ${DLlocation}
+ cp -dpR "${DL}-${compilers[${i}]}" "${D}/${DLlocation}/${PN}"
+ cp -dpR "${DLbin}-${compilers[${i}]}" "${D}/${DLlocation}"/bin
+ cp -dpR "${DLgpr}-${compilers[${i}]}" "${D}/${DLlocation}"/gpr
+ # create profile-specific specs file
+ cp ${LibEnv} "${D}/${SPECSDIR}/${PN}/${compilers[${i}]}"
+ sed -i -e "s:%DL%:${DLlocation}/${PN}:g" "${D}/${SPECSDIR}/${PN}/${compilers[${i}]}"
+ sed -i -e "s:%DLbin%:${DLlocation}/bin:g" "${D}/${SPECSDIR}/${PN}/${compilers[${i}]}"
+ sed -i -e "s:%DLgpr%:${DLlocation}/gpr:g" "${D}/${SPECSDIR}/${PN}/${compilers[${i}]}"
+ else
+ einfo "skipping gnat profile ${compilers[${i}]}"
+ fi
+ done
+ else
+ die "please make sure you have at least one gnat compiler installed!"
+ fi
+}