Entwickler-Ecke

Programmierwerkzeuge - dcc64.exe per Befehlszeile aufrufen


galagher - Sa 23.11.19 10:03
Titel: dcc64.exe per Befehlszeile aufrufen
Guten Morgen!

Wenn ich den Delphi-Compiler dcc64.exe per Befehlszeile aufrufen möchte, wie ist der Aufbau der Parameter? Was ist da zu beachten?


Th69 - Sa 23.11.19 11:07

Einfach mal "dcc64" oder "dcc64 -h" aufrufen. Das sollte dann eine Liste ähnlich wie zu DCC32.EXE, the Delphi Command Line Compiler [http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/dcc32_xml.html] ausgeben.


galagher - Sa 23.11.19 19:59

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Einfach mal "dcc64" oder "dcc64 -h" aufrufen.
Habe ich bereits gemacht, aber - naja, ist ja enorm, was es da an Parametern gibt ...
Also dachte ich, ich versuche einfach die Befehlszeile, die die IDE in die Meldungsliste schreibt, direkt so, wie sie ist. Klappt so nicht, das läuft bloss durch und dann schliesst sich das cmd.exe-Fenster, ohne dass man etwas lesen kann.

Also habe ich das Ganze aus der IDE-Liste kopiert, in einen Texteditor eingefügt, die Pfadnamen in Anführungszeichen gesetzt, drunter "pause" geschrieben und eine .bat daraus gemacht. Ebenso Fehlanzeige.
Letzter Versuch: Mit user profile iconmaels HxD Hex-Editor alle Zeilenumbrüche rausgenommen und so eine einzige Befehlszeile erzeugt: Wieder Fehlschlag.

Nun habe ich folgendes eingegeben:
C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3>dcc64 -b SynEdit.dpr

Ergebnis:
Zitat:
Embarcadero Delphi for Win64 compiler version 33.0
Copyright (c) 1983,2017 Embarcadero Technologies, Inc.
Unit1.pas(64) Schwerwiegend: F2613 Unit 'JvExControls' nicht gefunden.


Parameter -b deshalb, weil:
Zitat:
-B = Alle Units erzeugen


jaenicke - So 24.11.19 00:30

Benutze einfach msbuild. Damit werden dann die Pfade aus der IDE verwendet ohne dass du dich darum kümmern musst. Du musst nur die rsvars.bat aus dem Delphiordner vorher aufrufen.


galagher - Di 26.11.19 20:16

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Benutze einfach msbuild. Damit werden dann die Pfade aus der IDE verwendet ohne dass du dich darum kümmern musst. Du musst nur die rsvars.bat aus dem Delphiordner vorher aufrufen.


"Einfach" ist gut! Da gibt es ebenfalls eine lange Liste an Parametern, die ich nicht durchschaue!

Habe alle Schritte wie von dir beschrieben ausgeführt:

Zitat:
"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\rsvars.bat"
cd C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3
C:\Windows\assembly\GAC_32\MSBuild\3.5.0.0__b03f5f7f11d50a3a\MSBuild.exe SynEdit.dpr


Es funktioniert weder mit der .dpr noch mit der .dproj-Datei...

Ein praktisches Beispiel wäre hilfreich!


galagher - Di 26.11.19 20:31

Wenn ich hingegen keine Datei angebe und msbuild einfach so aufrufe, kompiliert es! Sogar als 64-Bit, und msbuild verwendet automatisch die .dproj-Datei :dance: ! Mit den Parametern aber blicke ich nicht durch.

Da taucht aber gleich noch eine Frage auf: Warum finde ich zwar die Datei msbuild.exe im Ordner C:\Windows\assembly\GAC_32\MSBuild\3.5.0.0__b03f5f7f11d50a3a\, kann aber nicht in diesen Ordner wechseln? Der Explorer listet ihn nicht auf, mit der Windows-Suche findet man sie auch nicht, mein selbstgeschriebenes FileFind-Programm findet die Datei samt Pfad jedoch!?

Ein praktisches Beispiel wäre dennoch hilfreich!

//Edit: Jetzt kommen wieder die selben Fehlermeldungen wie anfangs, unter anderem:
Zitat:
C:\Program Files (x86)\Embarcadero\Studio\20.0\Bin\CodeGear.Delphi.Targets(641,5): error MSB4127: The "CreateProperty" task could not be instantiated
from the assembly "Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Please verify the task assembly has be
en built using the same version of the Microsoft.Build.Framework assembly as the one installed on your computer and that your host application is not
missing a binding redirect for Microsoft.Build.Framework. Das Objekt des Typs "Microsoft.Build.Tasks.CreateProperty" kann nicht in Typ "Microsoft.Bu
ild.Framework.ITask" umgewandelt werden.
C:\Program Files (x86)\Embarcadero\Studio\20.0\Bin\CodeGear.Delphi.Targets(641,5): error MSB4060: The "CreateProperty" task has been declared or used
incorrectly, or failed during construction. Check the spelling of the task name and the assembly name.


jaenicke - Mi 27.11.19 06:56

So viele Parameter sind das nicht und gut dokumentiert ist der Aufruf auch:
http://docwiki.embarcadero.com/RADStudio/Rio/de/Erzeugen_eines_Projekts_mit_einem_MSBuild-Befehl

Beispiel aus unserem Buildskript:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
@echo off
if /i "%1" == "" (
set DelphiVersion=20.0
) else (
set DelphiVersion=%1
)
echo Benutze Delphi Version %DelphiVersion%...

call "O:\[...]\build\CopyDataFilesToLibPath.cmd" "%DelphiVersion%"
call  "C:\Program Files (x86)\Embarcadero\Studio\%DelphiVersion%\bin\rsvars.bat"

MSBuild "O:\[...]\project groups\Components32Bit.groupproj" /target:Build /p:config=Release;Platform=Win32

call O:\[...]\build\ImportTemplateRegFile.exe "%DelphiVersion%" O:\[...]\build\data\DelphiSettingsPackages.reg

Du kannst dort natürlich genauso auch Einzelprojekte angeben. Dieses Buildskript kompiliert unsere Packages und installiert diese danach. Die Zeile mit CopyDataFilesToLibPath.cmd kopiert dafür die Ressourcen usw. (.res, .dfm, .inc, ...) in unseren Bibliothekspfad und die letzte Zeile installiert die Packages über die Registry.

In deinem Fall sollte der Aufruf so aussehen:

Quelltext
1:
2:
3:
"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\rsvars.bat"
cd C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3
MSBuild.exe SynEdit.dproj /target:Build /p:config=Release;Platform=Win32

(Die Buildkonfiguration usw. musst du noch ggf. anpassen.)


galagher - Mi 27.11.19 07:55

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
In deinem Fall sollte der Aufruf so aussehen:

Quelltext
1:
2:
3:
"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\rsvars.bat"
cd C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3
MSBuild.exe SynEdit.dproj /target:Build /p:config=Release;Platform=Win32

(Die Buildkonfiguration usw. musst du noch ggf. anpassen.)

Es kommen jedesmal die Fehlermeldungen wie bereits erwähnt. Ob ich nun Platform=Win32 oder Platform=Win64 angebe, ist egal.

Es hat gestern genau 1x funktioniert, danach nicht mehr. Da steige ich nicht durch...

Hier die kompletten Meldungen:
Zitat:
Build started 27.11.2019 07:01:50.
Project "C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3\SynEdit.dproj" on node 0 (Build target(s)).
C:\Program Files (x86)\Embarcadero\Studio\20.0\Bin\CodeGear.Delphi.Targets(647,5): error MSB4127: The "CreateProperty" task could not be instantiated
from the assembly "Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Please verify the task assembly has be
en built using the same version of the Microsoft.Build.Framework assembly as the one installed on your computer and that your host application is not
missing a binding redirect for Microsoft.Build.Framework. Das Objekt des Typs "Microsoft.Build.Tasks.CreateProperty" kann nicht in Typ "Microsoft.Bu
ild.Framework.ITask" umgewandelt werden.
C:\Program Files (x86)\Embarcadero\Studio\20.0\Bin\CodeGear.Delphi.Targets(647,5): error MSB4060: The "CreateProperty" task has been declared or used
incorrectly, or failed during construction. Check the spelling of the task name and the assembly name.
Done Building Project "C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3\SynEdit.dproj" (Build target(s)) -- FAILED.


Build FAILED.

"C:\Users\user\Documents\Embarcadero\Studio\Projekte\Delphi 10.3\SynEdit.dproj" (Build target) (1) ->
(SetBuildOptions target) ->
C:\Program Files (x86)\Embarcadero\Studio\20.0\Bin\CodeGear.Delphi.Targets(647,5): error MSB4127: The "CreateProperty" task could not be instantiat
ed from the assembly "Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Please verify the task assembly has
been built using the same version of the Microsoft.Build.Framework assembly as the one installed on your computer and that your host application is n
ot missing a binding redirect for Microsoft.Build.Framework. Das Objekt des Typs "Microsoft.Build.Tasks.CreateProperty" kann nicht in Typ "Microsoft.
Build.Framework.ITask" umgewandelt werden.
C:\Program Files (x86)\Embarcadero\Studio\20.0\Bin\CodeGear.Delphi.Targets(647,5): error MSB4060: The "CreateProperty" task has been declared or us
ed incorrectly, or failed during construction. Check the spelling of the task name and the assembly name.

0 Warning(s)
2 Error(s)


galagher - Mi 27.11.19 22:43

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Es kommen jedesmal die Fehlermeldungen wie bereits erwähnt.
Ich habe jetzt die rsvars.bat und MSBuild.exe in einen gemeinsamen Ordner kopiert und jetzt funktioniert es wieder. Ich verstehe zwar nicht, was das damit zu tun hat, wo sich die Dateien befinden, aber egal.
Sollte ich gestern einen oder mehrere Fehler gemacht haben, kann ich das jetzt nicht mehr nachvollziehen, ich habe aber jedenfalls immer vorher rsvars.bat ausgeführt.

Es kompilierten nun mehrere .dproj's erfolgreich, ich habe mich auch (sehr wenig! :mrgreen: ) mit den Parametern beschäftigt und mir eine .bat geschrieben, die MSBuild mit den benötigten Parametern ausführt.


jaenicke - Do 28.11.19 10:30

So genau kenne ich msbuild auch nicht. Bei mir gab es damit noch nie Probleme. :nixweiss:
Aber die Hauptsache ist ja, dass es funktioniert...

Übrigens:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Da taucht aber gleich noch eine Frage auf: Warum finde ich zwar die Datei msbuild.exe im Ordner C:\Windows\assembly\GAC_32\MSBuild\3.5.0.0__b03f5f7f11d50a3a\, kann aber nicht in diesen Ordner wechseln? Der Explorer listet ihn nicht auf, mit der Windows-Suche findet man sie auch nicht, mein selbstgeschriebenes FileFind-Programm findet die Datei samt Pfad jedoch!?

Windows bzw. .NET kümmert sich selbst darum die korrekte Version einer DLL, Exe oder Assembly zur Verfügung zu stellen, wenn diese aufgerufen wird. Es kann also auch mehrere Versionen parallel geben.


galagher - Do 28.11.19 15:35

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
So genau kenne ich msbuild auch nicht. Bei mir gab es damit noch nie Probleme. :nixweiss:
Aber die Hauptsache ist ja, dass es funktioniert...
Stimmt!
Und MSBuild ruft dann dcc64.exe oder eben dcc32.exe auf, oder kompiliert MSBuild das Projekt selbst?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Windows bzw. .NET kümmert sich selbst darum die korrekte Version einer DLL, Exe oder Assembly zur Verfügung zu stellen, wenn diese aufgerufen wird. Es kann also auch mehrere Versionen parallel geben.
Ok, danke!


jaenicke - Do 28.11.19 17:12

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Stimmt!
Und MSBuild ruft dann dcc64.exe oder eben dcc32.exe auf, oder kompiliert MSBuild das Projekt selbst?
MSBuild kompiliert nicht selbst, nein. Das führt nur das Buildskript für Delphiprojekte aus und ruft dabei die normalen Compiler auf.

Dabei fällt mir ein, dass ich meinen alten Batchcompiler auch mal wieder aktualisieren könnte...
https://entwickler-ecke.de/viewtopic.php?t=41748