Značka command v Linuxu je jedním z nejčastěji používaných příkazů systémovými administrátory a programátory. I když pomáhá správcům při kompilaci a instalaci mnoha open source utilit prostřednictvím příkazového řádku, programátoři jej používají ke správě kompilace svých velkých a komplikovaných projektů. V tomto článku probereme vnitřní fungování značky příkaz spolu s několika praktickými příklady.
Jak vyrobit Příkaz funguje
Pro ty, kteří to nevědí, příkaz make přijímá cíle jako argumenty příkazového řádku. Tyto cíle jsou obvykle specifikovány v souboru s názvem 'Makefile', který také obsahuje přidruženou akci odpovídající cílům. Pro více informací si přečtěte naši sérii článků o tom, jak Makefiles fungují.
Když je příkaz make proveden úplně poprvé, prohledá Makefile, aby našel cíl (jemu dodaný) a poté přečetl jeho závislosti. Pokud jsou tyto závislosti samotné cíle, prohledá Makefile tyto cíle a vytvoří jejich závislosti (pokud existují) a poté je sestaví. Jakmile jsou vytvořeny hlavní závislosti, pak sestaví hlavní cíl (který byl předán příkazu make).
Nyní předpokládejme, že provedete změny pouze v jednom zdrojovém souboru a znovu provedete příkaz make, zkompiluje pouze objektové soubory odpovídající tomuto zdrojovému souboru, a proto ušetří spoustu času při kompilaci konečného spustitelného souboru.
vytvářejte příklady příkazů
Zde jsou podrobnosti o testovacím prostředí použitém pro tento článek:
- OS – Ubuntu 13.04
- Shell – Bash 4.2.45
- Aplikace – GNU Make 3.81
Níže je uveden obsah projektu:
$ ls
anotherTest.c Makefile test.c test.h
a zde je obsah souboru Makefile:
all: test
test: test.o anotherTest.o
gcc -Wall test.o anotherTest.o -o test
test.o: test.c
gcc -c -Wall test.c
anotherTest.o: anotherTest.c
gcc -c -Wall anotherTest.c
clean:
rm -rf *.o test
Nyní se podívejme na některé příklady použití příkazu make v Linuxu.
1) Jednoduchý příklad
Ke kompilaci projektu můžete buď jednoduše použít 'make' nebo můžete použít cíl 'all' s příkazem make.
$ make
gcc -c -Wall test.c
gcc -c -Wall anotherTest.c
gcc -Wall test.o anotherTest.o -o test
Takže můžete vidět, že příkaz make nejprve vytvoří závislosti a poté skutečný cíl.
Pokud se podíváte na obsah adresáře, budou v něm soubory .o a spustitelné soubory:
$ ls
anotherTest.c anotherTest.o Makefile test test.c test.h test.o
Nyní předpokládejme, že provedete nějakou změnu v test.c a znovu zkompilujete projekt pomocí make :
$ make
gcc -c -Wall test.c
gcc -Wall test.o anotherTest.o -o test
Takže můžete vidět, že je překompilován pouze test.o, zatímco jinýTest.o není překompilován.
Nyní, chcete-li vyčistit všechny soubory objektů spolu se spustitelným souborem 'test', můžete použít cíl 'clean':
$ make clean
rm -rf *.o test
$ ls
anotherTest.c Makefile test.c test.h
Můžete tedy vidět, že všechny soubory .o a spustitelný 'test' byly odstraněny.
2) Vždy proveďte všechny cíle přes volbu -B
Nyní byste si pravděpodobně byli vědomi, že příkaz make nezkompiluje soubory, které se od minule nezměnily. Pokud však chcete přepsat výchozí chování značky, můžete použít volbu -B.
Zde je příklad:
$ make
make: Nothing to be done for `all'.
$ make -B
gcc -c -Wall test.c
gcc -c -Wall anotherTest.c
gcc -Wall test.o anotherTest.o -o test
Takže můžete vidět, že zatímco příkaz 'make' nezkompiloval žádný soubor, 'make -B' násilně zkompiloval všechny objekty spolu s konečným spustitelným souborem.
3) Vytiskněte informace o ladění pomocí volby -d
Pokud chcete podrobný popis toho, co příkaz make skutečně dělá, když je spuštěn, použijte volbu -d.
Zde je příklad:
$ make -d | more
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
Reading makefiles...
Reading makefile `Makefile'...
Updating makefiles....
Considering target file `Makefile'.
Looking for an implicit rule for `Makefile'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.o'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.c'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.cc'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.C'.
Trying pattern rule with stem `Makefile'.
Trying implicit prerequisite `Makefile.cpp'.
Trying pattern rule with stem `Makefile'.
--More--
Je to dlouhý výstup. Můžete vidět, že jsem použil více příkaz pro zobrazení výstupu stránku po stránce. Musíte to vidět sami, abyste si udělali lepší představu o detailech, které je tato možnost schopna vyprodukovat.
4) Změňte adresář pomocí volby -C
Příkazu make můžete poskytnout jinou cestu k adresáři, do které by se přepnul před hledáním souboru Makefile.
Zde je příklad. Předpokládejme, že se aktuálně nacházíte v tomto adresáři:
$ ls
file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt
file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt
Ale chcete spustit make se souborem Makefile uloženým na ../make-dir/. Takže tady je to, co musíte udělat:
$ make -C ../make-dir/
make: Entering directory `/home/himanshu/practice/make-dir'
make: Nothing to be done for `all'.
make: Leaving directory `/home/himanshu/practice/make-dir'
Můžete tedy vidět, že se příkaz make přepnul do určeného adresáře, tam se provedl a pak se přepnul zpět.
5) S jakýmkoli jiným souborem zacházet jako s 'Makefile' přes volbu -f
Pokud chcete přejmenovat svůj Makefile, řekněme 'my_makefile' nebo jakýkoli jiný název, a chcete, aby s ním příkaz make zacházel jako s výchozím 'Makefile', můžete k tomu použít volbu -f.
Zde je příklad:
make -f my_makefile
Tímto způsobem bude příkaz make vybírat a skenovat my_makefile místo Makefile.