diff --git a/Makefile b/Makefile index 45e9b48f8a7b669af4e1f344250a923fa964a62c..ca4ccd6fc4d582c7fe4d624db5145c971f6dc4ec 100644 --- a/Makefile +++ b/Makefile @@ -3,12 +3,22 @@ override CPPFLAGS += --std=c++1z override CPPFLAGS += -MMD -MP override CPPFLAGS += -I./include override CPPFLAGS += $(shell cat .cxxflags 2> /dev/null | xargs) +override LDLIBS += -lstdc++fs + +ifneq ($(shell cat COPYRIGHT 2> /dev/null),) +COPYRIGHT ?= COPYRIGHT +else +COPYRIGHT ?= /dev/null +endif PREFIX := $(DESTDIR)/usr/local +INCDIR := $(PREFIX)/include BINDIR := $(PREFIX)/bin -SOURCES := $(shell echo *.cpp) +SOURCES := $(wildcard *.cpp) SCRIPTS := $(shell find -name *.sh) +MAKETMP := $(wildcard make_templates/*) +INCLUDE := $(MAKETMP:%=$(INCDIR)/%) TEMPDIR := temp DISTDIR := out OUT := $(SOURCES:%.cpp=$(DISTDIR)/%) @@ -26,25 +36,30 @@ $(TEMPDIR)/%.o: %.cpp | $(TEMPDIR) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $< $(TEMPDIR): - @mkdir $@ + @mkdir -p $@ $(DISTDIR): - @mkdir $@ + @mkdir -p $@ clean: @rm $(DEPENDS) 2> /dev/null || true @rm $(OBJECTS) 2> /dev/null || true - @rmdir $(TEMPDIR) 2> /dev/null || true + @rmdir -p $(TEMPDIR) 2> /dev/null || true @echo Temporaries cleaned! distclean: clean @rm $(OUT) 2> /dev/null || true - @rmdir $(DISTDIR) 2> /dev/null || true + @rmdir -p $(DISTDIR) 2> /dev/null || true @echo All clean! -install: $(TARGET) +install: $(TARGET) $(INCLUDE) @echo Install complete! +$(INCDIR)/make_templates/%: ./make_templates/% $(COPYRIGHT) + @mkdir -p $(@D) + cat $(COPYRIGHT) >> $@ 2> /dev/null || true + cat $< >> $@ + $(BINDIR)/%: $(DISTDIR)/% | $(BINDIR) install --strip $< $@ @@ -52,11 +67,11 @@ $(BINDIR)/%: ./%.sh | $(BINDIR) install $< $@ $(BINDIR): - @mkdir $@ + @mkdir -p $@ uninstall: -rm $(TARGET) - @rmdir $(BINDIR) 2> /dev/null || true + @rmdir -p $(BINDIR) 2> /dev/null || true @echo Uninstall complete! -include $(DEPENDS) diff --git a/make_templates/header_only_lib b/make_templates/header_only_lib new file mode 100644 index 0000000000000000000000000000000000000000..cebc88c2d77501409ed7fcc0f94c23d8aeb6d97c --- /dev/null +++ b/make_templates/header_only_lib @@ -0,0 +1,49 @@ +TAREGT_INCLUDE := include +COPYRIGHT := COPYRIGHT + +PREFIX := $(DESTDIR)/usr/local +INCDIR := $(PREFIX)/$(TAREGT_INCLUDE) + +SRCDIR := ./source +HEADERS := $(shell find -wholename "$(SRCDIR)/*.hpp" && find -wholename "$(SRCDIR)/*.h") +INCLUDE := $(HEADERS:$(SRCDIR)/%=$(INCDIR)/%) +INCDIRS := $(shell dirname $(INCLUDE)) + +default: + @echo This is a pure header library, so there is nothing to build. You can still install/uninstall or test. + +install: $(INCLUDE) + @echo Install complete! + +$(INCDIR)/%.h: $(SRCDIR)/%.h $(COPYRIGHT) + @mkdir -p $(@D) + cat $(COPYRIGHT) >> $@ 2> /dev/null || true + cat $< >> $@ + +$(INCDIR)/%.hpp: $(SRCDIR)/%.hpp $(COPYRIGHT) + @mkdir -p $(@D) + cat $(COPYRIGHT) >> $@ 2> /dev/null || true + cat $< >> $@ + +uninstall: + -rm $(INCLUDE) + @rmdir -p $(INCDIRS) 2> /dev/null || true + @echo Uninstall complete! + +TESTMAKE = +@$(MAKE) --no-print-directory -C unit_tests/ + +test: + @$(TESTMAKE) + +test-clean: + @$(TESTMAKE) clean + +test-cleanrun: + @$(TESTMAKE) cleanrun + @$(TESTMAKE) run + +test-all: testclean test + +clean: test-clean + +.PHONY : clean uninstall test test-clean test-cleanrun test-all diff --git a/make_templates/static_lib b/make_templates/static_lib new file mode 100644 index 0000000000000000000000000000000000000000..98367316580482bf768c9fb15c34af0ea350d2e5 --- /dev/null +++ b/make_templates/static_lib @@ -0,0 +1,106 @@ +override CPPFLAGS += --std=c++1z +override CPPFLAGS += -MMD -MP +override CPPFLAGS += -I./include +override CPPFLAGS += $(shell cat .cxxflags 2> /dev/null | xargs) + +ARFLAGS := $(ARFLAGS)c + +TAREGT_INCLUDE := include +TAREGT_SOURCE := source +TAREGT_LIB := lib +LOCAL_TEMP := . +LOCAL_DIST := . + +COPYRIGHT := COPYRIGHT + +PREFIX := $(DESTDIR)/usr/local +INCDIR := $(PREFIX)/$(TAREGT_INCLUDE) +LIBDIR := $(PREFIX)/$(TAREGT_LIB) +TARGET_SRCDIR := $(PREFIX)/$(TAREGT_SOURCE) + +SRCDIR := ./source +TEMPDIR := temp/$(LOCAL_TEMP) +DISTDIR := out/$(LOCAL_DIST) +ifeq ($(origin TARGET), undefined) +TARGET := $(shell pwd | xargs basename).a +endif +OUT := $(DISTDIR)/$(TARGET) + +HEADERS := $(shell find -wholename "$(SRCDIR)/*.hpp" && find -wholename "$(SRCDIR)/*.h") +INCLUDE := $(HEADERS:$(SRCDIR)/%=$(INCDIR)/%) +INCDIRS := $(shell dirname $(INCLUDE)) + +SOURCES := $(shell find -wholename "$(SRCDIR)/*.cpp") +TARGET_SOURCES := $(SOURCES:$(SRCDIR)/%=$(TARGET_SRCDIR)/%) +TARGET_SOURCES += $(INCLUDE:$(INCDIR)/%=$(TARGET_SRCDIR)/%) +TARGET_SRCDIRS := $(shell dirname $(TARGET_SOURCES)) + +OBJECTS := $(SOURCES:$(SRCDIR)/%.cpp=$(TEMPDIR)/%.o) +OBJDIRS := $(shell dirname $(OBJECTS)) +DEPENDS := $(OBJECTS:.o=.d) + + +$(OUT): $(OBJECTS) | $(DISTDIR) + $(AR) $(ARFLAGS) $@ $^ + +$(TEMPDIR)/%.o: $(SRCDIR)/%.cpp | $(TEMPDIR) + @mkdir -p $(@D) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $< + +$(TEMPDIR): + @mkdir -p $@ + +$(DISTDIR): + @mkdir -p $@ + +clean: + @rm $(DEPENDS) 2> /dev/null || true + @rm $(OBJECTS) 2> /dev/null || true + @rmdir -p -p $(OBJDIRS) 2> /dev/null || true + @echo Temporaries cleaned! + +distclean: clean + @rm $(OUT) 2> /dev/null || true + @rmdir -p $(DISTDIR) 2> /dev/null || true + @echo All clean! + +install_all: install install_source + +install: $(LIBDIR)/$(TARGET) $(INCLUDE) + +$(LIBDIR)/$(TARGET): $(OUT) | $(LIBDIR) + cp $< $@ + +$(LIBDIR): + @mkdir -p $@ + +$(INCDIR)/%.h: $(SRCDIR)/%.h $(COPYRIGHT) + @mkdir -p $(@D) + cat $(COPYRIGHT) >> $@ 2> /dev/null || true + cat $< >> $@ + +$(INCDIR)/%.hpp: $(SRCDIR)/%.hpp $(COPYRIGHT) + @mkdir -p $(@D) + cat $(COPYRIGHT) >> $@ 2> /dev/null || true + cat $< >> $@ + +install_source: $(TARGET_SOURCES) + +$(TARGET_SRCDIR)/%: $(SRCDIR)/% $(COPYRIGHT) + @mkdir -p $(@D) + cat $(COPYRIGHT) >> $@ 2> /dev/null || true + cat $< >> $@ + +uninstall: + -rm $(INCLUDE) + @rmdir -p $(INCDIRS) 2> /dev/null || true + -rm $(LIBDIR)/$(TARGET) + @rmdir -p $(LIBDIR) 2> /dev/null || true + -rm $(TARGET_SOURCES) + @rmdir -p $(TARGET_SRCDIRS) 2> /dev/null || true + @echo Uninstall complete! + +-include $(DEPENDS) + +.PRECIOUS : $(OBJECTS) +.PHONY : clean distclean uninstall