Pytanie Dodawanie niestandardowych poleceń do istniejących celów w qmake


Czy istnieje sposób, aby określić w .zawodowiec plik, dodatkowe polecenia do dodania do standardowego celu w Makefile że qmake generuje? Na przykład rozważ distclean, mogą być potrzebne dodatkowe polecenia, aby:

  • Usunąć * ~ akta.
  • Wyczyść pliki wyjściowe generowane przez środowisko wykonawcze z drzewa źródłowego.
  • Itp.

Chcę używać normalnego celu, a nie celu niestandardowego, ponieważ chcę, aby było to całkowicie przezroczyste w moim przepływie pracy. To jest (ponownie używając distclean jako przykład), nie chcę ...

  • ... wymagają wiedzy w konfiguracji wielu projektów, która jest pewna Makefiles użyj niestandardowej reguły zamiast distclean.
  • ... dokumentuj niestandardowe reguły, nawet w przypadku samodzielnych projektów, takich jak distclean jest już dobrze znane i intuicyjny.

znalazłem Jak dodać niestandardowe obiekty docelowe w pliku Makefile wygenerowanym przez qmake?, ale opisuje to dodawanie niestandardowych celów (czyli takich już udokumentowane, parzysty z powrotem w 4.6) zamiast dodawać reguły do ​​istniejących celów. Chociaż zawiera pewne wskazówki, wszystkie z nich wymagają dodania nowych niestandardowych celów, ponieważ określają ten sam cel więcej niż raz w kodzie Makefile zastępuje (nie dodaje) polecenia z poprzedniego celu.

Jedyne, co naprawdę mogłem spróbować, to dodać target.commands += new commands do .zawodowiec plik jako dzikie odgadnięcie (np distclean.commands += rm \"*~\"). To nie ma wpływu.

W jaki sposób mogę przezroczyście dodawać niestandardowe polecenia do istniejących celów za pomocą qmake?


  Dla distclean przykład: While maintainer-clean znajduje się również na tej liście "standardowego celu", w praktyce okazało się, że jest rzadko używana iw każdym razie qmake nie generuje go domyślnie; Uważam, że jest nieodpowiedni.


12
2018-04-24 17:27


pochodzenie


stackoverflow.com/a/5948236 - jimbo1qaz


Odpowiedzi:


Są dwa proste sposoby, aby to osiągnąć, w zależności od tego, jak samodzielne / przenośne chcesz, aby twoje rozwiązanie było i jak łagodne chcesz być z kolejnością wykonywania polecenia.


opcja 1

Pierwsza opcja polega na utworzeniu niestandardowego celu w .zawodowiec plik nowych poleceń, a następnie dodaj ten cel jako warunek wstępny do standardowego obiektu docelowego, który modyfikujesz. Wracając do distclean na przykład, powiedzmy, że chcesz dodać polecenie, aby usunąć wszystkie * ~ akta:

  1. Utwórz niestandardowy cel w swoim .zawodowiec plik. Zauważ, że musisz unikać cudzysłowów i ukośników .zawodowiec akta. Na przykład dodaj:

    extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
    
  2. Dodaj ten cel jako zależność celu, który modyfikujesz:

    distclean.depends = extraclean
    

    To tak naprawdę nie modyfikuje pliku distclean rządzić jeszcze, ponieważ ta metoda nie może być używana do modyfikowania istniejących reguł. Jednak...

  3. Dodaj zarówno nowy cel, jak i cel, który modyfikujesz jako dodatkowe cele:

    QMAKE_EXTRA_TARGETS += distclean extraclean
    

    Spowoduje to dodanie drugiej specyfikacji distclean do Makefile, ale to działa, ponieważ możesz dodać zależności do istniejących celów w make w osobnych regułach, nawet jeśli nie możesz dodawać poleceń w ten sposób. Jeśli miałbyś również określić distclean.commands w Twoim .zawodowiec plik, złamiesz istniejące distclean zastępując jego domyślną recepturę.

Tak więc, stawiając to wszystko razem, w .zawodowiec plik:

extraclean.commands = find . -name \"*~\" -exec rm -v {} \\;
distclean.depends = extraclean
QMAKE_EXTRA_TARGETS += distclean extraclean

Gdzie extraclean to jakiś cel niestandardowy z poleceniami, które chcesz dodać, i distclean jest istniejącym celem, który chcesz zmodyfikować.

Zalety:

  • Całkowicie samowystarczalny w .zawodowiec plik.
  • Tak przenośny, jak tylko możesz, pozostawia rzeczywiste Makefile składnia i generowanie do qmake.

Cons:

  • Twoje nowe polecenia nie są dołączone do istniejącego przepisu. Raczej mają one miejsce, gdy wszystkie pożądane cele są spełnione, ale przed istniejący przepis. w distclean przykład, z wersją qmake którego używam, umieszcza polecenia po drzewie źródłowym, ale wcześniej Makefile sama jest usuwana (jest to jedyna czynność, jaką przyjmuje domyślna receptura). Nie stanowi to problemu dla tego przykładu, ale może być problemem dla Ciebie.

Opcja 2

Drugą opcją jest zmiana nazwy pliku Makefile że qmake generuje i tworzy własny zwyczaj Makefile że odradza się do wygenerowanego, a nie + zastępuje go. Jest to również prosta opcja; chociaż nie jest tak samo zamknięty jak opcja 1, daje możliwość wykonywania poleceń zarówno przed, jak i po domyślnie wygenerowanej recepturze.

Nie chcesz uwzględniać + zastąpić istniejącego Makefile, ponieważ nie chcesz zastępować domyślnych receptur. Jeśli to zrobisz, musisz ponownie wdrożyć wartość domyślną, ale może to stanowić problem, ponieważ ta wartość domyślna może ulec zmianie (i musisz nadążyć za zmianami). Najlepiej pozwolić qmake wykonuj jak najwięcej pracy i nie powtarzaj jej pracy.

Aby to zrobić:

  1. Najpierw zmień nazwę pliku, który qmake generuje. Można to osiągnąć przez dodanie takiej linii do pliku .zawodowiec plik:

    MAKEFILE = RealMakefile
    

    To spowoduje qmake na wyjście RealMakefile zamiast Makefile.

  2. Następnym krokiem jest stworzenie własnego Makefile z Twoimi niestandardowymi poleceniami. Istnieją jednak pewne zastrzeżenia. Najpierw pełny przykład, ponownie używając distclean. W pliku o nazwie Makefile:

    .DEFAULT_GOAL := all
    
    %:
        @$(MAKE) -f RealMakefile $@
    
    distclean:
        @$(MAKE) -f RealMakefile $@ 
        @find . -name "*~" -exec rm -v {} \;
    

    Kilka uwag na ten temat:

    • Ustawiliśmy .DEFAULT_GOAL Ponieważ w przeciwnym razie distclean będzie domyślnie. Alternatywą do tego, jeśli nie czujesz się komfortowo .DEFAULT_GOAL, jest określenie all za pomocą reguły @$(MAKE) -f RealMakefile $@ jako przepis.
    • The % cel pasuje do dowolnego celu, który nie jest zdefiniowany w inny sposób Makefile. Po prostu przekazuje przetwarzanie do RealMakefile.
    • The distclean celem jest dodanie naszych poleceń. Nadal musimy delegować do RealMakefile, ale dodatkowe polecenia można dodawać zarówno przed jak i po tym wydarzeniu.

Zalety:

  • Więcej kontroli nad porządkiem poleceń. Polecenia można dodawać zarówno przed, jak i po domyślnej recepturze.

Cons:

  • Nie jest samodzielny w .zawodowiec.
  • Nie tak przenośny: nie pozostawia wszystkiego Makefile generowanie do qmake, a także nie jestem pewien, jakie części są specyficzne dla GNU make tutaj (komentarze mile widziane).

Tak więc, chociaż ta odpowiedź może być trochę długa, obie te metody są bardzo proste. Wolałbym opcję 1, chyba, że ​​kolejność wykonywania poleceń jest problemem.


16
2018-04-24 17:27



twoje rozwiązanie jest specyficzne dla pytania i "distclean" i "extraclean" ... jednak znalazłem to przydatne w bardziej ogólny sposób. FYI Użyłem opcji-1. dzięki! qmake jest bardzo trudny do zrobienia. - Trevor Boyd Smith
Wymieniłem distclean tutaj ze zwykłym starym clean aby uzyskać moje niestandardowe czyste polecenia do uruchomienia poprzez opcję menu w QtCreator. - BuvinJ