# Building the libcap/{cap.psx} Go packages. Note, we use symlinks to
# construct a go friendly src tree.

topdir=$(realpath ..)
include $(topdir)/Make.Rules

GOPATH=$(realpath .)
PSXGOPACKAGE=pkg/$(GOOSARCH)/libcap/psx.a
CAPGOPACKAGE=pkg/$(GOOSARCH)/libcap/cap.a

DEPS=../libcap/libcap.a ../libcap/libpsx.a

all: $(PSXGOPACKAGE) $(CAPGOPACKAGE) web compare-cap try-launching

$(DEPS):
	make -C ../libcap all

../progs/capsh:
	make -C ../progs capsh

src/libcap/psx:
	mkdir -p src/libcap
	ln -s $(topdir)/psx src/libcap/

src/libcap/cap:
	mkdir -p src/libcap
	ln -s $(topdir)/cap src/libcap/

$(topdir)/libcap/cap_names.h: $(DEPS)
	make -C $(topdir)/libcap all

src/libcap/cap/names.go: $(topdir)/libcap/cap_names.h src/libcap/cap  mknames.go
	go run mknames.go --header=$< | gofmt > $@ || rm -f $@

src/libcap/cap/syscalls.go: ./syscalls.sh src/libcap/cap
	./syscalls.sh src/libcap/cap

$(PSXGOPACKAGE): src/libcap/psx src/libcap/psx/psx.go src/libcap/psx/psx_test.go $(DEPS)
	mkdir -p pkg
	CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH="$(GOPATH)" go install libcap/psx

$(CAPGOPACKAGE): src/libcap/cap/syscalls.go src/libcap/cap/names.go src/libcap/cap/cap.go src/libcap/cap/text.go $(PSXGOPACKAGE)
	CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH=$(GOPATH) go install libcap/cap

# Compiles something with this package to compare it to libcap. This
# tests more when run under sudotest (see ../progs/quicktest.sh for that).
compare-cap: compare-cap.go $(CAPGOPACKAGE)
	CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH=$(GOPATH) go build $<

web: web.go $(CAPGOPACKAGE)
	CGO_ENABLED="$(CGO_REQUIRED)" CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH=$(GOPATH) go build $<
ifeq ($(RAISE_GO_FILECAP),yes)
	make -C ../progs setcap
	sudo ../progs/setcap cap_setpcap,cap_net_bind_service=p web
	@echo "NOTE: RAISED cap_net_bind_service ON web binary"
endif

ok: ok.go
	CGO_ENABLED=0 GOPATH=$(GOPATH) go build $<

try-launching: try-launching.go $(CAPGOPACKAGE) ok
	CGO_ENABLED="$(CGO_REQUIRED)" CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH=$(GOPATH) go build $<
ifeq ($(CGO_REQUIRED),0)
	CGO_ENABLED="1" CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH=$(GOPATH) go build -o $@-cgo $<
endif

test: all ../progs/capsh
	CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH="$(GOPATH)" go test libcap/psx
	CGO_LDFLAGS_ALLOW="$(CGO_LDFLAGS_ALLOW)" CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" GOPATH=$(GOPATH) go test libcap/cap
	LD_LIBRARY_PATH=../libcap ./compare-cap
	./try-launching
ifeq ($(CGO_REQUIRED),0)
	./try-launching-cgo
endif

sudotest: test
	sudo ./try-launching
ifeq ($(CGO_REQUIRED),0)
	sudo ./try-launching-cgo
endif

install: all
	mkdir -p $(FAKEROOT)$(GOPKGDIR)/libcap/psx
	rm -f $(FAKEROOT)$(GOPKGDIR)/libcap/psx/*
	install -m 0644 src/libcap/psx/* $(FAKEROOT)$(GOPKGDIR)/libcap/psx/
	mkdir -p $(FAKEROOT)$(GOPKGDIR)/libcap/cap
	rm -f $(FAKEROOT)$(GOPKGDIR)/libcap/cap/*
	install -m 0644 src/libcap/cap/* $(FAKEROOT)$(GOPKGDIR)/libcap/cap/

clean:
	GOPATH=$(GOPATH) go clean -x -i libcap/cap 2> /dev/null || exit 0
	GOPATH=$(GOPATH) go clean -x -i libcap/psx 2> /dev/null || exit 0
	rm -f *.o *.so *~ mknames web ok
	rm -f compare-cap try-launching try-launching-cgo
	rm -f $(topdir)/cap/*~ $(topdir)/cap/names.go $(topdir)/cap/syscalls*.go
	rm -f $(topdir)/psx/*~
	rm -fr pkg src
