Programowanie w systemie UNIX/(auto)Make


Makefile pomaga zdecydować, które części dużego programu wymagają ponownej kompilacji. Jest to narzędzia wspomagające/sterujące budowanie aplikacji/programu.

Wersje:[1]


GNU Make Edytuj

Jeśli w katalogu programu widzimy plik Makefile, to w celu kompilacji programu wystarczy wpisać w konsoli:

make

Możemy też użyć make bez pliku Makefile.[3]

make p.c

Wtedy make użyje domyślnych reguł aby skompilować plik p.c zawierajace kod C

Domyślne reguły Edytuj

Make ma wewnętrzną bazę danych z ukrytymi ( domyślnymi, predefiniowanymi) regułami ( ang. implicit rules)[4].

Domyślne reguły możemy sprawdzić za pomocą:

 make -p > p.txt

Plik ma 28 tysiecy linii !

Polecenie:

make -d 

powie ci, które reguły są stosowane


Opcja „-r” lub „--no-builtin-rules” anuluje wszystkie predefiniowane reguły.

Wpisane reguły Edytuj

Polecenie[5]

make -n

powoduje wypisanie ( bez uruchomienie) komend, które make chce wywołać ( ang. dry run[6]). Reguły te zawarte są w pliku Makefile (

Polecenie

make V=1

Powoduje uruchomienie i wyświetlenie komunikatów:

[ 36%] Built target minifb
[ 45%] Built target noise
[ 54%] Built target input_events
[ 63%] Built target input_events_cpp
[ 72%] Built target multiple_windows
[ 81%] Built target hidpi
[ 90%] Built target fullscreen
[100%] Built target timer

C Edytuj

Etapy

  • kompilacja pliku żródłowego n.c do pliku objektowego n.o
  • linkowanie ( Łączenie) pojedynczego pliku obiektowego n.o do pliku wynikowego
  • usuwanie plikóœ obiektowych


Plik obiektowy n.o jest tworzone automatycznie z n.c z przepisem w formie

‘$(CC) $(CPPFLAGS) $(CFLAGS) -c’.

Wbudowany przepis łączenia

‘$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)’

wersje Edytuj

Pokazanie informacji o wersji programu make:

 make -v


GNU Make 4.1
Ten program został zbudowany dla systemu x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
Licencja GPLv3+: GNU GPL wersja 3 lub nowsza <http://gnu.org/licenses/gpl.html>
To oprogramowanie jest wolnodostępne: można je swobodnie zmieniać i rozpowszechniać.
Nie ma ŻADNEJ GWARANCJI w zakresie dopuszczalnym przez prawo.

składnia użycia make Edytuj

 make [ -f makefile ] [ opcja ] ...  cel ...


Opcje Edytuj

  • n = wypisuje komendy bez ich uruchomienia
  • p = drukuje reguły i wartości zmiennych
  • w = drukuje katalog przed i po make


 make -n

Pliki Edytuj

  • Makefile
  • plik. mk


Makefile Edytuj

Plik Makefile

  • dla gcc i Linuxa[7]

składnia Edytuj

Plik Makefile jest napisany w dwóch zupełnie różnych „językach” :[8]

  • Przepisy (ang. Recipes czyli polecenia uruchamiające kompilatory, echo itp.) są zapisywane w składni skryptu powłoki. Wszystkie wiersze receptury są wcięte za pomocą Tab
  • Reszta pliku makefile, której nie ma w przepisie, jest zapisywana w składni pliku makefile. Wiersze niebędące recepturą nie są wcięte Tab,

Cele Edytuj

Plik Makefile powinien mieć przynajmniej 3 cele:[9]

  • all = zbudowanie całego programu, cel domyślny,
  • clean = czyszczenie kod po kompilacji
  • install = instalacja programu (po kompilacji)

Dobrym zwyczajem powinno być również dodanie celów

  • uninstall


pliki mk Edytuj

Pliki z rozszerzeniem mk są zamiennikami pliku Makefile

Użycie

make -f plik.mk

Uruchamianie Edytuj

Sprawdzamy co make będzie robił przy instalacji :

 make -n install

wartość zwracana Edytuj

pomoc Edytuj

offline Edytuj

   man --locale=C 1 make

cmake Edytuj

cmake = Cross-Platform Makefile Generator [10]


Sprawdzamy :

  cmake -version

przykładowy resultat:

cmake version 3.10.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).


Minimalny plik CMakeLists.txt:[11]

cmake_minimum_required(VERSION 2.6.0)

# here we specify that the project is C language only, so the default
# C compiler on the system will be used
project(myprogram C)

add_executable(main main.c)

W katalogu programu mamy :

  • main.c = program żródłwy
  • CMakeLists.txt = plik reguł dla cmake

Uruchamiamy :

 cmake .

przykładowy wynik:

-- The C compiler identification is GNU 5.4.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/a/c/cmake

Teraz w katalogu progrmau mmay:

  • CMakeCache.txt
  • cmake_install.cmake
  • main.c
  • CMakeFiles
  • CMakeLists.txt
  • Makefile ( 178 linii !!)


Uruchamiamy make :

Scanning dependencies of target main
[ 50%] Building C object CMakeFiles/main.dir/main.c.o
[100%] Linking C executable main
[100%] Built target main


i mamy skompilowany program main. możemy go uruchomić :

./main
Hello World!


Polecenie

cmake --build . -- VERBOSE=1

pozwala wypisać wykonywanie komendy


Jak utworzyć CMakeLists.txt

configure Edytuj

Jeśli w katalogu programu widzimy plik ( skrypt) configure to:

./configure
 make 
 make install

Configure tworzy plik Makefile dla progrmau make.


imake Edytuj

Instalacja w Ubuntu:

 sudo apt install xutils-dev


Sprawdzamy[12] :

touch Imakefile
xmkmf

w katalogu mamy 2 pliki:

  • Imakefile ( pusty)
  • Makefile ( 1000 linii) utworzony na podstawie Imake.tmpl i Imakefile przez imake ( xmkf =

Teraz możemy uruchomić make.

Wersje :

  • make Makefile
  • xmkmf = skrypt powłoki Bourne używany do wywołania imake
  • imboot

Automake i Autotools (GNU build system) Edytuj

GNU Autoconf - zestaw makr M4 stworzonych w ramach projektu GNU, które służą do generowania skryptów powłoki mających zająć się procesem kompilacji programów komputerowych rozprowadzanych w formie kodu źródłowego. Autoconf jest w stanie dostosować się do specyfiki wielu systemów operacyjnych bez angażowania użytkownika.

 
Autoconf-automake proces


Pliki zależne od programu:

  • configure
    • wejście: Makefile.in
    • wyjście: Makefile
  • autoconfig
    • wejście: configure.ac ( wcześniej configure.in)
    • wyjście: configure


Etapy:[13]

  • autoheader # creates config.h.in
  • touch NEWS README AUTHORS ChangeLog
  • touch stamp-h
  • aclocal # adds aclocal.m4 to directory. Defines some m4 macros used by the auto tools.
  • autoconf #- creates configure from configure.ac
  • automake # Creates Makefile.in from Makefile.am
  • ./configure # - creates Makefile from Makefile.in
  • make


Czasem jest skrypt autogen.sh który uruchamia te etapy

przykład Edytuj

  • plik Makefile.am trzeba utworzyć ręcznie
  • uruchom autoscan (tworzy configure.scan)
  • alocal
  • sprawdz ręcznie plik configure.scan, zapisz go jako configure.ac[14]
  • autoconf generuje skrypt configure bazując na zawartości pliku configure.ac
  • autoheader genereuje config.h.in na podstawie configure.ac
  • automake create Makefile.in from Makefile.am
  • uruchom configure (tworzy Makefile na podstawie configure.ac i Makefile.in)


autoscan
autoconf
autoheader
automake
./configure
make 
make install

Ubuntu-make Edytuj

sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt update
sudo apt install ubuntu-make


premake Edytuj

  • home page
  • instalacja : sudo apt install premake4
  • premake4 oczekuje skryptu o premake4.lua

Wykonanie:

premake4 gmake
make all

Zobacz również Edytuj

Źródła Edytuj

  1. Arkadiusz Ćwiek krotkie-wprowadzenie-do-gnu-make-czyli-jak-pisac-poprawne-makefile
  2. cmake tutorial
  3. stackoverflow question: using-the-make-command-without-makefiles
  4. gnu make manual: Implicit Rules
  5. stackoverflow question: using-cmake-with-gnu-make-how-can-i-see-the-exact-commands
  6. gnu make manual: Instead-of-Execution
  7. stackoverflow question : how-do-i-make-a-simple-makefile-for-gcc-on-linux
  8. stackoverflow question: when-to-use-space-or-tab-in-makefile ?
  9. GNU make - Grzegorz J. Nalepa 2007-10-22
  10. http://stackoverflow.com/questions/18966342/how-to-compile-a-c-program-that-includes-a-header-from-another-library
  11. stackoverflow question : how-compile-only-c-with-cmake
  12. linuxjournal : Building Projects With Imake Issue 48 From April 01, 1998 By Otto Hammersmit
  13. openismus automake
  14. autoconf manual 2.63: autoscan-Invocation