2015-04-24 4 views
11

Gibt es eine Möglichkeit zu geben, in einer .pro Datei, zusätzliche Befehle zu einem Standard-Ziel in dem Makefile hinzugefügt wird dass qmake erzeugt? Betrachten wir zum Beispiel distclean, könnten zusätzliche Befehle zu wünschen übrig:Hinzufügen von benutzerdefinierten Befehlen bestehende Ziele in qmake

  • * ~ Dateien entfernen.
  • Laufzeitgesteuerte Ausgabedateien aus der Quellstruktur löschen.
  • Etc.

Ich möchte das normale Ziel und nicht ein benutzerdefiniertes Ziel verwenden, weil ich in meinem Workflow vollständig transparent sein will. Das ist (wieder distclean als Beispiel), ich will nicht ...

  • ... erfordern Kenntnisse in einem Multi-Projekt-Setup, dass bestimmte Makefiles eine benutzerdefinierte Regel anstelle von distclean.
  • ... dokumentieren benutzerdefinierte Regeln, auch für eigenständige Projekte, wie distclean ist bereits well-known und intuitiv .

Ich fand How to add custom targets in a qmake generated Makefile?, aber das beschreibt individuelle Ziele Hinzufügen (die already documented, auch back in 4.6) statt Regeln bestehenden Ziele hinzuzufügen. Obwohl es einige Hinweise enthält, erfordern alle von ihnen das Hinzufügen neuer benutzerdefinierter Ziele, da das gleiche Ziel mehrmals in einem Makefile ersetzt (nicht hinzugefügt) Befehle aus dem vorherigen Ziel.

Das einzige, was ich wirklich denken konnte, um zu versuchen, war target.commands += new commands zur .pro Datei als wilde Vermutung hinzufügen (z distclean.commands += rm \"*~\"). Dies hat keine Auswirkung.

Wie kann ich benutzerdefinierte Befehle mit qmake transparent vorhandenen Zielen hinzufügen?


Für das distclean Beispiel: Während maintainer-clean ist auch auf diesem „Standardziel“ -Liste, in der Praxis habe ich gefunden, selten verwendet werden, und in jedem Fall qmake es nicht erzeugen standardmäßig; Ich halte es für ungeeignet.

Antwort

16

Es gibt zwei einfache Möglichkeiten, dies zu erreichen, je nachdem, wie eigenständig/portabel Sie Ihre Lösung haben möchten und wie nachsichtig Sie mit der Reihenfolge der Befehlsausführung sein wollen.


Option 1

Die erste Option ist ein benutzerdefiniertes Ziel in der .pro Datei für die neuen Befehle zu erstellen, fügen Sie dann das Ziel als Voraussetzung für das Standard-Ziel, das Sie ändern.Zurück zum distclean Beispiel gehen, sagen wir, Sie einen Befehl hinzufügen möchten alle * ~ Dateien entfernen:

  1. Erstellen eines benutzerdefinierten Ziel in Ihrer .pro Datei. Beachten Sie, dass Sie Anführungszeichen und Schrägstriche in .pro Dateien fliehen müssen. Fügen Sie zum Beispiel:

    extraclean.commands = find . -name \"*~\" -exec rm -v {} \\; 
    
  2. Dieses Ziel als Abhängigkeit des Ziels Sie ändern:

    distclean.depends = extraclean 
    

    Dies wird die distclean Regel nur noch nicht wirklich ändern, wie diese Methode‘ t verwendet werden, um bestehende Regeln zu ändern. Allerdings ...

  3. Both Ihr neues Ziel und das Ziel, das Sie werden als zusätzliche Ziele ändern:

    QMAKE_EXTRA_TARGETS += distclean extraclean 
    

    Dies wird eine zweite Spezifikation von distclean zum Makefile hinzufügen, aber dies funktioniert, weil you can add dependencies to existing targets in make in separate rules, even though you can't add commands that way. Wenn Sie auch distclean.commands in Ihrer .pro Datei angeben würden, würden Sie die vorhandene distclean durch Ersetzen des Standardrezepts brechen.

So, dass alle zusammen setzen, in der .pro Datei:

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

Wo extraclean einige benutzerdefinierte Ziel mit den Befehlen Sie hinzufügen möchten, und distclean ist das bestehende Ziel, dass Sie möchten ändern.

Vorteile:

  • vollständig in einer Datei .proeigenständig.
  • So tragbar wie Sie bekommen können, lässt die tatsächliche Makefile Syntax und Generation bis qmake.

Nachteile:

  • Ihre neuen Befehle sind nicht an das bestehende Rezept angehängt. Sie passieren vielmehr, wenn alle vorausgesetzten Ziele erfüllt sind, aber vor das vorhandene Rezept. In der distclean Beispiel, mit der Version von qmake, die ich verwende, legt dies die Befehle nach dem Quellbaum sauber, aber vor Makefile selbst ist gelöscht (das ist die einzige Aktion, die das Standardrezept dauert). Dies ist kein Problem für dieses Beispiel, aber möglicherweise ein Problem für Sie.

Option 2

Die zweite Option ist der Name des Makefile ändern dass qmake erzeugt, und erstellen Sie Ihre eigenen benutzerdefinierten Makefile dass auf die erzeugte ein aufschiebt, eher als includes + überschreibt es. Dies ist auch eine einfache Option; Obwohl es nicht so eigenständig ist wie Option 1, gibt es Ihnen die Möglichkeit, Befehle sowohl vor als auch nach dem standardmäßig generierten Rezept auszuführen.

Sie möchten das vorhandene Makefile nicht mit + überschreiben, da Sie die Standardrezepte nicht ersetzen möchten. Wenn Sie dies tun, müssen Sie den Standard neu implementieren, aber dies kann ein Problem sein, da sich der Standardwert ändern kann (und Sie müssen mit den Änderungen Schritt halten). Es ist am besten, qmake so viel Arbeit wie möglich zu machen und nicht seine Arbeit zu wiederholen.

dies zu tun:

  1. zunächst den Namen der Datei ändern, dass qmake erzeugt. Dies kann durch Hinzufügen einer Zeile wie dies die .pro Datei erreicht werden:

    MAKEFILE = RealMakefile 
    

    Die qmake zur Ausgabe RealMakefile statt Makefile verursachen.

  2. Der nächste Schritt ist, Ihre eigenen Makefile mit Ihren benutzerdefinierten Befehlen zu erstellen. Allerdings gibt es hier einige Vorbehalte. Zunächst ein vollständiges Beispiel, das wiederum distclean verwendet. In einer Datei namens Makefile:

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

    Einige Hinweise dazu:

    • Wir setzen .DEFAULT_GOAL weil sonst distclean der Standard sein würde. Eine Alternative dazu ist .DEFAULT_GOAL, wenn Sie eine all Regel mit @$(MAKE) -f RealMakefile [email protected] als Rezept angeben.
    • Das Ziel % entspricht einem Ziel, das in diesem Makefile nicht anders definiert ist. Es delegiert die Verarbeitung einfach an RealMakefile.
    • Das Ziel distclean ist, wo wir unsere Befehle hinzufügen. Wir müssen noch an RealMakefile delegieren, aber zusätzliche Befehle können vor und nach dem Hinzufügen hinzugefügt werden.

Pro:

  • Mehr Kontrolle über Befehl um. Befehle können sowohl vor als auch nach dem Standardrezept hinzugefügt werden.

Nachteile:

  • nicht eigenständig in einem .pro.
  • Nicht so portabel: Es lässt nicht alle Makefile Generation bis qmake, und ich bin auch nicht wirklich sicher, welche Teile sind spezifisch für GNU make hier (Kommentare willkommen).

So, während diese Antwort ein wenig lang sein können, sind beide Methoden sehr einfach. Ich würde Option 1 bevorzugen, es sei denn, die Befehlsausführung ist ein Problem.

+0

Ihre Lösung ist auf die Frage und die „distclean“ und „Extraclean“ specific ... aber ich fand es in einer allgemeineren Weise nützlich. FYI Ich habe Option-1 verwendet. Vielen Dank! qmake ist sehr, sehr schwierig, dies zu tun. –

+0

Ich habe "distclean" hier durch einfaches altes 'clean' ersetzt, um meine benutzerdefinierten clean-Befehle über die Menüoption in QtCreator auszulösen. – BuvinJ

Verwandte Themen