CURRENT := $(shell pwd)
RPLUGIN_HOME := $(CURRENT)/rplugin/python3
RPLUGIN_PATH := $(RPLUGIN_HOME)/deoplete/sources
MODULE_NAME := deoplete_go.py deoplete_go/cgo.py deoplete_go/stdlib.py

TARGET = $(RPLUGIN_HOME)/deoplete/ujson.so

GOCODE := $(shell which gocode)
GO_VERSION = $(shell go version | awk '{print $$3}' | sed -e 's/go//')
GO_STABLE_VERSION = 1.10.1
GOOS := $(shell go env GOOS)
GOARCH := $(shell go env GOARCH)

GIT := $(shell which git)
PYTHON3 := $(shell which python3)
DOCKER := $(shell which docker)
DOCKER_IMAGE := zchee/deoplete-go:${GO_STABLE_VERSION}-linux_amd64

PACKAGE ?= unsafe

ifneq ($(PACKAGE),unsafe)
	PACKAGE += unsafe
endif

PIP_FLAGS ?=


all: $(TARGET)


rplugin/python3/deoplete/ujson/.git:
	$(GIT) submodule update --init


$(TARGET): rplugin/python3/deoplete/ujson/.git
	cd ./rplugin/python3/deoplete/ujson; $(PYTHON3) setup.py build --build-base="$(CURRENT)/build" --build-lib="$(CURRENT)/build"
	mv "$(CURRENT)/build/ujson."*".so" "$(TARGET)"


data/stdlib-$(GO_VERSION)_$(GOOS)_$(GOARCH).txt:
	go tool api -contexts $(GOOS)-$(GOARCH)-cgo | sed -e s/,//g | awk '{print $$2}' | uniq > ./data/stdlib-$(GO_VERSION)_$(GOOS)_$(GOARCH).txt
	@for pkg in $(PACKAGE) ; do \
		echo $$pkg >> ./data/stdlib-$(GO_VERSION)_$(GOOS)_$(GOARCH).txt; \
	done

gen_json: data/stdlib-$(GO_VERSION)_$(GOOS)_$(GOARCH).txt
	$(GOCODE) close
	$(GOCODE) set package-lookup-mode go
	cd ./data && ./gen_json.py $(GOOS) $(GOARCH)


docker/build:
	$(DOCKER) build -t $(DOCKER_IMAGE) .

docker/gen_stdlib: docker/build
	$(DOCKER) run --rm $(DOCKER_IMAGE) cat /deoplete-go/data/stdlib-${GO_STABLE_VERSION}_linux_amd64.txt > ./data/stdlib-${GO_STABLE_VERSION}_linux_amd64.txt

docker/gen_json: docker/gen_stdlib
	$(DOCKER) run --rm $(DOCKER_IMAGE) > ./json_${GO_STABLE_VERSION}_linux_amd64.tar.gz
	tar xf ./json_${GO_STABLE_VERSION}_linux_amd64.tar.gz
	mv ./json_${GO_STABLE_VERSION}_linux_amd64.tar.gz ./data/json_${GO_STABLE_VERSION}_linux_amd64.tar.gz


test: lint

lint: lint/flake8

lint/flake8:
	flake8 --config=$(PWD)/.flake8 $(foreach file,$(MODULE_NAME),$(RPLUGIN_PATH)/$(file)) || true

lint/install_modules:
	pip3 install -U $(PIP_FLAGS) -r ./tests/requirements.txt

clean:
	$(RM) -r "$(CURRENT)/build" "$(TARGET)" rplugin/python3/deoplete/ujson/build data/stdlib-$(GO_VERSION)_$(GOOS)_$(GOARCH).txt

.PHONY: test lint clean gen_json build