Milan Stephan
Fotografie & IT
MAKEFLAGS += --no-builtin-rules

CC=gcc
CFLAGS=-std=c11 -pedantic -Wall -Werror -D_XOPEN_SOURCE=700 -c -g -pthread -O0
LD=gcc
LDFLAGS=-pthread

.PHONY: all clean run

all: atomic cas main-static main-dynamic

clean:
	rm -f atomic atomic.o
	rm -f cas cas.o
	rm -f main-static libfoo-static.a
	rm -f main-dynamic libfoo-dynamic.so
	rm -f main.o foo.o foo-pic.o

%: %.o
	$(LD) $(LDFLAGS) -o $@ $^

%.o: %.c
	$(CC) $(CFLAGS) -o $@ $<



######## Teil 1: Atomics und CAS #########

atomic: atomic.o
atomic.o: atomic.c

cas: cas.o
cas.o: cas.c



######## Teil 2: Bibliotheken #########

# Position Independent Code (PIC)
%-pic.o: %.c
	$(CC) $(CFLAGS) -fPIC -o $@ $<

# Modul foo für's statische und dynamische Linken kompilieren.
# Neuere gcc-Versionen kompilieren standardmäßig mit -fPIC.
# Wenn eine dynamisch linkbare Objektdatei erzeugt werden soll,
# muss das Flag aus Kompatibilitätsgründen aber natürlich
# trotzdem angegeben werden (daher das explizite -fPIC in
# der "%-pic.o"-Regel)!

foo-pic.o: foo.c foo.h
foo.o: foo.c foo.h

main.o: main.c foo.h

# Dynamische Bibliothek (.so)
libfoo-dynamic.so: foo-pic.o
	gcc -shared -fPIC -o $@ $^

# Statische Bibliothek
libfoo-static.a: foo.o
	ar -rcs $@ $^

# Linken. Da wir sowohl ein statisch, als auch ein dynamisch
# gelinktes Programm erzeugen wollen, müssen die verwendeten
# Bibliotheken verschiedene Namen haben - sonst würde die
# dynamische gewählt werden (vgl. Übungsfolien).

main-static: libfoo-static.a main.o
	$(LD) $(LDFLAGS) -o $@ main.o -L. -lfoo-static

main-dynamic: libfoo-dynamic.so main.o
	$(LD) $(LDFLAGS) -o $@ main.o -L. -lfoo-dynamic

# Dynamisch gelinktes Programm ausführen - hier muss der Pfad,
# der die Bibliothek enthält, explizit angegeben werden!
run:
	LD_LIBRARY_PATH=. ./main-dynamic