# use make
# or make DEBUG=1
# or make CLANG=1

ARCH := $(shell uname -m)

ifdef DEBUG
CFLAGS = -O0 -g -pg -D_DEBUG -Wall -fvisibility=hidden -fno-math-errno \
-fPIC -DPIC -Wshadow -Wno-unused-function -Wno-multichar -funsigned-char \
-mtune=generic
LDFLAGS =
else
CFLAGS = -O2 -s -DNDEBUG -Wall -fvisibility=hidden -fno-math-errno \
-fPIC -DPIC -Wshadow -Wno-unused-function -Wno-multichar -funsigned-char \
-mtune=generic
LDFLAGS = -s
endif

ifdef CLANG
CC = clang -std=gnu89
CXX = clang++ -std=c++98
else
CC = gcc -std=gnu89
CXX = g++ -std=c++98
endif

CXX += -fno-rtti -fno-exceptions

KCM_PATH=.
INC=-I . -I ./WDL-GV

CFLAGS += -DKCMLICE -DSWELL_LICE_GDI -DFORCE_WIN32_CURSES \
-DWDL_ALLOW_UNSIGNED_DEFAULT_CHAR -D_FILE_OFFSET_BITS=64

ifdef GDK2
  CFLAGS += -DSWELL_TARGET_GDK=2 $(shell pkg-config --cflags gdk-2.0)
  LDFLAGS += $(shell pkg-config --libs gdk-2.0) -lX11 -lXi
else
  CFLAGS += -DSWELL_TARGET_GDK=3 $(shell pkg-config --cflags gdk-3.0)
  LDFLAGS += $(shell pkg-config --libs gdk-3.0) -lX11 -lXi
endif
ifndef NOFREETYPE
  CFLAGS += -DSWELL_FREETYPE $(shell pkg-config --cflags freetype2)
  LDFLAGS += $(shell pkg-config --libs freetype2)
endif

LDFLAGS += -pthread -ldl -lGL

CXXFLAGS=$(CFLAGS) $(INC)

vpath %.c $(KCM_PATH)/WDL-GV/WDL $(KCM_PATH)/WDL-GV/WDL/zlib $(KCM_PATH)/WDL-GV/WDL/libpng \
$(KCM_PATH)/WDL-GV/WDL/giflib $(KCM_PATH)/WDL-GV/WDL/jpeglib $(KCM_PATH)/WDL-GV/WDL/eel2 \
$(KCM_PATH)
vpath %.cpp $(KCM_PATH)/WDL-GV/WDL $(KCM_PATH)/WDL-GV/WDL/wingui \
$(KCM_PATH)/WDL-GV/WDL/lice $(KCM_PATH)/WDL-GV/WDL/swell $(KCM_PATH)
vpath %.rc $(KCM_PATH)/res

WINGUI_OBJS = $(KCM_PATH)/WDL-GV/WDL/wingui/wndsize.o

SWELL_OBJS = $(KCM_PATH)/WDL-GV/WDL/swell/swell-wnd-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-gdi-lice.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-misc-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-dlg-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-menu-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-kb-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-gdi-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-ini.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-generic-gdk.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-miscdlg-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-appstub-generic.o \
$(KCM_PATH)/WDL-GV/WDL/swell/swell-modstub-generic.o
#swell-generic-headless.o

PNGLIB_OBJS = $(KCM_PATH)/WDL-GV/WDL/libpng/png.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngerror.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngget.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngmem.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngpread.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngread.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngrio.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngrtran.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngrutil.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngset.o \
$(KCM_PATH)/WDL-GV/WDL/libpng/pngtrans.o

GIFLIB_OBJS = $(KCM_PATH)/WDL-GV/WDL/giflib/dgif_lib.o \
$(KCM_PATH)/WDL-GV/WDL/giflib/egif_lib.o \
$(KCM_PATH)/WDL-GV/WDL/giflib/gifalloc.o \
$(KCM_PATH)/WDL-GV/WDL/giflib/gif_hash.o

JPEGLIB_OBJS = $(KCM_PATH)/WDL-GV/WDL/jpeglib/jcomapi.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdapimin.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdapistd.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdatadst.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdatasrc.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdcoefct.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdcolor.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jddctmgr.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdhuff.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdinput.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdmainct.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdmarker.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdmaster.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdmerge.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdphuff.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdpostct.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jdsample.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jerror.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jfdctflt.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jfdctfst.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jfdctint.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jidctflt.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jidctfst.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jidctint.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jidctred.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jmemmgr.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jmemnobs.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jquant1.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jquant2.o \
$(KCM_PATH)/WDL-GV/WDL/jpeglib/jutils.o

ZLIB_OBJS = $(KCM_PATH)/WDL-GV/WDL/zlib/compress.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/adler32.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/crc32.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/deflate.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/infback.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/inffast.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/inflate.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/inftrees.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/trees.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/uncompr.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/zutil.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/ioapi.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/zip.o \
$(KCM_PATH)/WDL-GV/WDL/zlib/unzip.o

LICE_OBJS = $(KCM_PATH)/WDL-GV/WDL/lice/lice.o \
$(KCM_PATH)/WDL-GV/WDL/lice/lice_line.o \
$(KCM_PATH)/WDL-GV/WDL/lice/lice_arc.o \
$(KCM_PATH)/WDL-GV/WDL/lice/lice_text.o \
$(KCM_PATH)/WDL-GV/WDL/lice/lice_colorspace.o
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_textnew.o \
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_image.o \
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_palette.o \
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_pcx.o \
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_texgen.o \
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_bmp.o
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_png.o \
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_jpg.o
#$(KCM_PATH)/WDL-GV/WDL/lice/lice_gif.o
#lice_gif_write.o

WINGUI_OBJS = $(KCM_PATH)/WDL-GV/WDL/wingui/wndsize.o

WDL_OBJS = $(KCM_PATH)/WDL-GV/WDL/filebrowse.o
#$(KCM_PATH)/WDL-GV/WDL/fft.o \
#$(KCM_PATH)/WDL-GV/WDL/projectcontext.o \
#$(KCM_PATH)/WDL-GV/WDL/resample.o \
#$(KCM_PATH)/WDL-GV/WDL/rng.o \
#$(KCM_PATH)/WDL-GV/WDL/sha.o \

EEL_OBJS = $(KCM_PATH)/WDL-GV/WDL/eel2/nseel-cfunc.o \
$(KCM_PATH)/WDL-GV/WDL/eel2/nseel-compiler.o \
$(KCM_PATH)/WDL-GV/WDL/eel2/nseel-eval.o \
$(KCM_PATH)/WDL-GV/WDL/eel2/nseel-ram.o \
$(KCM_PATH)/WDL-GV/WDL/eel2/nseel-yylex.o

ifeq ($(ARCH),x86_64)
#EEL_OBJS += $(KCM_PATH)/WDL-GV/WDL/eel2/asm-nseel-x64.o
EEL_OBJS += $(KCM_PATH)/WDL-GV/WDL/eel2/asm-nseel-x64-sse.o
endif

OBJS += kc.o cwinmain.o $(SWELL_OBJS) $(LICE_OBJS) $(WDL_OBJS) $(EEL_OBJS)

.phony: clean default

default: nasmgen kcm

nasmgen:
	(cd WDL-GV/WDL/eel2; make -f asm.mk)

kcm: $(OBJS)
	$(CXX) $(CFLAGS) -o $@ $^ $(LDFLAGS)

clean:
	-@find ./ -type f -name '*.o' -not -name 'asm*.o' -exec rm {} +
	-@rm kcm 2>/dev/null || true
	-@rm *.gz 2>/dev/null || true

JVER := $(shell grep "define KCMVER" kc.cpp | cut -c17- | tr -d '"')

SYSARCH := $(shell uname -m)
ifeq ($(SYSARCH),x86_64)
SYSARCH = amd64
endif

dist:
	#find . -type f -name '*.o' -delete
	find . -type f -name '*.o' -not -name 'asm*.o' -exec rm {} +
	mkdir src
	cp *.cpp src
	cp *.h src
	cp *.mak src
	cp Makefile src
	cp -r res/ src/
	cp -r WDL-GV/ src/
	tar cvf - kcm *.txt src Resources | \
	gzip -1 > kcm-$(JVER)-$(SYSARCH).tar.gz
	-@rm -r src 2>/dev/null || true
