# $Id$ # multilib abis # tell the buildsystem that we are doing a multilib build export MULTILIB_BUILD="true" # be verbose or nor (true|false} : ${MULTILIB_VERBOSE="true"} # multilib should call all dependant includes, which gets overridden sminclude mtools # do not define EMUL_LINUX_32 after inherit of multlib !! # it may break i*86 builds # default ABIs to be build case ${ARCH} in x86_64) : ${MULTILIB_ABIS="m32 m64"} # default false : ${EMUL_LINUX_32="false"} # add linux32 to the dependencies if [[ ${EMUL_LINUX_32} = true ]] then EMUL_LINUX_32_SDEPEND_x86_64=">= sys-apps/util-linux-2.19" SPECIAL_VARS="${SPECIAL_VARS} EMUL_LINUX_32_SDEPEND_x86_64" fi ;; i*86) : ${MULTILIB_ABIS="m32"} # always false EMUL_LINUX_32="false" ;; esac # add linux32 to the dependencies if [[ ${EMUL_LINUX_32} = true ]] then # very dirty trick to get the dependencies right # ; is the IFS, tr replaces ; with an crlfs # the var ist decided with our common eval+echo magic if [[ -z ${SDEPEND} ]] then SDEPEND="\$(eval echo \\\$EMUL_LINUX_32_SDEPEND_\${ARCH/i*86/x86} | tr ';' '\n')" else SDEPEND="${SDEPEND} \$(eval echo \\\$EMUL_LINUX_32_SDEPEND_\${ARCH/i*86/x86} | tr ';' '\n')" fi fi ## # overide some defaults to respect ABI_LIBDIR ## mlibdir() { local libdir=lib [[ ${ARCH} = x86_64 ]] && libdir=lib64 [[ -n ${ABI_LIBDIR} ]] && libdir="${ABI_LIBDIR}" echo "${libdir}" } ## # multilib abi changers ## abi-m32() { export ABI="m32" export CC="gcc -${ABI}" export CXX="g++ -${ABI}" export ABI_LIBDIR="lib" if [[ ${EXPORT_ABI_LDFLAGS} != false ]] then local saved_ldflags="${LDFLAGS}" export LDFLAGS="${LDFLAGS} -L/${ABI_LIBDIR} -L/usr/${ABI_LIBDIR}" fi # keep pkgconfig clean local orig_pkg_config_path="${PKG_CONFIG_PATH}" export PKG_CONFIG_PATH="/usr/${ABI_LIBDIR}/pkgconfig:${PKG_CONFIG_PATH}" if [[ ${MULTILIB_VERBOSE} = true ]] then echo -e "${COLBLUE}*** ${COLGREEN}running with -${ABI} ABI${COLDEFAULT}" echo -e "${COLBLUE}*** ${COLGREEN} ABI${COLDEFAULT}='${ABI}'" echo -e "${COLBLUE}*** ${COLGREEN} CC${COLDEFAULT}='${CC}'" echo -e "${COLBLUE}*** ${COLGREEN} CXX${COLDEFAULT}='${CXX}'" echo -e "${COLBLUE}*** ${COLGREEN} ABI_LIBDIR${COLDEFAULT}='${ABI_LIBDIR}'" if [[ ${EXPORT_ABI_LDFLAGS} != false ]] then echo -e "${COLBLUE}*** ${COLGREEN} LDFLAGS${COLDEFAULT}='${LDFLAGS}'" else echo -e "${COLBLUE}*** ${COLGREEN} LDFLAGS${COLDEFAULT}='${COLYELLOW}not exported${COLDEFAULT}'" fi echo -e "${COLBLUE}*** ${COLGREEN} CHOST${COLDEFAULT}='${CHOST}'" echo -e "${COLBLUE}*** ${COLGREEN} SRCDIR${COLDEFAULT}='${SRCDIR}/${SRCSUBDIR}'" echo -e "${COLBLUE}*** ${COLGREEN} PKG_CONFIG_PATH${COLDEFAULT}='${PKG_CONFIG_PATH}'" fi # configure a linux32 emulated build if [[ ${EMUL_LINUX_32} = true ]] then if [[ ${MULTILIB_VERBOSE} = true ]] then echo -e "${COLBLUE}*** ${COLGREEN} EMUL_LINUX_32${COLDEFAULT}='${EMUL_LINUX_32}'" fi uname(){ linux32 uname $@; } && export -f uname local orig_chost="${CHOST}" && export CHOST="i686-pc-linux-gnu" fi if [[ ${MULTILIB_VERBOSE} = true ]] then echo -e "${COLBLUE}*** ${COLGREEN} CHOST${COLDEFAULT}='${CHOST}'" fi # run any given command eval $@ || die unset ABI CC CXX ABI_LIBDIR # keep pkgconfig clean export PKG_CONFIG_PATH="${orig_pkg_config_path}" export LDFLAGS="${saved_ldflags}" # restore original settings if [[ ${EMUL_LINUX_32} = true ]] then unset uname export CHOST="${orig_chost}" && unset orig_chost fi } abi-m64() { export ABI="m64" export CC="gcc -${ABI}" export CXX="g++ -${ABI}" export ABI_LIBDIR="lib64" if [[ ${EXPORT_ABI_LDFLAGS} != false ]] then local saved_ldflags="${LDFLAGS}" export LDFLAGS="-L/${ABI_LIBDIR} -L/usr/${ABI_LIBDIR}" fi # keep pkgconfig clean local orig_pkg_config_path="${PKG_CONFIG_PATH}" export PKG_CONFIG_PATH="/usr/${ABI_LIBDIR}/pkgconfig:${PKG_CONFIG_PATH}" if [[ ${MULTILIB_VERBOSE} = true ]] then echo -e "${COLBLUE}*** ${COLGREEN}running with -${ABI} ABI${COLDEFAULT}" echo -e "${COLBLUE}*** ${COLGREEN} ABI${COLDEFAULT}='${ABI}'" echo -e "${COLBLUE}*** ${COLGREEN} CC${COLDEFAULT}='${CC}'" echo -e "${COLBLUE}*** ${COLGREEN} CXX${COLDEFAULT}='${CXX}'" echo -e "${COLBLUE}*** ${COLGREEN} ABI_LIBDIR${COLDEFAULT}='${ABI_LIBDIR}'" if [[ ${EXPORT_ABI_LDFLAGS} != false ]] then echo -e "${COLBLUE}*** ${COLGREEN} LDFLAGS${COLDEFAULT}='${LDFLAGS}'" else echo -e "${COLBLUE}*** ${COLGREEN} LDFLAGS${COLDEFAULT}='${COLYELLOW}not exported${COLDEFAULT}'" fi echo -e "${COLBLUE}*** ${COLGREEN} CHOST${COLDEFAULT}='${CHOST}'" echo -e "${COLBLUE}*** ${COLGREEN} SRCDIR${COLDEFAULT}='${SRCDIR}/${SRCSUBDIR}'" echo -e "${COLBLUE}*** ${COLGREEN} PKG_CONFIG_PATH${COLDEFAULT}='${PKG_CONFIG_PATH}'" fi # run any given command eval $@ || die unset ABI CC CXX ABI_LIBDIR # keep pkgconfig clean export PKG_CONFIG_PATH="${orig_pkg_config_path}" export LDFLAGS="${saved_ldflags}" } only-m32() { local abi=m32 local i for i in ${MULTILIB_ABIS} do if [[ ${i} = ${abi} ]] then # export this for mpatch etc (to repect only-${abi}) export MULTILIB_ONLY_ABI=${abi} cd ${SRCDIR}-${abi}/${SRCSUBDIR} abi-${abi} $@ || die # unset this is very important unset MULTILIB_ONLY_ABI fi done } only-m64() { local abi=m64 local i for i in ${MULTILIB_ABIS} do if [[ ${i} = ${abi} ]] then # export this for mpatch etc (to repect only-${abi}) export MULTILIB_ONLY_ABI=${abi} cd ${SRCDIR}-${abi}/${SRCSUBDIR} abi-${abi} $@ || die # unset this is very important unset MULTILIB_ONLY_ABI fi done } all-abis() { local abi for abi in ${MULTILIB_ABIS} do cd ${SRCDIR}-${abi}/${SRCSUBDIR} abi-${abi} $@ || die done } mabi() { echo \${ABI} } mabi-cc() { echo "gcc -\${ABI}" } mabi-cxx() { echo "g++ -\${ABI}" } mabi-cflags() { echo "\${CFLAGS}" } mabi-cxxflags() { echo "\${CXXFLAGS}" } mabi-ldflags() { echo "\${LDFLAGS}" } ## # multilib compile functions ## if [[ ! -z $(typeset -f mconfigure) ]] then # rename the old one old_mconfigure=old$(typeset -f mconfigure) eval "${old_mconfigure}" fi mconfigure() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do cd ${SRCDIR}-${abi}/${SRCSUBDIR} abi-${abi} oldmconfigure $@ || die done } if [[ ! -z $(typeset -f cmake_configure) ]] then # rename the old one old_cmake_configure=old$(typeset -f cmake_configure) eval "${old_cmake_configure}" fi cmake_configure() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" local saved_SRCDIR="${SRCDIR}" for abi in ${abis_to_run} do cd ${BUILDDIR}/build-${abi} SRCDIR="${saved_SRCDIR}-${abi}" abi-${abi} oldcmake_configure $@ || die done # restore SRCDIR SRCDIR="${saved_SRCDIR}" } if [[ ! -z $(typeset -f cmake_src_compile) ]] then # rename the old one old_cmake_src_compile=old$(typeset -f cmake_src_compile) eval "${old_cmake_src_compile}" fi cmake_src_compile() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do # remove build dir if exist [[ -d ${BUILDDIR}/build-${abi} ]] && rm -rf ${BUILDDIR}/build-${abi} # build outside of the source dir install -d ${BUILDDIR}/build-${abi} || die cd ${BUILDDIR}/build-${abi} done cmake_configure || die for abi in ${abis_to_run} do cd ${BUILDDIR}/build-${abi} abi-${abi} oldmmake $@ || die done } if [[ ! -z $(typeset -f cmake_src_install) ]] then # rename the old one old_cmake_src_install=old$(typeset -f cmake_src_install) eval "${old_cmake_install}" fi cmake_src_install() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do # install build outside of the source dir cd ${BUILDDIR}/build-${abi} abi-${abi} oldmmake DESTDIR=${BINDIR} $@ install || die done } if [[ ! -z $(typeset -f munpack) ]] then # rename the old one old_munpack=old$(typeset -f munpack) eval "${old_munpack}" fi munpack() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}unpacking for ABI -${abi}${COLDEFAULT}" oldmunpack $@ || die mv ${SRCDIR} ${SRCDIR}-${abi} || die done } if [[ ! -z $(typeset -f mmake) ]] then # rename the old one old_mmake=old$(typeset -f mmake) eval "${old_mmake}" fi mmake() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}compiling for ABI -${abi}${COLDEFAULT}" cd ${SRCDIR}-${abi}/${SRCSUBDIR} abi-${abi} oldmmake $@ || die done } if [[ ! -z $(typeset -f minstall) ]] then # rename the old one old_minstall=old$(typeset -f minstall) eval "${old_minstall}" fi minstall() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}installing for ABI -${abi}${COLDEFAULT}" cd ${SRCDIR}-${abi}/${SRCSUBDIR} abi-${abi} oldminstall $@ || die done } minstall_destdir() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}installing for ABI -${abi}${COLDEFAULT}" cd ${SRCDIR}-${abi}/${SRCSUBDIR} make DESTDIR=${BINDIR} $@ install || die done } if [[ ! -z $(typeset -f mpatch) ]] then # rename the old one old_mpatch=old$(typeset -f mpatch) eval "${old_mpatch}" fi mpatch() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}appling patch for ABI -${abi}${COLDEFAULT}" cd ${SRCDIR}-${abi}/${SRCSUBDIR} oldmpatch $@ || die done } if [[ ! -z $(typeset -f mlibtoolize) ]] then # rename the old one old_mlibtoolize=old$(typeset -f mlibtoolize) eval "${old_mlibtoolize}" fi mlibtoolize() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}running mlibtoolize for ABI -${abi}${COLDEFAULT}" cd ${SRCDIR}-${abi}/${SRCSUBDIR} oldmlibtoolize $@ || die done } if [[ ! -z $(typeset -f mautoreconf) ]] then # rename the old one old_mautoreconf=old$(typeset -f mautoreconf) eval "${old_mautoreconf}" fi mautoreconf() { local abi local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do echo -e "${COLBLUE}*** ${COLGREEN}running mautoreconf for ABI -${abi}${COLDEFAULT}" cd ${SRCDIR}-${abi}/${SRCSUBDIR} oldmautoreconf $@ || die done } if [[ ! -z $(typeset -f minstalldocs) ]] then # rename the old one old_minstalldocs=old$(typeset -f minstalldocs) eval "${old_minstalldocs}" fi minstalldocs() { local abi local docfiles local abis_to_run="${MULTILIB_ABIS}" # respect MULTILIB_ONLY_ABI variable [[ ! -z ${MULTILIB_ONLY_ABI} ]] && abis_to_run="${MULTILIB_ONLY_ABI}" for abi in ${abis_to_run} do cd ${SRCDIR}-${abi}/${SRCSUBDIR} oldminstalldocs $@ || die done } ## # multilib mbuild wrappers ## multilib_src_prepare() { munpack ${SRCFILE} || die } multilib_src_compile() { if [[ ! -z $(typeset -f cmake_src_compile) ]] then cmake_src_compile || die else mconfigure || die mmake || die fi } multilib_src_check() { if [[ ! -z $(typeset -f cmake_src_check) ]] then cmake_src_check || die else mmake -j1 -k check || die fi } multilib_src_install() { if [[ ! -z $(typeset -f cmake_src_install) ]] then cmake_src_compile || die else mmake DESTDIR=${BINDIR} install || die fi local i for abi in ${MULTILIB_ABIS} do cd ${SRCDIR}-${abi}/${SRCSUBDIR} for i in ABOUT-NLS AUTHORS BUGS CHANGES ChangeLog COPYING \ FAQ LICENSE NEWS README TODO do if [ -f ${SRCDIR}-${abi}/${i} ] then minstalldocs ${i} || die fi done done } export_inherits multilib src_prepare src_compile src_check src_install