Datum / Version im Dateinamen

Für Fragen rund um die Ide und zum Debugger
Antworten
Timm Thaler
Beiträge: 1091
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Datum / Version im Dateinamen

Beitrag von Timm Thaler »

Ist es möglich, in den Projekteinstellungen / Compilereinstellungen bei Ziel-Dateiname (Option -o) einen Platzhalter anzugeben, so dass das aktuelle Datum oder eine Versionsnummer an den Dateinamen angefügt wird?

Also statt myprog.exe dann myprog_200816.exe oder statt avrprog.hex dann avrprog_200816.hex.

Es gibt ja Platzhalter wie $(TargetOS), gibt es das auch für Datum?

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Datum / Version im Dateinamen

Beitrag von fliegermichl »

Man könnte Env(Variablenname) verwenden. Dazu müsste man z.B. in .bashrc eine entsprechende Variable setzen.

Socke
Lazarusforum e. V.
Beiträge: 2798
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Datum / Version im Dateinamen

Beitrag von Socke »

Im Wiki konnte ich kein passendes Macro finden. Man kann sich aber recht einfach eigene Macros erstellen:
  • Neues Package erstellen
  • Package als Entwicklungspackage in den Einstellungen markieren (nur Laufzeit geht nicht; muss in die IDE installiert werden)
  • IDEIntf als Abhängigkeit eintragen
  • Unit im Package anlegen
  • Im Packageinspektro die Unit mit der Checkbox "Registriere Unit" markieren
  • Code unten übernehmen, ggf. Unit-Namen anpassen
  • Package in die IDE installieren
  • Macro in den Projektoptionen verwenden, z.B. im Feld Zieldateiname: "$date()_project1"

Code: Alles auswählen

unit datemacro.macros;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, MacroDefIntf, MacroIntf;

type

  { TDateMacro }

  TDateMacro = class
  private
    fInstance: TDateMacro; static;
  public
    // Macro Funktion
    function MF_date(const s: string; const Data: PtrInt;
                            var Abort: boolean): string ;
    constructor Create;
    class function Instance: TDateMacro;
    Class procedure DoneInstance;
  end;

procedure Register;

implementation

procedure Register;
var
  m: TDateMacro;
begin
  // Macros dürfen erst in der Register-Prozedur erstellt werden
  // Das Registrieren der Macros im Initialization-Abschnitt führt zu
  // einer Endlosschleife
  m := TDateMacro.Instance;
end;

{ TDateMacro }

function TDateMacro.MF_date(const s: string; const Data: PtrInt;
  var Abort: boolean): string;
begin
  Result := FormatDateTime('YYYY-HH-DD', now());
  Abort := False;
end;

constructor TDateMacro.Create;
begin
  IDEMacros.Add(TTransferMacro.Create(
    'date',  // Das ist der Macroname
    '',
    'Returns the current date in Format YYYY-HH-MM',
    @MF_date,
    [])
  );
end;

class function TDateMacro.Instance: TDateMacro;
begin
  fInstance := TDateMacro.Create;
  Result := fInstance;
end;

class procedure TDateMacro.DoneInstance;
begin
  FreeAndNil(fInstance);
end;

finalization
  TDateMacro.DoneInstance;
end.
Und schon habe ich ein Programm mit dem Dateinamen "2020-12-37_project1.exe".
Zuletzt geändert von Socke am Fr 21. Aug 2020, 07:11, insgesamt 3-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Datum / Version im Dateinamen

Beitrag von fliegermichl »

Coole Sache,
das kannte ich noch gar nicht. Aber ich glaube ein kleiner Fehler ist noch da drin:
Socke hat geschrieben:
Do 20. Aug 2020, 12:38

class function TDateMacro.Instance: TDateMacro;
begin
fInstance := TDateMacro.Create;
end;
Muss das nicht

Code: Alles auswählen

class function TDateMacro.Instance: TDateMacro;
begin
  fInstance := TDateMacro.Create;
  Result := fInstance;
end;
heissen?

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Datum / Version im Dateinamen

Beitrag von fliegermichl »

Ich habe grad mal im Wiki nachgeschaut. Ich finde, diese Möglichkeit sich einfach selbst Macros erstellen zu können, sollte da mit rein.

Socke
Lazarusforum e. V.
Beiträge: 2798
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Datum / Version im Dateinamen

Beitrag von Socke »

fliegermichl hat geschrieben:
Do 20. Aug 2020, 12:50
Coole Sache,
das kannte ich noch gar nicht. Aber ich glaube ein kleiner Fehler ist noch da drin:
Im Prinzip ja, damit das Singleton korrekt funktioniert. Da in der Macrofunktion keine Daten des lokalen Objekts abruft, funktioniert das auch so.
Ich korrigier mal meinen Post.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wennerer
Beiträge: 201
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: Datum / Version im Dateinamen

Beitrag von wennerer »

Hallo Socke,
vielen Dank für das Beispiel. Ich habe es eben mal probiert und dank deiner Anleitung auch hinbekommen.
Über folgende Kleinigkeiten bin ich etwas gestolpert:
Ich musste bei mir zusätzlich noch das Package IDEIntf einbinden.
Und die Zeile

Code: Alles auswählen

Result := FormatDateTime('YYYY-HH-MM', now());
liefert das Jahr-die Stunde-die Minute.
Ich habe es geändert in

Code: Alles auswählen

Result := FormatDateTime('YYYY-MM-DD', now());
das liefert Jahr-Monat-Tag

Jetzt das Interessant daran:
Anschließend habe ich dann versucht noch die Zeit anzuhängen:

Code: Alles auswählen

Result := FormatDateTime('YYYY-MM-DD_hh-mm-ss', now());
Hier wurde zwar die Datei wie erwartet erzeugt, jedoch konnte Lazarus die kompilierte Datei nicht mehr öffnen. Hat ein Stück gedauert bis ich begriffen habe warum. In der Zeit vom Erzeugen der ausführbaren Datei bis zum Öffnen hat sich das Ergebnis des Makros geändert weil 3 Sekunden vergangen waren und somit die Dateinamen nicht mehr übereinstimmen.
Nur so als Info an alle die auch damit herum probieren.

Viele Grüße
Bernd

Socke
Lazarusforum e. V.
Beiträge: 2798
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Datum / Version im Dateinamen

Beitrag von Socke »

wennerer hat geschrieben:
Do 20. Aug 2020, 22:04
Ich musste bei mir zusätzlich noch das Package IDEIntf einbinden.
Vollkommen richtig; das habe ich offenbar auf dem Weg von Lazarus zum Browser vergessen.
wennerer hat geschrieben:
Do 20. Aug 2020, 22:04
Und die Zeile

Code: Alles auswählen

Result := FormatDateTime('YYYY-HH-MM', now());
liefert das Jahr-die Stunde-die Minute.
Ich habe es geändert in

Code: Alles auswählen

Result := FormatDateTime('YYYY-MM-DD', now());
das liefert Jahr-Monat-Tag
Ich muss jedesmal die Zeichen nachschauen, aber das ist offensichtlich besser so. Beides habe ich oben korrigiert.
wennerer hat geschrieben:
Do 20. Aug 2020, 22:04
Hier wurde zwar die Datei wie erwartet erzeugt, jedoch konnte Lazarus die kompilierte Datei nicht mehr öffnen. Hat ein Stück gedauert bis ich begriffen habe warum. In der Zeit vom Erzeugen der ausführbaren Datei bis zum Öffnen hat sich das Ergebnis des Makros geändert weil 3 Sekunden vergangen waren und somit die Dateinamen nicht mehr übereinstimmen.
Nur so als Info an alle die auch damit herum probieren.
Ich würde das als Bug betrachten: Lazarus sollte die Macros nur einmal auswerten und bis zum nächsten Kompilieren zwischenspeichern. Alternativ müsste die Macrofunktion das selbst machen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten