Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Compilerschalter für "Allways build unit" (https://www.delphipraxis.net/63302-compilerschalter-fuer-allways-build-unit.html)

generic 16. Feb 2006 15:29


Compilerschalter für "Allways build unit"
 
Ich hab hier meinen D7 Compiler und ich möchte ihn überreden das eine Unit immer übersetzt wird unabhändig ob ich Compilieren oder Erzeugen wähle.

Bernhard Geyer 16. Feb 2006 15:34

Re: Compilerschalter für "Allways build unit"
 
Für was soll das gut sein?
Der Compiler merkt doch aufgrund von Zeitstempeln ob die DCU verwendet werden kann oder ob die Pas-Datei neu übersetzt werden muss.

generic 16. Feb 2006 17:42

Re: Compilerschalter für "Allways build unit"
 
nein, wenn ich eine projektgruppe habe, welche aus mehreren projekte besteht tut er das leider nicht.

ich benutze bedingte kompilierungen ( {$ifdef} usw.). die switche sind im projekt definiert. wenn ich sage "compile all" dann compiliert er die units nur mit den switchen des ersten projektes. wenn dann der linker zuschlaegt nimmt dieser bedauerlicherweise eine mit anderen switchen compilierte dcu. was natuerlich dann probleme in den projekt bringt.
die switche sind nur in 2 units. immer alle 100 zu generieren ist uncool. mit "build all" sollte es laufen, dauert halt nur ewig lange.

alzaimar 16. Feb 2006 20:29

Re: Compilerschalter für "Allways build unit"
 
Dann solltet Ihr einfach die betroffenen DCUs nach dem Merge löschen.

generic 17. Feb 2006 11:05

Re: Compilerschalter für "Allways build unit"
 
eine batchgesteuerte "projektverwaltung" gibt es unter d7 ent. nicht.

alzaimar 17. Feb 2006 11:16

Re: Compilerschalter für "Allways build unit"
 
Irgendwie müssen die doch ihre Units wieder zusammenführen. Entweder über eine CVS o.ä., oder eben per Hand. Da beim Entwickeln im Team immer Disziplin erforderlich ist, sollte es doch kein Problem sein, nach dem Merge die paar DCUs zu löschen.

generic 17. Feb 2006 14:06

Re: Compilerschalter für "Allways build unit"
 
Die Projekte liegen in einem Baum. Gemeinsam genutzt Units liegen in gemeinsamen Ordner.
Alle Projekte sind in der Projektverwaltung von Delphi reingeklickert.
Der Entwickler erzeugt via "Alle Projekte compilieren" die Bin's.

Projekt "A" nutzt Unit "A" mit Schalter "A"
Projekt "B" nutzt Unit "A" mit Schalter "B" - Die kompilierte Unit A mit Schalter "A" wird gelinkt.

Bei "Alle Projekte erzeugen":
Projekt "A" nutzt Unit "A" mit Schalter "A"
Projekt "B" nutzt Unit "A" mit Schalter "B" - Die kompilierte Unit A mit Schalter "B" wird gelinkt.

Build dauert mir aber zu lange.

Ich möchte ausschliessen das nicht jemand "Alle Projekte compilieren" verwendet, weil ja sonst das eine binary nicht läuft.
Die Projektgruppe wird als ganzes in einem Teamsource Projekt verwaltet. Also nichts mit zusammen führen.

himitsu 17. Feb 2006 17:57

Re: Compilerschalter für "Allways build unit"
 
Ich ab leider seit bestimmt einem Jahr den selben Wunsch und noch keine wirklich brauchbare Lösung dafür ... vielleicht kann man aber auch mal irgendwann Boaland dazu übereden einen entsprechenden Compilerschalter einzuführen :roll:

Das einzige was hilft, ist entwrder "alles erzeugen", oder halt die DCU's löschen -.-''

Flocke 17. Feb 2006 18:29

Re: Compilerschalter für "Allways build unit"
 
Warum macht ihr dann nicht einfach zwei Units, in die ihr mit $I die eine Unit reinholt (ohne die erste Zeile natürlich).

Delphi-Quellcode:
unit modul_1_a;
{$DEFINE FIRST_OPTION}
{$I modul_1.inc}
Delphi-Quellcode:
unit modul_1_b;
{DEFINE SECOND_OPTION}
{$I modul_1.inc}
Der Compiler erzeugt dann die Units modul_1_a.dcu und modul_1_b.dcu.

himitsu 18. Feb 2006 09:46

Re: Compilerschalter für "Allways build unit"
 
Weil ich z.B. globale Kompilerschalter verwende und die Units nur neu kompiliert werden, wenn sich der Quelltext (also die Datei selber) verändert hat ... auf veränderte Kompilerschalter, welche allerding in den Dateien Veränderungen hervorrufen würden, reagiert der bl*** Compiler nicht.

Flocke 18. Feb 2006 12:27

Re: Compilerschalter für "Allways build unit"
 
Für globale Compilerschalter kannst du dir eine Include-Datei machen, in der alle deine Optionen aufgeführt sind, z.B.

Delphi-Quellcode:
{$O+}
{$DEFINE MIT_OPTIMIERUNG}
Wenn du diese Datei mit {$I ...} in all deinen Projektdateien benutzt, dann sollte auch die IDE die Änderungen mitbekommen.

himitsu 18. Feb 2006 12:56

Re: Compilerschalter für "Allways build unit"
 
Leider ist das nicht sooo einfach ... bei deinem Vorschlag stehen die Compilerschalter in einer Datei, welche dann ja verändert und demnach automatisch neu compiliert wird.

Aber ich habe eine/mehrere Datei(en), welche von mehreren Prokjekten mit unterschiedlichen Einstellungen verwendet werden.
Wie soll ich denn da für jedes Projekt andere Einstelungen da einbinden :?:

Daher sind die Compilerschalter in den jeweiligen Projektoptionen (für das entsprechende Projekt) angegeben und somit wird keine datei verändert, selbst wenn sich eine Option ändert -.-''

generic 5. Mär 2006 13:03

Re: Compilerschalter für "Allways build unit"
 
zusammengefasst: himitsu hat mein dilema verstanden.
btw. beim letzten release habe ich es natuerlich verbockt. ein projekt ist mit den falschen parametern ausgelieft worden.

alzaimar 7. Mär 2006 13:03

Re: Compilerschalter für "Allways build unit"
 
Ah!

Kapiert: Da habe ich zwei Tipps: Einen Blöden und einen Guten.

Erst der Blöde: Immer BUILD vor dem RELEASE :wall:
Jetzt der Gute: Schreib Dir einfach Tool, das betreffenden DCUs lösscht. Wie? Über ein ShellNotify, das beim Erzeugen einer bestimmten DCU die Zeiten der betreffenden DCU-Dateien zurücksetzt (oder die einfach löscht):
1. Schreib Dir eine Dummy-Unit ('Sentinel.PAS'), die Du erstes in allen 'Uses'-Anweisungen steht.
2. Ein ShellNotify reagiert also auf die Erzeugung der Datei 'Sentinel.DCU' und löscht dann die DCU, die auf jeden Fall neu kompiliert werden sollen.
3. Ein weiteres ShellNotify wartet auf die Erzeugung der EXE und löscht dann die Sentinel.DCU

Ich habs mir nicht genau überlegt, aber es könnte doch auch reichen, nach Erzeugung der EXE die DCU zu löschen? Denn (2) könnte zu lahm sein, wenn der Compiler schneller als das Notify ist...

Aber klappen müsste es eigentlich...

generic 7. Mär 2006 13:50

Re: Compilerschalter für "Allways build unit"
 
und jetzt die praktikabele lösung... ;-)

alzaimar 7. Mär 2006 14:02

Re: Compilerschalter für "Allways build unit"
 
Wie?
Praktikabler geht es nicht, weil sich um nix mehr kümmern muss: Die EXE angeben, die zu löschenen DCU-Dateien angeben, starten und vergessen. Was soll daran nicht praktikabel sein (äh, sofern es funktioniert?).

Alternativ: OpenTools-API, damit kenn ich mich aber nicht aus. Wer das kann, packt vor das 'Compile' einfach das 'delete DCU'...

freak4fun 7. Mär 2006 14:12

Re: Compilerschalter für "Allways build unit"
 
Zitat:

Zitat von alzaimar
Dann solltet Ihr einfach die betroffenen DCUs nach dem Merge löschen.

Zitat:

Zitat von generic
eine batchgesteuerte "projektverwaltung" gibt es unter d7 ent. nicht.

Beziehen sich die Aussagen auf einander?! :gruebel: Du kannst nämlich als erste Datei eine Batch-Datei in deine Projektverwaltung einbinden, in der steht, das die Datei(*.dcu) gelöscht werden soll.

MfG
freak

himitsu 8. Mär 2006 10:05

Re: Compilerschalter für "Allways build unit"
 
An das löschen/verändern der DCU's hab'sch och schon gedacht, nur ist das nicht sicher genug lösbar, da es ja schießlich nicht nur bei mir, sondern auch bei Anderen funktionieren soll ... und ständig irgendein programm zu starten, was das löschen übernimmt, will ich mir und vorallem den Anderen nicht zumuten.
Außerdem sollte es (nach Möglichkeit) von D4 Std (oder besser noch von D3) bis zum aktuellsten delphi funktionieren.

Und was soll es bringen, wenn ich noch 'ne zusätzliche Unit einbaue.
Entweder ich kompiliere nur, dann werden die DCU's aber nicht gelöscht, da ja das Programm nichtausgeführt wird ...
Und selbst wenn es funktioniert, dann hab ich ja den löschcode auch immer im fertigen Programm und dieser wird dann ständig beim Programmstart ausgeführt, was ja auch nicht gerade gut ist.


Was aber OpenTools-API angeht, daran hatte ich noch garnicht gedacht, kenne mich aber damit och nicht aus -.-''

alzaimar 8. Mär 2006 10:38

Re: Compilerschalter für "Allways build unit"
 
Zitat:

Zitat von himitsu
... und ständig irgendein programm zu starten, was das löschen übernimmt, will ich mir und vorallem den Anderen nicht zumuten...

"Starten und Vergessen" bedeutet: Im Tray ablegen.

Zitat:

Zitat von himitsu
Und was soll es bringen, wenn ich noch 'ne zusätzliche Unit einbaue.

Vergiss das mit der extra-Unit, war eine Idee, die wir nicht mehr brauchen-

Das Programm wird als Service, oder ist einfach nur ein Miniprogramm ("Sentinel.EXE"), das im Tray hockt. Und zwar auf dem PC, auf dem die EXE abgelegt wird. Dieses Programm wird nur dann aktiv, wenn eine Datei namens "C:\MyApplication\MyProject.EXE" verändert wird. Immer wenn diese Datei verändert wird (denn das wird sie ja immer durch den Delphi-Compiler), löscht der Sentinel.EXE einfach die DCUs der "Always Build Units"....

Also: Sei UTAB.PAS die ('Unit To Always Build') Unit, die immer neu erzeugt werden soll.
OK...

1. Anfangszustand: [UTAB.DCU ist gelöscht :thumb:]
2. Compile drücken ...
3. Zwischenzustand: [UTAB.PAS wird neu compiliert und damit UTAB.DCU erzeugt :twisted: ]
4. Zum Schluss wird die MyProject.EXE wird erzeugt.
5. Daraufhin springt der ShellNotify an und der kleine Sentinel.EXE löscht nun einfach die UTAB.DCU :mrgreen: .
6. Endzustand: [UTAB.DCU ist gelöscht :thumb:]

Super!
EndZustand = Anfangszustand und fertig!

Das Progrämmchen ist in einigen Minuten fertig geschrieben. Bei LMD gibt es eine ShellNotify-Komponente, aber wer sich ein bisserl mit der API auskennt, kriegt das auch so hin.

himitsu 8. Mär 2006 11:05

Re: Compilerschalter für "Allways build unit"
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von himitsu
... und ständig irgendein programm zu starten, was das löschen übernimmt, will ich mir und vorallem den Anderen nicht zumuten...

"Starten und Vergessen" bedeutet: Im Tray ablegen.

...

Das Programm wird als Service, oder ist einfach nur ein Miniprogramm ("Sentinel.EXE"), das im Tray hockt. Und zwar auf dem PC, auf dem die EXE abgelegt wird. Dieses Programm wird nur dann aktiv, wenn eine Datei namens "C:\MyApplication\MyProject.EXE" verändert wird. Immer wenn diese Datei verändert wird (denn das wird sie ja immer durch den Delphi-Compiler), löscht der Sentinel.EXE einfach die DCUs der "Always Build Units"....

Das Problem bei mir ist, daß es keine "MyProject.EXE" gibt ... die Units, um welche es sich handelt werden von mehreren Programmen genutzt, welche aber nicht vorher feststehen und wo jemand ständig z.B. den Programnamen in irgendeine Liste eintragen kann/will/sollte (daher ist es ja wichtig, daß die Units immer mit den richtigen Compiler-Schaltern kompiliert sind, welche aber in den verschiedenen Programmen unterschiedlich sein können).

Außerdem wollte ich es möglichst ohne ein weiteres, zusätzlich laufendes Programm hinbekommen (auf meinem rechner würde es mich ja nicht unbedingt stören, aber auf dem der Anderen -.-'').
Es laufen ja ohnehin schon zuviele Programme, auch wenn man nichts am PC macht :?

Das Einzige, was ich machen könnte, wäre eine Signatur (in Form eines Kommentars) und die Units (.pas) einzufügen, damit zumindestens erkannt wird um welche es sich dabei handelt.
Ich könnte z.B. auch einen bestimmen Parameter in meine Dateiheader (zur Versionskontrolle... siehe z.B. Compilerversionen? > FNS_VersionCheck.inc - am Dateianfang) einfügen.

alzaimar 8. Mär 2006 11:30

Re: Compilerschalter für "Allways build unit"
 
Zitat:

Zitat von himitsu
Das Problem bei mir ist, daß es keine "MyProject.EXE" gibt ...

Dann gibt es eben mehrere, stell Dich nich so an :wink:
Zitat:

Zitat von himitsu
... werden von mehreren Programmen genutzt, welche aber nicht vorher feststehen

Ach so, ein Glasskugelprogramm. Dann bleibt Dir nur die OpenTools-API. Ich würde mir ja bei einem neuen Projekt einmalig die Minute Zeit nehmen, um den Sentinel auf das neue Projekt anzusetzen...
Zitat:

Zitat von himitsu
und wo jemand ständig z.B. den Programnamen in irgendeine Liste eintragen kann/will/sollte

Nein. Nicht ständig. Nur ein einziges Mal. Wenn ich ein größeres Projekt bearbeite, habe ich einen APP-Ordner. Da werden alle EXEn reinkompiliert. Dann glotzt der Sentinel eben in den einen APP-Ordner und wird aktiv, sobald eine EXE verändert wurde...
Zitat:

Zitat von himitsu
Außerdem wollte ich es möglichst ohne ein weiteres, zusätzlich laufendes Programm hinbekommen ...

Na ja, einen ShellNotify spürt man eigentlich nicht. Und er läuft nur auf dem PC, auf dem die EXEn sind...
Unter uns: Die Zeit, die Du damit verbracht hast, zu erklären, warum es *nicht* geht, hättest Du damit verbringen können, das Programm zu schreiben und gleich einzurichten... Wenn Du es geschickt anfängst, dann scannst Du auch noch automatisch alle PAS Dateien und suchst nach einer Zeile '{$Allways Build}' am Anfang der Datei. Da wäre dann schon mal die Liste der zu löschenden DCUs...

Meiner Ansicht nach ist es einfach etwas aufwändiger, sich in die OpenTools-API reinzufräsen. Wie gesagt, das Programm ist in 20 Minuten fertig. Und würde viel bringen ...

himitsu 8. Mär 2006 11:43

Re: Compilerschalter für "Allways build unit"
 
Zitat:

Zitat von alzaimar
Ach so, ein Glasskugelprogramm. Dann bleibt Dir nur die OpenTools-API. Ich würde mir ja bei einem neuen Projekt einmalig die Minute Zeit nehmen, um den Sentinel auf das neue Projekt anzusetzen...

Einmal hab ich mir die Zeit schon genommen ... was man mit Batch-Dateien nicht ales machen kann, ^_^
aber auf Dauer ist das nichts.

Zitat:

Zitat von alzaimar
Nein. Nicht ständig. Nur ein einziges Mal. Wenn ich ein größeres Projekt bearbeite, habe ich einen APP-Ordner. Da werden alle EXEn reinkompiliert. Dann glotzt der Sentinel eben in den einen APP-Ordner und wird aktiv, sobald eine EXE verändert wurde...

Doch ständig ... vorallem wenn man parallel an mehreren Projekten, oder halt abwechselnd an diesen arbeitet uns daher die Dateien ja ständig gelöscht werden müssten.

Zitat:

Zitat von alzaimar
Na ja, einen ShellNotify spürt man eigentlich nicht. Und er läuft nur auf dem PC, auf dem die EXEn sind...
Unter uns: Die Zeit, die Du damit verbracht hast, zu erklären, warum es *nicht* geht, hättest Du damit verbringen können, das Programm zu schreiben und gleich einzurichten... Wenn Du es geschickt anfängst, dann scannst Du auch noch automatisch alle PAS Dateien und suchst nach einer Zeile '{$Allways Build}' am Anfang der Datei. Da wäre dann schon mal die Liste der zu löschenden DCUs...

Wie gesagt, etwas wie dieses {$Allways Build} könnte ich ja leicht in die Dateien reinschmuggeln, da die entsprechendenden Dateien auf jedenfall schon einen Dateiheader haben, worin auch erkennbar wäre, ob die dazugehörigen DCU's suzusagen befallen sind.

Zitat:

Zitat von alzaimar
Meiner Ansicht nach ist es einfach etwas aufwändiger, sich in die OpenTools-API reinzufräsen. Wie gesagt, das Programm ist in 20 Minuten fertig. Und würde viel bringen ...

Tja, wie gesagt, viel bringt es nur kurzzeitig was ... aber ich hätte hal gern etwas CPU-schohnendes und Langfristigeres :roll:

alzaimar 8. Mär 2006 12:24

Re: Compilerschalter für "Allways build unit"
 
Zitat:

Zitat von himitsu
... aber ich hätte hal gern etwas CPU-schohnendes ...

ShellNotify is CPU-schonend (wenn man es nicht gerade auf ALLE Events in der Root-Directory inkl. allen Subdirectories ansetzt).

Die perfekte Lösung wäre es, wenn der Delphi-Compiler (an den du nunmal nicht rankommst) das könnte. Kann er aber nicht. Also musst Du das zu kompilierende Projekt im Vorfeld parsen und in allen Uses-Klauseln schauen, ob da nicht eine deiner Always-Build-Units verwendet wird... Das dauert doch tierisch. Dann ist doch so ein Sentinel wirklich besser.

Wenn Deine AB-Units aber fest sind, dann schreib Dir einen Batch, der die DCU löscht und versuche, das vor das 'Compile' per OpenTools-API zu packen. Das wäre dann auch eine Lösung, bei der man viel rumkritisieren kann ("Öööhh, da muss ich ja ständig den Batch verändern, wenn ich mal wieder eine AB-Unit habe"), aber vielleicht bist Du dann wenigstens zufrieden.

himitsu 8. Mär 2006 18:34

Re: Compilerschalter für "Allways build unit"
 
Na ja, im Grunde würde es ja reichen, wenn ich z.B, nur nach 'nem Update, oder so die entsprechenden Dateien suchen lasse und dann (wenn ich es hinbekomm) per OpenTool-API die dateien löschen lasse.

Dann würde es doch bestimmt auch nichts machen, wenn ich die Dateien (*.DCU's) lösche/ändere, selbst wenn diese nicht im aktuell zu compilierendem Programm verwendet werden ... brauchen sie dann halt nicht mehr gelöscht werden, wenn es nötig ist ._.

Wenn ich die Kennung welche Dateien "gelöscht" werden müßen wäre dann auch gleich in der ersten QuellcodeZeile (wenn ich das in meine vorhandenen Header mit integrieren würde).
Und wo sich diese Dateien befinden würde auch schon in der Registry stehen, braucht also nicht jedesmal die gesamte Platte durchsucht zu werden (wenn der Pfad eh schon wegen dem Setup da drin ist)

generic 19. Apr 2006 14:51

Re: Compilerschalter für "Allways build unit"
 
ich gebe jetzt pro projekt ein "dcu" verzeichnis an.
damit löst sich das problem nicht aber die compilezeit ist zumindest kürzer.

gruss


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