help-make
[Top][All Lists]
Advanced

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

Re: Problem with pattern rules


From: Paul Smith
Subject: Re: Problem with pattern rules
Date: Wed, 21 Mar 2012 12:26:54 -0400

On Wed, 2012-03-21 at 09:09 -0700, DrDavey wrote:
> $(patsubst %,%_all,$(TARGETS)): $(patsubst %_all,%,$@)

Things like this cannot work.

The GNU make manual on automatic variables (like "$@") makes clear that
they have valid values ONLY WITHIN THE RECIPE.

You cannot use them like that in the prerequisites list as they have no
value at that time: this line is expanded when make is reading/parsing
the makefile.  It's not until much later, when make is trying to build
specific targets, that make will match the pattern rule against a real
target and thus have a value for address@hidden by then it's too late.

In your case you can just use static pattern rules:

  $(TARGETS): % : %_rel
  $(TARGETS): % : %_deb

  $(patsubst %,%_all,$(TARGETS): %_all : %

  $(patsubst %,%_clean,$(TARGETS): %_clean : %_clean_rel
  $(patsubst %,%_clean,$(TARGETS): %_clean : %_clean_deb

etc.

Or, you can use a define rule and eval to do it all for each target:

  define build_target
  $1 : $1_rel $1_deb
  $1_all : $1
  $1_clean: $1_clean_rel $1_clean_deb
  ...
  endef

  $(foreach T,$(TARGETS),$(eval $(call build_target,$T)))

Note that if your define contains other variables, than $1, you'll
probably have to escape them.  Eval is very powerful but can be
difficult to get your head around at first.




reply via email to

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