Skip to content

Instantly share code, notes, and snippets.

@Niakr1s
Last active March 16, 2019 08:06
Show Gist options
  • Select an option

  • Save Niakr1s/097db80004b6a2efc3afb70372ed41f3 to your computer and use it in GitHub Desktop.

Select an option

Save Niakr1s/097db80004b6a2efc3afb70372ed41f3 to your computer and use it in GitHub Desktop.
simple makefile
CC = g++
CFLAGS = -Wall
LDFLAGS =
SRC_PATH = src/
MAIN_OBJ = main.o # to filter out it from test objs
SRCS = $(wildcard $(SRC_PATH)*.cpp) # get all .cpp in src dir
# for tests
TEST_CFLAGS = $(CFLAGS) -Id:/libs/boost_1_69_0/stage/include/boost-1_69
TEST_LDFLAGS = $(LDFLAGS) -Ld:/libs/boost_1_69_0/stage/lib -lboost_unit_test_framework-mgw82-mt-s-x32-1_69
TEST_PATH = tests/
# making PREFIX
RELEASE_PREFIX = build/release/
DEBUG_PREFIX = build/debug/
ifeq "$(strip $(filter debug, $(MAKECMDGOALS)))" "debug"
PREFIX = $(DEBUG_PREFIX)
else
PREFIX = $(RELEASE_PREFIX)
endif
EXECUTABLE = $(PREFIX)main.exe
ifeq "$(strip $(filter test, $(MAKECMDGOALS)))" "test"
# excluding main.o from OBJS for test because of main function collisions
OBJS = $(addprefix $(PREFIX), $(filter-out $(MAIN_OBJ), $(notdir $(SRCS:.cpp=.o))))
else
OBJS = $(addprefix $(PREFIX), $(notdir $(SRCS:.cpp=.o)))
endif
# test vars
TEST_PREFIX = $(TEST_PATH)build/
TEST_SRCS = $(wildcard $(TEST_PATH)*.cpp) # get all .cpp in src dir
TEST_OBJS = $(addprefix $(TEST_PREFIX), $(notdir $(TEST_SRCS:.cpp=.o)))
TEST_EXECUTABLE = $(TEST_PREFIX)tests.exe
.PHONY: run release debug build clean
run: release
@echo -------------
$(EXECUTABLE)
@echo -------------
release: CFLAGS := -D NDEBUG $(CFLAGS)
release: build
debug: CFLAGS := -g $(CFLAGS)
debug: build
build: $(PREFIX) $(OBJS)
$(CC) $(OBJS) $(LDFLAGS) -o $(EXECUTABLE)
test: $(TEST_PREFIX) $(PREFIX) $(TEST_OBJS) $(OBJS)
$(CC) $(TEST_OBJS) $(OBJS) $(TEST_LDFLAGS) -o $(TEST_EXECUTABLE)
$(TEST_EXECUTABLE)
$(PREFIX) $(TEST_PREFIX):
mkdir -p $@
DEPS := $(OBJS:.o=.d)
TEST_DEPS := $(TEST_OBJS:.o=.d)
-include $(DEPS)
-include $(TEST_DEPS)
# -MMD flag create .d file with same name as .o
$(PREFIX)%.o: $(SRC_PATH)%.cpp # for each .cpp in src_path making .o in prefix_path
$(CC) -c -MMD $< $(CFLAGS) -o $@
$(TEST_PREFIX)%.o: $(TEST_PATH)%.cpp # for each .cpp in src_path making .o in prefix_path
$(CC) -c -MMD $< $(TEST_CFLAGS) -o $@
clean:
rm -rf $(RELEASE_PREFIX)* $(DEBUG_PREFIX)*
rm -rf $(TEST_PREFIX)*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment