Rendre à César...

  • Ce billet s'inspire fortement d'un post sur le forum Panda3D:


Panda3D et portage

  • Le problème est simple: Panda3D n'est disponible que dans une version très ancienne dans l'arbre portage.
  • Et oui, ça arrive. Bien que cela soit heureusement très rare, il manque parfois des choses dans portage.
  • Face à cela, deux possibilités:
    • la mauvaise: compiler vous même Panda3D et l'installer comme vous le pouvez.
    • la bonne: utiliser un overlay, ce qui vous permettra de suivre proprement les évolutions de version.


Petit rappel sur les overlays

  • Un overlay , c'est une série de ebuild additionnels non supportés dans l'arbre portage officiel.


Préparation de l'ebuild

  • Je pars du principe que votre overlay se situe ici:
    • /usr/local/portage
  • Vérifiez que votre make.conf contient la ligne suivante, sinon emerge ne trouvera pas votre overlay:
    • PORTDIR_OVERLAY="/usr/local/portage"
  • Créez le chemin de l'overlay de l'ebuild:
    • mkdir -p /usr/local/portage/media-libs/panda3d/
  • Voici l'ebuild à copier dans le répertoire précédemment créé
    • J'ai récupéré (et adapté légèrement) cet ebuild sur le forum de Panda3D
  • Fichier panda3d-1.5.2.ebuild à placer dans /usr/local/portage/media-libs/panda3d/
# Copyright 2000-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# 1.4.2 'stable' by joeldg - blog.peoplesdns.com
# 1.5.2 par jseb (article sur www.finiderire.com)
# $Header: $

inherit eutils python

DESCRIPTION="A 3D framework in C++ with python bindings"
HOMEPAGE="http://panda3d.org"
SRC_URI="http://panda3d.org/download/${P}/${P}.tar.gz"

LICENSE="Panda3D"
SLOT="0"
KEYWORDS="~x86"
IUSE="png jpeg tiff fmod openal nspr python ssl truetype doc zlib"

DEPEND="doc? ( dev-python/epydoc )
                png? ( media-libs/libpng )
                jpeg? ( media-libs/jpeg )
                tiff? ( media-libs/tiff )
                nspr? ( >=dev-libs/nspr-4.4.1-r2 )
                openal? ( media-libs/openal )
                fmod? ( =media-libs/fmod-3* )
                ssl? ( dev-libs/openssl )
                truetype? ( media-libs/freetype )
                zlib? ( sys-libs/zlib )
                python? ( dev-lang/python )"

pkg_setup() {
        ewarn "Please note that python bindings are now"
        ewarn "set by the python USE flag to coordinate"
        ewarn "with upstream."
}

src_unpack()
{
        unpack ${A}
}

src_compile()
{
        #
        # the everything keyword has checks for your current libs
        # and will skip them if not available..
        # this also adds support for maya and max models.
        #
        ./makepanda/makepanda.py --everything   || die "build failed"
}

src_install()
{
        dodir /opt/panda3d

        doenvd ${FILESDIR}/50panda3d
        sed -i -e "s:lib:$(get_libdir):g" \n        ${D}/etc/env.d/50panda3d \n        || die "libdir patching failed"

        #construire la doc, quoiqu'il arrive
        cp -R ${S}/samples ${S}/built
        cp -R ${S}/direct/src ${S}/built/direct/src
        cd ${S}/built

        if use python ; then
                # python installation
                python_version
                dodir /usr/$(get_libdir)/python${PYVER}/site-packages
                cat <<- EOF > ${D}/usr/$(get_libdir)/python${PYVER}/site-packages/panda3d.pth
                # This document sets up paths for python to access the
                # panda3d modules
            /opt/panda3d/lib
            /opt/panda3d/direct
        /opt/panda3d/pandac             
                /opt/panda3d/built
                /opt/panda3d/built/$(get_libdir)
                EOF
        fi

        cp -R ${S}/direct/src ${S}/built/direct/
        cp -R ${S}/built/* ${D}/opt/panda3d
        use python && touch ${D}/opt/panda3d/built/__init__.py
}

pkg_postinst()
{
        elog "Panda3d is installed in /opt/panda3d"
        elog
        if use doc ; then
                elog "Documentation is avaliable in /opt/panda3d/doc"
                elog "Samples are avalaible in /opt/panda3d/samples"
        fi
        elog "For C++ compiling, include directory must be set:"
        elog "g++ -I/opt/panda3d/include [other flags]"
        if use python ; then
                elog
                elog "ppython is depricated and panda3d modules are"
                elog "now installed as standard python modules."
        fi
        elog
        elog "Tutorials avaliable at http://panda3d.org"
}


  • note : si la commande ebuild refuse le script précédent, c'est probablement à cause d'un problème de tabulations transformées en espaces.
    • Pour résoudre ce problème, vous pouvez éditer le fichier et transformer les espaces de débuts de lignes en tabulations.
    • avec Vim : :%s/^\ \+/\t/g
  • Il faut créer le journal (qui consiste en une liste de checksum des fichiers impliqués) de l'ebuild
    • Cette opération est à refaire à chaque modification de l'ebuild.
    • La première fois est plus longue, car les sources sont chargées pour calculer leur checksum.
jseb panda3d # ebuild /usr/local/portage/media-libs/panda3d/panda3d-1.5.2.ebuild digest
>>> Creating Manifest for /usr/local/portage/media-libs/panda3d


  • Il faut également récupérer un fichier dans l'arbre portage officiel.
    • Il s'agit du fichier /usr/portage/media-libs/panda3d/files/50panda3d
    • Il faut donc créer un sous-répertoire files dans votre overlay panda3d, et le placer à l'intérieur.
    • Ce fichier contient des informations d'installation pour Panda3D et est utilisé par emerge.


emerge

  • emerge -va panda3d
  • Les slots des différents arbres portage (l'officiel et le votre) qui contiennent Panda3D doivent apparaitre (à la fin des messages de emerge)
 [0] /usr/portage
 [1] /usr/local/portage


  • Ne vous en faites pas pour les options, la compilation de Panda3D est lancée via un script Python.
  • Le lancement de la compilation dans l'ebuild se fait ainsi:
    • ./makepanda/makepanda.py --everything
    • Si un jour vous le construisez vous même, il est important de partir de la racine du répertoire de sources (ce que l'on fait ici).
    • L' option --everything construira Panda3D avec le maximum de packages disponibles sur votre système.
  • La compilation est assez longue, y compris sur une machine moderne bien dotée en ram.
    • ccache n'est pas utilisé pour les ebuild en dehors de l'arbre officiel portage.
    • quand j'aurai trouvé comment faire, je mettrai à jour ce billet. Si vous savez le faire, postez un commentaire, merci.
  • Panda3D sera installé à part dans son répertoire /opt/panda3d
    • Ceci est normal et souhaitable.


Vérification des fichiers après emerge

  • /etc/ld.so.conf : doit contenir /opt/panda3d/lib (le ldconfig est fait par emerge à la fin de la compilation)
    • sinon on peut éventuellement modifier à la main la variable LD_PATH_CONFIG pour faire un essai.
  • /usr/lib/python2.5/site-packages/ doit contenir un path Python (normalement: panda3d.pth )
jseb jseb # cat /usr/lib/python2.5/site-packages/panda3d.pth 
# This document sets up paths for python to access the
# panda3d modules
/opt/panda3d/lib
/opt/panda3d/direct
/opt/panda3d/pandac             
/opt/panda3d/built
/opt/panda3d/built/lib
  • Si, lorsque vous lancez un exemple (/opt/panda3d/samples/), Python ne trouve pas les import de Panda3D, vous aurez deux liens symboliques à créer vous même
    • ln -s /opt/panda3d/direct/ /usr/lib/python2.5/site-packages/
    • ln -s /opt/panda3d/pandac/ /usr/lib/python2.5/site-packages/

Attention à créer les liens dans la bonne version de Python (ici, 2.5) si celui-ci est slotté (cohabitation avec une autre version). Prendre la version utilisée par défaut lors du lancement de la commande Python.


Le nirvana est en vue

  • Si vous obtenez un segfault lors de l'exécution de l'exemple Asteroids , vous avez probablement un problème avec le son.
  • Par défaut, OpenAL est utilisé, et cela semble poser quelques problèmes pour l'instant.
  • Vous pouvez couper le son dans le fichier de config , pour vérifier qu'il s'agit bien de cela.
    • dans /opt/panda3d/etc/Config.prc , commentez cette entrée :
    • audio-library-name p3openal_audio
  • Sil il s'agit bien de cela, vous pouvez utiliser fmod (attention, bibliothèque non-libre) ou choisir de rétablir OpenAL.
    • J'ai écrit que vous pouviez rétablir OpenAL, car dans mon cas cela a suffit (après avoir lancé l'exemple asteroids en nosound, j'ai rétabli l'entrée dans le fichier de config Panda3D).
  • Pour remplacer OpenAL par Fmod
    • dans /opt/panda3d/etc/Config.prc :
    • audio-library-name fmod_audio


Pour les utilisateurs de MS-Windows

  • Vous êtes un utilisateur de MS-Windows et vous avez lu jusque là. C'est gentil.
  • Panda3D rame, c'est un fait. Il y a cependant moyen d'améliorer la situation.
    • Dans le fichier Config.prc , remplacez le rendering OpenGL par DirectX.
#load-display pandagl
load-display pandadx8


  • Pour éviter d'utiliser la version de Python fournie avec l'installeur des binaires de Panda3d, vous pouvez simplement utiliser les path déja évoqués ci-dessus
import sys
sys.path.append(repertoire_panda3d)


  • On peut aussi demander à Python d'ajouter un path au démarrage.
    • Il faut placer un fichier dans la racine du répertoire Python:
    • Contenu de panda3d.pth
panda152
panda152/bin


  • Ce fichier spécifie simplement les répertoires contenant les binaires (tools de Panda3D) et le répertoire racine de Panda3D, par rapport au répertoire racine de Python.
  • Ici, le répertoire de Panda3D se nomme donc panda152 et est placé dans le répertoire racine de Python.
  • Vous pouvez ensuite effacer le répertoire Python fourni avec l'installeur de Panda3D.