Discussion:
[Borland make] Fatal: Command arguments too long
(zu alt für eine Antwort)
Robert Hartmann
2010-09-17 14:03:07 UTC
Permalink
Hallo zusammen,

Das make von Turbo C++ 3.0 [(c)1990,1992 Borland]
genauer
MAKE Version 3.6 Copyright (c) 1991 Borland International
liefert mir

bei der Zeile:
$(CC) $(CANSIFLAGS) $(DEBUGFLAGS) $(LIBDIR) $(INCLUDEDIR)
-n$(PATH_DEBUGVERSION) -e$(OUTPUTNAME) $(PATH_DEBUGVERSION)\rh_conio.obj
$(PATH_DEBUGVERSION)\concolor.obj $(PATH_DEBUGVERSION)\main.obj

die ersetzt das ergibt

tcc -DTESTCONIO -A -1- -ms -N -w -DDEBUG -D_DEBUG -v -L.. -I.. -ndebug
-erun.exe debug\rh_conio.obj debug\concolor.obj debug\main.obj

die Fehlermeldung

Fatal: Command arguments too long

Google-Suche hat mir die Information gefunden, dass solche Meldung auch
noch bei win32 (MAKE Version 5.2) wohl noch so wäre (vgl[1],[2])

Bei [2] ganz unten ist ein Lösungsvorschlag gegeben,
"use make generated response file".

Funktioniert so etwas auch beim alten make?
(Hat sich evtl die Syntax verändert?)

Beste Grüße,
Robert Hartmann


[1] https://forums.embarcadero.com/thread.jspa?threadID=12093&tstart=0
[2] http://www.delphigroups.info/3/12/6923.html
Robert Hartmann
2010-09-17 14:35:15 UTC
Permalink
Ich hab mein Problem gelöst.
Post by Robert Hartmann
Hallo zusammen,
Das make von Turbo C++ 3.0 [(c)1990,1992 Borland]
genauer
MAKE Version 3.6 Copyright (c) 1991 Borland International
liefert mir
$(CC) $(CANSIFLAGS) $(DEBUGFLAGS) $(LIBDIR) $(INCLUDEDIR)
-n$(PATH_DEBUGVERSION) -e$(OUTPUTNAME) $(PATH_DEBUGVERSION)\rh_conio.obj
$(PATH_DEBUGVERSION)\concolor.obj $(PATH_DEBUGVERSION)\main.obj
[...]
Post by Robert Hartmann
die Fehlermeldung
Fatal: Command arguments too long
[Für das Archiv:]

Der Google-Hinweis "make" + "response file" hat geholfen.
Wenn ich die obige zulange Zeile so ab ändere, dass
eine temporäre Datei erzeugt wird aus der Make dann
die Optionen einließt funktioniert es ohne Fehlermeldung.

$(CC) @&&|
$(CANSIFLAGS) $(DEBUGFLAGS)
$(LIBDIR) $(INCLUDEDIR)
-n$(PATH_DEBUGVERSION) -e$(OUTPUTNAME)
$(PATH_DEBUGVERSION)\rh_conio.obj
$(PATH_DEBUGVERSION)\concolor.obj
$(PATH_DEBUGVERSION)\main.obj
$(CLIBS)
|
Post by Robert Hartmann
Funktioniert so etwas auch beim alten make?
(Hat sich evtl die Syntax verändert?)
Die Antwort ist somit ja.

Gruß Robert
Stefan Reuther
2010-09-17 16:43:45 UTC
Permalink
Hallo,
Post by Robert Hartmann
Post by Robert Hartmann
Das make von Turbo C++ 3.0 [(c)1990,1992 Borland]
genauer
MAKE Version 3.6 Copyright (c) 1991 Borland International
$(CC) $(CANSIFLAGS) $(DEBUGFLAGS) $(LIBDIR) $(INCLUDEDIR)
-n$(PATH_DEBUGVERSION) -e$(OUTPUTNAME) $(PATH_DEBUGVERSION)\rh_conio.obj
$(PATH_DEBUGVERSION)\concolor.obj $(PATH_DEBUGVERSION)\main.obj
[...]
Post by Robert Hartmann
die Fehlermeldung
Fatal: Command arguments too long
[Für das Archiv:]
Der Google-Hinweis "make" + "response file" hat geholfen.
Wenn ich die obige zulange Zeile so ab ändere, dass
eine temporäre Datei erzeugt wird aus der Make dann
die Optionen einließt funktioniert es ohne Fehlermeldung.
[Für das Archiv:]

Das Längenlimit für die Kommandozeilenparameter ist unter DOS 127 Bytes
plus/minus; je nach Implementation geht da noch der Kommandoname ab oder
nicht.

"response files" sind nun kein allgemeiner System-Mechanismus, der
überall funktioniert, sondern müssen von dem jeweiligen Programm
implementiert werden. Wenn ein Programm sowas implementiert, ist die
Syntax ist dann auch teilweise subtil verschieden. Bei Entwicklungstools
ist Unterstützung für "response files" relativ verbreitet, "normale"
DOS-Befehle (copy usw.) oder Anwenderprogramme haben sowas eher nicht.


Stefan
Joseph Terner
2010-09-17 17:48:00 UTC
Permalink
Das make von Turbo C++ 3.0 [(c)1990,1992 Borland] genauer
MAKE Version 3.6 Copyright (c) 1991 Borland International liefert mir
[...]
die Fehlermeldung
Fatal: Command arguments too long
Die Länge der Befehlszeilenargumente ist auf 127 Zeichen beschränkt.
Soviel Platz ist dafür nämlich im PSP (Program Segment Prefix)
vorgesehen, welcher den Status eines laufenden DOS-Programms speichert.
Bei [2] ganz unten ist ein Lösungsvorschlag gegeben, "use make generated
response file".
Funktioniert so etwas auch beim alten make?
Wie Du ja schon selbst herausgefunden hast, funktioniert das natürlich
gerade beim MAKE für DOS, denn "Response Files" sind ja dafür extra wegen
der o. g. Einschränkung erst eingeführt worden. Zu beachten ist dabei,
daß die von MAKE aufgerufenen Tools diese natürlich ihrerseits auch
unterstützen müssen.

ciao, Joseph
Thorsten Albers
2010-09-21 16:55:44 UTC
Permalink
Post by Robert Hartmann
tcc -DTESTCONIO -A -1- -ms -N -w -DDEBUG -D_DEBUG -v -L.. -I.. -ndebug
-erun.exe debug\rh_conio.obj debug\concolor.obj debug\main.obj
die Fehlermeldung
Fatal: Command arguments too long
Google-Suche hat mir die Information gefunden, dass solche Meldung auch
noch bei win32 (MAKE Version 5.2) wohl noch so wäre (vgl[1],[2])
Bei [2] ganz unten ist ein Lösungsvorschlag gegeben,
"use make generated response file".
Funktioniert so etwas auch beim alten make?
(Hat sich evtl die Syntax verändert?)
Die Doku (BCC 3.1 mit MAKE 3.6) gibt dazu nichts her. Aber hast Du schon
einmal versucht, das Problem zu umgehen, indem Du Umgebungsvariablen für
die LIB- (-L...) und INCLUDE-Verzeichnisse (-I...) setzt? Die dürften doch
die Kommandozeile so überlasten. Wenn ich nicht irre, berücksichtigen die
meisten Borland-Tools derartige Umgebungsvariablen.
--
Thorsten Albers

albers (a) uni-freiburg.de
Hans-Bernhard Bröker
2010-09-21 18:40:46 UTC
Permalink
Aber hast Du schon einmal versucht, das Problem zu umgehen, indem Du
Umgebungsvariablen für die LIB- (-L...) und INCLUDE-Verzeichnisse
(-I...) setzt? Die dürften doch die Kommandozeile so überlasten.
Mindestens ebenso oft sind es die elendiglich langen Listen von
Objektdateien, die beim Linken bzw. dem Bau von Libraries
zusammenkommen. Daher muss man das letztlich sowieso anders lösen.

Aus diesem Grund kennen die Borland-Tools (wie so ziemlich alle Compiler
unter DOS und Windows) eine Methode, Kommandozeilen-Argumente aus
Dateien zu lesen. Meistens geht das so:

c:\bcc31\bin\bcc.exe @args.txt

Borland make unterstützt diese Methode, indem es erlaubt, die Datei
"args.txt" im Vorbeigehen als Temporärdatei anzulegen, zu füllen, und
direkt nachher wieder zu entfernen. Dafür dient der &&-Operator.
Zusammen sieht das im Makefile dann z.B. so aus:

.c.obj:
$(BIN)$(CC) @&&!
$(CFLAGS)
! $<
Thorsten Albers
2010-09-21 20:25:50 UTC
Permalink
Post by Hans-Bernhard Bröker
Mindestens ebenso oft sind es die elendiglich langen Listen von
Objektdateien, die beim Linken bzw. dem Bau von Libraries
zusammenkommen. Daher muss man das letztlich sowieso anders lösen.
Aus diesem Grund kennen die Borland-Tools (wie so ziemlich alle Compiler
unter DOS und Windows) eine Methode, Kommandozeilen-Argumente aus
Borland make unterstützt diese Methode, indem es erlaubt, die Datei
Von anderen Entwickler-Tools her kenne ich das, aber die Borland-Hilfe
schweigt sich, swoeit ich gesehen habe, zumindest bei MAKE darüber völlig
aus. Kommt in's 'Notizbuch'.
Robert Hartmann
2010-09-22 08:24:20 UTC
Permalink
Hallo,
Post by Thorsten Albers
Post by Hans-Bernhard Bröker
Mindestens ebenso oft sind es die elendiglich langen Listen von
Objektdateien, die beim Linken bzw. dem Bau von Libraries
zusammenkommen. Daher muss man das letztlich sowieso anders lösen.
Aus diesem Grund kennen die Borland-Tools (wie so ziemlich alle Compiler
unter DOS und Windows) eine Methode, Kommandozeilen-Argumente aus
Borland make unterstützt diese Methode, indem es erlaubt, die Datei
Von anderen Entwickler-Tools her kenne ich das, aber die Borland-Hilfe
schweigt sich, swoeit ich gesehen habe, zumindest bei MAKE darüber völlig
aus. Kommt in's 'Notizbuch'.
Wenn man z.B. ein komplizierteres TurboC3 Projekt mit prj2mak.exe
in ein makefile konvertiert, dann kann man sehen, was alles geht.

Gruß Robert

Lesen Sie weiter auf narkive:
Loading...