FreeBSD Make question
Johan Kuuse
kuuse at redantigua.com
Fri Oct 25 07:43:05 UTC 2013
On Thu, Oct 24, 2013 at 11:49 PM, Simon J. Gerraty <sjg at juniper.net> wrote:
> >Simon: do we allow whitespace in target names in either fmake or bmake?
> >If so, what are the escaping rules?
>
Thanks Benjamin for the hints, I'll check out the -hackers list.
>
> Whether it is "allowed" or not, it isn't something I would consider
> doing.
>
Hi Simon,
I definitely agree that whitespaces shouldn't go into targets if it could
be avoided.
The background is that I'm trying to create a system of nonrecursive
Makefiles, where all paths must be absolute.
This implies using absolute paths as target names. What if a path contains
whitespaces? (God forbid!)
>
> What is the problem we are trying to solve?
>
>
Problem described above, below goes a sample Makefile, trying several ways
to escaping whitespaces in target names.
The Makefile:
Makefile.freebsd-questions
--------
# MY_TARGET=/home/joe/directory name with spaces/hello.c
# MY_SECOND_TARGET=/home/joe/directory name with spaces/world.c
# MY_TARGET='/home/joe/directory name with spaces/hello.c'
# MY_SECOND_TARGET='/home/joe/directory name with spaces/world.c'
# MY_TARGET="/home/joe/directory name with spaces/hello.c"
# MY_SECOND_TARGET="/home/joe/directory name with spaces/world.c"
MY_TARGET=/home/joe/directory\ name\ with\ spaces/hello.c
MY_SECOND_TARGET=/home/joe/directory\ name\ with\ spaces/world.c
all: ${MY_TARGET} ${MY_SECOND_TARGET}
@echo This is Make version $(MAKE_VERSION)
${MY_TARGET}:
@echo $@
${MY_SECOND_TARGET}:
@echo $@
--------
The output:
FreeBSD Make:
make -f Makefile.freebsd-questions
--------
"Makefile.freebsd-questions", line 20: warning: duplicate script for target
"/home/joe/directory\" ignored
"Makefile.freebsd-questions", line 20: warning: duplicate script for target
"name\" ignored
"Makefile.freebsd-questions", line 20: warning: duplicate script for target
"with\" ignored
/home/joe/directory\
name\
with\
spaces/hello.c
spaces/world.c
This is Make version 9201120530
--------
GNU Make:
gmake -f Makefile.freebsd-questions
--------
/home/joe/directory name with spaces/hello.c
/home/joe/directory name with spaces/world.c
This is Make version 3.82
--------
The only possible workaround I have found so far with FreeBSD Make, is
to substitute whitespaces with another character in the target
variables, for example '+', (i.e.
/home/joe/directory+name+with+spaces/hello.c) and using the modified
variable as the target name. In the target rule, the variable
substitution then has to be "reversed" to obtain the "real" target
name:
# MY_TARGET=/home/joe/directory name with spaces/hello.c#
MY_TARGET_PLUS != echo "$(MY_TARGET)" | sed -e 's/ /+/g'
${MY_TARGET_PLUS}: @echo "${@:C/\+/ /g}"
Using this ugly hack, the warnings disappears in the example above, but it
doesn't really resolve the problem, as MY_TARGET_PLUS will always be a
non-existing target. So using this hack, targets will always be
executed/rebuilt, even if MY_TARGET is up to date.
Best regards, Johan Kuuse
More information about the freebsd-doc
mailing list