DOKK Library

Build Automation: Introduzione a Make, Autotools e CMake

Authors Luca Ceresoli

License CC-BY-SA-3.0

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