Last active
November 24, 2018 21:24
-
-
Save tronje/ecff4b32f8f1b33fc31ce543259eed18 to your computer and use it in GitHub Desktop.
C Makefile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### 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