This does not directly answer your question...

My general advice is to not try to find ways to have directories as targets or 
as dependencies of rules.

One pattern that I find addresses many use cases is to unconditionally shell 
out to create all directories that will be used in the makefile, as:

$(shell mkdir -p dir) 

> -----Original Message-----
> From: Help-make <help-make-bounces+mec=stowers....@gnu.org> On
> Behalf Of Brian J. Murrell
> Sent: Thursday, January 28, 2021 12:10
> To: help-make@gnu.org
> Subject: make: *** No rule to make target 'dir/bar', needed by 'foobar'.
> Stop.
> 
> I wonder if somebody can explain to me why this Makefile:
> 
> foo:
>       touch foo
>       touch bar
> 
> %/:
>       mkdir -p $@
> 
> dir/%: % | dir/
>       rm -f $@
>       ln $< $@
> 
> foobar: dir/foo dir/bar
> 
> 
> doesn't work as one might think it should:
> 
> $ rm -rf dir foo bar; make foobar
> touch foo
> touch bar
> mkdir -p dir/
> rm -f dir/foo
> ln foo dir/foo
> make: *** No rule to make target 'dir/bar', needed by 'foobar'.  Stop.
> 
> Everything looks good for dir/bar to be created:
> 
> $ ls -l foo bar dir/
> -rw-rw-r--. 1 brian brian    0 Jan 28 12:53 bar
> -rw-rw-r--. 2 brian brian    0 Jan 28 12:53 foo
> 
> dir/:
> total 0
> -rw-rw-r--. 2 brian brian 0 Jan 28 12:53 foo
> 
> Subsequently trying to create dir/bar even works:
> 
> $ make dir/bar
> rm -f dir/bar
> ln bar dir/bar
> 
> Any ideas?  What am I missing?
> 
> Cheers,
> b.

Reply via email to