Plaintext
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