====== Creazione automatica dello scheletro per applicazioni gtk ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//22/12/2009//** \\ \\ Sviluppare con le librerie gtk 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-gtk 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/'' ; ===== 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 ===== #!/bin/sh #Modificare queste variabili a piacimento 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 "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 "ADD_DEFINITIONS()" >> CMakeLists.txt echo "INCLUDE_DIRECTORIES (. \${GTK_INCLUDE_DIRS})" >> CMakeLists.txt echo "LINK_DIRECTORIES (\${GTK_LIBRARY_DIRS} )" >> CMakeLists.txt echo "LINK_LIBRARIES (\${GTK_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 " > main.c echo "int main(int argc, char** argv) { GtkWidget* window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), \"destroy\", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show(window); gtk_main(); return 0; }" >> main.c