Run - "Build" - "Compile many modes" - "Clean Up and Build"

Für Fragen rund um die Ide und zum Debugger
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Run - "Build" - "Compile many modes" - "Clean Up and Build"

Beitrag von Nimral »

Hi,

eigentlich suche ich eine Lösung für ein Alltagsproblem: wenn ich auf der Käferjagd mit dem Debugger durch meinen Code steppe (F8), verzweigt das Debugging *manchmal* in separat kompilierte Units (idR eingebunden als Package/LPK), und manchmal nicht. Ich möchte gerne lernen, wie man das steuert, und parallel dazu auch sicherstellen, dass beim letzen Build vor Ausliederung (im Release mode) wirklich kein Debug-Code mehr im Projekt vorhanden ist, d.h. auch alle eingebundenen Units ohne Debug durchkompilieren.

Zu den o.g. Menüs fand ich leider nur denkbar wenig Dokumentation, ein paar dürre Sätze in der Lazarus Help Datei, die offenbar noch aus einer Ur-Ur-Version von Lazarus stammen, und so richtig Sinn machen sie bisher auch nicht.

Ich bekomme das gewünschte Verhalten bisher nur, indem ich den Quellcode aller eingebundenen Packages nochmal zu meinem File-Tree hinzufüge, aber das kanns ja wohl nicht sein, oder?

Wer kann mich erhellen, wie diese Menüs genau funktioneren (vor allem im Zusammenspielen mit eingebundenen Packages), und wie ich schlussendlich ein Verhalten bekomme bei dem die eingebundenen Packages in ihrem Debug-Verhalten stets der Konfiguration meines Projektes folgen: schalte ich das aktuelle Projekt auf "Debug", möchte nach dem nächsten Build auch alle eingebundenen Libraries debuggen können, schalte ich auf "Release" möchte ich jedweden Debug-Code aus dem Projekt haben.

Danke euch mal wieder für eure Zeit,

Armin.

charlytango
Beiträge: 842
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Run - "Build" - "Compile many modes" - "Clean Up and Build"

Beitrag von charlytango »

ich habe da jetzt nicht die letzte Wahrheit, aber möglicherweise können einige Strategien helfen.

Im wesentlichen sind bei mir Codeteile die ich zum Debuggen brauche mit Kompilerdirektiven umgeben.

Code: Alles auswählen

{$IFDEF DEBUG  }
            DebugLn('Hi');
{$ENDIF}
    //Some code;
und das auch inline und im uses Bereich

Code: Alles auswählen

uses
  a,b{$IFDEF DEBUG  },c{$ENDIF}
  ;
Diese thread meint dass es besser wäre

Code: Alles auswählen

 {$IFOPT D-}
  //code
 {$ENDIF}
zu verwenden, weil das von der Lazarus-GUI gesetzt wird - ausprobieren
https://stackoverflow.com/questions/309 ... ct#4087973

andere Quellen:
viewtopic.php?f=5&t=13132&p=116809&hili ... ug#p116809
https://forum.lazarus.freepascal.org/in ... ic=35178.0

Andererseits kannst du ja auch für unterschiedliche Build Modes (debug, release etc) eigene Defines definieren die dann auch Programmweit gelten, was den gleichen Effekt hat.

Was meinst du genau mit
Nimral hat geschrieben:
Sa 3. Apr 2021, 09:05
Ich bekomme das gewünschte Verhalten bisher nur, indem ich den Quellcode aller eingebundenen Packages nochmal zu meinem File-Tree hinzufüge, aber das kanns ja wohl nicht sein, oder?

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: Run - "Build" - "Compile many modes" - "Clean Up and Build"

Beitrag von wp_xyz »

Der Schlüssel zu diesem Vorhaben ist die Seite mit dem unaussprechlichen Namen "Hinzufügungen und Beeinflussungen" in den Projekt-Optionen. Wenn du hier unter "Hinzufügen" Debug-Informationen definierst, so gelten sie projektweit und auch in die verwendeten Packages hinein. Klicke auf "Gespeichert in der Projektsitzung" bzw. "Gespeichert im Projekt" (je nachdem, wo du die Einstellung speichern möchtest), dann "Hinzufügen" > "Benutzerdefinierte Option", dann in die erscheinende Eingabezeile "Custom" und schreibe dort "-gw2" (ohne Anführungsstriche, evtl auch andere Debugparameter, je nachdem was funktioniert). "OK". Wenn du nun das Projekt neu kompilierst, dann werden auch alle benötigten Units mit "-gw2" (Dwarf2)neu übersetzt, was etwas dauert, aber nun kann der Debugger in die Tiefen der LCL und von Packages von Drittanbietern eindringen (außer FCL und RTL).

Das ganze würde ich einem Build-Mode "Debug all" o.ä. zuordnen. Weiterhin würde ich - das war die andere Frage - einen Build-mode "Release" definieren, in dem auf Seite "Debuggen" das Häkchen "Generate info for the debugger" abgewählt ist. Das ist aber bereits bei dem automatisch erzeugten Release-Mode so voreingestellt. Das hält dein Programm frei von Debug-Informationen.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Run - "Build" - "Compile many modes" - "Clean Up and Build"

Beitrag von Nimral »

Herzlichen Dank, ich habs noch nicht probiert, aber das klingt sehr schlüssig, ich denke mit diesen Infos bekomme ich gebacken was ich möchte.

"Hinzufügen zum File-Tree" meint genau das. Ich habe ja im Projekt-Inspektor einen Baum mit zwei Abschnitten "Files" (das ist das was ich meinte) und "Required Packages". Ich habe mal durch Trial and Error herausgefunden, dass ich die Quelle eines Packages über Rechtsklick-Add zu den Files hinzufügen kann, obwohl die Datei eigentlich als Teil eines .lpk schon mal eingefügt wurde. Dann wird die darin enthaltene Unit ggf. offenbar mit den Debug-Einstellungen des aktuellen Projekts neu übersetzt und ich bekomme das Verhalten das ich möchte. Das ging aber natürlich nur bei selbsterstellten kleinen Komponenten, deren Packages aus gerade mel einer Unit-Datei bestehen.

Wisst ihr vielleicht auch, was es mit dem "Build Many Modes" auf sich hat? Der Menüpunkt wird erst aktiv, wenn ich "Debug und Release" Modes zum Projekt hinzugefügt habe. Andererseits bekomme ich in beiden Modi immer nur die selbe .exe Datei (andere Systeme wie z.B. Visual Studio machen Unterverzeichnisse für Debug und Release da hätte ich den Verdacht dass einfach alle definierten Configs durchkompiliert würden).

Ist das so gedacht dass ich dann noch in allen Configs auch noch separate Ausgabeverzeichnisse eintragen muss, damit der Menüpunkt einen Sinn bekommt?

Armin

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: Run - "Build" - "Compile many modes" - "Clean Up and Build"

Beitrag von wp_xyz »

Nimral hat geschrieben:
Sa 3. Apr 2021, 15:02
Wisst ihr vielleicht auch, was es mit dem "Build Many Modes" auf sich hat? Der Menüpunkt wird erst aktiv, wenn ich "Debug und Release" Modes zum Projekt hinzugefügt habe. Andererseits bekomme ich in beiden Modi immer nur die selbe .exe Datei (andere Systeme wie z.B. Visual Studio machen Unterverzeichnisse für Debug und Release da hätte ich den Verdacht dass einfach alle definierten Configs durchkompiliert würden).

Ist das so gedacht dass ich dann noch in allen Configs auch noch separate Ausgabeverzeichnisse eintragen muss, damit der Menüpunkt einen Sinn bekommt?
Genau. Hab's gerade ausprobiert: Nach dem Klicken von "Build many modes" kommt eine Auswahlbox mit allen definierten Buildmodes, und man kann durch Häkchen festlegen, welche davon kompiliert werden sollen. In der Standardeinstellung mit derselben Ausgabedatei wird diese natürlich mit jedem Mode überschrieben. Also: bevor du das machst, wähle jeden Build-Mode in den Einstellungen an, gehe zur Seite mit den Pfaden und trage in der Zeile "Target file name" den Pfad vor dem Namen des Binary ein. Es gibt auch ein Macro $(BuildMode) für den aktuellen Build-Mode. Wie ich gesehen habe, ist das für "Build many modes" nicht geeignet, weil es nur den in der IDE eingestellten Mode repräsentiert und beim Iterieren durch die Buildmodes nicht mitläuft. Und Achtung: Beim Eintragen des Namens der Ausgabedatei muss das .exe bei Windows unterbleiben, sonst bekommst du ein "Programm.exe.exe".

Antworten