# Compiler/Linker/dynamic linker
CC = gcc
LD = gcc

# Tots els executables
PROGS = prog prog_est prog_dyn prog_tot_est mainsuma

# Fitxers font de la versi compilada sense llibreria d'usuari
PROG_SRC = main.c util_file.c util_net.c util_math.c

# Fitxer objecte no incorporat a la llibreria
PROG_OBJS = main.o

# Fitxers objecte a la llibreria dinamica
LIB_OBJS_DYN = util_file.pic util_net.pic util_math.pic

# Fitxers objecte a la llibreria estatica
LIB_OBJS_EST = util_file.o util_net.o util_math.o

# top-level rule
all: $(PROGS)

prog: $(PROG_SRC)
	$(CC) $(PROG_SRC) -o $@

prog_dyn: main.o libutil_dyn.so
	$(LD) main.o -L. -lutil_dyn -o prog_dyn

prog_est: main.o libutil_est.a
	$(LD) main.o -L. -lutil_est -o prog_est

prog_tot_est: $(PROG_SRC)
	$(CC) -static $(PROG_SRC) -o $@

mainsuma: mainsuma.c 
# -ldl es la llibreria de cont dlopen, dlsym,...
	$(CC) mainsuma.c -ldl -o $@

# Crea llibreries dinamiques (a algunes plataformes pot ser amb -G)

libiter.so: iter.pic
	$(LD) -shared $< -o $@

librec.so: rec.pic
	$(LD) -shared $< -o $@

libdir.so: dir.pic
	$(LD) -shared $< -o $@

libutil_dyn.so: $(LIB_OBJS_DYN)
	$(LD) -shared $(LIB_OBJS_DYN) -o libutil_dyn.so

# Crea llibreria estatica
libutil_est.a: $(LIB_OBJS_EST)
	$(AR) rc libutil_est.a $(LIB_OBJS_EST)

# compile C source files into object files.
%.o: %.c
	$(CC) -c $< -o $@

# compile C source files into PIC object files (on some plataforms, -fpic)
%.pic: %.c
	$(CC) -fPIC -c $< -o $@

# clean everything
clean:
	$(RM) -f $(PROGS) *.o *.pic *.so *.a
