.PHONY: all clean

# C&GO编译器
CC := gcc
AR := ar
DEFINS = -D_GNU_SOURCE

GO := go
GO_BUILD := $(GO) build
GO_FLAGS := -ldflags "-s -w -X hnyfkj.com.cn/rtu/linux/baseapp.Version=1.0.0.1 -X hnyfkj.com.cn/rtu/linux/baseapp.BuildTime=$(shell date +%Y-%m-%dT%H:%M:%S) -X main.BuildTime=$(shell date +%Y-%m-%dT%H:%M:%S)"

target ?= armv7hf
ifeq ($(target),armv7hf)
  GOOS := linux
  GOARCH := arm
  GOARM := 7
  CC := arm-linux-gnueabihf-gcc
  AR := arm-linux-gnueabihf-ar
endif

# GO编译环境
SETGO_ENV = \
	$(if $(GOOS),GOOS=$(GOOS)) \
	$(if $(GOARCH),GOARCH=$(GOARCH)) \
	$(if $(GOARM),GOARM=$(GOARM)) \
	CC=$(CC) CGO_ENABLED=1 \

# 日期和时间
DATE := $(shell date +%Y%m%d_%H%M%S)

# 编译的目标
all : camera_test.out hk_takephoto.out dh_takephoto.out air720u_4g.out rtu_linux_modules.out yfkj_sshd.out yfkj_ssh_client.out yfkj_ssh_client.exe yfkj_timesync.out

# 通用基础库
libswapi.a :
	$(MAKE) -C swapi target=$(target) $@

# 海康机器人
libhk_takephoto.a :
	$(MAKE) -C hk_takephoto target=$(target) $@

# "iRAYPLE"
libdh_takephoto.a :
ifeq ($(target),armv7hf)
	$(MAKE) -C dh_takephoto target=$(target) $@
else
	$(error Unsupported target: $(target), only armv7hf is supported)
endif

# "Air720U"
libair720u.a :
	$(MAKE) -C air720u target=$(target) $@

# "Air530Z"
libair530z.a :
	$(MAKE) -C air530z target=$(target) $@

## "EC200U"
libec200u.a :
	$(MAKE) -C ec200u target=$(target)  $@

## "YMODEM"
libymodem.a :
	$(MAKE) -C ymodem target=$(target)  $@

# 海康相机拍照测试
LIB1 := -Wl,-Bstatic -L./swapi -lswapi -L./hk_takephoto -lhk_takephoto
ifeq ($(target),armv7hf)
  LIB1 += -Wl,-Bdynamic -lc -lm -ldl -lpthread -L$(PWD)/hk_takephoto/lib/armv7hf/. -lMvCameraControl
else
  LIB1 += -Wl,-Bdynamic -lc -lm -ldl -lpthread -L$(PWD)/hk_takephoto/lib/x86_64/64 -lMvCameraControl
endif
hk_takephoto.out : libswapi.a libhk_takephoto.a ./tests/hk_takephoto/main.go
	mkdir -p ./build/hk_takephoto_test
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB1)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./tests/hk_takephoto/main.go
	@cp $@ ./build/hk_takephoto_test/$(basename $@)_$(DATE)$(suffix $@)
	rm -rf $@

# 测4G模块Air720U
LIB2 := -Wl,-Bstatic -L./swapi -lswapi -L./air720u -lair720u -Wl,-Bdynamic -lc -lm -ldl -lpthread
air720u_4g.out : libswapi.a libair720u.a ./tests/air720u/main.go
	mkdir -p ./build/air720u_test
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB2)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./tests/air720u/main.go
	@cp $@ ./build/air720u_test/$(basename $@)_$(DATE)$(suffix $@)
	rm -rf $@

# 测4G模块-EC200U
LIB3 := -Wl,-Bstatic -L./swapi -lswapi -L./ec200u -lec200u -Wl,-Bdynamic -lc -lm -ldl -lpthread
ec200u_4g.out : libswapi.a libec200u.a ./tests/ec200u/main.go
	mkdir -p ./build/ec200u_test
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB3)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./tests/ec200u/main.go
	@cp $@ ./build/ec200u_test/$(basename $@)_$(DATE)$(suffix $@)
	rm -rf $@

# 大华相机拍照测试
LIB4 := -Wl,-Bstatic -L./swapi -lswapi -L./dh_takephoto -ldh_takephoto
ifeq ($(target),armv7hf)
  LIB4 += -Wl,-Bdynamic -lc -lm -ldl -lpthread -L$(PWD)/dh_takephoto/lib/armv7hf -lMVSDK -liImageProcessing -lImageConvert -llog4cpp -lMvLSCProcess
	LIB4 += -L$(PWD)/dh_takephoto/lib/armv7hf/GenICam/bin -lGCBase_gcc483_v3_0 -lGenApi_gcc483_v3_0 -lLog_gcc483_v3_0 -llog4cpp_gcc483_v3_0 -lMathParser_gcc483_v3_0 -lNodeMapData_gcc483_v3_0 -lXmlParser_gcc483_v3_0
endif
dh_takephoto.out : libswapi.a libdh_takephoto.a ./tests/dh_takephoto/main.go
	mkdir -p ./build/dh_takephoto_test
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB4)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./tests/dh_takephoto/main.go
	@cp $@ ./build/dh_takephoto_test/$(basename $@)_$(DATE)$(suffix $@)
	rm -rf $@

# 综合相机测试程序
LIB5 := -Wl,-Bstatic -L./swapi -lswapi -L./hk_takephoto -lhk_takephoto -L./dh_takephoto -ldh_takephoto
ifeq ($(target),armv7hf)
  LIB5 += -Wl,-Bdynamic -lc -lm -ldl -lpthread -L$(PWD)/hk_takephoto/lib/armv7hf/. -lMvCameraControl
	LIB5 += -L$(PWD)/dh_takephoto/lib/armv7hf -lMVSDK -liImageProcessing -lImageConvert -llog4cpp -lMvLSCProcess
	LIB5 += -L$(PWD)/dh_takephoto/lib/armv7hf/GenICam/bin -lGCBase_gcc483_v3_0 -lGenApi_gcc483_v3_0 -lLog_gcc483_v3_0 -llog4cpp_gcc483_v3_0 -lMathParser_gcc483_v3_0 -lNodeMapData_gcc483_v3_0 -lXmlParser_gcc483_v3_0
endif
camera_test.out : libswapi.a libhk_takephoto.a libdh_takephoto.a ./tests/camera/main.go
	mkdir -p ./build/camera_test
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB5)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./tests/camera/main.go
	@cp $@ ./build/camera_test/$(basename $@)_$(DATE)$(suffix $@)
	rm -rf $@

# 远程运维工具程序
LIB6 = -Wl,-Bstatic -L./swapi -lswapi -L./air530z -lair530z -Wl,-Bdynamic -lc -lm -ldl -lpthread
yfkj_sshd.out       : libswapi.a libair530z.a ./sshd/server/server.go
	mkdir -p ./build
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB6)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/server/*.go
	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)

yfkj_ssh_client.out : ./sshd/client/client.go
	mkdir -p ./build
	$(GO) mod tidy
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/client/*.go
	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)

yfkj_ssh_client.exe : ./sshd/client/client.go
	mkdir -p ./build
	$(GO) mod tidy
	GOOS=windows GOARCH=amd64 CGO_ENABLED=0 $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/client/*.go
	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)

yfkj_timesync.out   : libswapi.a libair530z.a ./tools/timesync/main.go
	mkdir -p ./build
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIB6)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./tools/timesync/main.go
	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)

# 综合应用测试程序
LIBS := -Wl,-Bstatic -L./swapi -lswapi -L./hk_takephoto -lhk_takephoto -L./dh_takephoto -ldh_takephoto -L./air720u -lair720u -L./air530z -lair530z -L./ec200u -lec200u
ifeq ($(target),armv7hf)
  LIBS += -Wl,-Bdynamic -lc -lm -ldl -lpthread -L$(PWD)/hk_takephoto/lib/armv7hf/. -lMvCameraControl
	LIBS += -L$(PWD)/dh_takephoto/lib/armv7hf -lMVSDK -liImageProcessing -lImageConvert -llog4cpp -lMvLSCProcess
	LIBS += -L$(PWD)/dh_takephoto/lib/armv7hf/GenICam/bin -lGCBase_gcc483_v3_0 -lGenApi_gcc483_v3_0 -lLog_gcc483_v3_0 -llog4cpp_gcc483_v3_0 -lMathParser_gcc483_v3_0 -lNodeMapData_gcc483_v3_0 -lXmlParser_gcc483_v3_0
else
  LIBS += -Wl,-Bdynamic -lc -lm -ldl -lpthread -L$(PWD)/hk_takephoto/lib/x86_64/64 -lMvCameraControl
endif
rtu_linux_modules.out : libswapi.a libhk_takephoto.a libdh_takephoto.a libair720u.a libair530z.a libec200u.a ./main.go
	mkdir -p ./build
	$(GO) mod tidy
	$(SETGO_ENV) CGO_LDFLAGS="$(LIBS)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./main.go
	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)

# 编译的清理
clean :
	make -C ./swapi clean
	make -C ./hk_takephoto clean
	make -C ./dh_takephoto clean
	make -C ./air720u clean
	make -C ./air530z clean
	make -C ./ec200u  clean
	make -C ./ymodem  clean
	rm -rf ./*.a ./*.out ./*.exe ./build
