====== 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