Jed Jia wrote:
> Take a look at the following Makefile:
> 
> > x: obj/./t
> >     touch x
> >
> > obj/t: a
> >     touch obj/t
> 
> but make outputs:
> > make: *** No rule to make target `obj/./t', needed by `x'.  Stop.

While I'm not able to answer your final question, this function may help
(taken from https://github.com/dmoulding/boilermake):

> # CANONICAL_PATH - Given one or more paths, converts the paths to the 
> canonical
> #   form. The canonical form is the path, relative to the project's top-level
> #   directory (the directory from which "make" is run), and without
> #   any "./" or "../" sequences. For paths that are not  located below the
> #   top-level directory, the canonical form is the absolute path (i.e. from
> #   the root of the filesystem) also without "./" or "../" sequences.
> define CANONICAL_PATH
> $(patsubst ${CURDIR}/%,%,$(abspath ${1}))
> endef

With this function, you could then write:

> define CANONICAL_PATH
> $(patsubst ${CURDIR}/%,%,$(abspath ${1}))
> endef
> x: $(call CANONICAL_PATH,obj/./t)
>       touch x
> 
> $(call CANONICAL_PATH,obj/t):
>       touch $(call CANONICAL_PATH,obj/t)

This make your makefile independent from how a path is specified.

Cheers,

Christof

_______________________________________________
Help-make mailing list
Help-make@gnu.org
http://lists.gnu.org/mailman/listinfo/help-make

Reply via email to