[Top][All Lists]

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

Re: GNU Make Question about string replace in dependency list

From: Paul D. Smith
Subject: Re: GNU Make Question about string replace in dependency list
Date: Tue, 12 Nov 2002 15:19:12 -0500

%% Philip Guenther <address@hidden> writes:

  pg> %.o: $(SRC)/%.cpp $(INCL)/%.h
  pg>   $(CC) $(CPPFLAGS) -o $@ $(SRC)/$(@:.o=.cpp)

You should simply use "$<" here, instead of "$(SRC)/$(@:.o=.cpp)".  If
you really don't like that, I'd at least use "$(SRC)/$*.cpp".

Basing it on $@ is much less flexible: what happens when you change the
target pattern to "$(OBJ)/%.o"?  Now you have to use $(@F) or something.

  pg> If different sets of files need different 'mappings' from source
  pg> path to object, then a static pattern rule will do the trick:

  pg> CPP_OBJ = node.o foo.o

  pg> $(CPP_OBJ): %.o: $(SRC)/%.cpp $(INCL)/%.h
  pg>   $(CC) $(CPPFLAGS) -o $@ $(SRC)/$(@:.o=.cpp)

  pg> C_OBJ = low_level.o

  pg> $(C_OBJ): %.o: $(SRC)/%.c $(INCL)/%.h
  pg>   $(CC) $(CPPFLAGS) -o $@ $(SRC)/$(@:.o=.c)

Static pattern rules are often useful, but they aren't actually
necessary in the example you provide here (again, just to be pedantic).

If make can't match one pattern rule it'll simply keep looking for
another one.  So, you can make both of the above normal pattern rules
instead of static pattern rules, and it will Just Work: when make wants
to build node.o it will find a $(SRC)/node.cpp and use that rule; when
it wants to build low_level.o it won't find a $(SRC)/low_level.cpp so it
rejects the first pattern rule, then it finds a $(SRC)/low_level.c and
so chooses that one instead.

 Paul D. Smith <address@hidden>          Find some GNU make tips at:            
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist

reply via email to

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