%% Russell <[EMAIL PROTECTED]> writes:

  >> >> CSRCS = file1.c file2.c file999.c file1000.c
  >> >> c.pfs:
  >> >>      @rm -f $@
  >> >>      @$(foreach f,$(CSRCS),$(shell echo $(f) >> $@))

  r> I think each line of the command is spawned as a separate shell
  r> process. Try to keep all the commands in one line (one process):

  >> He's using make commands like $(foreach ...) and $(shell ...), and those
  >> are evaluated by make before the command script is actually invoked.
  >> 
  >> So, what you're suggesting won't help...

  r> But wouldn't the line: @$(foreach f,$(CSRCS),$(shell echo $(f) >>
  r> $@)) end up as a series of shell commands?

It does, but you have to keep in mind that $(shell ...) is executed
_when it's expanded_.

What does make do when it wants to run a command script?  It expands
all the variables in the script.  _Then_ it runs the script.  Since the
$(shell ...) commands are invoked when expanded, they are all run
_before_ the command script (the rm operation) is run.

  r> I thought it would then be more logical to execute all the shell
  r> commands beginning from the start:

  r> @rm -f $@ ; \
  r> $(foreach f,$(CSRCS),$(shell echo $(f) >> $@))

  r> Is this quirk of execution order stated in the manual? I'd
  r> consider it a bug fix if that quirk wasn't so.

It's not a quirk, and it's not a bug.  It's a natural extension of the
fact that (a) make functions are evaluated just like variables are, and
(b) all make variables (and functions) in a command script are (must
be!) expanded before make can invoke that command script.

-- 
-------------------------------------------------------------------------------
 Paul D. Smith <[EMAIL PROTECTED]>          Find some GNU make tips at:
 http://www.gnu.org                      http://make.paulandlesley.org
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist


_______________________________________________
Help-make mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/help-make

Reply via email to