I am doing a project which is growingprety fast and keeping the object files up date is no option. The problem beyon 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 seperate diretory, which works allready. Note: I am not that used to makefiles, I know the basics, but everything beyond...
So my question: How to scan a src folder recursivly and do that in a smart manner?
I already did it with multiple SRC variables but thats uggly and clutters the whole makefile with an increasing number of directories.
What I currently use is:
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 $< -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"
Thanks to answer #1 it boils down to how to solve this:
$(BUILDDIR)/%.o: $(SOURCEDIR)/%.c
$(CC) $(CFLAGS) $(LDFLAGS) $(SOURCETREE) -c $< -o $@
especially in the case of BUILDDIR = build and SOURCEDIR having to be replaced with the single .c files from SOURCES including their paths :/