Created
February 17, 2023 15:07
-
-
Save tgarc/0e4b21cabbe4c5bf8f273fbb7be70073 to your computer and use it in GitHub Desktop.
C++ Makefile template
This file contains hidden or 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
# Thanks to Job Vranish (https://spin.atomicobject.com/2016/08/26/makefile-c-projects/) | |
TARGET_EXEC := a | |
BUILD ?= release | |
BUILD_DIR ?= ./build | |
SRC_DIRS ?= ./src | |
CC ?= gcc | |
CXX ?= g++ | |
# Append flags conditionally | |
# (Can be overriden by passing CPPFLAGS variable to make) | |
cppflags.common := -Wall -Wextra | |
cppflags.release := -O2 | |
cppflags.debug := -O0 -g | |
CPPFLAGS := $(cppflags.common) $(cppflags.$(BUILD)) | |
CXXFLAGS := -std=c++11 | |
# CFLAGS := | |
# LDFLAGS := | |
# Find all the C and C++ files we want to compile | |
# Note the single quotes around the * expressions. Make will incorrectly expand these otherwise. | |
SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c' -or -name '*.s') | |
# String substitution for every C/C++ file. | |
# As an example, hello.cpp turns into ./build/hello.cpp.o | |
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) | |
# For assembly dumps | |
ASMS := $(OBJS:.o=.asm) | |
# String substitution (suffix version without %). | |
# As an example, ./build/hello.cpp.o turns into ./build/hello.cpp.d | |
DEPS := $(OBJS:.o=.d) | |
# Every folder in ./src will need to be passed to GCC so that it can find header files | |
INC_DIRS := $(shell find $(SRC_DIRS) -type d) | |
# Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag | |
INC_FLAGS := $(addprefix -I,$(INC_DIRS)) | |
# The -MMD and -MP flags together generate Makefiles for us! | |
# These files will have .d instead of .o as the output. | |
CPPFLAGS := $(INC_FLAGS) -MMD -MP $(CPPFLAGS) | |
# The final build step. | |
$(TARGET_EXEC): $(OBJS) | |
$(CXX) $(OBJS) -o $@ $(LDFLAGS) | |
.PHONY: all | |
all: $(TARGET_EXEC) | |
.PHONY: asm | |
asm: $(ASMS) | |
# Build step for disassembly | |
$(BUILD_DIR)/%.asm: $(BUILD_DIR)/%.o | |
@objdump -SCl $< > $@ | |
# Build step for C source | |
$(BUILD_DIR)/%.c.o: %.c | |
@mkdir -p $(dir $@) | |
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ | |
# Build step for C++ source | |
$(BUILD_DIR)/%.cpp.o: %.cpp | |
@mkdir -p $(dir $@) | |
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ | |
.PHONY: clean | |
clean: | |
rm -rf $(BUILD_DIR) $(TARGET_EXEC) | |
# Include the .d makefiles. The - at the front suppresses the errors of missing | |
# Makefiles. Initially, all the .d files will be missing, and we don't want those | |
# errors to show up. | |
-include $(DEPS) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment