# Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/eclass/gnat.eclass,v 1.11 2005/12/15 12:06:30 george Exp $ # # 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 cop of source is held) and $DL instead of $D as # its installation point. inherit flag-o-matic EXPORT_FUNCTIONS pkg_setup src_unpack src_compile DESCRIPTION="Common procedures for building Ada libs using split gnat compilers" # ---------------------------------- # Globals # Locations # Gnat profile dependent files go under under ${LibTop}/${Gnat_Profile}/${PN} # and common files go unde SpecsDir, DataDir PREFIX=/usr AdalibSpecsDir=${PREFIX}/include/ada AdalibDataDir=${PREFIX}/share/ada AdalibLibTop=${PREFIX}/lib/ada # build-time locations # SL is a "localized" S, - location where sources are copied for # profile-specific build SL=${WORKDIR}/LocalSource # DL is a "localized destination", where ARCH/SLOT dependent binaries should be # installed in lib_install DL=${WORKDIR}/LocalDest # location of cleaned-up eselect script, for sourcing EselectScript=${WORKDIR}/gnat.eselect # 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 listsnew 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) echo "export ${line}:\${${EnvVar}}" >> $1.tmp done mv $1.tmp $1 } # ------------------------------------ # Functions # Checks the gnat backend SLOT and filters flags correspondingly # To be called from scr_compile for each profile, before actual compilation # takes one optional parameter, which defaults to SLOT if omitted gnat_filter_flags() { # We should probably check which GNAT is installed and # filter flags accordingly. This version is overly protective. 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//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} #the following two break the oncoming amd64 support #will completely remove when gnat-3.44 is unmasked # export ADACFLAGS=${ADACFLAGS//athlon64/i686} # export ADACFLAGS=${ADACFLAGS//athlon/i686} export ADACFLAGS=${ADACFLAGS//-Os/-O2} export ADAMAKEFLAGS=${ADAMAKEFLAGS:-"-cargs ${ADACFLAGS} -margs"} export ADABINDFLAGS=${ADABINDFLAGS:-""} } gnat_pkg_setup() { export ADAC=${ADAC:-gnatgcc} export ADAMAKE=${ADAMAKE:-gnatmake} export ADABIND=${ADABIND:-gnatbind} } gnat_src_unpack() { unpack ${A} cat /usr/share/eselect/modules/gnat.eselect | \ grep -v svn_date_to_version | \ grep -v DESCRIPTION > ${EselectScript} } # 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.. gnat_src_compile() { # We source the eselect-gnat module and use its functions directly, instead of # duplicating code or trying to violate sandbox in some way.. . ${EselectScript} || die "cannot source eselect-gnat module" compilers=( $(find_compilers ) ) if [[ -n ${compilers[@]} ]] ; then local i for (( i = 0 ; i < ${#compilers[@]} ; i = i + 1 )) ; do # copy sources mkdir ${DL} 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) do_set ${compilers[${i}]} ${BuildEnv} expand_BuildEnv ${BuildEnv} . ${BuildEnv} # call compilation callback cd ${SL} lib_compile # call install callback lib_install # move installed and cleanup mv ${DL} ${DL}-${compilers[${i}]} rm -rf ${SL} done else die "please make sure you have at least one gnat compiler installed!" 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() { # prep lib specs directory . ${EselectScript} || die "cannot source eselect-gnat module" dodir ${SPECSDIR}/${PN} compilers=( $(find_compilers ) ) if [[ -n ${compilers[@]} ]] ; then local i for (( i = 0 ; i < ${#compilers[@]} ; i = i + 1 )) ; do local DLlocation=${AdalibLibTop}/${compilers[${i}]} dodir ${DLlocation} cp -dpR "${DL}-${compilers[${i}]}" "${D}/${DLlocation}/${PN}" # 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}]} done else die || "please make sure you have at least one gnat compiler installed!" fi }