Úvod
Linux make
command je běžně používaný nástroj systémovými administrátory a vývojáři. Příkaz pomáhá při procesu kompilace a je nezbytným nástrojem pro vytváření velkých aplikací. Tento nástroj omezuje opakování a urychluje kompilaci, což šetří čas.
Tento článek vám ukáže, jak používat Linux make
příkaz s příklady.

Předpoklady
- Přístup k terminálu.
make
funkce nainstalována.- Textový editor.
Poznámka: Pokud make
není v systému k dispozici, použijte sudo apt install make
.
Jak funguje příkaz make?
make
příkaz zkompiluje různé části programu a vytvoří konečný spustitelný soubor. Účel make
je automatizovat kompilaci souborů, čímž je proces jednodušší a méně časově náročný.
Příkaz funguje s jakýmkoli programovacím jazykem, pokud lze kompilátor spustit pomocí příkazu shellu.
Kompilace je při práci s několika soubory přímočará. Proces tedy zahrnuje vyvolání kompilátoru a výpis názvů souborů.
Například ke kompilaci programu C ze tří souborů (file1.c , soubor2.c , soubor3.h ):

Vyvolejte kompilátor pomocí:
gcc file1.c file2.c file3.h
gcc
příkaz vytvoří a.out soubor, což je standardní kompilovaný spustitelný soubor.

Změna jednoho ze zdrojových souborů však vyžaduje rekompilaci všeho, což je při práci s velkými aplikacemi ještě složitější. make
příkaz automatizuje proces a umožňuje uživatelům aktualizovat pouze části, které je třeba změnit, aniž by museli znovu kompilovat každý soubor.
make
příkaz používá uživatelem generovaný soubor Makefile ke kompilaci částí programu. Při prvním spuštění make
hledá v Makefile instrukce, např. popisy souborů a časy úprav. Na základě dostupných údajů make
rozhodne, které soubory je třeba aktualizovat, a vydá potřebné příkazy.
Co jsou soubory Makefiles?
Makefile je textový soubor obsahující sadu pravidel, která instruuje make
jak vytvořit aplikaci. Pravidlo se skládá ze tří částí:cíl , závislosti a příkazy .

Základní syntaxe Makefile je:
target: dependencies
<TAB> commands
Části syntaxe jsou:
- Cíle . Názvy souborů, které mají být vytvořeny nebo aktualizovány po provedení
make
. - Závislosti . Názvy souborů (oddělené mezerami), ze kterých je sestaven cíl.
- Příkazy . Pravidla popisující, jak vytvořit nebo aktualizovat cíl, když se změní závislosti.
Jeden Makefile má několik sad pravidel. První pravidlo je výchozí a uvádí, jak má být konečný spustitelný soubor (cíl) vytvořen z dosud nevytvořených objektových souborů (závislosti):

Syntaxe v tomto případě je:
EXECUTABLE: Object file 1, Object file 2
<TAB> commands
Poznámka: Příkazy v Makefiles vždy následují za TAB klíč. Jinak příkaz nefunguje.
Po nastavení pravidla jedna uživatel přidá pokyny, jak vytvořit soubory objektů:

make
příkaz funguje tak, že zkompiluje zdrojové soubory do objektových souborů a poté zkompiluje objektové soubory do cílového souboru, konečného spustitelného souboru. Syntaxe Makefile se třemi výše uvedenými pravidly je:
EXECUTABLE: Object file 1, Object file 2
<TAB> commands
Object file 1: Source file 1, Source file 2
<TAB> commands
Object file 2: Source file 2
<TAB> commands
Linux make Command Syntaxe
Základní make
syntaxe vypadá takto:
make [OPTIONS]
Při spuštění bez argumentů make
vytvoří první cíl ze souboru Makefile.
Linux make Command Options
make
příkaz je široce používán kvůli jeho účinnosti, rozmanitosti a schopnosti provádět specifické akce. Zatímco příkaz vypíše výsledek při spuštění bez voleb, přidání argumentů rozšíří make
's použitelnost.
Zde jsou nejpoužívanější možnosti:
Příkaz | Popis |
---|---|
-B , --always-make | Bezpodmínečně zkompiluje všechny cíle. |
-d , --debug[=FLAGS] | Vytiskne informace o ladění. |
-C dir , --directory=dir | Změní adresář před spuštěním souboru Makefile. |
-f file , --file=file , --Makefile=FILE | Používá konkrétní soubor jako soubor Makefile. |
-i , --ignore-errors | Ignoruje všechny chyby v příkazech. |
-I dir , --include-dir=dir | Určuje adresář pro hledání zadaného Makefile. |
-j [jobs] , --jobs[=jobs] | Určuje počet úloh, které se mají spustit současně. |
-k , --keep-going | Pokračuje v běhu make co nejdéle po obdržení chyby. |
-l [load] , --load-average[=load] | Určuje, že pokud jsou ve frontě jiné úkoly, neměl by být spuštěn žádný nový úkol. |
-n , --dry-run , --just-print , --recon | Vytiskne očekávaný výstup bez provedení příkazu make . |
-o file , --old-file=file , --assume-old=file | Zajišťuje, že make nepředělá soubor, i když je starší než závislosti. |
-p , --print-data-base | Vytiskne databázi vytvořenou po přečtení souboru Makefile. |
-q , --question | Aktivuje režim otázek, ve kterém je make nespustí žádné příkazy, ale vrátí návratový stav nula, pokud je cíl již zkompilován. |
-r , --no-builtin-rules | Odstraní vestavěná implicitní pravidla. |
-s , --silent , --quiet | Omezuje tisk příkazů při jejich provádění. |
-S , --no-keep-going , --stop | Zastaví „-k , --keep-going "příkaz. |
-t , --touch | Dotýká se souborů místo spouštění příkazů. |
--trace | Sleduje dispozice každého cíle. |
-W file , --what-if=file , --new-file=file , --assume-new=file | Ignoruje skutečnost, že byl cílový soubor změněn. |
--warn-undefined-variables | Upozorňuje, že se odkazuje na neznámou proměnnou. |
Příklady příkazů Linux make
Nejlepší způsob, jak porozumět make
a Makefiles je spuštěním příkazu a různých možností v jednoduchém programu.
Chcete-li například vytvořit spustitelný soubor, který vytiskne zprávu "Další informace o Makefiles" , postupujte takto:
1. Vytvořte adresář s názvem Test .
2. Vytvořte tři zdrojové soubory main.c , text.c a text.h :

- main.c - je soubor s hlavní funkcí (
int main
), který volá funkci z jiného souboru.

- text.c - je soubor se souborem, který chcete vytisknout "Další informace o Makefiles!".

- text.h - je hlavičkový soubor s deklaracemi funkcí. Záhlaví je součástí obou c soubory s
#include
argument, který má stejný účel jako kopírování/vkládání obsahu záhlaví.

Následující části ilustrují některé běžné případy použití make
a Makefiles na třech výše zmíněných souborech.
Poznámka: Následující příklady jsou napsány v jazyce C.
Vytvořit program
Existují dva způsoby, jak vytvořit program:
- Zkompilujte soubory standardním způsobem vyvoláním kompilátoru gcc. Tato metoda je vhodná pro menší programy.
- Pomocí make a Makefiles.
Vytvořte program pomocí kompilátoru gcc
Kompilátor gcc používejte pouze pro jednoduché programy. Jinak používejte Makefiles při práci s velkým počtem souborů.
Chcete-li vytvořit program pomocí kompilátoru:
1. Otevřete terminál a přejděte do adresáře obsahujícího soubory.
2. Vyvolejte gcc kompilátoru a zadejte název obou c soubory. Záhlaví se nezkompiluje, protože je již zahrnuto v c soubory.
gcc main.c text.c

3. Seznam všech souborů v aktuálním adresáři s ls
příkaz:
ls

Terminál ukazuje, že nový spustitelný soubor a.out soubor je vytvořen. Spustitelný soubor je také vidět prostřednictvím průzkumníka souborů:

Chcete-li otestovat, zda byla kompilace úspěšná, vyvolejte spustitelný soubor pomocí:
./a.out

Terminál ukazuje, že spustitelný soubor funguje správně.
Vytvořte program pomocí Make a Makefiles
Kompilace souborů s make
a Makefiles je jednodušší než použití kompilátoru. Začněte vytvořením nového textového dokumentu ve stejném adresáři a pojmenujte jej Makefile nebo makefile .

Otevřete soubor a jako vodítko použijte základní syntaxi Makefile:

1. Jako cíl zadejte název nového spustitelného souboru, například my_app.

2. Přidejte objektové soubory main.o a text.o jako závislosti. make
příkaz znovu zkompiluje cíl pokaždé, když se objektové soubory změní.

3. Stiskněte TAB a vyvolejte gcc
kompilátor pro objektové soubory:
<TAB> gcc main.o text.o

4. Přidejte -o
označte a pojmenujte cíl my_app.

Po napsání prvního pravidla vypadá Makefile takto:
my_app: main.o text.o
<TAB> gcc main.o text.o -o my_app

Dále dejte souboru Makefile pokyny, jak vytvořit main.o :
1. Nastavte main.o jako cíl.
2. Zadejte main.c jako závislost. main.c slouží k vytvoření a aktualizaci main.o .
3. Napište následující příkaz pro aktualizaci main.o pokaždé main.c změny:
gcc -c main.c
4. Přidejte -c
příznak, který dává Makefile pokyn, aby nevytvářel nový spustitelný soubor, ale pouze četl kód a kompiloval objektový soubor.
main.o: main.c
<TAB> gcc -c main.c

Chcete-li vytvořit text.o , nastavte tento soubor jako cíl a přidejte oba text.c a text.h jako závislosti. Nicméně gcc
příkaz pouze zkompiluje text.c
soubor, protože záhlaví se nikdy nezkompilují:
text.o: text.c text.h
<TAB> gcc -c text.c

Uložte soubor Makefile a zadejte make
v terminálu.

make
příkaz vytvořil dva objektové soubory (main.o a text.o ) a spustitelný soubor (moje_aplikace ).
Chcete-li ověřit, že make vytvořené nové soubory, spusťte ls
znovu:

Terminál ukazuje, že spuštěním příkazu byla vytvořena aplikace my_app . Chcete-li spustit my_app soubor, zadejte:
./my_app

Aktualizujte program
Když se změní jeden zdrojový soubor, make
aktualizuje pouze soubory objektů v závislosti na tomto zdrojovém souboru. Chcete-li například změnit text zobrazený při spuštění my_app z „Další informace o Makefiles “ na „Kde to jsem ?":
1. Otevřete text.c v textovém editoru:

2. Změňte text na „Kde jsem?“ :

3. Uložte soubor, otevřete terminál a spusťte make
:

make
příkaz zjistil změny v text.c a překompiloval pouze tento soubor.
Chcete-li ověřit změnu, spusťte spustitelný soubor:
./my_app

Zkompilujte všechny soubory
Ke kompilaci všech souborů a nejen změněných souborů použijte -B
nebo --always-make
možnosti.
Chcete-li například změnit text v souboru text.c soubor zpět do „Další informace o Makefiles“ a uložte soubor, zadejte:
make -B

Výstup ukazuje, že make
zkompiloval všechny soubory ve složce, dokonce i ty, které nebyly změněny.
Vyčistit soubory objektů
Když uživatel spustí make
poprvé příkaz vytvoří soubory objektů a spustitelný soubor. Chcete-li tedy uvolnit zdrojovou složku a vyčistit soubory objektů, přidejte clean
funkce do souboru Makefile:
clean:
<TAB> rm *.o my_app

Příkaz se skládá z:
- Čistý cíl bez závislostí - cíl je vždy považován za zastaralý a vždy proveden.
- The
rm
příkaz - odstraní zadané objekty. *.o
část - porovnává soubory s o rozšíření a vyčistí objektové soubory a my_app .
Chcete-li vyčistit soubory objektů, spusťte:
make clean

Po spuštění ls
terminál opět ukazuje, že soubory objektů a my_app byly odstraněny.
Spusťte make v režimu ladění
Spusťte make
v režimu ladění vytisknout další informace o procesu kompilace. Proveďte make
s -d
možnost zobrazení výstupu ladění:
make -d

Použít jiný soubor jako soubor Makefile
Ve výchozím nastavení make
hledá soubor s názvem Makefile nebo makefile v aktuálním adresáři. Chcete-li použít jiný soubor, spusťte:
make -f [file_name]
Pokud je například soubor Makefile pojmenován můj_soubor , proveďte:
make -f my_file

Použít proměnné
Proměnné v Makefiles představují vícenásobné názvy souborů, argumenty, cíle, závislosti, příkazy, zdrojové adresáře nebo jiné položky. Dále je proměnná definována jménem a představuje řetězec textu nazývaný hodnota proměnné.
Chcete-li definovat proměnnou, použijte =
. Například nahraďte gcc
s proměnnou C.
C=gcc
my_app: main.o text.o
<TAB> $ (C) main.o text.o -o my_app
main.o:main.c
<TAB> $ (C) -c main.c
text.o: text.c text.h
<TAB> $ (C) -c text.c

Při spuštění make
v terminálu příkaz přečte C
proměnná jako gcc
:

Závěr
Poté, co si projdete příklady v tomto tutoriálu, víte, jak používat make
příkaz v Linuxu a jak to funguje.
Dále si stáhněte cheat sheet pro příkazy Linuxu, kde se dozvíte další důležité příkazy systému Linux.