Makefile mit automatischen Buildnummern



  • Endlich mal wieder etwas Freizeit... 😃

    Ich wollte automatische Buildnummern erzeugen und nach einige Wutanfällen und mehreren Flaschen Bier geht es nun. Sicher gibt es noch was zu verbessern, die Basis war das "optimale Makefile für jedes Projekt".

    SHELL	:= /bin/bash
    TARGET   := ../build/program
    BUILD_NUMBER := $(shell echo $(shell cat .BuildCounter)+1 | bc)
    CXXFLAGS := -g -Wextra -Wall -Wno-long-long -pedantic-errors -std=c++98 -fstack-protector-all -D__BUILD_DATE=$(shell date +'%Y%m%d') -D__BUILD_NUMBER=$(BUILD_NUMBER)
    CXX      := g++
    LIBS     :=
    EXT      := cpp
    BUILDDIR := ../build
    
    override BUILDDIR := $(strip $(BUILDDIR))
    SOURCES  := $(wildcard *.$(EXT))
    OBJECTS  := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES))
    DEPS     := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES))
    
    .PHONY: all
    all: $(TARGET)
    
    $(TARGET): $(OBJECTS) $(DEPS)
    	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
    	@$(shell echo $(BUILD_NUMBER) > .BuildCounter)
    
    ifneq ($(MAKECMDGOALS), clean)
    -include $(DEPS)
    endif
    
    $(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag
    	$(CXX) $(CXXFLAGS) -c $< -o $@
    
    $(DEPS): $(BUILDDIR)/%.dep: %.$(EXT) $(BUILDDIR)/.tag
    	mkdir -p $(dir $(@))
    	@if ! test -f .BuildCounter ; then echo 0 > .BuildCounter; fi
    	$(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@
    
    %.tag:
    	mkdir -p $(dir $(@))
    	touch $@
    
    run:
    	$(TARGET)
    
    .PHONY: clean
    clean:
    	rm -rf $(BUILDDIR)
    

    Dazu der Aufruf:

    static const unsigned long BUILD_DATE   = __BUILD_DATE;
    static const unsigned long BUILD_NUMBER = __BUILD_NUMBER;
    

    Tipps, Kritik oder vernichtendes Urteil?



  • Mit Ant geht das in 1 bzw. 2 Zeilen.


Anmelden zum Antworten