[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: A question about Makefile
From: |
Jed Jia |
Subject: |
Re: A question about Makefile |
Date: |
Wed, 8 Dec 2010 18:50:48 +0800 |
Hi Christof,
Thanks for your solution!
It works well, but seems a little inconvenient. Do I have to use
CANONICAL_PATH on every file path?
And I wonder whether this is a future of make or just a bug?
Jed
2010/12/8 Warlich, Christof <address@hidden>:
> 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
>