2010-03-10 12 views
7

Czy istnieje sposób rejestrowania komend, wywoływania invokes do kompilowania programu? Wiem o parametrach -n i -p, ale nie rozwiązują one warunków, ale po prostu je wypisują. Lub nie działają, gdy w Makefile są wywołania "make".Log wywoływał komendy make

Odpowiedz

1

Być może znajdziesz to, czego szukasz w dziennikach opisów utworzonych przez SparkBuild. Obejmuje to polecenia każdej reguły wykonanej w kompilacji, bez względu na to, czy użyto "@", aby zapobiec drukowaniu wiersza poleceń.

Twoja uwaga na temat warunków if jest nieco myląca: czy mówisz o konstruktach powłoki, czy konstruujesz? Jeśli masz na myśli konstrukcje powłoki, nie sądzę, że jest jakiś sposób, aby uzyskać dokładnie to, czego szukasz, chyba że używasz strace, jak opisywali inni. Jeśli masz na myśli tworzenie konstruktów, wynik, który widzisz, jest wynikiem rozstrzygniętego wyrażenia warunkowego.

+0

Wygląda na to, że są konstrukcjami powłoki.Ale nie wiem, dlaczego ktoś chce używać konstruktów powłoki w Makefile, kiedy można użyć konstrukcji Makefile. Czy w jakiś sposób są lepsi? – Customizer

+0

I SparkBuild wygląda interesująco. Na pewno się tym zajrzę. – Customizer

+1

Pytanie o konstrukcje powłoki względem konstruktów zależy od tego, co próbujesz zrobić. Po pierwsze, istnieją rzeczy, które możesz zrobić z konstrukcjami powłoki, których nie możesz zrobić, tworząc konstrukty, np. Testując, czy plik jest czytelny lub wykonywalny. Po drugie, są one oceniane w różnym czasie w odniesieniu do innych poleceń w treści reguły: konstrukty są oceniane przed wykonaniem któregokolwiek z poleceń, ale konstrukcje powłoki będą oceniane na miejscu podczas wykonywania poleceń. –

0

Czy próbowałeś z parametrem -d (debugowanie)?

Należy pamiętać, że można kontrolować ilość informacji za pomocą --debug. Na przykład, --debug = a (tak samo jak -d) lub --debug = b, aby wyświetlić tylko podstawowe informacje ...

+0

Nie zapominając, aby przekierować standardowe wyjście do pliku, make -d bardzo szybko wytwarza dużo informacji. –

1

można spróbować zalogować execve połączeń z strace

strace -f -e execve make ... 
+0

To jest dobre narzędzie. Jeszcze o tym nie słyszałem. Ale produkuje dużo wyjścia, nie potrzebuję w tym przypadku. – Customizer

+0

Strace jest narzędziem do śledzenia wszystkich wywołań systemowych (w moim przykładzie jest to tylko execv), więc tak, prawdopodobnie da ci więcej niż wymagane minimum (w szczególności wypisze wszystkie (nieudane) próby wykonania polecenia z wszystkie katalogi $ PATH). – hlovdal

2

Marka pisze każda komenda jest wykonywana do konsoli, więc

make 2>&1 | tee build.log 

utworzy plik dziennika o nazwie build.log jako efekt uboczny, który zawiera te same rzeczy napisane na ekranie. (man tee, aby uzyskać więcej informacji.)

2>&1 łączy standardowe wyjście i błędy w jednym strumieniu. Jeśli tego nie uwzględnisz, zwykłe dane wyjściowe będą przesyłane do pliku dziennika, ale błędy będą kierowane tylko do konsoli. (make pisze tylko stderr kiedy polecenie zwraca kod błędu).

Jeśli chcesz stłumić wyjście całkowicie za rejestrowanie do pliku, to jeszcze prostsze:

make 2>&1 > build.log 

Ponieważ są tylko uchwycić konsolę wyjściowe działają dobrze z rekursywnym make.

+0

Polecenia, które są poprzedzone prefiksem @ (ciche wykonanie), nie są niestety zawarte w tym dzienniku. –

7

Ten

make SHELL="sh -x" 

spowoduje skorupę (które sprawiają, powołuje do oceny konstrukcji powłoki), aby wydrukować informacje o tym, co robi, co pozwala zobaczyć, jak wszelkie warunkowe w poleceń powłoki są oceniane.

+0

Jest to przydatna odpowiedź – tonylo