|
Home > Archive > Unix Programming > March 2007 > [GNU Make] Stem for phony target
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
[GNU Make] Stem for phony target
|
|
| * Tong * 2007-03-21, 7:20 pm |
| Hi,
I have the following make file:
-------------------------------------------
all: something else
..PHONY: MakeAppleJuice MakeOrangeJuice MakeTomatoJuice
MakeAppleJuice:
make_juice Apple.in.source Apple.in.condition
MakeOrangeJuice:
make_juice Orange.in.source Orange.in.condition
MakeTomatoJuice:
make_juice Tomato.in.source Tomato.in.condition
-------------------------------------------
Is there anyway to combine the 3 rules into one? I hope there is, because
the 3 rules only different in what files they use and what juices then make
(but I still need the 3 phony targets). I tried the following but it didn't
work:
-------------------------------------------
Make%Juice: %.in.source
make_juice $*.in.source $*.in.condition
-------------------------------------------
Please help.
thanks
--
Tong (remove underscore(s) to reply)
http://xpt.sf.net/techdocs/
http://xpt.sf.net/tools/
--
Posted via a free Usenet account from http://www.teranews.com
| |
| Jean-Rene David 2007-03-22, 1:24 am |
| * * Tong * [2007.03.21 21:05]:
> I tried the following but it didn't work:
>
> -------------------------------------------
> Make%Juice: %.in.source
> make_juice $*.in.source $*.in.condition
> -------------------------------------------
Though a bit different, this works and may get on you the
right track:
all: something else
..PHONY: AppleJuice OrangeJuice TomatoJuice
%Juice: %.in.source
make_juice $? $(addsuffix .in.condition, $(patsubst %.in.source,%,$?))
info make --index='File Name Functions'
info make --index='Pattern Rules'
info make --index='Automatic Variables'
--
JR
| |
| * Tong * 2007-03-22, 1:24 am |
| On Wed, 21 Mar 2007 19:46:40 -0500, Jean-Rene David wrote:
> * * Tong * [2007.03.21 21:05]:
>
> Though a bit different, this works and may get on you the
> right track:
>
> all: something else
>
> .PHONY: AppleJuice OrangeJuice TomatoJuice
>
> %Juice: %.in.source
> make_juice $? $(addsuffix .in.condition, $(patsubst %.in.source,%,$?))
thanks for the reply, hmm...
Have you tried your make file?
$ make AppleJuice
make: Nothing to be done for `AppleJuice'.
Which shouldn't be, because AppleJuice is a phony target.
--
Tong (remove underscore(s) to reply)
http://xpt.sf.net/techdocs/
http://xpt.sf.net/tools/
--
Posted via a free Usenet account from http://www.teranews.com
| |
| Jean-Rene David 2007-03-22, 1:24 am |
| * * Tong * [2007.03.22 01:12]:
> On Wed, 21 Mar 2007 19:46:40 -0500, Jean-Rene David wrote:
>
> thanks for the reply, hmm...
>
> Have you tried your make file?
I did what one should never do: change one small thing
*after* having tested it.
> $ make AppleJuice
> make: Nothing to be done for `AppleJuice'.
I looked into it a little (did you?) and I learned
something. Pattern rules and phonies don't play well. You
can't have a rule like this:
..PHONY: %.o
Also, it seems when you define:
..PHONY: AppleJuice
Then make looks for an *explicit* rule to make "AppleJuice".
It doesn't do the pattern rule.
Interestingly, I haven't seen this anywhere in the
documentation.
> Which shouldn't be, because AppleJuice is a phony target.
Quite the opposite. In light of the above, if you remove the
target from the phonies, it works.
If you want to get the effect of .PHONY, there's another
trick:
FORCE:
Make%Juice: %.in.source FORCE
make_juice $*.in.source $*.in.condition
And your original command line works.
info make --index='force'
--
JR
| |
| * Tong * 2007-03-22, 1:27 pm |
| On Wed, 21 Mar 2007 23:33:30 -0500, Jean-Rene David wrote:
> If you want to get the effect of .PHONY, there's another
> trick:
>
> FORCE:
> Make%Juice: %.in.source FORCE
> make_juice $*.in.source $*.in.condition
Thanks for the reply. I still can't get it working:
$ cat Makefile
make_juice := echo
all: something else
..PHONY: MakeAppleJuice MakeOrangeJuice MakeTomatoJuice
FORCE:
Make%Juice: %.in.source FORCE
make_juice $*.in.source $*.in.condition
#MakeAppleJuice:
$ make MakeAppleJuice
make: Nothing to be done for `MakeAppleJuice'.
If the last "MakeAppleJuice:" is uncommented, It still won't work. My make
is:
$ make --version
GNU Make 3.81
>
> Quite the opposite. In light of the above, if you remove the
> target from the phonies, it works.
I don't quite understand this. You mean do a 'rm <target>' as the make rule?
This is what I tried also:
$ rm -v Apple.in.*
removed `Apple.in.condition'
removed `Apple.in.source'
$ make MakeAppleJuice
make: Nothing to be done for `MakeAppleJuice'.
I read quite a lot, but just can't apprehend enough to make it works.
thanks
--
Tong (remove underscore(s) to reply)
http://xpt.sf.net/techdocs/
http://xpt.sf.net/tools/
--
Posted via a free Usenet account from http://www.teranews.com
| |
| Jean-Rene David 2007-03-22, 1:27 pm |
| * * Tong * [2007.03.22 12:47]:
> On Wed, 21 Mar 2007 23:33:30 -0500, Jean-Rene David wrote:
> Thanks for the reply. I still can't get it working:
>
> $ cat Makefile
> make_juice := echo
>
> all: something else
>
> .PHONY: MakeAppleJuice MakeOrangeJuice MakeTomatoJuice
>
> FORCE:
> Make%Juice: %.in.source FORCE
> make_juice $*.in.source $*.in.condition
>
> #MakeAppleJuice:
>
> $ make MakeAppleJuice
> make: Nothing to be done for `MakeAppleJuice'.
This is basically the same makefile as before.
The "FORCE" trick is meant to *replace* the .PHONY rule.
It's not exactly the same thing, but in your case it will
allow you to do what you want with a similar overall effect
(only performance is affected).
>
> I don't quite understand this. You mean do a 'rm <target>'
> as the make rule?
No. I mean delete the .PHONY *rule* from your makefile.
% cat Makefile
all: something else
FORCE:
Make%Juice: %.in.source FORCE
@echo $*.in.source $*.in.condition
% ls *.in.source
Apple.in.source
Orange.in.source
Tomato.in.source
% make MakeAppleJuice
Apple.in.source Apple.in.condition
% touch MakeAppleJuice
% make MakeAppleJuice
Apple.in.source Apple.in.condition
Without "FORCE":
% cat Makefile
all: something else
Make%Juice: %.in.source
@echo $*.in.source $*.in.condition
% touch MakeAppleJuice
% make MakeAppleJuice
make: `MakeAppleJuice' is up to date.
--
JR
| |
|
|
|
|
|