HIPCC   ?= hipcc
CXX     ?= g++

CXXFLAGS := -O2 -std=c++17 -fPIC
HIPFLAGS := -O2 -std=c++17 -fPIC -I../headers

LDFLAGS :=

all: prac6 prac6a prac6_so prac6b prac6c

########################################
# Object files
########################################

main.o: main.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

prac6.o: prac6.hip
	$(HIPCC) $(HIPFLAGS) -c $< -o $@

prac6b.o: prac6b.hip
	$(HIPCC) $(HIPFLAGS) -c $< -o $@

prac6c.o: prac6c.hip
	$(HIPCC) $(HIPFLAGS) -c $< -o $@

########################################
# Direct linking
########################################

prac6: main.o prac6.o
	$(HIPCC) $^ -fPIC -o $@

########################################
# Static library (.a)
########################################

libprac6.a: prac6.o
	ar rcs $@ $^

prac6a: main.o libprac6.a
	$(HIPCC) main.o -L. -lprac6 -fPIC -o $@

########################################
# Shared library (.so)
########################################

libprac6.so: prac6.o
	$(HIPCC) -shared -o $@ $^

prac6_so: main.o libprac6.so
	$(HIPCC) main.o -L. -lprac6 -Wl,-rpath=. -fPIC -o $@

########################################
# Template examples
########################################

prac6b: prac6b.o
	$(HIPCC) main.o $^ -fPIC -o $@

prac6c: prac6c.o
	$(HIPCC) main.o $^ -fPIC -o $@

########################################

clean:
	rm -f *.o *.a *.so prac6 prac6a prac6_so prac6b prac6c
