[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
make: # in quotes is still treated as comment character
From: |
Manoj Srivastava |
Subject: |
make: # in quotes is still treated as comment character |
Date: |
Fri, 12 Apr 2002 19:46:22 -0500 |
User-agent: |
Gnus/5.090006 (Oort Gnus v0.06) Emacs/21.2 (i386-debian-linux-gnu) (i386-debian-linux-gnu) |
Hi,
[Please retain the CC to address@hidden and
address@hidden 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 <address@hidden> <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
- make: # in quotes is still treated as comment character,
Manoj Srivastava <=