AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Zugriff auf Environmental-Variablen mit compiler directives (Pre-Compile-Script) ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Rollo62 · begonnen am 29. Apr 2020 · letzter Beitrag vom 30. Apr 2020
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.170 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 29. Apr 2020, 10:51
Delphi-Version: 5
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.

Geändert von Rollo62 (29. Apr 2020 um 15:33 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?

  Alt 29. Apr 2020, 11:31
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
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.170 Beiträge
 
Delphi 12 Athens
 
#3

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?

  Alt 29. Apr 2020, 14:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.355 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?

  Alt 29. Apr 2020, 14:57
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.170 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ist der Zugriff auf Environmental variables mit compiler directives möglich ?

  Alt 29. Apr 2020, 15:30
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 ?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 29. Apr 2020, 16:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.633 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 29. Apr 2020, 17:30
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.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.170 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 29. Apr 2020, 18:16
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.

Geändert von Rollo62 (29. Apr 2020 um 18:20 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#9

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

  Alt 30. Apr 2020, 08:18
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz