MCUDA = -cuda 
MCUDA_CURAND = $(MCUDA) -cudalib=curand


OBJS = 	ppmExampleHost ppmExampleCUDA \
	rayHost rayCUDA \
	sphereHost sphereCUDA \
	normalHost normalCUDA \
	twoSpheresHost twoSpheresCUDA \
	antialiasHost antialiasCUDA \
	diffuseHost diffuseCUDA \
	metalHost metalCUDA \
	dielectricHost dielectricCUDA \
	cameraHost cameraCUDA \
	defocusBlurHost defocusBlurCUDA \
	coverHost coverCUDA \
	triangleHost triangleCUDA \
	lightsHost lightsCUDA \
	textureHost textureCUDA

# the host renderer for these four scenes takes tens of minutes on the CPU, so
# they are built but only their CUDA counterpart is run, as the TA suite does
SLOWOBJS = coverHost triangleHost lightsHost textureHost
RUNOBJS = $(filter-out $(SLOWOBJS),$(OBJS))

all: build run verify

build: $(OBJS)

# each ray tracing example writes its image to stdout, capture it as a .ppm
run: build
	@for x in $(RUNOBJS); do \
	  echo "----------------- $$x --------------------"; \
	  $(RUN) ./$$x > $$x.ppm || exit 1; \
	done

verify:

# section 12.1

ppmExampleHost: ppmExample.f90
	nvfortran -o $@ $^

ppmExampleCUDA: ppmExample.f90
	nvfortran -o $@ $(MCUDA) $^

# section 2.2

rgb_m.host.o: rgb_m.F90
	nvfortran -c -o $@ $^

rgb_m.cuda.o: rgb_m.F90
	nvfortran -c -o $@ $(MCUDA) $^

# section 2.3

rayHost: ray.F90 rgb_m.host.o
	nvfortran -o $@ $^

rayCUDA: ray.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA) $^

# section 12.4

sphereHost: sphere.F90 rgb_m.host.o
	nvfortran -o $@ $^

sphereCUDA: sphere.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA) $^

# section 12.5

normalHost: normal.F90 rgb_m.host.o
	nvfortran -o $@ $^

normalCUDA: normal.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA) $^


twoSpheresHost: twoSpheres.F90 rgb_m.host.o
	nvfortran -o $@ $^

twoSpheresCUDA: twoSpheres.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA) $^

# section 12.6

antialiasHost: antialias.F90 rgb_m.host.o
	nvfortran -o $@ $^

antialiasCUDA: antialias.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.7.1

diffuseHost: diffuse.F90 rgb_m.host.o
	nvfortran -o $@ $^

diffuseCUDA: diffuse.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.7.2

metalHost: metal.F90 rgb_m.host.o
	nvfortran -o $@ $^

metalCUDA: metal.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.7.3

dielectricHost: dielectric.F90 rgb_m.host.o
	nvfortran -o $@ $^

dielectricCUDA: dielectric.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.8

cameraHost: camera.F90 rgb_m.host.o
	nvfortran -o $@ $^

cameraCUDA: camera.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.9

defocusBlurHost: defocusBlur.F90 rgb_m.host.o
	nvfortran -o $@ $^

defocusBlurCUDA: defocusBlur.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.10

coverHost: cover.F90 rgb_m.host.o
	nvfortran -o $@ $^

coverCUDA: cover.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.11

triangleHost: triangle.F90 rgb_m.host.o
	nvfortran -o $@ $^

triangleCUDA: triangle.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.12

lightsHost: lights.F90 rgb_m.host.o
	nvfortran -o $@ $^

lightsCUDA: lights.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^

# section 12.13

textureHost: texture.F90 rgb_m.host.o
	nvfortran -o $@ $^

textureCUDA: texture.F90 rgb_m.cuda.o
	nvfortran -o $@ $(MCUDA_CURAND) $^



clean:
	rm -rf $(OBJS) a.out *.ppm *.mod *.o *~

clobber: clean
