BINARY = lilyterm
VER = 0.9.9

PKGCONFIG := $(shell whereis pkg-config | tr -d '\n' | sed 's/^pkg-config://g')
GTK ?= ""
GLIB ?= ""
VTE ?= ""

ifneq ($(PKGCONFIG), )

ifeq ($(GTK), "")
GTK := $(shell pkg-config --exists 'gtk+-2.0' && echo 'gtk+-2.0')
endif
ifeq ($(GTK), )
GTK := $(shell pkg-config --exists 'gtk+-3.0' && echo 'gtk+-3.0')
endif

ifeq ($(GLIB), "")
GLIB := $(shell pkg-config --exists 'glib-2.0' && echo 'glib-2.0')
endif

ifeq ($(VTE), "")
VTE := $(shell pkg-config --exists 'vte' && echo 'vte')
endif
ifeq ($(VTE), )
VTE := $(shell pkg-config --exists 'vte-2.90' && echo 'vte-2.90')
endif

endif

prefix ?= /usr
bindir = $(prefix)/bin
etcdir = /etc/xdg
datadir = $(prefix)/share
date = `date +%Y-%m-%d`
CC ?= gcc
CFLAGS = $$CFLAGS -Wall -Os
#CFLAGS = $$CFLAGS -Wall -Wextra -Os -std=c99 \
#	 -DG_DISABLE_DEPRECATED \
#	 -DG_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED \
#	 -DGDK_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_DEPRECATED \
#	 -DGTK_DISABLE_SINGLE_INCLUDES -DGSEAL_ENABLE
LDFLAGS = -L$(prefix)/local/lib -l$(VTE)
OBJ_PKG_CMD = pkg-config --cflags $(GTK) $(VTE)
BINARY_PKG_CMD = pkg-config --cflags --libs $(GTK) $(VTE)
PO_LIST = zh_TW de fr es it nl ru sk tr uk zh_CN
OBJ = menu.o profile.o dialog.o pagename.o notebook.o font.o \
      property.o window.o misc.o console.o main.o

INCLUDES = -DPACKAGE=\"$(BINARY)\" \
	   -DPACKAGE_NAME=\"LilyTerm\" \
	   -DPACKAGE_BUGREPORT=\"tetrlet@gmail.com\" \
	   -DLOCALEDIR=\"$(datadir)/locale\" \
	   -DICONDIR=\"$(datadir)/pixmaps\"

ifneq ($(GTK), "")
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.10' && echo ' -DENABLE_TAB_REORDER')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.10' && echo ' -DENABLE_PAGE_ADDED')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.12' && echo ' -DENABLE_RGBA')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.12' && echo ' -DENABLE_GDKCOLOR_TO_STRING')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.12' && echo ' -DENABLE_SET_TOOLTIP_TEXT')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.12' && echo ' -DENABLE_DRAG_AND_DROP')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.14' && echo ' -DENABLE_MOUSE_SCROLL')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.16' && echo ' -DUSE_GTK_MENU_ITEM_SET_LABEL')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) >= 2.18' && echo ' -DUSE_GTK_WIDGET_SET_CAN_FOCUS')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) < 2.20' && echo ' -DUSE_OLD_GTK_WIDGET_MAPPED')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(GTK) < 2.20' && echo ' -DUSE_OLD_GTK_LABEL_PACKING')
endif

ifneq ($(GLIB), "")
INCLUDES := $(INCLUDES)$(shell pkg-config --exists 'glib-2.0 >= 2.14' && echo ' -DUSE_TIMEOUT_SECONDS')
endif

ifneq ($(VTE), "")
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) >= 0.16' && echo ' -DENABLE_VTE_SELECT_ALL')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) >= 0.17.1' && echo ' -DUSE_NEW_VTE_CURSOR_BLINKS_MODE')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) >= 0.17.1' && echo ' -DUSE_NEW_VTE_MATCH_ADD_GREGEX')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) >= 0.20.4' && echo ' -DENABLE_VTE_ERASE_TTY')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) >= 0.22.3' && echo ' -DENABLE_UNLIMITED_SCROLL_HISTORY')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) >= 0.25.1' && echo ' -DENABLE_FIND_STRING')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) < 0.20' && echo ' -DUSE_OLD_VTE_SET_FONT')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) < 0.24.1' && echo ' -DUSE_OLD_VTE_GET_PADDING')
INCLUDES := $(INCLUDES)$(shell pkg-config --exists '$(VTE) < 0.25.1' && echo ' -DUSE_OLD_VTE_FORK_COMMAND')
endif

.PHONY: all
all: default
	strip --remove-section=.comment --remove-section=.note $(BINARY)

.PHONY: default
default: CFLAGS := $(CFLAGS) -DDEFENSIVE
default: INCLUDES := $(INCLUDES) -DVERSION=\"$(VER)\ \($(date)\)\"
default: compile

.PHONY: debug
debug: CFLAGS := $(CFLAGS) -g
debug: INCLUDES := $(INCLUDES) -DDEFENSIVE -DDEBUG -DVERSION=\"$(VER)\ Debug\ Version\ \($(date)\)\"
debug: BINARY := $(BINARY)_dbg
debug: compile

.PHONY: dev
dev: develop
.PHONY: develop
develop: CFLAGS := $(CFLAGS) -g
develop: INCLUDES := $(INCLUDES) -DDEBUG -DDEVELOP -DVERSION=\"$(VER)\ Develop\ Version\ \($(date)\)\"
develop: BINARY := $(BINARY)_dev
develop: compile

.PHONY: ddev
ddev: defensive-develop
.PHONY: defensive-develop
defensive-develop: CFLAGS := $(CFLAGS) -g
defensive-develop: INCLUDES := $(INCLUDES) -DDEFENSIVE -DDEBUG -DDEVELOP -DVERSION=\"$(VER)\ Develop\ Version\ \($(date)\)\"
defensive-develop: BINARY := $(BINARY)_dev
defensive-develop: compile

.PHONY: geometry
geometry: CFLAGS := $(CFLAGS) -g
geometry: INCLUDES := $(INCLUDES) -DGEOMETRY -DDEBUG -DDEVELOP -DVERSION=\"$(VER)\ Develop\ Version\ \($(date)\)\"
geometry: BINARY := $(BINARY)_dev
geometry: compile

.PHONY: detail
detail: CFLAGS := $(CFLAGS) -g
detail: INCLUDES := $(INCLUDES) -DDEBUG -DDEVELOP -DDETAIL -DVERSION=\"$(VER)\ Develop\ Version\ \($(date)\)\"
detail: BINARY := $(BINARY)_dev
detail: compile

.PHONY: full
full: CFLAGS := $(CFLAGS) -g
full: INCLUDES := $(INCLUDES) -DDEBUG -DDEVELOP -DDETAIL -DFULL -DVERSION=\"$(VER)\ Develop\ Version\ \($(date)\)\"
full: BINARY := $(BINARY)_dev
full: compile

.PHONY: memory
memory: CFLAGS := $(CFLAGS) -g
memory: INCLUDES := $(INCLUDES) -DDEBUG -DDEVELOP -DDEFENSIVE -DOUT_OF_MEMORY -DVERSION=\"$(VER)\ Develop\ Version\ \($(date)\)\"
memory: BINARY := $(BINARY)_dev
memory: compile

.PHONY: clean
clean:
	-@ for FileName in $(BINARY) $(BINARY)_dev $(BINARY)_dbg *.o ../po/*.mo; \
	do \
		if [ -f "$$FileName" ]; then \
			echo "deleting $$FileName..."; \
			rm "$$FileName"; \
		fi; \
	done

.PHONY: data
data: debug
	xgettext --from-code=UTF-8 -k_ --add-comments='TRANSLATE NOTE:' -o ../po/lilyterm.pot *.c
	@ for FileName in $(PO_LIST); \
	do \
		echo "msgmerge $$FileName.po..."; \
		msgmerge --previous ../po/$$FileName.po ../po/lilyterm.pot -o ../po/$$FileName.po; \
		msgfmt --check --statistics ../po/$$FileName.po -o ../po/$$FileName.mo; \
	done
	./$(BINARY)_dbg -p > ../data/lilyterm.conf
	@ cd ../po; /usr/bin/intltool-update -m; cd -

menu.o: data.h lilyterm.h menu.h menu.c
	$(CC) $(CFLAGS) $(INCLUDES) -c menu.c `$(OBJ_PKG_CMD)`

font.o: data.h lilyterm.h font.h font.c
	$(CC) $(CFLAGS) $(INCLUDES) -c font.c `$(OBJ_PKG_CMD)`

dialog.o: data.h lilyterm.h dialog.h dialog.c
	$(CC) $(CFLAGS) $(INCLUDES) -c dialog.c `$(OBJ_PKG_CMD)`

profile.o: data.h lilyterm.h profile.h profile.c
	$(CC) $(CFLAGS) $(INCLUDES) -c profile.c `$(OBJ_PKG_CMD)`

pagename.o: data.h lilyterm.h pagename.h pagename.c
	$(CC) $(CFLAGS) $(INCLUDES) -c pagename.c `$(OBJ_PKG_CMD)`

property.o: data.h lilyterm.h property.h property.c
	$(CC) $(CFLAGS) $(INCLUDES) -c property.c `$(OBJ_PKG_CMD)`

notebook.o: data.h lilyterm.h notebook.h notebook.c
	$(CC) $(CFLAGS) $(INCLUDES) -c notebook.c `$(OBJ_PKG_CMD)`

window.o: data.h lilyterm.h window.h window.c
	$(CC) $(CFLAGS) $(INCLUDES) -c window.c `$(OBJ_PKG_CMD)`

misc.o: data.h lilyterm.h misc.h misc.c
	$(CC) $(CFLAGS) $(INCLUDES) -c misc.c `$(OBJ_PKG_CMD)`

console.o: data.h lilyterm.h console.h console.c
	$(CC) $(CFLAGS) $(INCLUDES) -c console.c `$(OBJ_PKG_CMD)`

main.o: data.h lilyterm.h main.h main.c
	$(CC) $(CFLAGS) $(INCLUDES) -c main.c `$(OBJ_PKG_CMD)`

.PHONY: compile
compile: $(OBJ)
	$(CC) $(LDFLAGS) $(CFLAGS) -o $(BINARY) $(OBJ) `$(BINARY_PKG_CMD)`
