Date: Sun, 20 Oct 1996 20:23:59 +0200 (IST) From: Eli Zaretskii To: djgpp-announce AT delorie DOT com Subject: Mixing v2.0 and v2.01 considered harmful Message-Id: Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII This is a bit longish message, so the main points first: 1) It is not recommended to mix Make from old v2.0 distribution with gcc and Binutils from v2.01, or vice versa. If you upgrade to v2.01, replace all the binaries you have installed from the above packages. 2) If you want to try v2.01 but be able to downgrade back to v2.0 in case you have unexpected trouble, back up your v2.0 executables before installing v2.01. PLEASE RESTRICT FURTHER DISCUSSIONS ABOUT THIS to djgpp mailing list and comp.os.msdos.djgpp news group. Do NOT post to djgpp-announce anything about this, please! Now for the juicy details: In v2.01, passing command lines to child programs has changed. The most important aspects of the change are: 1) Arguments passed by `spawnXX' and `execXX' library functions aren't globbed by the child; thus spawn(P_NOWAIT, "ls", "ls", "*.c", 0) will most probably complain that *.c doesn't exist. This is so these functions work as they do on Unix. If you need for the child to glob the arguments, you should call `system' instead (see below). 2) Arguments passed by `system' *are* globbed. In v2.0, `system' didn't support command lines longer than 126 characters. The new `system' allows long command lines (when the child is a DJGPP program), but this will only work when both the parent and the child were compiled with v2.01. If the child was compiled with v2.0, it will only see the first 126 characters of the command line. The most important case where these considerations apply is when Make calls gcc. DJGPP ports of Make 3.73 and before use `spawn' unless the command involves redirection. If you have a Makefile which says something like prog: $(OBJS) gcc -o prog *.o this will not work when Make is from v2.0 and gcc from v2.01. The next port of Make 3.75 (to be uploaded soon) uses `system' in such cases, but if gcc is from v2.0, and the command line includes wildcards or quotes and is longer than 126 characters, that command will mysteriously fail. To be sure things work together as you'd expect, use both Make 3.75 (or later) and gcc/Binutils compiled with v2.01. The above might sound scary at first, but it really isn't. Experience shows that the absolute majority of Makefiles continue to work. (I have successfully built most of the DJGPP packages with a v2.0 gcc and a v2.01 Make, and never saw any problem.) But if you want consistently correct behavior, you shouldn't mix Make and gcc from different versions. Note that after v2.01 was uploaded to SimTel, the old Make 3.73 distribution was overwritten by the new, compiled with v2.01. Therefore, you should save your previous v2.0 make.exe if you think there's a chance you'd want to go back to v2.0.