From 6451cf08b54528305b081a5ddf710af0e2da6ce1 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 1 Jun 2014 09:07:07 +0200
Subject: [PATCH] make follow source dependencies

---
 alib2/makefile | 52 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 31 insertions(+), 21 deletions(-)

diff --git a/alib2/makefile b/alib2/makefile
index cc0515fe3e..d8f590fcbb 100644
--- a/alib2/makefile
+++ b/alib2/makefile
@@ -1,42 +1,52 @@
-CC=g++
-LIBRARY=libalib2.so 
-TESTBIN=alib2test
-CCFLAGS= -std=c++11 -O2 -g -c -Wall -pedantic -Wextra -fPIC -I/usr/include/libxml2/ 
-LDFLAGS= -shared -lxml2
-TEST_CCFLAGS= -std=c++11 -O2 -g -c -Wall -pedantic -Wextra -I../alib2/src -I/usr/include/libxml2/ 
-TEST_LDFLAGS= -L../alib2/lib -lxml2 -lalib2 -lcppunit -Wl,-rpath,.
+SHELL:=/bin/bash
+LIBRARY:=libalib2.so 
+TESTBIN:=alib2test
+CXXFLAGS:= -std=c++11 -O2 -g -c -Wall -pedantic -Wextra -fPIC -I/usr/include/libxml2/ 
+LDFLAGS:= -shared -lxml2
+TEST_CXXFLAGS:= -std=c++11 -O2 -g -c -Wall -pedantic -Wextra -I../alib2/src -I/usr/include/libxml2/ 
+TEST_LDFLAGS:= -L../alib2/lib -lxml2 -lalib2 -lcppunit -Wl,-rpath,.
 
-SOURCES=$(shell find src/ -name *cpp)
-OBJECTS=$(patsubst src/%.cpp, obj/%.o, $(SOURCES))
+SOURCES:=$(shell find src/ -name *cpp)
+OBJECTS:=$(patsubst src/%.cpp, obj/%.o, $(SOURCES))
+DEPENDENCIES:=$(patsubst src/%.cpp, obj/%.d, $(SOURCES))
 
-TEST_SOURCES=$(shell find test-src/ -name *cpp)
-TEST_OBJECTS=$(patsubst test-src/%.cpp, test-obj/%.o, $(TEST_SOURCES))
+TEST_SOURCES:=$(shell find test-src/ -name *cpp)
+TEST_OBJECTS:=$(patsubst test-src/%.cpp, test-obj/%.o, $(TEST_SOURCES))
+TEST_DEPENDENCIES:=$(patsubst test-src/%.cpp, test-obj/%.d, $(TEST_SOURCES))
 
-.PHONY: all
-.PHONY: test
+.PHONY: all build test clean
+.PRECIOUS: $(DEPENDENCIES) $(TEST_DEPENDENCIES)
 
 all: build test
 
 lib/$(LIBRARY): $(OBJECTS)
-	mkdir -p lib
-	$(CC) $(OBJECTS) -o $@ $(LDFLAGS)
+	mkdir -p lib;
+	$(CXX) $(OBJECTS) -o $@ $(LDFLAGS);
 
-obj/%.o: src/%.cpp
+obj/%.d:
 	mkdir -p $(dir $@)
-	$(CC) $(CCFLAGS) $< -o $@
+	echo "$(shell sha1sum <<< "$@" | sed "s/  -//g") = \$$(shell \$$(CXX) -MM \$$(CXXFLAGS) $(patsubst obj/%.d,src/%.cpp, $@) | sed \"s/.*://g\" | sed \"s/\\\\\\\\//g\")" >> $@
+	echo "$(patsubst %.d,%.o, $@): \$$($(shell sha1sum <<< "$@" | sed "s/  -//g"))" >> $@
+	echo "	\$$(CXX) \$$(CXXFLAGS) \$$< -o $(patsubst %.d,%.o, $@)" >> $@
 
 build: lib/$(LIBRARY)
 
 test-bin/$(TESTBIN): $(TEST_OBJECTS) lib/$(LIBRARY)
-	mkdir -p test-bin
-	$(CC) $(TEST_OBJECTS) -o $@ $(TEST_LDFLAGS)
+	mkdir -p test-bin; \
+	$(CXX) $(TEST_OBJECTS) -o $@ $(TEST_LDFLAGS); \
 
-test-obj/%.o: test-src/%.cpp
+test-obj/%.d:
 	mkdir -p $(dir $@)
-	$(CC) $(TEST_CCFLAGS) $< -o $@
+	echo "$(shell sha1sum <<< "$@" | sed "s/  -//g") = \$$(shell \$$(CXX) -MM \$$(TEST_CXXFLAGS) $(patsubst test-obj/%.d,test-src/%.cpp, $@) | sed \"s/.*://g\" | sed \"s/\\\\\\\\//g\")" >> $@
+	echo "$(patsubst %.d,%.o, $@): \$$($(shell sha1sum <<< "$@" | sed "s/  -//g"))" >> $@
+	echo "	\$$(CXX) \$$(TEST_CXXFLAGS) \$$< -o $(patsubst %.d,%.o, $@)" >> $@
 
 test: test-bin/$(TESTBIN)
 	LD_LIBRARY_PATH=lib test-bin/$(TESTBIN)
 
 clean:
 	$(RM) -r *.o *.d lib obj test-bin test-obj
+
+-include $(DEPENDENCIES)
+-include $(TEST_DEPENDENCIES)
+
-- 
GitLab