[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Target-specific variables in implicit rules
From: |
Greg Chicares |
Subject: |
Re: Target-specific variables in implicit rules |
Date: |
Thu, 20 Oct 2005 17:07:50 +0000 |
User-agent: |
Mozilla Thunderbird 1.0.2 (Windows/20050317) |
On 2005-10-20 16:06 UTC, Dario Teixeira wrote:
>
> I need to use variables inside an implicit rule. The idea
> is that all files named $(PREFIX)_%_$(SUFFIX) should
> be processed by the rule. The exact values for $(PREFIX)
> and $(SUFFIX) are set previously in the Makefile, and the
> % character is of course the wildcard for implicit rules.
>
> Anyway, here's an example that works fine:
> (It is of course a stripped down version of the full Makefile.
> Also, suppose that "generate" is a command which reads from
> first argument and writes to the second).
>
> ==================================================
> all: draft
> PREFIX=before
> SUFFIX=after
> draft: before_foobar_after.out
>
> $(PREFIX)_%_$(SUFFIX).out : $(PREFIX)_%_$(SUFFIX).in
> generate $< $@
> ==================================================
>
>
> Now, the problem happens when I use target-specific
> variable values. If I understood the make manual,
> all prerequisites should inherit those target-specific
> variables, but this does not seem to happen with
> the implicit rule.
>
> This example fails:
>
> ==================================================
> all: draft
> draft: PREFIX=before
> draft: SUFFIX=after
> draft: prefix_foobar_suffix.out
>
> $(PREFIX)_%_$(SUFFIX).out : $(PREFIX)_%_$(SUFFIX).in
> generate $< $@
> ==================================================
>
>
> Is this a bug, a feature, or am I missing something?
Target-specific variables work only in scripts: they're like
$@, $*, etc. in that respect.
> Also, is there any other way to achieve what I want?
It's been said that you can solve any programming problem by
adding an extra level of indirection. Here's a way to transform
target-specific variables into vanilla variables.
# GNUmakefile begins #
draft: PREFIX=before
draft: SUFFIX=after
PREFIX ?= (PREFIX not set)
SUFFIX ?= (SUFFIX not set)
all: $(PREFIX)_$(MAKECMDGOALS)_$(SUFFIX).out
%:
@$(MAKE) --file=submakefile --no-print-directory \
PREFIX='$(PREFIX)' SUFFIX='$(SUFFIX)' \
$(PREFIX)address@hidden(SUFFIX).out
# GNUmakefile ends #
# submakefile begins #
%.out:
@echo PREFIX='$(PREFIX)'
@echo SUFFIX='$(SUFFIX)'
@echo Invoke rule to make $@
# submakefile ends #
Test:
$make draft
PREFIX=before
SUFFIX=after
Invoke rule to make before_draft_after.out
$make xyzzy
PREFIX=(PREFIX not set)
SUFFIX=(SUFFIX not set)
Invoke rule to make (PREFIX not set)_xyzzy_(SUFFIX not set).out