FreeBSD Make question

Johan Kuuse kuuse at
Fri Oct 25 07:43:05 UTC 2013

On Thu, Oct 24, 2013 at 11:49 PM, Simon J. Gerraty <sjg at> 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:

# 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

@echo This is Make version $(MAKE_VERSION)

    @echo $@

    @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
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

# 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