Mam dość duży plik makefile, który tworzy wiele celów w locie, obliczając nazwy ze zmiennych. (np. foo $ (VAR): $ (PREREQS)). Czy istnieje sposób, w jaki można przekonać gnu make do wyplucia listy celów po rozwinięciu tych zmiennych?
Chciałbym móc znaleźć cele dla aribitrary makefile. Próbuję napisać funkcję uzupełniającą dla mojej powłoki.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
.-r
Usuwa ukryte zasady.Zaczerpnięte z zakończenia make arg, które działa jak urok.
źródło
~/bin
zamiast używać aliasu. Działa świetnie; dzięki!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
który pozwoli Ci zaoszczędzić 2 minuty cytowania gier :-)| sort -u
wygląda bardziej przydatnie :)Nie jestem pewien, czy to tylko kwestia tworzenia GNU, ale działa to dobrze:
make help
źródło
Kilku respondentów zasugerowało użycie
make -pn
, które wypisze bazę danych reguł, ale niczego nie wykona - mniej więcej. Problem z tym podejściem polega na tym,-n
że nadal wywołuje wszystkie rekurencyjne marki i nadal wykonuje o wiele więcej pracy niż to konieczne, ponieważ wypisuje każde polecenie, które wywołałoby w normalnej kompilacji. Bardziej wydajnym rozwiązaniem byłoby utworzenie trywialnego pliku makefile dummy.mk o następującej zawartości:Teraz wywołaj make as
make -p -f Makefile -f dummy.mk __all_targets__
. W przypadku każdej znaczącej budowy różnica w ilości produkcji generowanej przez markę jest znacząca. Na przykład:Czas wykonania również był znacznie lepszy - 2,063 s dla pierwszej wersji, 0,059 s dla drugiej.
źródło
time make -pn | wc -l
":1338738 real 0m47.754s.
"time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
":938621 real 0m40.219s
.make
podręcznika dla wydaje się sugerować coś podobnego, ale przyjaznego, a mianowiciemake -p -f/dev/null
-f /dev/null
zapobiegniemake
parsowaniu zwykłych plików makefile, więc otrzymasz wydruk tylko reguł wbudowanych. Dlatego moje rozwiązanie określa-f Makefile -f dummy.mk
. Ale to też nie wystarczy, ponieważ polecenie-n
,make
rozpocznie wykonywanie reguł z pliku makefile. Niestety nie znam żadnych modyfikacji, które mogłyby uprościć rozwiązanie, tak jak zostało to zaprezentowane pierwotnie.-n
..."Sprawdź ukończenie bash dla marki w GitHub.
źródło
Edycja: FYI repozytorium git do zakończenia debian bash w innej odpowiedzi zawiera teraz ulepszoną wersję tego skryptu dostosowaną do przypadków użycia bash.
Jest to znacznie bardziej kompletny skrypt niż skrypt uzupełniający debian bash, ponieważ zapewnia wyniki dla wygenerowanych reguł, o które zadaje się pytanie, a najczęściej głosowana odpowiedź (skrypt uzupełniający debian bash na serwerze debian git) nie jest wystarczająca.
To nie jest oryginalny skrypt, z którym się łączyłem, ale jest znacznie prostszy i odrobinę szybszy.
źródło
To jest kod aliasu oparty na rozwiązaniu Todda Hodesa
źródło
To da ładny wynik:
źródło
Jest tutaj bardzo fajne rozwiązanie z odrobiną magii sed i egrep: https://gist.github.com/pvdb/777954
źródło
Chyba trochę się spóźniłem na to przyjęcie, ale jeśli szukasz konkretnego polecenia, możesz spróbować
To w większości działa, chociaż nadal może zawierać pewne elementy niebędące celem, takie jak
vpath
dyrektywa. Jeśli nie polegasz namake
wbudowanych regułach, możesz użyćmake -qpR
jako pierwszego polecenia w potoku.źródło
Rozwiązanie Ruby:
źródło
Pracuję nad powłoką Solaris 10 i Turbo C. Podane rozwiązanie nie działa dla mojego projektu makefile. nawet po zmianie powyższego wiersza poleceń na składnię tcsh. Jednak dowiedziałem się, że możesz uzyskać łatwe rozwiązanie za pomocą
wersja remake:
jest
i kilka innych nieistotnych danych o wersji
źródło
Szukałem tego samego pytania i wymyśliłem ten spin:
To usuwa wszystkie linie komentarzy, reguły wzorców (linie zaczynające się od tabulatorów), wszystkie elementy wewnętrzne (przykłady
.c.o
i%.o: %.c
wzorce).źródło
Znalazłem to rozwiązanie w innym wątku:
Możesz również dodać go do
Makefile
:I wykonaj
make list
.źródło
Jasne, ale kiedy chcesz, żeby je wypluła?
Aby zgłosić nazwę celu po uruchomieniu reguły, umieść wiersz w regule:
Aby wypluć je wszystkie na raz, możesz stworzyć osobny cel PHONY:
Można to uczynić warunkiem wstępnym domyślnego celu:
EDYTOWAĆ:
Chcesz sposobu, aby pokazać wszystkie możliwe cele dowolnego pliku makefile, co, jak przypuszczam, oznacza nieinwazyjne. Dobrze...
Aby to zrobić dokładnie i móc poradzić sobie z wyrafinowanymi plikami makefile, np. Zawierającymi reguły skonstruowane przez
eval
instrukcje, musiałbyś napisać coś zbliżonego do emulatora Make. Niepraktyczny.Aby zobaczyć cele prostych reguł, możesz napisać plik makefile, który działałby jak skaner makefile, działający na dowolnym pliku makefile:
To byłaby imponująca praca. Czy na pewno ten cel jest wart wysiłku?
źródło
źródło
:=
).