[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bug or correct behavior?

From: Mike Shal
Subject: Re: Bug or correct behavior?
Date: Tue, 5 Feb 2008 16:27:20 -0500

On 2/5/08, Derek Clegg <address@hidden> wrote:
> On Feb 5, 2008, at 11:45 AM, Mike Shal wrote:
> > Pattern rules are treated a little differently. Specifically, see
> > section 10.5.1 "Introduction to Pattern Rules" in the make info pages:
> >
> >  The order in which pattern rules appear in the makefile is important
> >  since this is the order in which they are considered.  Of equally
> >  applicable rules, only the first one found is used.
> >
> > In your example, only the first pattern rule will apply, and the foo.h
> > dependency will be ignored.
> I'm not sure this is correct. If it were, as you point out:
> > You could move foo.h to the line above and have a single pattern
> > rule to get your expected behavior in this case.
> I tried this, and the behavior is unchanged.  Unless there's a bug,
> this implies that I have a single pattern rule:
>    dir/%.c: %.c | dir ; cp $< $@
> The rule
>    dir/%.c: foo.h
> does not appear to be treated as a pattern rule.  (Otherwise, putting
> it first would have changed the behavior.)

Err, sorry I wasn't clear. I meant putting foo.h in the line above,
not just swapping the two lines:

start: dir/a.c
dir/%.c: %.c foo.h | dir ; cp $< $@
dir: ; mkdir $@
a.c foo.h: ; touch $@

$ make
touch a.c
touch foo.h
mkdir dir
cp a.c dir/a.c

I suspect just swapping the lines doesn't do what you would think
because the pattern rule 'dir/%.c: foo.h' doesn't have any commands
associated with it (such as the other rule does). I tried swapping the
two lines and adding a command to the foo.h rule, and only that rule
was executed.

Either way, Paul's advice about making the .o depend on the .h is
probably the road you should pursue - I was just trying to get your
script to generate your expected output :)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]