Makefile simple
From Attie's Wiki
(Difference between revisions)
m |
m |
||
Line 23: | Line 23: | ||
SRCS:=$(wildcard *.c) | SRCS:=$(wildcard *.c) | ||
− | DEPS:=$(SRCS:.c=.d) | + | DEPS:=$(addprefix .dep/,$(SRCS:.c=.d)) |
− | OBJS:=$(SRCS:.c=.o) | + | OBJS:=$(addprefix .obj/,$(SRCS:.c=.o)) |
LFLAGS+=$(addprefix -l,$(CLIBS)) | LFLAGS+=$(addprefix -l,$(CLIBS)) | ||
Line 31: | Line 31: | ||
MAKE+=--no-print-directory | MAKE+=--no-print-directory | ||
− | .PHONY: all run clean new | + | .PHONY: all run clean new .%.dir |
all: $(BINOUT) | all: $(BINOUT) | ||
Line 43: | Line 43: | ||
new: clean | new: clean | ||
@$(MAKE) all | @$(MAKE) all | ||
+ | |||
+ | .%.dir: | ||
+ | @if [ ! -d $* ]; then echo "mkdir -p $*"; mkdir -p $*; else echo "!mkdir $*"; fi | ||
+ | @touch $@ | ||
$(BINOUT): $(OBJS) | $(BINOUT): $(OBJS) | ||
$(GCC) $(LFLAGS) $(filter %.o,$^) -o $@ | $(GCC) $(LFLAGS) $(filter %.o,$^) -o $@ | ||
− | $(OBJS): %.o: %.c %.d | + | $(OBJS): .obj/%.o: %.c ..obj.dir .dep/%.d |
$(GCC) $(CFLAGS) $*.c -c -o $@ | $(GCC) $(CFLAGS) $*.c -c -o $@ | ||
− | $(DEPS): %.d: %.c makefile | + | $(DEPS): .dep/%.d: %.c ..dep.dir makefile |
− | $(GCC) $(CFLAGS) -MM $*.c -o $@ | + | $(GCC) $(CFLAGS) -MM -MT .obj/$*.o $*.c -o $@ |
include $(wildcard *.d) | include $(wildcard *.d) | ||
</source> | </source> |
Revision as of 00:30, 11 March 2012
This is a really simple makefile, for small projects
It will just build all of the *.c
files in this directory into their own object files, and then output a linked binary to BINOUT
There is no tidy housekeeping / folder creating in this makefile
# the output binary name BINOUT?=main # a cross compile prefix (if you want one) CROSS_COMPILE?= # standard cflags CFLAGS:=-Wall -pedantic # standard lflags LFLAGS:= # a list of libraries you wish to link against LIBS:= #-------------------------------# SRCS:=$(wildcard *.c) DEPS:=$(addprefix .dep/,$(SRCS:.c=.d)) OBJS:=$(addprefix .obj/,$(SRCS:.c=.o)) LFLAGS+=$(addprefix -l,$(CLIBS)) GCC:=$(CROSS_COMPILE)gcc MAKE+=--no-print-directory .PHONY: all run clean new .%.dir all: $(BINOUT) run: all ./$(BINOUT) clean: rm -f $(DEPS) $(OBJS) $(BINOUT) new: clean @$(MAKE) all .%.dir: @if [ ! -d $* ]; then echo "mkdir -p $*"; mkdir -p $*; else echo "!mkdir $*"; fi @touch $@ $(BINOUT): $(OBJS) $(GCC) $(LFLAGS) $(filter %.o,$^) -o $@ $(OBJS): .obj/%.o: %.c ..obj.dir .dep/%.d $(GCC) $(CFLAGS) $*.c -c -o $@ $(DEPS): .dep/%.d: %.c ..dep.dir makefile $(GCC) $(CFLAGS) -MM -MT .obj/$*.o $*.c -o $@ include $(wildcard *.d)