# TODO: make shared library # Directory structure # =================== # . # ├── build # │ ├── bin # │ │ └── * # │ ├── dep # │ │ ├── *.d # │ └── obj # │ └── *.o # ├── src # │ ├── *.c # │ └── *.h # ├── test # │ └── test_*.c # ├── LICENSE # ├── Makefile # └── README.md proj:=dslibc # COMPILER OPTIONS CC:=gcc CFLAGS:=-std=c17 -Wall -Werror -g # LIBRARIES testframework:=criterion # DIRECTORIES buildir:=build objdir:=$(buildir)/obj bindir:=$(buildir)/bin depdir:=$(buildir)/dep srcdir:=src testdir:=test # FILES srcfiles:=$(wildcard $(srcdir)/*.c) objfiles=$(patsubst $(srcdir)/%.c,$(objdir)/%.o, $(srcfiles)) testfiles:=$(wildcard $(testdir)/test_*.c) dependencies:=$(patsubst $(srcdir)/%.c,$(depdir)/%.d, $(srcfiles)) bin:=$(bindir)/$(proj) testbins:=$(patsubst $(testdir)/%.c,$(bindir)/%, $(testfiles)) # TARGETS .PHONY: build build: $(objdir) $(bindir) $(depdir) $(bin) .PHONY: clean clean: -rm -r $(buildir) .PHONY: test test: $(objdir) $(bindir) $(depdir) $(objfiles) $(testbins) @for test in $(testbins); do ./$$test --verbose; done .PHONY: run run: build @$(bin) # .PHONY: demo # demo: $(objfiles) $(testdir)/demo.c # $(CC) $(CFLAGS) -o $(bindir)/demo -c $^ # .PHONY: shared # shared: $(objfiles) # $(CC) -fPIC -shared -o $(proj).so $^ .PHONY: info info: @echo "srcfiles: $(srcfiles)" @echo "objfiles: $(objfiles)" @echo "testfiles: $(testfiles)" @echo "testbins: $(testbins)" # Create object files $(objdir)/%.o: $(srcdir)/%.c $(CC) $(CFLAGS) -o $@ -c $< -MMD -MF $(depdir)/$(@F:.o=.d) -include $(dependencies) # Create binary $(bin): $(objfiles) $(CC) $(CFLAGS) -o $@ $^ # Make test binaries $(bindir)/%: $(testfiles) $(filter-out $(objdir)/demo.o,$(objfiles)) $(CC) $(CFLAGS) -o $@ -l $(testframework) $^ # Create Directories $(objdir): mkdir -p $@ $(bindir): mkdir -p $@ $(depdir): mkdir -p $@