DESTDIR ?=
PREFIX  ?= /usr/local

CTX_VERSION=0.1.14

CCACHE=`command -v ccache`
CLIENTS_CFILES = $(wildcard demos/c/*.c)
CLIENTS_BINS   = $(CLIENTS_CFILES:.c=)

BINS_CFILES = $(wildcard bin/*.c)
BINS   = $(BINS_CFILES:.c=)

all: build.conf ctx-wasm.pc ctx-wasm-simd.pc ctx.pc libctx.so ctx.h ctx $(BINS)

include build.conf


CTX_OBJS = ctx.o

CFLAGS_warnings= -Wall \
                 -Wextra \
		 -Wno-unused-but-set-parameter \
		 -Wno-unused-parameter \
		 -Wno-unused-function \
		 -Wno-missing-field-initializers 
CFLAGS+= $(CFLAGS_warnings) -fpic -fno-builtin-memcpy -fno-semantic-interposition
CFLAGS+= -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=600 \
	 -I/usr/X11R6/include -I/usr/X11R7/include

CFLAGS += -ffinite-math-only -fno-trapping-math -fno-signed-zeros -fno-math-errno

CFLAGS+= -I. -Ifonts -Ideps
LIBS  += -lm -lpthread  



ifeq ($(CTX_SIMD), 1)
ifeq ($(CTX_ARCH), x86_64)
CTX_SIMD_OBJS = ctx-x86-64-v2.o ctx-x86-64-v3.o
else ifeq ($(CTX_ARCH), armv7l)
CTX_SIMD_OBJS = ctx-arm-neon.o 
endif
CTX_OBJS += $(CTX_SIMD_OBJS)
endif

CCC=$(CCACHE) $(CC)


build.conf:
	@echo "You have not run configure, running ./configure.sh without arguments for you"
	@echo "you will have to run make again after this.";echo
	./configure.sh
	@echo "!!!!!!!!!!!!!!!!!!!!!!!!";
	@echo "!! now run make again !!";
	@echo "!!!!!!!!!!!!!!!!!!!!!!!!";false

bin/ctx-terminal: bin/ctx-terminal.o
bin/ctx-terminal.o: bin/ctx-*.c bin/ctx.c bin/ui/*.[ch]
bin/ctx.o: bin/ctx-*.c bin/ctx.c bin/ui/ui.[ch] 

bin/%: bin/%.o build.conf Makefile libctx.so libctx.a ctx_config.h local.conf
	@echo LD $@;if [ x"$(CTX_EXTRA_STATIC)" = x"" ]; then \
	$(CCC) -Wl,-rpath `pwd` -g $< -o $@ -Isrc $(CFLAGS) libctx.so $(LIBS) $(CTX_CFLAGS) $(CTX_LIBS)  \
	; else $(CCC) -g $< -o $@ $(CFLAGS) libctx.a $(LIBS) $(CTX_CFLAGS) $(CTX_LIBS) -static && strip $@ ; fi
bin/%.o: bin/%.c bin/*.h src/*.h build.conf bin/ui/*.[ch] Makefile ctx_config.h local.conf \
	
	@echo CC $@;$(CCC) -g $< -c -o $@ -Isrc $(CFLAGS) $(CTX_CFLAGS) -Oz


run: bin/ctx-terminal
	./bin/ctx-terminal

test: ctx
	make -C tests
distclean: clean
	rm -f *.conf
clean:
	rm -f ctx *.o highlight.css bin/*.o
	rm -f libctx.a libctx.so
	rm -f ctx.pc ctx-wasm.pc ctx-wasm-simd.pc
	rm -f $(CLIENTS_BINS)
	rm -f $(BINS)
	rm -f $(TERMINAL_OBJS)
	rm -f $(MEDIA_HANDLERS_OBJS)
	rm -f tests/index.html
	rm -f squoze/squoze

ctx.pc: Makefile
	@echo "prefix=$(PREFIX)" > $@
	@echo 'exec_prefix=$${prefix}' >> $@
	@echo 'libdir=$${prefix}/lib' >> $@
	@echo 'includedir=$${prefix}/include' >> $@
	@echo 'apiversion=0.0.0' >> $@
	@echo '' >> $@
	@echo 'Name: ctx' >> $@
	@echo 'Description: ctx vector graphics' >> $@
	@echo 'Version: $(CTX_VERSION)' >> $@
	@echo 'Libs: -L$${libdir} -lctx' >> $@
	@echo 'Cflags: -I$${includedir}' >> $@

ctx-wasm.pc: Makefile
	@echo "prefix=$(PREFIX)" > $@
	@echo 'exec_prefix=$${prefix}' >> $@
	@echo 'libdir=$${prefix}/lib' >> $@
	@echo 'includedir=$${prefix}/include' >> $@
	@echo 'apiversion=0.0' >> $@
	@echo '' >> $@
	@echo 'Name: ctx' >> $@
	@echo 'Description: ctx vector graphics - wasm target' >> $@
	@echo 'Version: $(CTX_VERSION)' >> $@
	@echo 'Libs: -Wl,--lto-O3 ' >> $@
	@echo 'Cflags: -I$${includedir} -DCTX_IMPLEMENTATION -flto -O3 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS=_main,_free,_calloc,_malloc' >> $@

ctx-wasm-simd.pc: Makefile
	@echo "prefix=$(PREFIX)" > $@
	@echo 'exec_prefix=$${prefix}' >> $@
	@echo 'libdir=$${prefix}/lib' >> $@
	@echo 'includedir=$${prefix}/include' >> $@
	@echo 'apiversion=0.0' >> $@
	@echo '' >> $@
	@echo 'Name: ctx' >> $@
	@echo 'Description: ctx vector graphics - wasm target' >> $@
	@echo 'Version: $(CTX_VERSION)' >> $@
	@echo 'Libs: -Wl,--lto-O3 ' >> $@
	@echo 'Cflags: -msimd128 -ftree-vectorize -I$${includedir} -DCTX_IMPLEMENTATION -flto -O3 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS=_main,_free,_calloc,_malloc' >> $@

install: ctx libctx.so ctx.h ctx.pc ctx-wasm.pc ctx-wasm-simd.pc
	install -D -m755 -t $(DESTDIR)$(PREFIX)/bin ctx
	install -D -m755 -t $(DESTDIR)$(PREFIX)/lib/pkgconfig ctx.pc
	install -D -m755 -t $(DESTDIR)$(PREFIX)/lib/pkgconfig ctx-wasm.pc
	install -D -m755 -t $(DESTDIR)$(PREFIX)/lib/pkgconfig ctx-wasm-simd.pc
	install -D -m644 -t $(DESTDIR)$(PREFIX)/include ctx.h
	install -D -m755 -t $(DESTDIR)$(PREFIX)/lib libctx.so
	install -D -m644 -t $(DESTDIR)$(PREFIX)/share/appdata meta/graphics.ctx.terminal.appdata.xml
	install -D -m644 -t $(DESTDIR)$(PREFIX)/share/applications meta/graphics.ctx.terminal.desktop
	install -D -m644 -t $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps meta/graphics.ctx.terminal.svg
	ldconfig || true
uninstall:
	rm -rf $(DESTDIR)$(PREFIX)/bin/ctx
	rm -rf $(DESTDIR)$(PREFIX)/lib/libctx.so
	rm -rf $(DESTDIR)$(PREFIX)/lib/libctx.a
	rm -rf $(DESTDIR)$(PREFIX)/lib/pkgconfig/ctx.pc
	rm -rf $(DESTDIR)$(PREFIX)/lib/pkgconfig/ctx-wasm.pc
	rm -rf $(DESTDIR)$(PREFIX)/lib/pkgconfig/ctx-wasm-simd.pc
	rm -rf $(DESTDIR)$(PREFIX)/include/ctx.h
	rm -f $(DESTDIR)$(PREFIX)/share/appdata/graphics.ctx.terminal.appdata.xml
	rm -f $(DESTDIR)$(PREFIX)/share/applications/graphics.ctx.terminal.desktop
	rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/graphics.ctx.terminal.svg


ctx.o: ctx.c ctx.h build.conf Makefile build.conf \

	@echo CC $@; $(CCC) $< -c -o $@ $(CFLAGS) $(CTX_CFLAGS) $(OPT_CFLAGS)

ctx-x86-64-v2.o: ctx.c ctx.h build.conf Makefile build.conf 
	rm -f vec.missed
	$(CCC) $< -c -o $@ $(CFLAGS) -DCTX_SIMD_X86_64_V2 -momit-leaf-frame-pointer -ftree-vectorize -mfpmath=sse -mmmx -msse -msse2 -msse4.1 -msse4.2 -mpopcnt -mssse3 $(CTX_CFLAGS) $(OPT_CFLAGS) \
	#-fopt-info-vec-missed=vec.missed
ctx-x86-64-v3.o: ctx.c ctx.h build.conf Makefile build.conf 
	rm -f vec.optimized
	$(CCC) $< -c -o $@ $(CFLAGS) -DCTX_SIMD_X86_64_V3 -mmovbe -momit-leaf-frame-pointer -mxsave -mxsaveopt -ftree-vectorize -mmmx -msse -msse2 -msse4.1 -msse4.2 -mpopcnt -mssse3 -mavx -mavx2 -mfma -mmovbe $(CTX_CFLAGS) $(OPT_CFLAGS) \
	#-fopt-info-vec-optimized=vec.optimized
ctx-arm-neon.o: ctx.c ctx.h build.conf Makefile build.conf
	$(CCC) $< -c -o $@ $(CFLAGS) -DCTX_SIMD_ARM_NEON -ftree-vectorize -ffast-math -march=armv7 -mfpu=neon-vfpv4 $(CTX_CFLAGS) $(OPT_CFLAGS)

libctx.a: $(CTX_OBJS) build.conf Makefile
	@echo AR $@;$(AR) rcs $@ $(CTX_OBJS)
libctx.so: $(CTX_OBJS) build.conf Makefile
	@echo CCLD $@;$(CCC) -shared $(LIBS) $(CTX_OBJS) $(CTX_LIBS) -o $@

ctx: bin/ctx
	cp $< $@ || true

#	
	
test-terminal: bin/ctx-terminal
	CTX_BACKEND=sdl ./bin/ctx-terminal
