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.
L'utilizzo dello script e' immediato basta infatti impartire da console i seguenti comandi:
./auto-gtk <nome-progetto>
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/<nome 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
#!/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 <gtk/gtk.h>" > 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