Authors Luca Ceresoli,
License CC-BY-SA-3.0
Build Automation: Introduzione a Make, Autotools e CMake Luca Ceresoli luca@lucaceresoli.net http://lucaceresoli.net Linux Day 2017 Agenda • Introduzione • Shell script • Make • Autotools • CMake • Conclusioni 1 Introduzione Processo di build hello.c utils.c utils.h ? hello 2 Processo di build hello.c utils.c utils.h ? hello gcc -o hello hello.c utils.c 2 Processo di build hello.c utils.c utils.h ? hello Processo di build: • Input: il lavoro di un umano • Output: un programma, una libreria, un documento, … Esempi: • Codice C / C++ → un eseguibile o una libreria • File di testo → Un documento PDF 3 Dove andrà il tuo software domani? • Continuous integration / continuous delivery • Jenkins, Travis CI... • Server locale o “cloud” 4 Dove andrà il tuo software domani? • Continuous integration / continuous delivery • Jenkins, Travis CI... • Server locale o “cloud” • Distribuzioni: dpkg, rpm... 4 Dove andrà il tuo software domani? • Continuous integration / continuous delivery • Jenkins, Travis CI... • Server locale o “cloud” • Distribuzioni: dpkg, rpm... • Sistemi embedded • Buildroot • Openembedded • OpenWRT 4 Dove andrà il tuo software domani? • Continuous integration / continuous delivery • Jenkins, Travis CI... • Server locale o “cloud” • Distribuzioni: dpkg, rpm... • Sistemi embedded • Buildroot • Openembedded • OpenWRT • Windows, MacOS, Android, iOS 4 Come vuoi compilare il tuo software? • Debug / Release • -Wall -Werror • Librerie: shared / static • … 5 Build automation: necessità • Da riga di comando • Deve funzionare in ambienti diversi • Non deve avere policy hard-coded 6 Shell script Shell script semplice hello.c utils.c utils.h ./build.sh hello build.sh: #!/bin/bash gcc -o hello hello.c utils.c 7 Shell script semplice ✓ Funziona per casi molto semplici × Ricompila tutto ogni volta (se ci sono 100 file sorgente?) 8 File oggetto intermedi hello.c utils.c hello.o utils.o hello 9 File oggetto intermedi #!/bin/bash if test hello.c -nt hello.o; then gcc -c hello.c fi if test utils.c -nt utils.o; then gcc -c utils.c fi if test hello.o -nt hello || test utils.o -nt hello; then gcc -o hello hello.c utils.c fi 10 File oggetto intermedi ✓ Più efficiente × Scomodo da scrivere e mantenere × Non sfrutta CPU multi core 11 Make Make hello.c utils.c Makefile make hello 12 Makefile Makefile contiene regole: hello: hello.o utils.o gcc -o hello hello.o utils.o hello.o: hello.c gcc -c hello.c utils.o: utils.c gcc -c utils.c 13 Regole hello: hello.o utils.o gcc -o hello hello.o utils.o • hello = target • hello.o utils.o = dipendenze • gcc … = comandi 14 Grafo delle dipendenze hello.c utils.c hello.o utils.o hello 15 Uso di Make $ ls -tr utils.h utils.c hello.c Makefile $ make gcc -c hello.c gcc -c utils.c gcc -o hello hello.o utils.o $ ls -tr utils.h utils.c hello.c Makefile utils.o hello.o hell $ touch utils.c $ make gcc -c utils.c gcc -o hello hello.o utils.o $ 16 Altre regole utili install: hello install -m 755 hello /usr/bin/ clean: rm -f hello hello.o utils.o dist: tar czf hello.tar.gz utils.h utils.c hello.c Makefile 17 Alcuni vantaggi di Make • Scrittura delle regole • Wildcard (%.o: %.c) • Implicit rules: varie regole predefinite (C, C++, …) • … • Utilizzo • Build in parallelo (make -j<N>) • Build di un target specifico (make utils.o) 18 Cosa manca a Make • Ricerca di librerie • Prefix (/usr, /usr/bin, …) • Diverted installation (DESTDIR) • Out of tree build • Cross-compilazione (possibile ma scomoda) 19 Autotools ./configure make sudo make install 20 Autotools: schema semplificato Scritti dal configure.ac Makefile.am programmatore GNU autoconf automake Autotools Makefile.in Generati dal programmatore, usati configure dall'utente Generati Makefile dall'utente 21 Autoconf configure.ac configure.ac Makefile.am AC_INIT([hello], [1.0]) autoconf automake AC_OUTPUT Makefile.in configure • È uno script di shell Makefile • Con l’aggiunta di macro m4 22 Autoconf configure.ac configure.ac Makefile.am AC_INIT([hello], [1.0]) autoconf automake AC_PREREQ([2.69]) Makefile.in AC_PROG_CC configure AC_CONFIG_FILES([Makefile]) AC_OUTPUT Makefile Makefile.in hello: hello.o utils.o @CC@ -o hello hello.o utils.o %.o: %.c @CC@ -c $< 23 Automake configure.ac Makefile.am autoconf automake Makefile.in configure Makefile Makefile.am bin_PROGRAMS = hello hello_SOURCES = hello.c utils.c utils.h • È un normale Makefile • Con l’aggiunta di costrutti di automake 24 Automake: PSV e PLV Makefile.am si compone di: • bin_PROGRAMS = hello • Product List Variable (PLV) • Elenca i prodotti da generare • hello_SOURCES = hello.c utils.c utils.h • Product Source Variable (PSV) • Elenca i sorgenti necessari per generare un prodotto 25 Autotools Scritti dal configure.ac Makefile.am programmatore GNU autoconf automake Autotools Makefile.in Generati dal programmatore, usati configure dall'utente Generati Makefile dall'utente 26 Autotools: vantaggi • Usato da moltissimi software • Compatibilità con ogni sistema UNIX-like • Moltissime macro già pronte • Usano shell e Make • Generano Makefile: • Conformi agli standard UNIX • Completi (make install, make clean, make dist, …) • Vedi slide “Cosa manca a Make”: • Ricerca di librerie • Prefix (--prefix=/usr) • Diverted installation (DESTDIR) • Out of tree build • Cross-compilazione con strumenti standard 27 Autotools: svantaggi • Praticamente inutilizzabili su sistemi non UNIX-like • Usano shell e Make • Complesso da imparare inizialmente • È facile scrivere codice “sbagliato” se non è chiaro il come funzionano • ./configure è lento (esecuzione sequenziale) 28 CMake ccmake . make sudo make install 29 CMake CMakeLists.txt cmake Makefile 30 CMakeLists.txt semplice CMakeLists.txt cmake_minimum_required(VERSION 2.6) project(hello) add_executable(hello hello.c utils.c) 31 ccmake 32 Installazione CMakeLists.txt cmake_minimum_required(VERSION 2.6) project(hello) add_executable(hello hello.c utils.c) install(TARGETS hello DESTINATION bin) 33 CMake: vantaggi • Funziona su Linux, Windows, MacOS… • Diffusione crescente • Apprendimento iniziale facile • ccmake e cmake-gui per configurazione interattiva • Genera Makefile, progetti Visual Studio, XCode… • Vedi slide “Cosa manca a Make”: • Ricerca di librerie • Prefix (CMAKE_INSTALL_PREFIX) • Diverted installation (DESTDIR) • Out of tree build • Cross-compilazione 34 CMake: svantaggi • Sintassi “non convenzionale” • Non è banale gestire software complessi in modo corretto • Minore diffusione 35 Conclusioni Conclusioni • Shell: non adatto • Make: ottimo strumento, ma scrivere un ottimo Makefile è un lavoro enorme • Autotools e CMake: strumenti completi e standard • Fanno molto più di quanto abbiamo visto • Esistono anche altri strumenti simili, meno diffusi 36 Quale strumento utilizzare? Priorità di scelta indicativa 1. Autotools o CMake: quello che si conosce già 2. CMake: se serve compilare su Windows, MacOS… 3. Autotools: librerie di basso livello (sistema, interazione con il kernel) 4. Make: se Autotools e CMake non sono adatti 5. Shell: se non basta neanche Make… 37 Bibliografia • GNU Make Manual (https://www.gnu.org/software/make/manual/) • “A Practitioner’s Guide to GNU Autoconf, Automake, and Libtool”, John Calcote (https://www.nostarch.com/autotools.htm) • “Autotools Mythbuster”, Diego Elio “Flameeyes” Pettenò (https://autotools.io/index.html) • “Autotools: A Demystification Tutorial”, Thomas Petazzoni (https://elinux.org/images/4/43/Petazzoni.pdf, https://www.youtube.com/watch?v=_zX8LJ9Xjyk) • CMake Tutorial: https://cmake.org/cmake-tutorial/ • CMake documentation: https://cmake.org/documentation/ 38 Grazie per l’attenzione! Domande? luca@lucaceresoli.net http://lucaceresoli.net © Copyright 2017, Luca Ceresoli Materiale rilasciato sotto licenza Creative Commons Attribution - Share Alike 3.0 https://creativecommons.org/licenses/by-sa/3.0/ 39