Możesz wydrukować zmienne podczas odczytywania pliku makefile (zakładając, że GNU tworzy, ponieważ odpowiednio otagowałeś to pytanie), korzystając z tej metody (ze zmienną o nazwie „var”):
$(info $$var is [${var}])
Możesz dodać ten konstrukt do dowolnego przepisu, aby zobaczyć, co marka przejdzie do powłoki:
.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world
Teraz dzieje się tak, że przechowuje całą recepturę ( $(info $$var is [${var}])echo Hello world
) jako jedną rekurencyjnie rozszerzoną zmienną. Kiedy make decyduje się uruchomić przepis (na przykład, gdy każesz mu budować all
), rozwija zmienną, a następnie przekazuje każdą wynikową linię osobno do powłoki.
A więc w bolesny sposób:
- Rozszerza się
$(info $$var is [${var}])echo Hello world
- Aby to zrobić, najpierw się rozwija
$(info $$var is [${var}])
$$
staje się dosłowny $
${var}
staje się :-)
(powiedz)
- Efekt uboczny
$var is [:-)]
pojawia się na standardowym wyjściu
- Rozszerzenie
$(info...)
tego jest puste
- Marka pozostaje
echo Hello world
echo Hello world
Najpierw wykonaj odbitki na standardowym ekranie, aby dowiedzieć się, o co ma poprosić powłokę
- Powłoka drukuje się
Hello world
na standardowym wyjściu.
Zgodnie z instrukcją GNU Make, a także wskazaną przez „bobbogo” w poniższej odpowiedzi, możesz użyć informacji / ostrzeżenia / błędu do wyświetlenia tekstu.
Aby wydrukować zmienne,
„error” zatrzyma wykonanie make po wyświetleniu ciągu błędu
źródło
z „Mr. Make post” https://www.cmcrossroads.com/article/printing-value-makefile-variable
Dodaj następującą regułę do pliku Makefile:
Następnie, jeśli chcesz poznać wartość zmiennej makefile, po prostu:
i zwróci:
źródło
Jeśli po prostu chcesz trochę danych wyjściowych, sam chcesz użyć
$(info)
. Możesz to zrobić w dowolnym miejscu w pliku Makefile, a pokaże on, kiedy ta linia jest oceniana:Wyjdzie
VAR="<value of VAR>"
za każdym razem, gdy procesy zostaną przetworzone w tym wierszu. To zachowanie jest bardzo zależne od pozycji, więc musisz się upewnić, że$(info)
rozszerzenie nastąpi PO wszystkim, co można zmodyfikować$(VAR)
, już się wydarzyło!Bardziej ogólną opcją jest utworzenie specjalnej reguły drukowania wartości zmiennej. Ogólnie mówiąc, reguły są wykonywane po przypisaniu zmiennych, więc pokaże ci to, która wartość jest faktycznie używana. (Chociaż reguła może zmienić zmienną .) Dobre formatowanie pomoże wyjaśnić, na co ustawiona jest zmienna, a
$(flavor)
funkcja powie ci, co to za zmienna. Więc w tej regule:$*
rozwija się do rdzenia, którego%
wzór pasował do reguły.$($*)
rozwija się do wartości zmiennej, której nazwę podaje$*
.[
I]
jasno wyznaczać ekspansję zmiennych. Możesz także użyć"
i tym"
podobnych.$(flavor $*)
mówi ci, jaka to zmienna. UWAGA:$(flavor)
przyjmuje nazwę zmiennej , a nie jej rozwinięcie. Więc jeśli powieszmake print-LDFLAGS
, dostajesz$(flavor LDFLAGS)
, to jest to, czego chcesz.$(info text)
zapewnia wydajność. Rób odbitkitext
na stdout jako efekt uboczny rozszerzenia. Rozszerzenie$(info)
chociaż jest puste. Możesz myśleć o tym w ten sposób@echo
, ale co ważne, nie używa on powłoki, więc nie musisz się martwić o reguły cytowania powłoki.@true
jest tylko po to, aby podać polecenie dla reguły. Bez tego marka będzie również generowaćprint-blah is up to date
. Wydaje mi się,@true
że jest bardziej jasne, że ma to być zakaz operacji.Uruchamiasz to
źródło
@echo $ (NDK_PROJECT_PATH) to dobry sposób na zrobienie tego. Nie sądzę, że błąd pochodzi stąd. Zasadniczo ten błąd pojawia się, gdy źle wpisałeś zamiar: Myślę, że masz spacje, w których powinieneś mieć tabulator.
źródło
Wszystkie wersje
make
wymagają, aby wiersze poleceń były wcięte klawiszem TAB (nie spacją) jako pierwszym znakiem w linii. Jeśli pokazałeś nam całą regułę zamiast tylko dwóch linii, o których mowa, moglibyśmy dać jaśniejszą odpowiedź, ale powinno to być coś w stylu:gdzie pierwszym znakiem w drugim wierszu musi być TAB.
źródło
Uruchom
make -n
; pokazuje wartość zmiennej.Makefile ...
Komenda:
Wynik:
źródło
--just-print
tego samego w Zamiast egzekucjiSpowoduje
makefile
to wygenerowanie komunikatu o błędzie „brak separatora”:Przed znakiem jest zakładka
@echo "All done"
(choćdone:
zasada i działanie są w dużej mierze zbędne), ale nie przed@echo PATH=$(PATH)
.Problem polega na tym, że linia początkowa
all
powinna mieć dwukropek:
lub znak równości,=
co oznacza, że jest linią docelową lub linią makro, i nie ma żadnej, więc brakuje separatora.Akcja, która powtarza wartość zmiennej, musi być powiązana z celem, być może atrapą lub celem PHONEY. Ta linia docelowa musi mieć dwukropek. Jeśli dodać
:
poall
na przykładmakefile
i zastąpić wiodące spacje na następnej linii przez kartę, to będzie działać zdrowo.Prawdopodobnie masz analogiczny problem w pobliżu linii 102 w oryginale
makefile
. Jeśli pokazałeś 5 niepustych wierszy bez komentarza przed nieudanymi operacjami echa, prawdopodobnie byłoby możliwe zakończenie diagnozy. Ponieważ jednak pytanie zostało zadane w maju 2013 r., Jest mało prawdopodobne, że zepsutymakefile
jest nadal dostępny (sierpień 2014 r.), Więc tej odpowiedzi nie można formalnie zweryfikować. Można go jedynie wykorzystać do zilustrowania prawdopodobnego sposobu wystąpienia problemu.źródło
Nie trzeba modyfikować pliku Makefile.
źródło
Problem polega na tym, że echo działa tylko pod blokiem wykonawczym. tzn. cokolwiek po „xx:”
Zatem wszystko powyżej pierwszego bloku wykonawczego jest tylko inicjalizacją, więc nie można użyć komendy wykonawczej.
Utwórz blok wykonawczy
źródło
Można to zrobić w sposób ogólny i może być bardzo przydatne podczas debugowania złożonego makefile. Postępując zgodnie z tą samą techniką, jak opisano w innej odpowiedzi , możesz wstawić następujące polecenie do dowolnego pliku makefile:
Następnie możesz po prostu wykonać polecenie „print”, aby zrzucić wartość dowolnej zmiennej:
źródło
Możesz utworzyć regułę vars w swoim pliku make, w następujący sposób:
Istnieje kilka bardziej niezawodnych sposobów na zrzucenie wszystkich zmiennych tutaj: gnu make: wyświetla wartości wszystkich zmiennych (lub „makr”) w danym przebiegu .
źródło
Jeśli nie chcesz modyfikować samego pliku Makefile, możesz użyć,
--eval
aby dodać nowy cel, a następnie wykonać nowy cel, np.make --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
Możesz wstawić wymagany znak TAB w wierszu poleceń, używając
CTRL-V, TAB
przykład Makefile z góry:
źródło
make: *** missing separator. Stop.
make --eval='print-tests: ; @echo TESTS $(TESTS)' print-tests
jeśli używasz Androida make (mka)
@echo $(NDK_PROJECT_PATH)
nie będzie działać i wyświetli się błąd,*** missing separator. Stop."
użyj tej odpowiedzi, jeśli próbujesz wydrukować zmienne w android maketo działało dla mnie
źródło
Zwykle odbijam się z błędem, gdy chcę zobaczyć wartość zmiennej (tylko jeśli chcesz zobaczyć wartość. Zatrzyma to wykonywanie).
źródło