Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script) ? (https://www.delphipraxis.net/204148-zugriff-auf-environmental-variablen-mit-compiler-directives-pre-compile-script.html)

Rollo62 29. Apr 2020 11:51

Delphi-Version: 5

Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script) ?
 
Hallo zusammen,

der FPC hat ein schönes Feature, gibt es vielleicht was Vergleichbares bei Delphi Pascal ?
! Wohlgemerkt, mir geht es um die Auswertung VOR dem eigentlichen Code-teil,
um die Ergebnisse in einem conditionalen Code benutzen zu können, ohne Include "{I 'MyInc.inc'}".
Wie der Zugriff im Code funktioniert ist mir klar.

Zitat:

1.1.23 $I or $INCLUDE : Include compiler info

In this form:

{$INCLUDE %xxx%}

where xxx is one of TIME, DATE, FPCVERSION or FPCTARGET, will generate a macro with the value of these things. If xxx is none of the above, then it is assumed to be the value of an environment variable. It's value will be fetched, and inserted in the code as if it were a string.

For example, the following program

Program InfoDemo;

Const User = {$I %USER%};


begin
Write ('This program was compiled at ',{$I %TIME%});
Writeln (' on ',{$I %DATE%});
Writeln ('By ',User);
Writeln ('Compiler version : ',{$I %FPCVERSION%});
Writeln ('Target CPU : ',{$I %FPCTARGET%});
end.

Creates the following output :

This program was compiled at 17:40:18 on 1998/09/09
By michael
Compiler version : 0.99.7
Target CPU : i386


Sowas naheliegendes "Const User = '$(MyVar)';" hatte ich schon probiert, geht leider nicht.

Delphi.Narium 29. Apr 2020 12:31

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?
 
Hab' mir mal vor Jahren 'nen Before-/AfterCompile-Experten geschrieben, der u.a. 'ne Include-Datei für das gerade zu kompilierende Projekt erstellt. Dadrin stehen diverse Daten wie z. B. das Kompilierdatum, diverses aus den Versionsinformationen zum Projekt.

Der Experte müsste auch auf die Umgebungsvariabeln zugreifen können, die man dann beim Schreiben der Includedatei berücksichtigen kann.
Prinzipiell müsstest Du dort alles das nutzen können, was Du auch in 'nem Programm nutzen kannst.
Delphi-Quellcode:
{$DEFINE SBExperten_BeforeCompile}
(* Konstanten für die Versionsinformationen ... *)
Const
  csFV_CompileDate            = '29.04.2020';
  csFV_CompileTime            = '11:31:55';
  csFV_LastCompile            = '29.04.2020 11:31:55';
  csFV_FileName               = 'Project1';
  csFV_LegalCopyright         = 'Copyright 2020 Dein Name oder sonstwas';
  csFV_Compiler               = 'Delphi 7';
  csFV_CompilerVersion        = '15';
  csFV_RTLVersion             = '15';
  csFV_FileVersion            = '0.0.0.0';
  csFV_CompanyName            = 'Firmenname';
  csFV_InternalName           = 'Project1';
  csFV_OriginalFilename       = 'Project1';
  csFV_ProductName            = 'Project1';
  csFV_ProductVersion         = '0.0.0.0';
  csFV_FileDescription        = 'Eine vernünftige Programmbeschreibung';
  csFV_LegalTradeMarks        = '';
  csFV_Comments               = 'Ein sinnvoller Kommentar zum Programm.';
  csFV_MajorVersion           = '0';
  csFV_MinorVersion           = '0';
  csFV_ReleaseVersion         = '0';
  csFV_BuildVersion           = '0';
  csFV_CodePage               = '1252';
  csFV_Locale                 = '1031';
Das Erstellen einer Includedatei, die alles das, was Du in Deinem Beispiel aufführst enthält, sollte ohne übermäßig großen Aufwand möglich sein und steht Dir dann bei allen Programmen zu Verfügung. Ob Du die Includedatei nun in alle Programme einbindest oder nicht, bleibt Dir überlassen. Da sie vor jedem Kompilieren neu erstellt wird, enthält sie immer die aktuellen Informationen zum aktuellen Projekt.

Zum Stöbern, wie es eventuell umzusetzen sein könnte: IOTAProject site:delphipraxis.net

Rollo62 29. Apr 2020 15:36

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?
 
Dankesehr, ist zumindest eine Lösung.
Auch wenn ich doch noch hoffe das solche Dinge in der IDE/Sprache selbst erledigt werden können.

Das ich z.B. nicht prüfen kann ob eine Include-Date an einem Ort existiert ist ziemlich blöd,
denn dann könnte ich stattdessen eine Default-Datei includieren.
Der Weg über die Environment-Variablen wäre auch als Krücke für solche Dinge gedacht.

Include-Datei automatisch erzeugen ist natürlich möglich, damit wäre dann theoretisch auch noch mehr machbar.
Muss ich mal sacken lassen.

Eine andere Überlegung die ich hatte war das man Settings über Option-Sets verwaltet,
um z.B. Gruppen von Includes bequem ein- und auszuschalten.
Auch das ist aber nicht so komfortabel und sicher das ich mich darauf immer verlassen möchte.
Bei den Options scheint bei mir immer was hängen zu bleiben, oder man hat sich einmal vertippt
und dann ist er hinüber.

Wahrscheinlich ist ein kleines, externes Tool was dies alles regeln kann wirklich das Beste.
Welches dann im Pre- Post-Compiler aufgerufen werden kann, und zusätzlich noch manuell.
So könnte man ein frisches Projekt nehmen, einfach eimal tool.exe /INIT FMX_Typ_01 o.ä. aufrufen, und alles wäre ruckzuck vorbereitet.

himitsu 29. Apr 2020 15:57

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?
 
Per se ist es nicht möglich dass "Variablen" im Compiler und in Strings aufgelöst werden.

Man kann sich ein PreCompileScript basteln und dort die PAS/INC umschreiben/aktualisieren.

Rollo62 29. Apr 2020 16:30

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?
 
Ja so hatte ich Delphi.Narium auch verstanden.

Oder gibt es einen Unterschied zw. "Experten" und "Script", siehe unten ?
Womöglich kann ein Script nicht die geöffneten, modifizierten Units sehen,
der Experte aber schon.

Ich frage mal blöd, gibt es da eigentlich nichts Fertiges auf das man Aufbauen kann ?

Delphi.Narium 29. Apr 2020 17:25

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Ein Experte ist ein Delphi-Package, das in die IDE eingebunden wird (wie jedes beliebige andere Package auch, Package erstellen, kompilieren, installieren).

Bei einem Experten, der auf das Ereignis BeforeCompile reagiert, musst Du "nur" den Experten nach Deinen Wünschen erstellen. Beim Kompilieren ruft die IDE den automatisch immer auf. Du hast also genau einmal Arbeit nach Deinen Wünschen zu erledigen.
Du schreibst bei 'nem Experten letztlich nix weiter, als ein Delphiplugin, mit allen Dir in Delphi zur Verfügung stehenden Möglichkeiten, mit dem Du Dir Deine IDE selbst nach Deinen Wünschen erweiterst.

Ein Script ist 'ne Batchdatei, ein VB-Script, ein was auch immer, dass Du selbst aufrufen musst oder halt irgendwie in Deinen Buildprozess integrieren musst.

Ein Experte hat aber den Vorteil, er kennt das zu kompilierende Projekt und hält eine nicht unerhebliche Anzahl von Informationen vor, an die Du per Batch, VB-Script, ... niemals herankommst. Der Experte "weiß" quasi alles vom Projekt, was Delphi (also die IDE) auch weiß. Versionsinfos des Projektes, Dateinamen, Quelltexte, Informationen über sich selbst ...

Zitat:

Ich frage mal blöd, gibt es da eigentlich nichts Fertiges auf das man Aufbauen kann ?
Was meinst Du damit?

Bist Du mal den oben von mir verlinkten Suchergebnissen gefolgt?

Da solltest Du Experten finden, die Du nach Deinen Wünschen selbst anpassen kannst.

Ein Muster für 'nen BeforeCompile-Experten ist auch dabei. Du musst halt nur dort, wo die Batchdatei erstellt wird, eine Include-Datei erstellen, die Du nach Deinen Wünschen befüllst. Die musst Du halt per {$I Dateiname} in die dpr (oder sonst eine von Dir gewünschte Quelltextdatei) einbinden und der Kompiler berücksichtigt automatisch den Inhalt, da die Include ja letztlich nix weiter als ein Stück Quelltext des Programmes ist.

Den Aufruf der Batchdatei per ShellExecute aus dem Experten schmeißt Du raus. Damit sollte das Problem dann eigentlich gelöst sein.
Aufwand: Vermutlich weniger, als die bisherige Recherchearbeit zur Suche nach einer Lösung ;-)

Bernhard Geyer 29. Apr 2020 17:36

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Für "Delphi-Version: 5"?

Delphi.Narium 29. Apr 2020 17:40

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Die 5 steht doch immer da, wenn man nix angibt. Dürfte wohl eher die Version aus dem Userprofil sein, die da "Delphi 10.3 Rio" ist.

himitsu 29. Apr 2020 17:46

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Der Experte hat den Vorteil, dass es während der Arbeit direkt in der IDE und in geöffneten Dateien Änderungen vornehmen kann.

Das PreCompileScript hat es da etwas schwerer, auch wenn es dort ebenfalls mehrere Umgebungsvariablen gibt, die was über das Projekt aussagen.
Zusätzlich steht Dieses in der DPROJ, wobei die DPROJ auch wiederrum ein XML-BuildScript ist, welches z.B. von MSBuild verstanden wird und somit das PreCompileScript dort auch ausgeführt wird.



Jemand hatte mal einen PreCompiler für delphi geschrieben, wo man sowas machen konnt, aber seit der neuen IDE nach Delphi 7 sind die Zugangspunkte weg, wo er sich damals reingehäckt hatte. :cry:
So Dinge wie Precompiler, Makros usw. hatten sich schon viele gewünscht, aber leider gibt es das nicht für Pascal ... nur im C++Builder.
https://www.delphipraxis.net/59965-s...__-delphi.html
http://docwiki.embarcadero.com/RADSt...inierte_Makros

Im C++Builder kann man auch PAS-Units einbinden, aber andersrum bekommt man keine C/H ins Pascal rein.

Rollo62 29. Apr 2020 18:21

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Sorry Delphi.Narium, hab mich wohl etwas unklar ausgedrückt.
Ich weiss wohl was Experte und Script sind.

Meine Vermutung hat himitsu ja gerade bestätigt.
Heisst wohl das bei Skripten muss man vorher "Save all" Drücken, was ich sowieso immer mache.
Das Problem kommt eben dann wenn man es doch mal vergisst, da ist der Experte schon sicherer.
(ich meine aber es gibt auch eine IDE-Aktion Save before build, oder so ähnlich, das würde dann helfen).

Eigentlich wollte ich für sowas nicht unbedingt Experten einsetzen, sondern eher die Pre-Build Scripte.
Im Wesentlichen weil ich nicht sicher bin ob die Experten auch in einer CI Umgebung richtig laufen würden.

Bei Skripten kann man sich bei irgendwelchen Problemen selber behelfen.

Aber danke für die Beschreibung, werde mir mal so einen Experten genauer ansehen.

Mit "etwas Fertiges" meinte ich ein Tool für genau so einen Fall.
Solche Pre-Compiler Wünsche müsste doch fast jeder IDE-Nutzer haben.
Kann ja sein das etwas im CnPack, GExperts oder ähnlichem was versteckt ist,
aber ich bin mit der Installation solcher Packages generell immer etwas (über)-vorsichtig.

Uwe Raabe 29. Apr 2020 18:30

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Zitat:

Zitat von Rollo62 (Beitrag 1463116)
Sowas naheliegendes "Const User = '$(MyVar)';" hatte ich schon probiert, geht leider nicht.

Was soll denn dabei herauskommen? Der User, der den Compiler angeworfen hat, oder der User, der das Programm gestartet hat?

Ersteres wäre wohl in vielen Fällen der User unter dem der Build-Server läuft.

Zitat:

Zitat von Rollo62 (Beitrag 1463160)
Solche Pre-Compiler Wünsche müsste doch fast jeder IDE-Nutzer haben.

Scheint nicht wirklich verbreitet zu sein. Vielleicht fehlt mir auch nur das Verständnis mangels eines konkreten Anwendungsfalls.

Rollo62 29. Apr 2020 19:16

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1463161)
Zitat:

Zitat von Rollo62 (Beitrag 1463116)
Sowas naheliegendes "Const User = '$(MyVar)';" hatte ich schon probiert, geht leider nicht.

Was soll denn dabei herauskommen? Der User, der den Compiler angeworfen hat, oder der User, der das Programm gestartet hat?

Das war ja nur ein Beispiel aus einem FPC Dokument, wie man irgendwelche Werte da rausholt.
http://www.math.uni-leipzig.de/pool/...00000000000000

Zitat:

Write ('This program was compiled at ',{$I %TIME%});
Writeln (' on ',{$I %DATE%});
Writeln ('By ',User);
Writeln ('Compiler version : ',{$I %FPCVERSION%});
Writeln ('Target CPU : ',{$I %FPCTARGET%});

Zitat:

Zitat:

Solche Pre-Compiler Wünsche müsste doch fast jeder IDE-Nutzer haben.
Scheint nicht wirklich verbreitet zu sein. Vielleicht fehlt mir auch nur das Verständnis mangels eines konkreten Anwendungsfalls.
Mit einem richtigen PreCompiler oder PreCompile-Script wäre manches möglich.

Ein Beispiel s.u. von Delphi.Narium, um Version Info settings zu holen und auch für externe Setup-Tools zu setzen.

Ausserdem könnte ein solches Tool einen Versionszähler bauen der wirklich funktioniert.

Bei mehreren Platformen, Konfigurationen kommt bei der Version Info manchmal was Durcheinander.
Das könnte ein PreCompile-Script womöglich setzen und korrigieren.

Auch könnte ein PreCompile-Script vorhandene Konfigurations-Vorlagen mit in die Options und Includes einbinden, und zwar fehlerfrei.
Zum Beispiel nur die Versions-Nummer, die man bei mehreren Konfigurationen mehrfach setzen muss.
Das könnte ein Script womöglich einmalig, und dann für Alle gleich übernehmen.

Es könnte auch Testen ob noch Alle settings richtig sind, oder ob ein Permission-Schalter fehlt,
besser noch setzt er das fehlene gleich.

Es könnte das Signieren und die erforderlichen Key's und so weiter erzeugen, verwalten, setzen.

Ich meine die ganze Handarbeit in den Optionen könnte größtenteils automatisiert werden.

Ich weiss das Du die OptionSets benutzt, das ist auch OK, mir felt da aber das sichere Automatisieren und Konfigurieren von mehreren OptionSets.
Z.B. würde ich gerne OptionsSets für Features anlegen,
OptionSet-Camera : setzt alles Notwendige für Camera in Win/iOS/Android/...
OptionSet-Location: setzt alles Notwendige für Camera in Win/iOS/Android/...
OptionSet-Maps : setzt alles Notwendige für Camera in Win/iOS/Android/...
....

Diese OptionSets wären dann erstmal wiederverwendbar, ich mus mir mein neues Projekt aber von Hand zusammenklicken.

OptionSet-Maps käme s.o. auch schon an eine Grenze, weil zwei individuelle API-Keys (DEBUG/RELEASE) benötigt werden.

Sowas würde ich gerne in einer Projektvorlage unterbringen (mehr oder weniger eine komprimierte .dproj Vorlage), welche dann die ganze .dproj konfiguriert, und bei Bedarf auch Includes o.ä. anpassen kann.

Was ein solches System noch leisten könnte wäre die einfache Migration von einem Projekt zu einem anderen Kunden, indem alle Settings, Zertifikate, API-Keys, etc. umgeschaltet werden.

Von den gefühlt 500 Parameter ändern sich in der Praxis wohl nur 10-20, und genau die wären meine ideale Projekt-Vorlage.

Delphi.Narium 30. Apr 2020 09:18

AW: Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script)
 
Bin mir fast sicher, dass alle Deine Wünsche per Experten erfüllt werden können.

Die Versionsnummer wird bei mir immer per Experte gesetzt und das funktioniert seit Jahren fehlerfrei.

Auch wenn ich meine Exen nicht signiere (für die Hobbyprogrammierung mit Delphi 7 wohl nicht nötig) hab' ich mal 'nen eigenen "Schutzmechanismus" eingebaut. Nach dem Kompilieren wird die fertige Exe um die MD5-Checksumme ihrer Selbst erweitert. Beim Start prüft sie, ob diese MD5-Checksumme noch stimmt. Änderungen durch Viren, Resourceeditoren ... werden so zuverlässig erkannt.

Im BeforeCompile kannst Du eigentlich alle Quelltexte des Projektes parsen, ergänzen, Dateien verändern, Includes einfügen, sofern nicht vorhanden, die Projektoptionen prüfen, anpassen, erweitern, ...
Genaugenommen kannst Du dort wohl so ziemlich alles machen, was Du auch durch "Klickerei" in der IDE erreichen kannst.

Im AfterCompile kannst Du dann alles erledigen, was eben mit einem fertig kompilierten Projekt noch zu "veranstalten" ist.

Klar: Wenn Du per Script und Kommandozeilencompiler, in 'nem Buildprozess ..., Deine Projekte erstellst, sind diese Möglichkeiten nicht gegeben.

Aber ein neues Projekt nach Deinen Wünschen per Experte zu erstellen, die Einstellungen eines vorhanden Projektes zu prüfen, zu korrigieren, zu erweitern ..., sollte durchaus im Rahmen des Möglichen sein.

Wenn man sich mal so anschaut, was z. B. GExperts so alles kann, sieht man, wie Leistungsfähig der Umgang mit Experten ist. Und ich bin mir sicher, dass da die Möglichkeiten von Experten noch bei weitem nicht ausgereizt sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf