Skip to content

Instantly share code, notes, and snippets.

@lukoshkin
Last active March 26, 2021 18:11
Show Gist options
  • Save lukoshkin/0c5681f58dc3b69bf591ab2e6695b1d6 to your computer and use it in GitHub Desktop.
Save lukoshkin/0c5681f58dc3b69bf591ab2e6695b1d6 to your computer and use it in GitHub Desktop.
Makefile with dependencies auto-generation
OBJDIR = bin
DEPDIR = deps
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d
src = $(wildcard src/*.cc)
obj = $(src:src/%.cc=$(OBJDIR)/%.o)
DEPFILES = $(src:src/%.cc=$(DEPDIR)/%.d)
# if boost is correctly installed, no need to add pathes to
# include and lib files: -I$(BOOST_DIR)/include -L$(BOOST_DIR)/lib
CXXFLAGS = -std=c++2a -Wall
LDFLAGS = -lboost_program_options
OPTFLAGS = -O3 -march=native
DBGFLAGS = -g
MODE != cat .make-switch 2> /dev/null
ifeq ($(MODE),)
MODE := release
endif
ifeq ($(MODE), release)
CXXFLAGS += $(OPTFLAGS)
LDFLAGS += $(OPTFLAGS)
else
CXXFLAGS += $(DBGFLAGS)
LDFLAGS += $(DBGFLAGS)
endif
CXX = g++ $(CXXFLAGS)
LINKER= g++
preproc: $(obj)
$(LINKER) $^ -o $@ $(LDFLAGS)
release:
@grep -q $@ .make-switch 2> /dev/null \
|| { echo $@ > .make-switch; \
rm -rf $(OBJDIR)/* $(DEPDIR)/*; }
debug:
@grep -q $@ .make-switch 2> /dev/null \
|| { echo $@ > .make-switch; \
rm -rf $(OBJDIR)/* $(DEPDIR)/*; }
$(OBJDIR)/%.o: src/%.cc $(DEPDIR)/%.d | $(DEPDIR) $(OBJDIR)
$(CXX) $(DEPFLAGS) -c $< -o $@
$(DEPDIR):
mkdir -p $@
$(OBJDIR):
mkdir -p $@
$(DEPFILES):
include $(DEPFILES)
.PHONY: clean
clean:
rm -rf $(OBJDIR) $(DEPDIR) .make-switch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment