CC = cl
CFLAGS = /Ox /Oy /GL /W2 /fp:fast /I"$(CUDA_PATH)\include" /I"$(CUDA_PATH)\include\cudart" /nologo

CC_PATH = $(shell where cl)

NVCCFLAGS = -m32 --ptxas-options=-v -Wno-deprecated-gpu-targets
CUFLAGS = -ccbin="$(CC_PATH)" -Xcompiler "/EHsc /W3 /nologo /Ox /GL" $(NVCCFLAGS)

# generate code for supported compute capabilities
# note: compute capability 1.x GPUs are no longer supported - use the '0.23' branch for older devices
#NVCCFLAGS += --generate-code arch=compute_20,code=sm_20 # Fermi GPUs
NVCCFLAGS += --generate-code arch=compute_30,code=sm_30 # early Kepler GPUs
NVCCFLAGS += --generate-code arch=compute_35,code=sm_35 # later Kepler GPUs; funnel shift added in 3.2
NVCCFLAGS += --generate-code arch=compute_50,code=sm_50 # Maxwell GPUs
NVCCFLAGS += --generate-code arch=compute_60,code=sm_60 # Pascal GPUs
NVCCFLAGS += --generate-code arch=compute_61,code=sm_61
NVCCFLAGS += --generate-code arch=compute_62,code=sm_62
NVCCFLAGS += --generate-code arch=compute_70,code=sm_70 # Volta GPUs
#NVCCFLAGS += --generate-code arch=compute_72,code=sm_72
#NVCCFLAGS += --generate-code arch=compute_75,code=sm_75 # Turing GPUs; slightly faster than 7.0
#NVCCFLAGS += --generate-code arch=compute_80,code=sm_80 # Ampere GPUs
#NVCCFLAGS += --generate-code arch=compute_86,code=sm_86
#NVCCFLAGS += --generate-code arch=compute_87,code=sm_87
#NVCCFLAGS += --generate-code arch=compute_89,code=sm_89 # Ada Lovelace GPUs
#NVCCFLAGS += --generate-code arch=compute_90,code=sm_90 # Hopper GPUs
#NVCCFLAGS += --generate-code arch=compute_120,code=sm_120 # Blackwell GPUs

LINK = link
LFLAGS = /nologo /LTCG #/ltcg:pgo

CSRC  = sieve.c timer.c parse.c read_config.c mfaktc.c checkpoint.c \
	filelocking.c signal_handler.c output.c crc.c
CUSRC = tf_96bit.cu tf_barrett96.cu tf_barrett96_gs.cu gpusieve.cu \
        cuda_utils.cu

CUOBJS = $(CUSRC:.cu=.obj) tf_75bit.obj
COBJS  = $(CSRC:.c=.obj)

RC    = mfaktc.rc
RES   = $(RC:.rc=.res)
ICON  = mfaktc.ico

LIBS = "$(CUDA_PATH)\lib\Win32\cudart_static.lib"

INSTALL = copy

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

all : ..\mfaktc-win-32.exe ..\mfaktc.ini $(ICON)

..\mfaktc-win-32.exe : $(COBJS) $(CUOBJS) $(RES)
	$(LINK) $(LFLAGS) $^ $(LIBS) /out:$@

clean :
	del *.obj $(RC) $(RES) $(ICON)

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

%.obj : %.c
	$(CC) $(CFLAGS) /c /Tp $<

%.rc : assets\\%.rc
	$(INSTALL) $< .

%.res : %.rc
	rc /fo $@ $<

tf_75bit.obj : tf_96bit.cu
	nvcc -O2 -c $< -o $@ $(CUFLAGS) -DSHORTCUT_75BIT

%.obj : %.cu
	nvcc -O2 -c $< -o $@ $(CUFLAGS)

..\\%.ini : %.ini
	$(INSTALL) $< ..

assets\\icons\\mfaktc.ico : assets\\icons\\mfaktc_16x16.png assets\\icons\\mfaktc_24x24.png assets\\icons\\mfaktc_32x32.png assets\\icons\\mfaktc_48x48.png assets\\icons\\mfaktc_256x256.png
	magick convert $^ $@

$(ICON) : assets\\icons\\mfaktc.ico
	$(INSTALL) $< .

.PHONY: all clean
