02 mai 2021

Compiler la librairie ZgeBullet avec Free Pascal sur Linux


Je viens de passer trois semaines à ne travailler qu'au portage d'Omeganaut sur Linux. Et pour cela il a fallu améliorer et débugger certaines fonctions de ZGameEditor avec l'aide de son créateur, Ville Krumlinde.

Entre autres, le passage de 32 à 64bits a cassé pas mal de fonctions, comme le curseur de la souris qui ne s'affichait plus. La librairie Sunvox permettant de synthétiser la musique ne fonctionnait pas. Et le plus gros morceau : la librairie ZgeBullet permettant de gérer les collisions n'existait pas pour cet OS... Et c'est justement le sujet de cet article : la compilation de cette librairie sur Linux avec Free Pascal.

Ce n'est pas vraiment passionnant, mais si je n'avais pas fait la même chose précédemment pour compiler ZGameEditor sur Android et Linux, je n'aurais jamais réussi...

Mettre à jour les sources et installer les librairies nécessaires :

sudo apt-get update
sudo apt-get install cmake python3

Télécharger et dézipper

, ni plus ni moins.

cd ~/bullet3-2.85.1
sudo nano make.sh

Copier/coller le code suivant, sauver, quitter :

#!/bin/sh
rm CMakeCache.txt
mkdir build_cmake
cd build_cmake
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_PYBULLET=OFF -DCMAKE_BUILD_TYPE=Release ..
make -j12

Finalement, lancer la longue compilation :

chmod 755 make.sh
./make.sh

Une fois terminé, il est temps de passer à ZgeBullet, la librairie créée par Rado1, qui permet d'accéder aux florilèges de fonctions proposées par bullet3 depuis ZGameEditor.

svn checkout https://github.com/Rado-1/ZgeBullet/trunk ~/ZgeBullet
cd ~/ZgeBullet/src

La compilation d'une librairie partagée .so se fait en deux étapes :

  • Compiler ZgeBullet avec l'option -fPIC en indiquant où se trouvent les fichiers source de bullet3
  • Linker tous les fichiers nécessaires à la création de la librairie avec l'option -shared

Pour cela, créer le fichier :

nano make.sh

Copier/coller le code suivant, sauver, quitter : gcc -Wall -O2 -fPIC -I ~/bullet3-2.85.1/src -c ZgeBullet.cpp -o ZgeBullet.o
C="bullet3-2.85.1/build_cmake/src/BulletCollision/CMakeFiles/BulletCollision.dir"
D="bullet3-2.85.1/build_cmake/src/BulletDynamics/CMakeFiles/BulletDynamics.dir"
M="bullet3-2.85.1/build_cmake/src/LinearMath/CMakeFiles/LinearMath.dir"
gcc -shared -O2 -o ZgeBullet.so ZgeBullet.o ~/$C/BroadphaseCollision/btAxisSweep3.o ~/$C/BroadphaseCollision/btCollisionAlgorithm.o ~/$C/BroadphaseCollision/btDbvt.o ~/$C/BroadphaseCollision/btDbvtBroadphase.o ~/$C/BroadphaseCollision/btDispatcher.o ~/$C/BroadphaseCollision/btMultiSapBroadphase.o ~/$C/BroadphaseCollision/btOverlappingPairCache.o ~/$C/BroadphaseCollision/btQuantizedBvh.o ~/$C/BroadphaseCollision/btSimpleBroadphase.o ~/$C/CollisionDispatch/btActivatingCollisionAlgorithm.o ~/$C/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.o ~/$C/CollisionDispatch/btBoxBoxCollisionAlgorithm.o ~/$C/CollisionDispatch/btBoxBoxDetector.o ~/$C/CollisionDispatch/btCollisionDispatcher.o ~/$C/CollisionDispatch/btCollisionObject.o ~/$C/CollisionDispatch/btCollisionWorld.o ~/$C/CollisionDispatch/btCollisionWorldImporter.o ~/$C/CollisionDispatch/btCompoundCollisionAlgorithm.o ~/$C/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.o ~/$C/CollisionDispatch/btConvex2dConvex2dAlgorithm.o ~/$C/CollisionDispatch/btConvexConcaveCollisionAlgorithm.o ~/$C/CollisionDispatch/btConvexConvexAlgorithm.o ~/$C/CollisionDispatch/btConvexPlaneCollisionAlgorithm.o ~/$C/CollisionDispatch/btDefaultCollisionConfiguration.o ~/$C/CollisionDispatch/btEmptyCollisionAlgorithm.o ~/$C/CollisionDispatch/btGhostObject.o ~/$C/CollisionDispatch/btHashedSimplePairCache.o ~/$C/CollisionDispatch/btInternalEdgeUtility.o ~/$C/CollisionDispatch/btManifoldResult.o ~/$C/CollisionDispatch/btSimulationIslandManager.o ~/$C/CollisionDispatch/btSphereBoxCollisionAlgorithm.o ~/$C/CollisionDispatch/btSphereSphereCollisionAlgorithm.o ~/$C/CollisionDispatch/btSphereTriangleCollisionAlgorithm.o ~/$C/CollisionDispatch/btUnionFind.o ~/$C/CollisionDispatch/SphereTriangleDetector.o ~/$C/CollisionShapes/btBoxShape.o ~/$C/CollisionShapes/btBvhTriangleMeshShape.o ~/$C/CollisionShapes/btCapsuleShape.o ~/$C/CollisionShapes/btCollisionShape.o ~/$C/CollisionShapes/btCompoundShape.o ~/$C/CollisionShapes/btConcaveShape.o ~/$C/CollisionShapes/btConeShape.o ~/$C/CollisionShapes/btConvexHullShape.o ~/$C/CollisionShapes/btConvexInternalShape.o ~/$C/CollisionShapes/btConvexPolyhedron.o ~/$C/CollisionShapes/btConvexShape.o ~/$C/CollisionShapes/btConvexTriangleMeshShape.o ~/$C/CollisionShapes/btCylinderShape.o ~/$C/CollisionShapes/btHeightfieldTerrainShape.o ~/$C/CollisionShapes/btMultiSphereShape.o ~/$C/CollisionShapes/btOptimizedBvh.o ~/$C/CollisionShapes/btPolyhedralConvexShape.o ~/$C/CollisionShapes/btScaledBvhTriangleMeshShape.o ~/$C/CollisionShapes/btShapeHull.o ~/$C/CollisionShapes/btSphereShape.o ~/$C/CollisionShapes/btStaticPlaneShape.o ~/$C/CollisionShapes/btStridingMeshInterface.o ~/$C/CollisionShapes/btTetrahedronShape.o ~/$C/CollisionShapes/btTriangleBuffer.o ~/$C/CollisionShapes/btTriangleCallback.o ~/$C/CollisionShapes/btTriangleIndexVertexArray.o ~/$C/CollisionShapes/btTriangleIndexVertexMaterialArray.o ~/$C/CollisionShapes/btTriangleMesh.o ~/$C/CollisionShapes/btTriangleMeshShape.o ~/$C/CollisionShapes/btUniformScalingShape.o ~/$C/Gimpact/btContactProcessing.o ~/$C/Gimpact/btGenericPoolAllocator.o ~/$C/Gimpact/btGImpactBvh.o ~/$C/Gimpact/btGImpactCollisionAlgorithm.o ~/$C/Gimpact/btGImpactQuantizedBvh.o ~/$C/Gimpact/btGImpactShape.o ~/$C/Gimpact/btTriangleShapeEx.o ~/$C/Gimpact/gim_box_set.o ~/$C/Gimpact/gim_contact.o ~/$C/Gimpact/gim_memory.o ~/$C/Gimpact/gim_tri_collision.o ~/$C/NarrowPhaseCollision/btContinuousConvexCollision.o ~/$C/NarrowPhaseCollision/btConvexCast.o ~/$C/NarrowPhaseCollision/btGjkConvexCast.o ~/$C/NarrowPhaseCollision/btGjkEpa2.o ~/$C/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.o ~/$C/NarrowPhaseCollision/btGjkPairDetector.o ~/$C/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.o ~/$C/NarrowPhaseCollision/btPersistentManifold.o ~/$C/NarrowPhaseCollision/btPolyhedralContactClipping.o ~/$C/NarrowPhaseCollision/btRaycastCallback.o ~/$C/NarrowPhaseCollision/btSubSimplexConvexCast.o ~/$C/NarrowPhaseCollision/btVoronoiSimplexSolver.o ~/$D/Character/btKinematicCharacterController.o ~/$D/ConstraintSolver/btConeTwistConstraint.o ~/$D/ConstraintSolver/btContactConstraint.o ~/$D/ConstraintSolver/btFixedConstraint.o ~/$D/ConstraintSolver/btGearConstraint.o ~/$D/ConstraintSolver/btGeneric6DofConstraint.o ~/$D/ConstraintSolver/btGeneric6DofSpring2Constraint.o ~/$D/ConstraintSolver/btGeneric6DofSpringConstraint.o ~/$D/ConstraintSolver/btHinge2Constraint.o ~/$D/ConstraintSolver/btHingeConstraint.o ~/$D/ConstraintSolver/btNNCGConstraintSolver.o ~/$D/ConstraintSolver/btPoint2PointConstraint.o ~/$D/ConstraintSolver/btSequentialImpulseConstraintSolver.o ~/$D/ConstraintSolver/btSliderConstraint.o ~/$D/ConstraintSolver/btSolve2LinearConstraint.o ~/$D/ConstraintSolver/btTypedConstraint.o ~/$D/ConstraintSolver/btUniversalConstraint.o ~/$D/Dynamics/btDiscreteDynamicsWorld.o ~/$D/Dynamics/btRigidBody.o ~/$D/Dynamics/btSimpleDynamicsWorld.o ~/$D/MLCPSolvers/btDantzigLCP.o ~/$D/MLCPSolvers/btMLCPSolver.o ~/$D/Vehicle/btRaycastVehicle.o ~/$D/Vehicle/btWheelInfo.o ~/$M/btAlignedAllocator.o ~/$M/btConvexHull.o ~/$M/btConvexHullComputer.o ~/$M/btGeometryUtil.o ~/$M/btPolarDecomposition.o ~/$M/btQuickprof.o ~/$M/btSerializer.o ~/$M/btVector3.o

Rendre le script exécutable et le lancer :

chmod 755 make.sh
./make.sh

Et voilà ! Vous venez d'obtenir le fichier ZgeBullet.so

Après tout ça, Omeganaut fonctionne finalement sur Linux. Mais pourquoi Linux ? Car c'est la porte ouverte à tout un tas de machines rigolotes comme les petites consoles RG351, ou moins marantes, comme les MacBook.


Tags

Catégories

Archives