Re: Possible solution for special characters in makefile paths

Boris Kolpackov <[email protected]>
Newsgroups gmane.comp.gnu.make.devel
Organization Code Synthesis Tools CC
Message-ID <[email protected]>
Hi Paul,

Some of my thoughts off the top of my head (sorry, no time to think
more thoroughly on this at the moment):

Paul D. Smith <[email protected]> writes:
 
> Here's an idea. It is not ideal and some may find it distasteful.

I think it is pretty alright.

 
> Maybe $[...] or $`...`.

We already have the:

make "foo bar"
make 'foo bar'

syntax. Can't we make one of them work in makefiles as well for
consistency?

"my target": "this: prerequisite"

('' will also work, see below).

> The disadvantage of this is that it would not be usable inside the
> makefile to encode expansions of values.  For example suppose someone
> runs 'make FOO="bar biz"' and the makefile author knows that the value
> of FOO should always be treated as a single word; they may want to
> write:
> 
>   FOO=$[$(FOO)]

I think this should not be possible. If a value of a variable should
be treated as a single word, then it should be specified as such and
not re-interpreted half way through. In other words, the only time
it should be possible to decide and specify that, say, space is
part of a value and not a delimiter is when we specify that value.
Inside make (so to speak) it is always treated as specified and
once it gets outside (e.g., into a shell script) it is escaped
accordingly.

So in this light (using "" as the syntax):

make FOO="bar biz"   # two words
make BAR='"bar biz"' # single word

In the makefile:

foo := $(FOO)  # two words
bar := $(BAR)  # one word

foo := bar biz
foo := "bar biz"

 
> I should note that in no way am I suggesting that we would fix the
> user's recipes automatically to work properly with these values.  That
> would be their responsibility.  As an example, the default builtin rules
> such as:
> 
>    %.o : %.c
>            $(COMPILE.o) -c $< -o $@

I actually think that it might not be a bad idea to try to escape
values that were escaped. In other words, "escaped input, escaped
output". So that:

make foo.o         # Runs CC -c foo.c -o foo.o
make '"foo bar.o"' # Runs CC -c "foo bar.c" -o "foo bar.o"

Again, there is probably a lot of holes in my ideas, but generally,
this kind of semantics where make doesn't re-interpret values
and simply passes them through feels cleaner and easier to explain.

Boris
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.