====== Creazione automatica dello scheletro per applicazioni libglade ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//24/12/2009//** \\ \\
Sviluppare con le libglade puo' risultare tedioso nel caso in cui ogni volta ci si deve creare a mano il sorgente base, i vari script per la generazione del makefile e la struttura delle directory del progetto. Vedremo in questo articolo di creare uno script che possa automatizzare il tutto. \\
Utilizzeremo il tool CMake per generare il makefile multipiattaforma.\\
===== Utilizzo dello script =====
L'utilizzo dello script e' immediato basta infatti impartire da console i seguenti comandi:
./auto-libglade
per creare la directory del progetto con dentro tutte le sottodirectory e il file CMakeLists.txt .
drwxr-xr-x 2 fabio fabio 4096 2009-12-22 15:32 bin
-rw-r--r-- 1 fabio fabio 1050 2009-12-22 15:32 CMakeLists.txt
-rwxr-xr-x 1 fabio fabio 18 2009-12-22 15:32 configure
drwxr-xr-x 3 fabio fabio 4096 2009-12-22 15:32 share
drwxr-xr-x 2 fabio fabio 4096 2009-12-22 15:32 src
dentro **bin** verra posizionato l'eseguibile ; \\
in **src** sta il sorgente; \\
mentre in **share** c'e' una directory con lo stesso nome del progetto che verra copiata in fase di installazione in ''$PREFIX/share/'' . In **share** risiedera' il nostro file xml da modificare con glade ;
===== Compilazione e installazione del progetto =====
Quando vorremo compilare e installare il progetto basteranno i seguenti comandi:
cmake .
make
sudo make install
oppure
./configure
make
sudo make install
Qualora si vogliano cambiare le opzioni di configurazione e' sufficente lanciare il comando
ccmake .
se il comando ccmake non e' installato lo si puo' installare in ubuntu con ''sudo apt-get install cmake-curses-gui''
===== Lo script =====
**auto-glade**
#!/bin/sh
AUTHOR="Fabio Di Matteo"
VERSION="0.1.0"
#Controllo se e' stato fornito il nome del progetto
if [ "$1" = "" ];then
echo "E' necessario fornire il nome del progetto come parametro."
exit 1 ;
fi
#Se la directory del progetto esiste gia' esco.
mkdir $1 2>/dev/null
if [ "$?" != 0 ];then
echo "Il progetto esiste."
exit 1 ;
fi
cd $1
mkdir bin
mkdir share && mkdir share/$1
echo "Genero il CMakeLists.txt ...\n"
echo "cmake_minimum_required(VERSION 2.6)" > CMakeLists.txt
echo "PROJECT($1)" >> CMakeLists.txt
echo "SET (AUTHOR \"$AUTHOR\" INTERNAL \"Author\")" >> CMakeLists.txt
echo "SET (VERSION \"$VERSION\")" >> CMakeLists.txt
echo "INCLUDE (FindPkgConfig)" >> CMakeLists.txt
echo "IF (NOT PKG_CONFIG_FOUND)" >> CMakeLists.txt
echo " MESSAGE (FATAL_ERROR \"pkg-config not found...\") " >> CMakeLists.txt
echo "ENDIF (NOT PKG_CONFIG_FOUND)" >> CMakeLists.txt
echo "pkg_check_modules (GTK REQUIRED gtk+-2.0>=2.6)" >> CMakeLists.txt
echo "pkg_check_modules (GLADE REQUIRED libglade-2.0>=2.0)" >> CMakeLists.txt
echo "IF (NOT GTK_FOUND)" >> CMakeLists.txt
echo " MESSAGE(FATAL_ERROR \"You don't seem to have gtk >= 2.6 development libraries installed...\")" >> CMakeLists.txt
echo "ENDIF (NOT GTK_FOUND)" >> CMakeLists.txt
echo "FIND_PACKAGE(GTK2 COMPONENTS gtk glade)" >> CMakeList.txt
echo "ADD_DEFINITIONS()" >> CMakeLists.txt
echo "INCLUDE_DIRECTORIES (. \${GTK_INCLUDE_DIRS})" >> CMakeLists.txt
echo "INCLUDE_DIRECTORIES (. \${GLADE_INCLUDE_DIRS})" >> CMakeLists.txt
echo "LINK_DIRECTORIES (\${GTK_LIBRARY_DIRS} )" >> CMakeLists.txt
echo "LINK_LIBRARIES (\${GTK_LIBRARIES} )" >> CMakeLists.txt
echo "LINK_LIBRARIES (\${GLADE_LIBRARIES} )" >> CMakeLists.txt
echo "#Indichiamo dove sara' messo l'eseguibile" >>CMakeLists.txt
echo "ADD_EXECUTABLE( bin/$1 src/main.c)" >> CMakeLists.txt
echo "#Se se si ha bisogno di eventuali dipendenze fornite da noi stessi" >> CMakeLists.txt
echo "#ADD_DEPENDENCIES ($1 src/main.c)" >> CMakeLists.txt
echo "#Variabili per le directory di installazione" >> CMakeLists.txt
echo "#ADD_DEFINITIONS (-DVERSION=\\\"\${VERSION}\\\")" >> CMakeLists.txt
echo "#ADD_DEFINITIONS (-DDATADIR=\\\"\${CMAKE_INSTALL_PREFIX}/share\\\")" >> CMakeLists.txt
echo "#Copia file per l'installazione" >> CMakeLists.txt
echo "#ADD_SUBDIRECTORY (src)" >> CMakeLists.txt
echo "INSTALL (TARGETS bin/$1 DESTINATION bin)" >> CMakeLists.txt
echo "INSTALL (DIRECTORY share/$1 DESTINATION share)" >> CMakeLists.txt
echo "#!/bin/sh" > configure
echo "cmake ." >> configure
chmod 755 configure
echo "Genero il main.c"
mkdir src && cd src
echo "
#include //includo le librerie gtk e glade.
#include
GladeXML *xml; //questo รจ il puntatore al file xml che contiene l'interfaccia
GtkWidget *widget; //questa variabile serve per recuperare di volta in volta il
// widget (ovvero l'oggetto ) che vogliamo usare
void on_MainWindow_delete_event(GtkWidget *widget, gpointer user_data) //altra callback associata alla chiusura della
{ // finestra
gtk_main_quit();
}
int
main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
gchar* base;
gchar* glade_file;
if (g_find_program_in_path (\"$1\")==NULL){
/*Ricava il percorso dell'eseguibile, senza il nome del file*/
base = g_path_get_dirname(argv[0]);
/*Concatena il percorso base al nome file gui.glade */
glade_file = g_build_filename (base,\"../share/$1\", \"gui.glade\", NULL);
}else{
base = g_path_get_dirname(g_find_program_in_path (\"$1\"));
glade_file = g_build_filename (base,\"../share/$1\", \"gui.glade\", NULL);
}
/*Infine carica come disolito il file dell'interfaccia */
xml = glade_xml_new(glade_file, NULL, NULL);
/* connette tutti gli eventi dei widget alle rispettive funzioni */
glade_xml_signal_autoconnect(xml);
/* Avvia il ciclo principale delle gtAvvia il ciclo principale delle gtk*/
gtk_main ();
return 0;
}
" > main.c
#scrivo il file della GUI
cd ../share/$1
echo "
True
" > gui.glade