CC = gcc SRC = source OBJ = objects LIB = libraries SRC_LIB = $(SRC)/libraries INC = includes BIN = bin TARGET = root PREFIX ?= /usr/local CFLAGS = -Wall -Wextra -std=c11 LIBRARIES = INCLUDES = \ -I ./source DEPENDENCIES = $(shell find ./deps -maxdepth 2 -name Makefile -printf '%h\n' | grep -v 'unittest' | grep -v '^.$$') SOURCES = $(shell find ./source -name '*.c') # Debug ifeq ($(DEBUG), 1) CFLAGS += -DDEBUG=1 -ggdb endif # Release ifeq ($(RELEASE), 1) CFLAGS += -O2 endif # Shared ifeq ($(SHARED), 1) SOURCES=$(shell find ./$(SRC_LIB) -name '*.c') TARGET=my_lib endif OBJECTS = $(addprefix $(OBJ)/,$(SOURCES:%.c=%.o)) .PHONY: all all: dependencies source .PHONY: dependencies dependencies: echo "empty" .PHONY: source source: $(OBJECTS) @mkdir -p $(BIN) ifeq ($(SHARED), 1) $(CC) -shared -fPIC -o $(BIN)/$(TARGET).so $^ $(LIBRARIES) ar -rcs $(BIN)/$(TARGET).a $^ else $(CC) $(CFLAGS) $(LIBRARIES) $^ -o $(BIN)/$(TARGET) endif # $(CC) -o $(TARGET) $(OBJECTS) $(CFLAGS) $(OBJ)/%.o: %.c @mkdir -p $(dir $@) $(CC) -c -o $@ $< $(CFLAGS) $(INCLUDES) .PHONY: clean clean: @rm -rf $(OBJ)/* 2> /dev/null @rm -rf $(BIN)/* 2> /dev/null @rm -rf $(INC)/* 2> /dev/null # .PHONY: install # install: # install $(TARGET) $(PREFIX)/bin # .PHONY: uninstall # uninstall: # @rm -f $(PREFIX)/bin/$(TARGET) 2> /dev/null