CFLAGS=-g -O

PROGS=test1 test2

all: $(PROGS) libfoo2.so libfoo3.so libfoo4.so
	rm -f libfoo.so
	ln -s libfoo1.so libfoo.so
	./test1
	rm -f libfoo.so
	ln -s libfoo2.so libfoo.so
	./test1
	rm -f libfoo.so
	ln -s libfoo3.so libfoo.so
	-./test1
	rm -f libfoo.so
	ln -s libfoo4.so libfoo.so
	-./test1
	./test2

test1: main.o libref.so
	rm -f libfoo.so
	ln -s libfoo1.so libfoo.so
	$(CC) -o $@ $^ -Wl,-rpath,.

test2: main.o libbar.so libref.so
	rm -f libfoo.so
	ln -s libfoo1.so libfoo.so
	$(CC) -o $@ $^ -Wl,-rpath,.

libfoo1.so: foo1.o
	$(CC) -shared -Wl,-soname,libfoo.so  -o $@ $^ -Wl,--version-script,libfoo1.map 

libfoo2.so: foo2.o
	$(CC) -shared -Wl,-soname,libfoo.so  -o $@ $^ -Wl,--version-script,libfoo2.map 

libfoo3.so: foo3.o
	$(CC) -shared -Wl,-soname,libfoo.so  -o $@ $^ -Wl,--version-script,libfoo3.map 

libfoo4.so: foo3.o libbar.so
	$(CC) -shared -Wl,-soname,libfoo.so  -o $@ $^ -Wl,--version-script,libfoo3.map 

libbar.so: bar.o
	$(CC) -shared -o $@ $^ -Wl,--version-script,libbar.map 

libref.so: ref.o libfoo1.so
	$(CC) -shared -o $@ $^

foo1.o: foo1.c
	$(CC) -c $(CFLAGS) -fPIC $<

foo2.o: foo2.c
	$(CC) -c $(CFLAGS) -fPIC $<

ref.o: ref.c
	$(CC) -c $(CFLAGS) -fPIC $<

clean:
	rm -f $(PROGS) a.out *.so *.o *.os

tar:
	tar cfz bug.tar.gz Makefile *.c *.map
