1.

gnu make的函数调用是$,比如 $(subst ee,EE,feet on the street)

 

规则中“TARGETS”可以是空格分开的多个文件名

 

a all:
echo $(subst ee,EE,feet on the street)

 

 

 Phony-Targets

SUBDIRS = foo bar baz

.PHONY: subdirs $(SUBDIRS)

subdirs: $(SUBDIRS)

$(SUBDIRS):
        $(MAKE) -C $@

foo: baz

 

 

Pattern Rules

 

Makefile里的.c.o等价于 %.o : %.c

 

 

.c.o:
    $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po

 

gcc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -DINCLUDEDIR=\"/usr/local/include\" -DHAVE_CONFIG_H -I.  -I./glob    -g -O2 -MT ar.o -MD -MP -MF .deps/ar.Tpo -c -o ar.o ar.c
mv -f .deps/ar.Tpo .deps/ar.Po
...

gcc  -g -O2   -o make ar.o arscan.o commands.o default.o dir.o expand.o file.o function.o getopt.o getopt1.o implicit.o job.o main.o misc.o read.o remake.o remote-stub.o rule.o signame.o strcache.o variable.o version.o vpath.o hash.o glob/libglob.a

 

 
下载3.8.2源码编译,./configure && make

http://www.gnu.org/software/make/manual/make.html#Text-Functions

 

http://ftp.gnu.org/gnu/make/

 

2.

 automake生成的Makefile

 

all: config.h
    $(MAKE) $(AM_MAKEFLAGS) all-recursive
...

RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
install-html-recursive install-info-recursive \
install-pdf-recursive install-ps-recursive install-recursive \
installcheck-recursive installdirs-recursive pdf-recursive \
ps-recursive uninstall-recursive

...

$(RECURSIVE_TARGETS):
    @fail= failcom='exit 1'; \
    for f in x $$MAKEFLAGS; do \
      case $$f in \
        *=* | --[!k]*);; \
        *k*) failcom='fail=yes';; \
      esac; \
    done; \
    dot_seen=no; \
    target=`echo $@ | sed s/-recursive//`; \
    list='$(SUBDIRS)'; for subdir in $$list; do \
      echo "Making $$target in $$subdir"; \
      if test "$$subdir" = "."; then \
        dot_seen=yes; \
        local_target="$$target-am"; \
      else \
        local_target="$$target"; \
      fi; \
      ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
      || eval $$failcom; \
    done; \
    if test "$$dot_seen" = "no"; then \
      $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
    fi; test -z "$$fail"
...
all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) config.h

...
make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES) 
    @rm -f make$(EXEEXT)
    $(LINK) $(make_OBJECTS) $(make_LDADD) $(LIBS)

...

am_make_OBJECTS = ar.$(OBJEXT) arscan.$(OBJEXT) commands.$(OBJEXT) \
    default.$(OBJEXT) dir.$(OBJEXT) expand.$(OBJEXT) \
    file.$(OBJEXT) function.$(OBJEXT) getopt.$(OBJEXT) \
    getopt1.$(OBJEXT) implicit.$(OBJEXT) job.$(OBJEXT) \
    main.$(OBJEXT) misc.$(OBJEXT) read.$(OBJEXT) remake.$(OBJEXT) \
    $(am__objects_1) rule.$(OBJEXT) signame.$(OBJEXT) \
    strcache.$(OBJEXT) variable.$(OBJEXT) version.$(OBJEXT) \
    vpath.$(OBJEXT) hash.$(OBJEXT)
make_OBJECTS = $(am_make_OBJECTS)

...

.c.o:
    $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po