====== Usare Cmake ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//07/11/2008//** \\ \\ Il nome CMake è un'abbreviazione di cross platform make. Questo software rimpiazza il vecchio e non facilissimo da usare Automake nella generazione dei Makefile. Infatti, nella maggior parte dei progetti, non esiste un Makefile incluso nei sorgenti, dato che questo non è portabile. Per la compilazione del programma è necessario verificare che siano incluse tutte le librerie e scovare i loro percorsi all'interno del file system. Proprio per questo motivo, è impossibile avere un Makefile già scritto.[[http://it.wikipedia.org/wiki/CMake|Da Wikipedia, l'enciclopedia libera.]] ===== Un esempio pratico con le librerie Gtk ===== Innanzitutto ecco l'alberatura delle directory del nostro progetto +\Progetto | +------src | |_____main.c | ---CmakeLists.txt Prendiamo ad esempio il seguente codice che non fa altro ache creare una semplice finestra con una tabella in Gtk+2. ==== Sorgente generico GTK ==== **main.c ** //(Un sorgente GTK+-2.x qualunque)// #include void hello(GtkWidget* widget, gpointer data) { g_print("Hello, World!\n"); } int main(int argc, char** argv) { GtkWidget* window; GtkWidget* button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(window), 10); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); button = gtk_button_new_with_label("Hello, World!"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(hello), NULL); gtk_container_add(GTK_CONTAINER(window), button); gtk_widget_show(window); gtk_widget_show(button); gtk_main(); return 0; } ==== Listato CMake ==== **CMakeLists.txt ** cmake_minimum_required(VERSION 2.6) PROJECT(ProvaGTK) SET (AUTHOR "Fabio Di Matteo" INTERNAL "Author") SET (VERSION "0.1.0") INCLUDE (FindPkgConfig) #Controlla se c'e' il programma pkg-config IF (NOT PKG_CONFIG_FOUND) MESSAGE (FATAL_ERROR "pkg-config not found...") ENDIF (NOT PKG_CONFIG_FOUND) pkg_check_modules (GTK REQUIRED gtk+-2.0>=2.6) #Controlla se ci sono le Gtk+-2.0 IF (NOT GTK_FOUND) MESSAGE(FATAL_ERROR "You don't seem to have gtk >= 2.6 development libraries installed...") ENDIF (NOT GTK_FOUND) ADD_DEFINITIONS() #Include INCLUDE_DIRECTORIES (. ${GTK_INCLUDE_DIRS}) #Lincaggio alle librerie LINK_DIRECTORIES (${GTK_LIBRARY_DIRS} ) LINK_LIBRARIES (${GTK_LIBRARIES} ) #Indichiamo dove sara' messo l'eseguibile ADD_EXECUTABLE(prova-bin src/main.c) #Se se si ha bisogno di eventuali dipendenze fornite da noi stessi #ADD_DEPENDENCIES (prova-bin src/main.c) #Variabili per le directory di installazione #ADD_DEFINITIONS (-DVERSION=\\\"${VERSION}\\\") #ADD_DEFINITIONS (-DDATADIR=\\\"${CMAKE_INSTALL_PREFIX}/share\\\") #Copia file per l'installazione #ADD_SUBDIRECTORY (src) INSTALL (TARGETS prova-bin DESTINATION bin) #INSTALL (FILES src/prova-bin DESTINATION bin) ===== Come CMake interagisce con pkg-config ===== Ormai quasi tutte le librerie vengono distribuite con il proprio file **.pc** che indica a **pkg-config** dove sono gli include e i file delle librerie. Per fornire questi importanti parametri in fase di compilazione e lincaggio basta compilare con l'output del comando ''pkg-config --cflags --clibs '' dove nome libreria si puo' ricavare dall'elenco delle librerie installate tramite il comando . ==== Esempio pratico ==== Immaginiamo di dovere creare un nostro progetto che usi le librerie ''gio-unix-2.0'' , istruire cmake del suo utilizzo e' semplice: ... # Controlla che sia presente GIO-UNIX, specificando che e' richiesto pkg_check_modules (GIO REQUIRED gio-unix-2.0>=2.0) #Se non viene trovata la nostra libreria allora stampa un messaggio d'errore IF (NOT GIO_FOUND) MESSAGE(FATAL_ERROR "You don't seem to have gio-unix >= 2.0 development libraries installed...") ENDIF (NOT GIO_FOUND) #Infine prende i flag per il lincaggio alle librerie LINK_DIRECTORIES (${GIO_LIBRARY_DIRS} ) LINK_LIBRARIES (${GIO_LIBRARIES} ) ... ===== Assegnare valori ad una variabile ===== SET (NOME_VARIABILE "valore") esempio: SET (CMAKE_INSTALL_PREFIX "/opt") CMAKE_INSTALL_PREFIX e' la variabile del percorso di installazione. ===== Creare pacchetti deb con cmake ===== Sono richiesti alcuni pacchetti //cmake build-essential devscripts // . Installabili con il solito ''apt-get install cmake build-essential devscripts'' . Per creare pacchetti a partire dai file di configurazione di cmake basta eseguire i seguenti semplici comandi.Visto e considerato che i percorsi di installazione sono specificati nel ''CMakeList.txt'' con le direttive ''INSTALL'' . \\ \\ Prima di tutto assicurarsi che la directory del progetto segua la sintassi dei debuild ovvero ****-//// . - Dare il comando ''ccmake '' ****-//// per configurare il progetto ; - tramite un menu' testuale da dove sara' possibile configurare i vari aspetti del pacchetto, premendo la lettera c (2 volte) e per confermare la lettera(g); - Tramite il comando ''dh_make -s -e nostra@email.it -n'' si creera'la sottodirectory //debian// con diversi file contenenti informazioni sul pacchetto come //copyright// e altri. Questi file possono essere modificati secondo le proprie esigenze; - A questo punto e' possibile usare il comando ''debuild binary'' per compilare i sorgenti e creare il pacchetto. Il pacchetto verra' generato nella directory al primo livello superiore. \\ \\ E' possibile inseguito ispezionare le proprieta' del pacchetto con il comando ''dpkg -I nomepacchetto.deb'', per installarlo invece ''dpkg -i nomepacchetto.deb '' ===== Conoscere le direttive di cmake ===== Per una lista delle direttive: cmake --help-command-list Per avere documentazione su una direttiva: cmake --help-command Per altra documetazione e' utile consultare il sito web ufficiale ela man page