Skip to content

Instantly share code, notes, and snippets.

@vindex10
Created May 4, 2017 20:53
Show Gist options
  • Save vindex10/63601b1e2515512ca7eac3241a7d5b66 to your computer and use it in GitHub Desktop.
Save vindex10/63601b1e2515512ca7eac3241a7d5b66 to your computer and use it in GitHub Desktop.
Makefile for library building. Automatic header linking.
# Definitions for header autolinking
DEPDIR := .d
$(shell mkdir -p $(DEPDIR) >/dev/null)
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td
COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cc = $(CXX) $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
POSTCOMPILE = @mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d && touch $@
# Main part
MKDIR = mkdir -p
RMDIR = rm -rf
program_NAME := blackswan
program_RELEASE_DIR := release
program_DEBUG_DIR := debug
program_CPP := $(program_NAME).cpp
program_OBJ := $(program_NAME).o
program_LIBSRC_DIR := src
program_LIB_DIR := lib
program_LIBSRC_PATHS := $(patsubst %/,%,$(sort $(dir $(wildcard $(program_LIBSRC_DIR)/*/))))
program_LIBNAMES := $(patsubst $(program_LIBSRC_DIR)/%,%,$(program_LIBSRC_PATHS))
program_LIBSRCS := $(foreach libpath,$(program_LIBSRC_PATHS),$(wildcard $(libpath)/*.cpp))
program_LIBOBJS := $(patsubst $(program_LIBSRC_DIR)/%,$(program_LIB_DIR)/%,$(patsubst %.cpp,%.o,$(program_LIBSRCS)))
program_INC_DIRS := include
SRCS := $(program_LIBSRCS) $(program_CPP)
CPPFLAGS += $(foreach includedir,$(program_INC_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIB_DIR),-L$(librarydir))
.PHONY: debug release libs $(program_LIBNAMES) release_lib clean wipe
debug: $(program_DEBUG_DIR)/$(program_NAME)
$(program_DEBUG_DIR)/$(program_NAME): $(program_LIBOBJS) $(program_DEBUG_DIR)/$(program_OBJ)
$(LINK.cc) $(program_LIBOBJS) $(program_DEBUG_DIR)/$(program_OBJ) -o $@
$(program_DEBUG_DIR)/$(program_OBJ): $(program_DEBUG_DIR)/%.o : $(program_CPP) $(DEPDIR)/%.d
$(MKDIR) $(@D)
$(MKDIR) $(DEPDIR)/$(*D)
$(COMPILE.cc) -o $@ $<
$(POSTCOMPILE)
$(program_LIBOBJS): $(program_LIB_DIR)/%.o : $(program_LIBSRC_DIR)/%.cpp $(DEPDIR)/%.d
$(MKDIR) $(@D)
$(MKDIR) $(DEPDIR)/$(*D)
$(COMPILE.cc) -fPIC $< -o $@
$(POSTCOMPILE)
.SECONDEXPANSION:
$(program_LIBNAMES): $$(patsubst $(program_LIBSRC_DIR)/%,$(program_LIB_DIR)/%,$$(patsubst %.cpp,%.o,$$(wildcard $(program_LIBSRC_DIR)/$$@/*.cpp)))
libs: $(program_LIBNAMES)
release_lib: $(program_LIB_DIR)/lib$(program_NAME).so
$(program_LIB_DIR)/lib$(program_NAME).so: $(program_LIBOBJS)
$(MKDIR) $(@D)
$(LINK.cc) -shared -Wl,-soname,lib$(program_NAME).so -o $@ $(program_LIBOBJS)
release: $(program_RELEASE_DIR)/$(program_NAME)
$(program_RELEASE_DIR)/$(program_OBJ): $(program_RELEASE_DIR)/%.o: $(program_CPP) $(DEPDIR)/%.d
$(MKDIR) $(@D)
$(MKDIR) $(*D)
$(COMPILE.cc) -o $@ $(program_CPP)
$(POSTCOMPILE)
$(program_RELEASE_DIR)/$(program_NAME): $(program_LIB_DIR)/lib$(program_NAME).so $(program_RELEASE_DIR)/$(program_OBJ)
$(LINK.cc) -o $@ -l$(program_NAME) $(program_RELEASE_DIR)/$(program_OBJ)
wipe: clean
$(RMDIR) $(program_RELEASE_DIR)
$(RMDIR) $(program_DEBUG_DIR)
$(RM) $(program_LIB_DIR)/lib$(program_NAME).so
clean:
$(RM) $(program_LIBOBJS)
$(RMDIR) $(sort $(dir $(program_LIBOBJS)))
$(RM) $(program_OBJ)
$(RMDIR) $(DEPDIR)
$(DEPDIR)/%.d:;
.PRECIOUS: $(DEPDIR)/%.d
include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment