Programowanie w systemie UNIX/(auto)Make
Make jest to program powłoki systemowej automatyzujący i przyspieszający proces kompilacji złożonych programów i bibliotek. Make nadaje się również do innych prac, które wymagają przetwarzania wielu plików zależnych od siebie.
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 ( plik Makefile)
- cmake (plik CMakeLists.txt)[2]
- automake
- FreeBCD make
- NetBSD make
- OpenBSD make
- ubuntu make
Rodzaje kompilacji:
- ręczna kompilacja
- skrypt bash
- program make
FAQ
[edytuj]- kiedy używać make zamiast skryptu bash?[3]
- kiedy stosować plik bas zamiast make? [4]
- kiedy stosować ręczną kompilację? kiedy kompilujemy prosty program na 1 platformę
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.[5]
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)[6].
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[7]
make -n
powoduje wypisanie ( bez uruchomienie) komend, które make chce wywołać ( ang. dry run[8]). 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[9]
składnia
[edytuj]Plik Makefile jest napisany w dwóch zupełnie różnych „językach” :[10]
- 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:[11]
- 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 [12]
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:[13]
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
- The Robot Operating System (ROS)
- the constructsim
- https://stackoverflow.com/questions/6914524/how-to-generate-cmakelists-txt SO]
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[14] :
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.
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:[15]
- 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[16]
- 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]- ↑ Arkadiusz Ćwiek krotkie-wprowadzenie-do-gnu-make-czyli-jak-pisac-poprawne-makefile
- ↑ cmake tutorial
- ↑ stackoverflow question: why-use-make-over-a-shell-script?
- ↑ unix.stackexchange question: script-or-makefile-to-automate-new-user-creation?
- ↑ stackoverflow question: using-the-make-command-without-makefiles
- ↑ gnu make manual: Implicit Rules
- ↑ stackoverflow question: using-cmake-with-gnu-make-how-can-i-see-the-exact-commands
- ↑ gnu make manual: Instead-of-Execution
- ↑ stackoverflow question : how-do-i-make-a-simple-makefile-for-gcc-on-linux
- ↑ stackoverflow question: when-to-use-space-or-tab-in-makefile ?
- ↑ GNU make - Grzegorz J. Nalepa 2007-10-22
- ↑ http://stackoverflow.com/questions/18966342/how-to-compile-a-c-program-that-includes-a-header-from-another-library
- ↑ stackoverflow question : how-compile-only-c-with-cmake
- ↑ linuxjournal : Building Projects With Imake Issue 48 From April 01, 1998 By Otto Hammersmit
- ↑ openismus automake
- ↑ autoconf manual 2.63: autoscan-Invocation