Dans ma distribution, lorsqu'on installe un package (via emerge), les sources sont téléchargées puis compilées. Elles se trouvent généralement dans le répertoire /usr/include/, et plus précisément dans le répertoire /usr/include/geany/.

La documentation de geany pour créer un plugin est plutôt light... Elle donne la base, mais ne permet pas de résoudre certains problèmes basiques comme la création d'une librairie en utilisant une librairie externe.

Donc mon but était de faire un bout de code C qui permette de faire du "XML Pretty Printing" (formatter un XML proprement en un click). Celui-ci n'étant pas terminé, je mets juste la partie du code qui permet de vérifier que le document est bien un XML :

//fichier Plugin.c
#define MALLOC_ERROR -1
 
#include <stdlib.h>
#include <stdio.h>
#include <geany.h>
#include <ui_utils.h>
#include <plugindata.h>
#include <editor.h>
#include <document.h>
#include <geanyfunctions.h>
#include <Scintilla.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
 
static void item_activate_cb(GtkMenuItem *menuitem, gpointer gdata)
{
	//retrieves the current document
	GeanyDocument* doc = document_get_current();
	GeanyEditor* editor = doc->editor;
	ScintillaObject* sco = editor->sci;
 
	//allocate a new pointer
	int length = sci_get_length(sco)+1;
	char* buffer = (char*)malloc(length*sizeof(char));
	if (buffer == NULL) { exit(MALLOC_ERROR); } //malloc error
 
	//retrieves the text
	sci_get_text(sco, length, buffer);
 
	//checks if the data is an XML format
	xmlDoc* xmlDoc = xmlParseDoc((unsigned char*)buffer);
 
	if(xmlDoc == NULL)
	{
		dialogs_show_msgbox(GTK_MESSAGE_ERROR, "Unable to parse the content as XML.");
		return;
	}
 
	xmlFreeDoc(xmlDoc);
 
	//process Pretty Printing
}

Le premier problème à régler est celui de la compilation. Le fait de connaître le dossier contenant les librairies ne suffit pas pour compiler :

gcc -std=c99 -o "Plugin.o" -Wall -c "Plugin.c" -I/usr/include/geany

L'exécution de la commande ci-dessus donne droit à un beau pavé d'erreurs, pour la plupart indiquant que des objets sont inexistants. C'est simplement qu'il faut indiquer toutes les librairies utilisées par geany (et aussi par libxml2). Et pour cela, il y a la commande salvatrice pkg-config :

gcc -std=c99 -o "Plugin.o" -Wall -c "Plugin.c" `pkg-config --cflags geany libxml-2.0`

Et tout compile proprement !

Vient ensuite le problème de l'intégration du plugin. Geany a besoin d'un fichier so (dynamic shared library) pour pouvoir l'utiliser (plus d'infos). Pour compiler le plugin et créer la librairie, les deux lignes de commandes suivantes mènent à bon port :

gcc -std=c99 -o "Plugin.o" -Wall -c -fpic "Plugin.c" `pkg-config --cflags geany libxml-2.0`
gcc -shared  -o "Plugin.so" "Plugin.o" `pkg-config --libs geany libxml-2.0`

Pour terminer l'installation, il suffit de copier le fichier Plugin.so dans le répertoire ~/.config/geany/plugins puis de relancer geany. Le plugin devrait ensuite apparaître dans le menu Tools (cela dépend du code) !

J'ai mis en pièce jointe tout le code ainsi que le script de compilation et d'exécution pour ceux qui aimeraient tester :)