.ONESHELL:

SHELL := cmd
BUILDDIR := $(subst /,\,$(CURDIR))
TOPDIR := $(BUILDDIR)\..\..
OUTPUTDIR := output

MODULEDIR = $(TOPDIR)\src\go
TARGETDIR = $(TOPDIR)\src\go\cmd\zabbix_agent2
TARGETPKG=golang.zabbix.com/agent2/cmd/zabbix_agent2

CC = gcc
WINDRES = windres.exe

OBJS = \
	$(OUTPUTDIR)\bincommon.o \
	$(OUTPUTDIR)\threads.o \
	$(OUTPUTDIR)\interval.o \
	$(OUTPUTDIR)\num.o \
	$(OUTPUTDIR)\str.o \
	$(OUTPUTDIR)\common_str.o \
	$(OUTPUTDIR)\common_log.o \
	$(OUTPUTDIR)\components_strings_representations.o \
	$(OUTPUTDIR)\libc_wrappers.o \
	$(OUTPUTDIR)\param.o \
	$(OUTPUTDIR)\misc.o \
	$(OUTPUTDIR)\time.o \
	$(OUTPUTDIR)\expr.o \
	$(OUTPUTDIR)\host.o \
	$(OUTPUTDIR)\macro.o \
	$(OUTPUTDIR)\function.o \
	$(OUTPUTDIR)\token.o \
	$(OUTPUTDIR)\fatal.o \
	$(OUTPUTDIR)\disk.o \
	$(OUTPUTDIR)\ip.o \
	$(OUTPUTDIR)\iprange.o \
	$(OUTPUTDIR)\zbxhash.o \
	$(OUTPUTDIR)\md5.o \
	$(OUTPUTDIR)\sysinfo.o \
	$(OUTPUTDIR)\vector.o \
	$(OUTPUTDIR)\hashset.o \
	$(OUTPUTDIR)\zbxregexp.o \
	$(OUTPUTDIR)\persistent_state.o \
	$(OUTPUTDIR)\logfiles.o \
	$(OUTPUTDIR)\file.o \
	$(OUTPUTDIR)\algodefs.o \
	$(OUTPUTDIR)\json.o \
	$(OUTPUTDIR)\json_parser.o \
	$(OUTPUTDIR)\jsonpath.o \
	$(OUTPUTDIR)\jsonobj.o \
	$(OUTPUTDIR)\sha256crypt.o \
	$(OUTPUTDIR)\variant.o \
	$(OUTPUTDIR)\sysinfo_system.o \
	$(OUTPUTDIR)\sysinfo_dns.o \
	$(OUTPUTDIR)\sysinfo_ip_reverse.o \
	$(OUTPUTDIR)\sysinfo_vfs_file.o \
	$(OUTPUTDIR)\sysinfo_dir.o \
	$(OUTPUTDIR)\sysinfo_alias.o \
	$(OUTPUTDIR)\eventlog.o \
	$(OUTPUTDIR)\process_eventslog.o \
	$(OUTPUTDIR)\process_eventslog6.o \
	$(OUTPUTDIR)\symbols.o \
	$(OUTPUTDIR)\win32_file.o \
	$(TARGETDIR)\resource.syso

CFLAGS := $(CFLAGS) -O2 -g -DHAVE_STDINT_H=1 -DZBX_BUILD_AGENT2=1  -DHAVE_THREAD_LOCAL=1 \
	-I$(TOPDIR)\build\win32\include\common -I$(TOPDIR)\build\mingw -I$(TOPDIR)\include -I$(TOPDIR)\include\common

RFLAGS := $(RFLAGS) --input-format=rc -O coff
GOPATH := $(GOPATH);$(TOPDIR)\go
TAGS :=

ifeq ("$(ARCH)", "")
	ARCH := $(PROCESSOR_ARCHITECTURE)
endif

ifeq ("$(ARCH)", "x86")
	CFLAGS := $(CFLAGS) -m32
	CGO_CFLAGS := $(CGO_CFLAGS) -m32
	GOARCH := 386
	TARGETBIN=$(TOPDIR)\bin\win32\zabbix_agent2.exe
	RFLAGS := $(RFLAGS) --target=pe-i386

else
	TARGETBIN=$(TOPDIR)\bin\win64\zabbix_agent2.exe
	GOARCH := amd64
	RFLAGS := $(RFLAGS) --target=pe-x86-64
endif

ifneq ("$(OPENSSL)", "")
	CFLAGS := $(CFLAGS) -DHAVE_OPENSSL=1 -DHAVE_OPENSSL_WITH_PSK=1
	ifneq (,$(wildcard $(OPENSSL)))
		CFLAGS := $(CFLAGS) -I$(OPENSSL)\include
		LDFLAGS := $(LDFLAGS) -L$(OPENSSL)\lib
		TAGS += openssl
		OBJS += $(OUTPUTDIR)\tls_version.o
	endif
endif

ifneq ("$(PCRE)", "")
	CFLAGS := $(CFLAGS) -DPCRE_STATIC -I$(PCRE)\include -DHAVE_PCRE_H=1
	LDFLAGS := $(LDFLAGS) -L$(PCRE)\lib
	TAGS := $(TAGS) pcre
endif

ifneq ("$(PCRE2)", "")
	CFLAGS := $(CFLAGS) -DPCRE2_STATIC -I$(PCRE2)\include -DHAVE_PCRE2_H=1
	LDFLAGS := $(LDFLAGS) -L$(PCRE2)\lib
	TAGS := $(TAGS) pcre2
endif

CGO_CFLAGS += $(CFLAGS)
CGO_LDFLAGS += $(LDFLAGS)

PKG=golang.zabbix.com/agent2/pkg/version

GOLDFLAGS = -X $(PKG).compileOs=windows
GOLDFLAGS += -X $(PKG).compileArch=$(GOARCH)
GOLDFLAGS += -X main.confDefault=zabbix_agent2.win.conf
GOLDFLAGS += -X main.applicationName=zabbix_agent2

all: $(TARGETBIN)

$(OUTPUTDIR)\bincommon.o: $(TOPDIR)\src\libs\zbxbincommon\bincommon.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\misc.o: $(TOPDIR)\src\libs\zbxcommon\misc.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\ip.o: $(TOPDIR)\src\libs\zbxip\ip.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\iprange.o: $(TOPDIR)\src\libs\zbxip\iprange.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\num.o: $(TOPDIR)\src\libs\zbxnum\num.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\str.o: $(TOPDIR)\src\libs\zbxstr\str.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\common_str.o: $(TOPDIR)\src\libs\zbxcommon\common_str.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\common_log.o: $(TOPDIR)\src\libs\zbxcommon\common_log.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\file.o: $(TOPDIR)\src\libs\zbxfile\file.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\symbols.o: $(TOPDIR)\src\libs\zbxwin32\symbols.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\win32_file.o: $(TOPDIR)\src\libs\zbxfile\win32\win32_file.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\time.o: $(TOPDIR)\src\libs\zbxtime\time.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\expr.o: $(TOPDIR)\src\libs\zbxexpr\expr.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\host.o: $(TOPDIR)\src\libs\zbxexpr\host.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\macro.o: $(TOPDIR)\src\libs\zbxexpr\macro.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\function.o: $(TOPDIR)\src\libs\zbxexpr\function.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\interval.o: $(TOPDIR)\src\libs\zbxexpr\interval.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\token.o: $(TOPDIR)\src\libs\zbxexpr\token.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\components_strings_representations.o: $(TOPDIR)\src\libs\zbxcommon\components_strings_representations.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\libc_wrappers.o: $(TOPDIR)\src\libs\zbxcommon\libc_wrappers.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\param.o: $(TOPDIR)\src\libs\zbxparam\param.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\tls_version.o: $(TOPDIR)\src\libs\zbxcomms\tls_version.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\fatal.o: $(TOPDIR)\src\libs\zbxwin32\fatal.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\disk.o: $(TOPDIR)\src\libs\zbxwin32\disk.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\threads.o: $(TOPDIR)\src\libs\zbxthreads\threads.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\zbxhash.o: $(TOPDIR)\src\libs\zbxhash\zbxhash.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\md5.o: $(TOPDIR)\src\libs\zbxhash\md5.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\json_parser.o: $(TOPDIR)\src\libs\zbxjson\json_parser.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\jsonpath.o: $(TOPDIR)\src\libs\zbxjson\jsonpath.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\jsonobj.o: $(TOPDIR)\src\libs\zbxjson\jsonobj.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\sha256crypt.o: $(TOPDIR)\src\libs\zbxhash\sha256crypt.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\variant.o: $(TOPDIR)\src\libs\zbxvariant\variant.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\json.o: $(TOPDIR)\src\libs\zbxjson\json.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\sysinfo.o: $(TOPDIR)\src\libs\zbxsysinfo\sysinfo.c
	$(CC) $(CFLAGS) -DUNICODE -DWITH_COMMON_METRICS -c $^ -o $@

$(OUTPUTDIR)\sysinfo_system.o: $(TOPDIR)\src\libs\zbxsysinfo\common\system.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\sysinfo_ip_reverse.o: $(TOPDIR)\src\libs\zbxsysinfo\common\ip_reverse.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\sysinfo_dns.o: $(TOPDIR)\src\libs\zbxsysinfo\common\dns.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\sysinfo_vfs_file.o: $(TOPDIR)\src\libs\zbxsysinfo\common\vfs_file.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\sysinfo_dir.o: $(TOPDIR)\src\libs\zbxsysinfo\common\dir.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\sysinfo_alias.o: $(TOPDIR)\src\libs\zbxsysinfo\alias\alias.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\vector.o: $(TOPDIR)\src\libs\zbxalgo\vector.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\hashset.o: $(TOPDIR)\src\libs\zbxalgo\hashset.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\version.o: $(TOPDIR)\src\libs\zbxversion\version.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\algodefs.o: $(TOPDIR)\src\libs\zbxalgo\algodefs.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\zbxregexp.o: $(TOPDIR)\src\libs\zbxregexp\zbxregexp.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\active_checks.o: $(TOPDIR)\src\zabbix_agent\active_checks\active_checks.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\eventlog.o: $(TOPDIR)\src\zabbix_agent\active_checks\eventlog_win32\eventlog.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\process_eventslog.o: $(TOPDIR)\src\zabbix_agent\active_checks\eventlog_win32\process_eventslog.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\process_eventslog6.o: $(TOPDIR)\src\zabbix_agent\active_checks\eventlog_win32\process_eventslog6.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\persistent_state.o: $(TOPDIR)\src\zabbix_agent\logfiles\persistent_state.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(OUTPUTDIR)\logfiles.o: $(TOPDIR)\src\zabbix_agent\logfiles\logfiles.c
	$(CC) $(CFLAGS) -DUNICODE -c $^ -o $@

$(TARGETDIR)\resource.syso: $(TOPDIR)\build\win32\project\resource.rc
	$(WINDRES) $^ $(RFLAGS) -D _WINDOWS -D ZABBIX_AGENT2 -o $@

.FORCE:
$(TARGETBIN): $(OBJS) .FORCE
	set CGO_CFLAGS=$(CGO_CFLAGS)
	set CGO_LDFLAGS=$(CGO_LDFLAGS)
	set GOARCH=$(GOARCH)
	set CGO_ENABLED=1

	for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
	set BUILD_DATE=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%
	set BUILD_TIME=%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%

	set GOLDFLAGS=$(GOLDFLAGS) -X $(PKG).compileDate=%BUILD_DATE%
	set GOLDFLAGS=%GOLDFLAGS% -X $(PKG).compileTime=%BUILD_TIME%
	cd $(MODULEDIR)

	go build -tags "$(TAGS)" -ldflags="%GOLDFLAGS%" -o $(TARGETBIN) golang.zabbix.com/agent2/cmd/zabbix_agent2

clean:
	go clean -cache
	del $(TOPDIR)\include\common\config.h "$(TARGETBIN)" $(OUTPUTDIR)\*.o $(TARGETDIR)\*.syso 2>NUL