W rzeczywistości wykonuje polecenie, zmieniając katalog na some_directory
, jednak jest to wykonywane w powłoce podprocesu i nie wpływa ani na markę, ani na powłokę, z której pracujesz.
Jeśli chcesz wykonać więcej zadań w środku some_directory
, musisz dodać średnik i dołączyć również inne polecenia. Pamiętaj, że nie możesz używać znaków nowej linii, ponieważ są one interpretowane przez make jako koniec reguły, więc wszelkie nowe linie, których używasz dla zachowania przejrzystości, muszą być poprzedzone odwrotnym ukośnikiem.
Na przykład:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
Zauważ też, że średnik jest konieczny między każdym poleceniem, nawet jeśli dodajesz odwrotny ukośnik i nowy wiersz. Wynika to z faktu, że cały ciąg jest analizowany przez powłokę jako pojedynczy wiersz. Jak zauważono w komentarzach, do łączenia poleceń należy używać „&&”, co oznacza, że są one wykonywane tylko wtedy, gdy poprzednie polecenie zakończyło się powodzeniem.
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
Jest to szczególnie ważne, gdy wykonujesz niszczycielskie prace, takie jak sprzątanie, ponieważ w przeciwnym razie zniszczysz niewłaściwe rzeczy, w przypadku cd
niepowodzenia z jakiegokolwiek powodu.
Typowym zastosowaniem jest jednak wywoływanie make w podkatalogu, w którym warto zajrzeć. Jest do tego opcja wiersza poleceń, więc nie musisz dzwonić do cd
siebie, więc twoja reguła wyglądałaby tak
all:
$(MAKE) -C some_dir all
które zmienią się some_dir
i wykonają Makefile
tam z celem „wszystko”. Najlepszą praktyką jest używanie $(MAKE)
zamiast make
bezpośredniego wywoływania , ponieważ zadba o to, aby wywołać odpowiednią instancję make (jeśli na przykład używasz specjalnej wersji make dla środowiska kompilacji), a także zapewnić nieco inne zachowanie podczas uruchamiania za pomocą niektórych przełączników, takich jak -t
.
Dla przypomnienia, zawsze wykonuj echo polecenia, które wykonuje (chyba że jest wyraźnie wyłączone), nawet jeśli nie ma danych wyjściowych, co właśnie widzisz.
make
nigdy nie chciałem zmieniać katalogu w ten sposób. Może powinieneś wypróbować inne podejście do swojego rozwiązania?