Skip to content

Instantly share code, notes, and snippets.

@tronje
Last active November 24, 2018 21:24
Show Gist options
  • Save tronje/ecff4b32f8f1b33fc31ce543259eed18 to your computer and use it in GitHub Desktop.
Save tronje/ecff4b32f8f1b33fc31ce543259eed18 to your computer and use it in GitHub Desktop.
C Makefile
### constants ###
NAME = name_of_program
# directories
SRC_DIR = src
INCLUDE_DIR = include
BUILD_DIR = build
TARGET_DIR = $(BUILD_DIR)/debug
RELEASE_TARGET_DIR = $(BUILD_DIR)/release
# compilation
CC = gcc
CFLAGS = -Wall -Wextra -Wpedantic -Iinclude
LIBS = -lm
# debug mode
DBFLAGS = -Werror -Wshadow -Wstrict-overflow -fno-strict-aliasing -g -Og -DDEBUG
TARGET_NAME = $(NAME)
TARGET = $(TARGET_DIR)/$(TARGET_NAME)
# release mode
OPTFLAGS = -Os -flto
RELEASE_TARGET_NAME = $(NAME)
RELEASE_TARGET = $(RELEASE_TARGET_DIR)/$(RELEASE_TARGET_NAME)
# files
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
HEADERS = $(wildcard $(INCLUDE_DIR)/*.h)
OBJECTS = $(patsubst $(SRC_DIR)/%.c, $(TARGET_DIR)/%.o, $(SRC_FILES))
RELEASE_OBJECTS = $(patsubst $(SRC_DIR)/%.c, $(RELEASE_TARGET_DIR)/%.o, $(SRC_FILES))
### targets ###
.DEFAULT:
@echo "Target not found:" $@
@echo "Use 'make help' to print help text."
.PRECIOUS: $(TARGET) $(OBJECTS) $(RELEASE_TARGET) $(RELEASE_OBJECTS)
.PHONY: release
release: CFLAGS += $(OPTFLAGS)
release: $(RELEASE_TARGET)
.PHONY: debug
debug: CFLAGS += $(DBFLAGS)
debug: $(TARGET)
$(TARGET_DIR):
mkdir -p $(TARGET_DIR)
$(RELEASE_TARGET_DIR):
mkdir -p $(RELEASE_TARGET_DIR)
$(TARGET_DIR)/%.o: $(SRC_DIR)/%.c $(HEADERS) | $(TARGET_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(RELEASE_TARGET_DIR)/%.o: $(SRC_DIR)/%.c $(HEADERS) | $(RELEASE_TARGET_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) $(LIBS) -o $@
$(RELEASE_TARGET): $(RELEASE_OBJECTS)
$(CC) $(CFLAGS) $(RELEASE_OBJECTS) $(LIBS) -o $@
.PHONY: help
help:
@echo "Makefile for" $(NAME)
@echo ""
@echo "Targets:"
@echo " release build executable in release mode (default)"
@echo " debug build executable in debug mode"
@echo " init create required directories"
@echo " clean remove generated binary files"
@echo " help print this help"
.PHONY: clean
clean:
rm -f $(OBJECTS)
rm -f $(RELEASE_OBJECTS)
rm -f $(TARGET)
rm -f $(RELEASE_TARGET)
.PHONY: mrproper
mrproper:
rm -rf $(BUILD_DIR)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment