Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 11.3 - Packages und {$IF (https://www.delphipraxis.net/212688-delphi-11-3-packages-und-%7B%24if.html)

rabatscher 15. Mär 2023 13:51

Delphi 11.3 - Packages und {$IF
 
Für mein "kleines" Projekt auf https://github.com/mikerabat/mrmath wollte ich mich mal um eine ARM kompatible Version kümmern.
Zu diesem Zweck wollte ich mal zumindest ein "Conditional Compile" einfügen, dass keine assembleroptimierten Versionen
der Funktionen einbindet.

Dazu wollte ich im Package file (mrmath.dpk) folgende Zeilen einfügen:


{$IF not defined(x86) and not defined(x64)}
{$DEFINE MRMATH_NOASM}
{$ifend}

und auch

{$IF CompilerVersion >= 340}
{$LIBSUFFIX AUTO}
{$IFEND}


und dann später im File, an der Stelle an der die Dateien eingefügt werden:
{$IFNDEF MRMATH_NOASM}
ASMMatrixAddSubOperations in '..\..\ASMMatrixAddSubOperations.pas',
ASMMatrixAddSubOperationsx64 in '..\..\ASMMatrixAddSubOperationsx64.pas',
ASMMatrixElementwiseMultOperations in '..\..\ASMMatrixElementwiseMultOperations.pas',
ASMMatrixElementwiseMultOperationsx64 in '..\..\ASMMatrixElementwiseMultOperationsx64.pas',
... (und noch ein dutzend anderer Dateien)
{$ENDIF}


Das Konstrukt wird in der IDE immer als "ausgegraut" dargestellt, beim Compilieren aber werden die
Datein importiert allerdings mit der Warnung, dass diese "implizit" eingefügt werden.

{$IF CompilerVersion >= 340}
{$LIBSUFFIX AUTO}
{$IFEND}
Das Konstrukt funtioniert überhaupt nicht - das IF kann vom Compiler nicht evaluiert werden und wird als Fehler ausgegeben.


Hat da wer ne Idee?

Andreas13 15. Mär 2023 14:08

AW: Delphi 11.3 - Packages und {$IF
 
Zitat:

{$IF not defined(x86) and not defined(x64)}
Meines Wissens müßte es heißen:

Delphi-Quellcode:
{$IFNdef CPUX86} AND {$IFNdef CPUX64}
Grüße, Andreas

himitsu 15. Mär 2023 14:17

AW: Delphi 11.3 - Packages und {$IF
 
Ja, x68/x64 gibt es nicht, dort die anderen Namen.

Ansonsten sollte es egal sein ob
Delphi-Quellcode:
{$IFnDEF xxx
oder
Delphi-Quellcode:
{$IF not Defined(xxx)
,
wobei das IF den Vorteil von AND, OR und NOT hat.

rabatscher 15. Mär 2023 14:29

AW: Delphi 11.3 - Packages und {$IF
 
Autsch... danke für den Hinweis... ich hatte diese Defines in den anderen Files definiert (auch mit FPC Kompatibilität im Hinterkopf...).


Weiß nur eventuell wer warum das
{$IF CompilerVersion >= 340}

einen Fehler verursacht?
dcc32 E2026: Konstantenausdruck erwartet

himitsu 15. Mär 2023 14:48

AW: Delphi 11.3 - Packages und {$IF
 
Hast du dafür auch eine eigene Konstante? (zusätzlich zu der in System.pas)

Hier kann man nur "echte" Konstanten benutzen, keine typisierten Konstanten (schreibgeschützte Variablen).



Und DEFINEs werden nicht über Unitgrenzen hinweg durchgereicht.
Das geht nur beim
Delphi-Quellcode:
{$INCLUDE
.

Uwe Raabe 15. Mär 2023 16:42

AW: Delphi 11.3 - Packages und {$IF
 
Die CompilerVersion von Delphi 11 ist 35.0 - 340 ist also noch eine Weile hin...

rabatscher 16. Mär 2023 09:18

AW: Delphi 11.3 - Packages und {$IF
 
Ja die Versio stimmt ned so richtig (habs eh auch mit 34.0 probiert...) aber...
es scheint dieses {$If Compilerversion....} darf nicht im dpk gemacht werden - es geht in den Units aber
nicht im dpk (warum eigentlich??)

In Delphi2010 hab ichs eh auch nicht zum Laufen gebracht also denk ich mal es war schon immer so...

Es wird also mit {$libsuffix auto} nichts werden ;) (inklusive der ganzen QC die das eh schon hat)

Uwe Raabe 16. Mär 2023 09:57

AW: Delphi 11.3 - Packages und {$IF
 
Zitat:

Zitat von rabatscher (Beitrag 1519935)
es scheint dieses {$If Compilerversion....} darf nicht im dpk gemacht werden - es geht in den Units aber
nicht im dpk (warum eigentlich??)

Weil die Konstante CompilerVersion in System.pas deklariert ist (wenn auch nicht explizit). Nun wird System bei einer Unit zwar unsichtbar immer in die Uses-Anwesiung eingebunden, aber eine DPK hat eben keine Uses-Anweisung und kann somit diese Konstante nicht sehen.

rabatscher 16. Mär 2023 10:22

AW: Delphi 11.3 - Packages und {$IF
 
Oh wow... das wusste ich nicht. Ich dachte das wäre was, was ja tatsächlich vom Compiler zur Verfügung gestellt wird,
ähnlich wie CPUX86

Aber gut, dann wird sich für mich ein automatisches Libsuffix nicht spielen...

Uwe Raabe 16. Mär 2023 12:55

AW: Delphi 11.3 - Packages und {$IF
 
Zitat:

Zitat von rabatscher (Beitrag 1519940)
Aber gut, dann wird sich für mich ein automatisches Libsuffix nicht spielen...

Und wie würde dann jetzt deine Alternative aussehen?

rabatscher 17. Mär 2023 11:43

AW: Delphi 11.3 - Packages und {$IF
 
Ich werde versuchen ein Inc File zu erstellen, das alle Versionen (Delphi 2010 bis jetzt) abdeckt.

{$IFDEF VER280}
{$LIBSUFFIX '280'}
{$ENDIF}

usw...

Falls jemand da eine bessere Idee hat bin für alles offen :)

Uwe Raabe 17. Mär 2023 12:32

AW: Delphi 11.3 - Packages und {$IF
 
Na ja, folgendes steht in der Hilfe zu Project Magician:
Zitat:

Auto LibSuffix

Maintaining packages for different Delphi versions requires to use a decent LIBSUFFIX to distinguish the bpl-files for each version. Creating the project files for a new Delphi version usually involves copying those from the previous version to a new folder and adjusting the LIBSUFFIX entries. This option eliminates the last step.
Ob das für deinen Anwendungsfall passt kann ich aber jetzt nicht beurteilen. Es funktioniert gut, wenn man die Packages in der IDE aufmacht und erzeugt. Das geht auch in der Regel mit einem Package für alle Delphi-Versionen. Bei einem Build-Server klappt das naturgemäß nicht so ohne weiteres, aber das tut $(Auto) auch nicht.

Allerdings gibt's den Project Magician auch nur bis XE3 runter.

rabatscher 17. Mär 2023 13:22

AW: Delphi 11.3 - Packages und {$IF
 
Ich wollte eine Lösung, die bis Delphi2010 funktioniert - wir benutzen zur Zeit D2010 und delphi 11.3
und da die Lib auf Github ist, sollte das eventuell auch für andere Versionen funktionieren.

Ich wollte eben nicht für jede Delphi Version ein eigenes DPK erstellen - wie es andere Anbieter ja machen -
sondern nur eines.
Ein dpk (ohne Version) funktioniert ja auch, solange nur eine Delphi Version am Rechner installiert ist.
Bei unserer Transition von 2010 auf 11 sollten ja irgendwie beide Umgebungen noch funktionieren...

Auf https://docwiki.embarcadero.com/RADS...bjects_(Delphi)
wird ja auch auf ein Beispiel mit einem Inc File verwiesen (http://www.codenewsfast.com/cnf/arti...okmark.6481542).

himitsu 17. Mär 2023 13:48

AW: Delphi 11.3 - Packages und {$IF
 
Es reicht doch für die Alten
und dann ein ELSE mit AUTO.

Und mit IF statt IFDEF hast auch ein ELSE-IF
Delphi-Quellcode:
{$IF Defined(VER270)}

{$ELSEIF Defined(VER280)}

{$ELSE}

{$IFEND}

Uwe Raabe 17. Mär 2023 15:04

AW: Delphi 11.3 - Packages und {$IF
 
Bei solchen Konstrukten muss man bei DPKs vorsichtig sein, dass die IDE einem das nicht wieder kaputt macht. Da sind DPKs noch empfindlicher als DPRs.

Uwe Raabe 17. Mär 2023 15:08

AW: Delphi 11.3 - Packages und {$IF
 
Zitat:

Zitat von rabatscher (Beitrag 1520003)
Ich wollte eben nicht für jede Delphi Version ein eigenes DPK erstellen - wie es andere Anbieter ja machen -
sondern nur eines.

Virtual-TreeView macht das gemischt: Für 10.4+ gibt es nur ein Package mit $(Auto), was zum Support zukünftiger Delphi-Versionen ja ausreicht.

rabatscher 20. Mär 2023 10:27

AW: Delphi 11.3 - Packages und {$IF
 
Danke für den Hinweis!!!

Ich habs jetzt mit einem Inc File bewerkstelligt, das ab Ver340 {$Libsuffix AUTO} benutzt.
Damit denke (hoffe) ich sollte es funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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