Blog

[CMake] Lire un fichier de configuration.

L’idée est de générer des variables pointant sur des valeurs à partir d’un fichier texte au format .cfg/.ini.

Voici un exemple de fichier de configuration:

[python]
ma_python_path = /home/toto/dependencies/venv/bin/python3.9
ma_python_dll_path = /home/toto/dependencies/venv/lib
ma_python_dll_name = libpython3.9.so

[wx]
ma_wxpython_path = /home/toto/dependencies/wxPython
ma_wx_minor_version = 1
ma_wx_so_suffix = .so.5

Voici le script CMake qui permet de parser et de générer les variables contenu dans le fichier de configuration.

set (MA_DEPENDENCIES_DIR "${PROJECT_SOURCE_DIR}/../dependencies/")
set (MA_DEPENDENCIES_CFG_PATH "${MA_DEPENDENCIES_DIR}/dependencies.cfg")

file(STRINGS ${MA_DEPENDENCIES_CFG_PATH} MA_DEPENDENCIES_CFG_LINES)

macro(set_var _NAME _VALUE)
  set(${_NAME} "${_VALUE}")
endmacro()

foreach (_variableName ${MA_DEPENDENCIES_CFG_LINES})
    string(FIND "${_variableName}" "[" _FIND_GROUP)
    if(${_FIND_GROUP} EQUAL -1)
        string(FIND "${_variableName}" "=" _FIND_EQUAL)
        if(NOT ${_FIND_EQUAL} EQUAL -1)
            string(LENGTH "${_variableName}" _LENGTH)

            # La clef
            string(SUBSTRING "${_variableName}" 0 ${_FIND_EQUAL} _KEY)
            string(STRIP "${_KEY}" _KEY)
            string(TOUPPER "${_KEY}" _KEY)

            # La valeur
            math(EXPR _LENGTH "${_LENGTH} + 1" OUTPUT_FORMAT DECIMAL)            
            string(SUBSTRING "${_variableName}" ${_FIND_EQUAL} ${_LENGTH} _VALUE)
            string(REPLACE "=" "" _VALUE "${_VALUE}")
            string(STRIP "${_VALUE}" _VALUE)

            set_var(${_KEY} ${_VALUE})
            #message("${_KEY}:${_VALUE}")
        endif()        
    endif()
endforeach()

# on vérifie que l'une des variables du fichier de configurtion est accecible
message("${MA_PYTHON_PATH}")

GCC Référence indéfinie vers vtable

Lors de l’édition de liens d’une application utilisant une de mes librairies, j’ai eu les erreus suivantes.

libAPI.so : référence indéfinie vers « vtable for API::wxParameterManager
libAPI.so : référence indéfinie vers « typeinfo for API::wxParameterManager

vtable indique la fonction membre manquante est virtuelle.

Il vous suffit donc de regarder votre en-tête et de comparer avec le corps les fonctions qui n’ont pas été implémentées.

Dans mon cas il s’agissait du destructeur.

Je vous conseigne le lien suivant pour allé plus loin sur les possibles erreurs liées à ce message d’erreur.
it.swarw-eu.dev

Compiler Code::Blocks sur Mageia7

Compiler Code::Blocks sur Mageia7

Récupérer les sources:

Pour ce petit tutoriel, je propose de créer un dossier Codeblocks et d’ouvrir une console à partir de ce répertoire.

La hiérarchie des dossiers et des fichiers ressemblera à ça.

/Codeblocks*
           |
           *-/bin                         # binaires générés par la  
           |                              # commande «make install»
           |
           *-/codeblocks-code*            # sources
           |                 |
           |                 *-configure  # généré par «bootstrap»
           |
           *-build.sh                     # script qui permet de générer 
                                          # le fichier «configure», de 
                                          # compiler et d'installer les
                                          # binaires dans le dossier
                                          # «bin»
svn checkout https://svn.code.sf.net/p/codeblocks/code/trunk codeblocks-code

Le dossier ressemblera donc à ça :
…\Codeblocks\codeblocks-code

Il est très probable que le transfert échoue et qu’il se fera en plusieurs fois. Pour ce faire il vous faudra faire les commandes suivantes autant de fois qu’il sera nécessaire.

cd codeblocks-code
svn cleanup
cd ..
svn checkout https://svn.code.sf.net/p/codeblocks/code/trunk codeblocks-code

Installer les dépendances:

su
urpmi autoconf libtool automake lib64squirrel-devel hunspell hunspell-fr hunspell-en lib64hunspell-devel lib64wxgtku3.0-devel lib64tinyxml-devel lib64gamin-devel
exit

Lire la suite

Tester si une chaîne de caractère est un réel à l’aide de regex.

Tester si une chaîne de caractère est un réel à l’aide de regex.

L’objectif est de tester si une chaîne de caractère représente un nombre réel (float, double, long double). Pour ce faire j’ai décidé d’utiliser une expression régulière.

Voici l’expression régulière:

(^[\s]*[-+]?[0-9]*?\.?[0-9]+([eE][-+]?[0-9]+)?[\s]*|^[\s]*[-+]?[0-9]+\.?[\s]*)

Le lien de l’expression avec les tests est disponible sur regex101.com
L’expression est divisée en deux groupes (groupe1|groupe2). Le groupe 1 ne peut détecter de réel dans la chaîne de caractère qui suit «1.», c’est au groupe 2 qu’il incombe de le détecter.

Le problème de regex101 c’est qu’il ne génère pas l’implémentation pour c++.

Lire la suite

C++/Python wxWidgets3/wxPython4 avec CodeBlocks et pybind11

Au travers de l’application wxCppPy je vais vous apprendre à créer une application wxWidgets qui charge des scripts python et qui se laisse modifier et manipuler par wxPython. A savoir que wxPython4, qui porte le nom de version Phoenix, ne possède plus d’exemple pour interfacer wxPython avec wxWidgets. Je vais donc vous expliquer comment y parvenir.

Lire la suite

[Mageia 6]Compiler et installer GCC 6, 7, 8 ou 9

Introduction :

Je suis sur Mageia 6 et suite à une question que j’avais posée sur le forum de Mageia. J’ai décidé de me lancer et de compiler les versions que je souhaite de gcc.
Sur Ubuntu le problème se pose beaucoup moins car les paquets pour installer gcc6, 7 et 8 sont fournis.

Attention si vous êtes sur Mageia 7, qui est encore en bêta au moment où j’écris cet article, gcc 8.2.1 est la nouvelle version par défaut de gcc.

Tout d’abord des liens utiles:

Résumé :

$ su
# urpmi lib64gmp-devel
# urpmi lib64mpfr-devel
# urpmi lib64mpc-devel
# urpmi lib64isl-devel
# exit # pour quitter le mode administrateur

Pour les exemples j’utilise la dernière release de gcc8 : gcc-8.3.0. A vous de remplacer les «8_3_0» et «8.3.0» par votre version de gcc.

$ mkdir gcc8
$ cd gcc8
$ svn checkout svn://gcc.gnu.org/svn/gcc/tags/gcc_8_3_0_release/ source
$ mkdir obj
$ cd obj
$ ../source/configure --with-isl-include=/usr/include/ --with-isl-lib=/usr/lib64/ --program-suffix=-8.3.0 --prefix=/usr --libdir=/usr/lib/gcc/8.3.0/lib --datarootdir=/usr/share/gcc/8.3.0 -bindir=/usr/bin --libexecdir=/usr/libexec --includedir=/usr/include
# 16 étant le nombre de cpu de ma machine à vous de mettre le nombre de thread que vous souhaité.
$ make -j 16

Pour l’installation deux solutions :
Installer gcc dans un répertoire à part.

$ make DESTDIR=/home/suryavarman/working/gcc8/dest install

Installer gcc dans l’arborescence de /usr/

$ su
# make install

Lire la suite

Godot 3.0.6 / 3.1 export HTML5 (GLES 3/GLES 2)

Godot 3.0.6 / 3.1 export HTML5 (GLES 3/GLES 2)

Sonic le saumon:

Lors de la Jam des Volcans notre équipe a décidée de découvrir Godot.

Le thème de la Global Game Jam fut la maison, le chez soit. C’est tout naturellement que nous avons décidé de créer un jeux sur Sonic le saumon.

Sonic le saumon remonte le courant du fleuve qui la vu naître pour frayer et mourir. Mais voilà pour son plus grand malheur nous n’avons eu le temps que de lui donner que deux options. Mourir de faim ou se faire manger par un Ours. Le tout sur une simple ligne droite avec quelques bas fonts et obstacles qui le ralentissent. Seul plaisir qu’il aura c’est de nager et manger quelques autres poissons avec une musique entrainante composée par l’un des membres de l’équipe.

Voici le lien vers l’application WebGL (attention c’est long à charger, la version GLES2 étant la plus rapide à s’initialiser):

[GLES3]Sonic le saumon

[GLES2]Sonic le saumon (réaliser avec Godot 3.1.beta 10)

Cliquer sur «Nager» puis déplacer Sonic le saumon en déplaçant la sourie de gauche à droite.

Attention:

Les prérequis sont d’avoir un navigateur compatible avec WebAssembly et WebGL 2.0.
cf : Godot documentation export html5

Lire la suite

Jam des Volcans 2019

Jam des Volcans 2019

Du vendredi 25 au dimanche 27 janvier il y aura la Jam des Volcans à Clermont-Ferrand. C’est une des antennes de l’évènement mondiale : Global Game Jam (GGJ).

Si vous ne serez pas sur Clermont-Ferrand lors de cet évènement vous trouverez ici la liste des autres lieux de par le monde.

Les participants, seul ou en équipe, auront 48h pour créer un jeu vidéo autour d’un thème. C’est un hackathon. Le thème 2019 restera secret jusqu’au vendredi 25.

Je vous propose de vous rendre sur le site pour vous pré-inscrire et souscrire aux informations.
http://jam-des-volcans.fr/

En 2018 le thème était la transmission.

Cette vidéo est insupportable mais bon c’est comme ça.

Vous trouverez ici la liste des jeux réalisés en 2018:
https://globalgamejam.org/2018/games

Tout le monde peut y participer, professionnel ou pas, seul ou en équipe.

.template

Voici un bout de code décrivant un cas concret où j’ai dû apprendre à utiliser l’instruction.

.template

Avant de lire ce bout de code, je vous conseil de lire la faq de developez qui explique très bien à quoi sert l’instruction .template.

L’objectif du bout de code suivant est de définir un traitement commun pour différent type de fichier 3D. C’est une version simplifier de ce que j’ai eu à faire. Ici il n’y a pas beaucoup de sens à utiliser un template T_Mesh mais le sujet est de montrer un cas d’utilisation de l’instruction .template. A la fin de l’article je vous ai ajouté la version original des classes Mesh et Vertex ceci pour donner un peu plus de sens à l’utilisation de ce bout de code.

Vous pouvez retrouver le code sur CppShell.

Lire la suite