Node:Makefiles,
Previous:How long,
Up:Command line
Q: I use Make to compile with GCC, but GCC gets only the first 126
characters of its command line. Didn't you just explain in so many words
that invoking a DJGPP program (GCC) from another DJGPP program (Make) can
safely pass up to 13K characters of command-line arguments using the
!proxy
method?
Q: I use RHIDE, but it only passes the first 126 characters of
my long command lines to the compiler!
A: If you use Make 3.73, check your Makefile for SHELL =
command.com
statements, or for commands which include pipe or
redirection characters like >
, |
, etc. If Make sees any
such statements, it will invoke COMMAND.COM
to run GCC, and
COMMAND.COM
can't pass more than 126 characters to GCC. To work
around, comment-out the SHELL=
line, and change your commands to
work without redirection/pipe characters. One easy way to get rid of
redirection characters without losing their effect is to use the
redir
program which comes with DJGPP. For example, the following
command:
frobnicate foo.bar > myfile.tmp
can be re-written instead like this:
redir -o myfile.tmp frobnicate foo.bar
The ports of Make 3.75 and later don't call COMMAND.COM
in the
above cases, but rather emulate pipes and redirection internally, so
upgrading to the latest version of Make will solve such problems. If
you think about using Make 3.75 with DJGPP v2.0, don't: invoking v2.0
programs from v2.01 programs will cause subtle and hard-to-debug
problems due to incompatibilities between these two versions regarding
the methods of invoking child programs (in particular, v2.0 doesn't
support the environment method of passing long command lines described
above).
If you have problems with long command lines when using Make 3.75 and
later, it might be caused by the environment variable SHELL
that
points to a Unix-style shell which is not a DJGPP program. This could
happen, for example, if you use the shell from the MKS toolkit. When
SHELL
points to a program whose name looks like it's a Unix-style
shell (sh.exe
, bash.exe
, etc.), library functions like
system
will invoke the shell to do everything, instead of using
the internal shell emulator. If that shell isn't a DJGPP program, the
long command lines will end up truncated. To solve these problems,
either unset SHELL
or override it by setting MAKESHELL
to
point to COMMAND.COM
or to the DJGPP port of Bash. This is
further explained in the GNU Make manual
(see SHELL
and MAKESHELL
).
Problems with passing long commands from RHIDE are usually caused by invoking old programs compiled with DJGPP v2.0. Upgrade to the latest binaries.