Hi, [Please retain the CC to [EMAIL PROTECTED] and [EMAIL PROTECTED] so that the Debian Bug Tracking system can record your input]
The following problems were reported by debian developers. I am not sure they are related, but they seem to deal with quoting of targets in make rules. I am not sure whether these are bugs, but there does seem to be an inconsistency somewhere. manoj ###################################################################### Make apparently does not escape # characters in quotes, so that the target foo: $(shell grep -v "^#" gj-files) will yield the error message Makefile:1: *** unterminated call to function `shell': missing `)'. Stop. However, this works fine in commands, and backslash-escaping works, so that the following fragment works fine: foo: gj-files $(shell grep -v ^\# gj-files) cat $(shell grep -v "^#" gj-files) > $@ This bug affects variable setting, as well, so that VAR=$(shell grep -v "^#" gj-files) gives an error when $(VAR) is referenced, even though manually expanding the command would work fine; that is echo $(VAR) gives and error even though echo $(shell grep -v "^#" gj-files) works fine. Again, using backslash escaping is a possible workaround for this. I would claim that the makefile lexer should be string-aware, and not process # characters as comments inside quoted strings. I'm not positive this is a bug, but it seems like one to me. ###################################################################### If a filename contains a space or a dollar, make/its default rules fail to escape or quote the name correctly when invoking the compiler. Here's how to reproduce this problem: cat >Makefile <<__EOF__ all: pound dollar space @echo "It all works!" pound: pound\#file.o @echo "Pounds work" dollar: dollar$$file.o @echo "Dollars work" space: space\ file.o @echo "Spaces work" clean: @rm *.o __EOF__ cat /dev/null >'pound#file.c' cat /dev/null >'dollar$file.c' cat /dev/null >'space file.c' make -k cc -c -o pound#file.o pound#file.c Pounds work cc -c -o dollar$file.o dollar$file.c cc: dollar.c: No such file or directory cc: No input files make: *** [dollar$file.o] Error 1 cc -c -o space file.o space file.c cc: cannot specify -o with -c or -S and multiple compilations make: *** [space file.o] Error 1 make: Target `all' not remade because of errors. (beware the tabs of course ;-)) Things to note: * 'cc dollar$file.o', $file is not set so cc tries to read 'dollar.c' and fails. The $ should have been escaped but there is no way to escape it in the Makefile that will work. * 'cc space file.c', same thing, the space is not escaped so cc tries to read 'space.c' and fails. Adding an additional \ in the Makefile results in make complaining it cannot find 'space\ file.c'. * Putting single or double quotes around the troublesome filenames does not work: make takes them to be part of the file name. * Escaping the pound sign works. I'm not sure how make invokes cc (via fork()/exec(), system(), sh?), but it seems no shell is involved since '#' would make the start of the comments. * '$' behaves strangely. It is interpreted by make before anything else, including '\'. So '\$' does not work and one must use '$$' (which is documented). This is a bit confusing. Would it break many makefiles if '\' were interpreted first so that '\$' is equivalent to '$$'? * Workaround: adding rules like the one below solve this problem: .c.o: cc -c -o '$*.o' '$<' * Optional question: how would one write a generic command to link a bunch of object files containing spaces together? It seems "'$^'" would not work. -- Fay: The British police force used to be run by men of integrity. Truscott: That is a mistake which has been rectified. Joe Orton, "Loot" Manoj Srivastava <[EMAIL PROTECTED]> <http://www.debian.org/%7Esrivasta/> 1024R/C7261095 print CB D9 F4 12 68 07 E4 05 CC 2D 27 12 1D F5 E8 6E 1024D/BF24424C print 4966 F272 D093 B493 410B 924B 21BA DABB BF24 424C _______________________________________________ Bug-make mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/bug-make