title: Makefile issue: smart way to scan directory tree for .c files
body: <p>I am doing a project which is growing pretty fast and keeping the object files up date is no option. The problem beyond wildcard command lies somewhere between "I do not want recursive makefiles" and "I do not want it to list by hand". The objects are supposed to go into a separate directory, which works already.
  Note: I am not <em>that</em> used to makefiles, I know the basics, but everything beyond...</p>
  
  <p>So my question: 
  <b> How to scan a src folder recursively and do that in a smart manner?</b></p>
  
  <p>I already did it with multiple SRC variables but that's ugly and clutters the whole makefile with an increasing number of directories.</p>
  
  <p>What I currently use is:</p>
  
  <pre><code>OS = Linux
  
  VERSION = 0.0.1
  CC      = /usr/bin/gcc
  CFLAGS  = -Wall -g -D_REENTRANT -DVERSION=\"$(VERSION)\"
  LDFLAGS = -lm `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
  
  BUILDDIR = build
  SOURCEDIR = src
  HEADERDIR = src
  
  SOURCES = $(wildcard $(SOURCEDIR)/*.c)
  OBJECTS = $(patsubst $(SOURCEDIR)/%.c, $(BUILDDIR)/%.o, $(SOURCES))
  
  NAME = cinnamon
  BINARY = cinnamon.bin
  
  ECHO = echo
  RM = rm -rf
  MKDIR = mkdir
  INSTALL = install
  
  .PHONY: all clean setup
  
  all: $(BINARY)
  
  
  $(BINARY): $(BUILDDIR)/$(OBJECTS)
      $(CC) $(CFLAGS) $(LDFLAGS) -I$(HEADERDIR) -I$(SOURCEDIR) $(OBJECTS) -o $(BINARY) 
  
  
  $(BUILDDIR)/%.o: $(SOURCEDIR)/%.c
      $(CC) $(CFLAGS) $(LDFLAGS) -I$(HEADERDIR) -I$(SOURCEDIR) -c $&lt; -o $@
  
  setup:
      $(MKDIR) -p $(BUILDDIR)
  
  install:
      $(INSTALL) -m 755 -o 0 -g 0 -d $(DESTDIR)/usr/local/bin/
      $(INSTALL) -m 755 -o 0 -g 0 $(BINARY) $(DESTDIR)/usr/local/bin/$(BINARY)
      $(INSTALL) -m 755 -o 0 -g 0 -d $(DESTDIR)/usr/local/$(NAME)/ui/
      $(INSTALL) -m 644 -o 0 -g 0 ./ui/*.ui $(DESTDIR)/usr/local/$(NAME)/ui/
  #   $(INSTALL) -m 755 -o 0 -g 0 -d $(DESTDIR)/usr/local/$(NAME)/model/
  #   $(INSTALL) -m 644 -o 0 -g 0 ./model/*.model $(DESTDIR)/usr/local/$(NAME)/model/
  
  clean:
      $(RM) $(BINARY) $(OBJECTS)
  
  distclean: clean
  
  
  help:
      @$(ECHO) "Targets:"
      @$(ECHO) "all     - buildcompile what is necessary"
      @$(ECHO) "clean   - cleanup old .o and .bin"
      @$(ECHO) "install - not yet fully supported"
  </code></pre>
  
  <p>Thanks to answer #1 it boils down to how to solve this:</p>
  
  <pre><code>$(BUILDDIR)/%.o: $(SOURCEDIR)/%.c
      $(CC) $(CFLAGS) $(LDFLAGS) $(SOURCETREE) -c $&lt; -o $@
  </code></pre>
  
  <p>especially in the case of BUILDDIR = build and SOURCEDIR having to be replaced with the single .c files from SOURCES including their paths :/</p>