Makefile 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. export GO111MODULE=on
  2. GOPROXY ?= https://proxy.golang.org,direct
  3. export GOPROXY
  4. BUILD_TAG = devel
  5. ARCH ?= $(shell uname -m)
  6. BIN := yay
  7. DESTDIR :=
  8. GO ?= go
  9. PKGNAME := yay
  10. PREFIX := /usr/local
  11. MAJORVERSION := 12
  12. MINORVERSION := 0
  13. PATCHVERSION := 0
  14. VERSION ?= ${MAJORVERSION}.${MINORVERSION}.${PATCHVERSION}
  15. LOCALEDIR := po
  16. SYSTEMLOCALEPATH := $(PREFIX)/share/locale/
  17. # ls -1 po | sed -e 's/\.po$//' | paste -sd " "
  18. LANGS := ca cs de en es eu fr_FR he id it_IT ja ko pl_PL pt_BR pt ru_RU ru sv tr uk zh_CN zh_TW
  19. POTFILE := default.pot
  20. POFILES := $(addprefix $(LOCALEDIR)/,$(addsuffix .po,$(LANGS)))
  21. MOFILES := $(POFILES:.po=.mo)
  22. FLAGS ?= -trimpath -mod=readonly -modcacherw
  23. EXTRA_FLAGS ?= -buildmode=pie
  24. LDFLAGS := -X "main.yayVersion=${VERSION}" -X "main.localePath=${SYSTEMLOCALEPATH}" -linkmode=external
  25. FLAGS += $(shell pacman -T 'pacman-git' >/dev/null 2>&1 && echo "-tags next")
  26. RELEASE_DIR := ${PKGNAME}_${VERSION}_${ARCH}
  27. PACKAGE := $(RELEASE_DIR).tar.gz
  28. SOURCES ?= $(shell find . -name "*.go" -type f)
  29. .PRECIOUS: ${LOCALEDIR}/%.po
  30. .PHONY: default
  31. default: build
  32. .PHONY: all
  33. all: | clean release
  34. .PHONY: clean
  35. clean:
  36. $(GO) clean $(FLAGS) -i ./...
  37. rm -rf $(BIN) $(PKGNAME)_*
  38. .PHONY: test_lint
  39. test_lint: test lint
  40. .PHONY: test
  41. test:
  42. $(GO) test -race -covermode=atomic $(FLAGS) ./...
  43. .PHONY: test-integration
  44. test-integration:
  45. $(GO) test -tags=integration $(FLAGS) ./...
  46. .PHONY: build
  47. build: $(BIN)
  48. .PHONY: release
  49. release: $(PACKAGE)
  50. .PHONY: docker-release-all
  51. docker-release-all:
  52. make docker-release-armv7h ARCH=armv7h
  53. make docker-release-x86_64 ARCH=x86_64
  54. make docker-release-aarch64 ARCH=aarch64
  55. docker-release:
  56. docker create --name yay-$(ARCH) yay:${ARCH}
  57. docker cp yay-$(ARCH):/app/${PACKAGE} $(PACKAGE)
  58. docker container rm yay-$(ARCH)
  59. .PHONY: docker-build
  60. docker-build:
  61. docker build -t yay-$(ARCH):${VERSION} .
  62. docker run -e="ARCH=$(ARCH)" --name yay-$(ARCH) yay-$(ARCH):${VERSION} make build VERSION=${VERSION} PREFIX=${PREFIX}
  63. docker cp yay-$(ARCH):/app/${BIN} $(BIN)
  64. docker container rm yay-$(ARCH)
  65. .PHONY: lint
  66. lint:
  67. $(GO) vet $(FLAGS) ./...
  68. @test -z "$$(gofmt -l $(SOURCES))" || (echo "Files need to be linted. Use make fmt" && false)
  69. golangci-lint run ./...
  70. .PHONY: fmt
  71. fmt:
  72. go fmt ./...
  73. .PHONY: install
  74. install: build ${MOFILES}
  75. install -Dm755 ${BIN} $(DESTDIR)$(PREFIX)/bin/${BIN}
  76. install -Dm644 doc/${PKGNAME}.8 $(DESTDIR)$(PREFIX)/share/man/man8/${PKGNAME}.8
  77. install -Dm644 completions/bash $(DESTDIR)$(PREFIX)/share/bash-completion/completions/${PKGNAME}
  78. install -Dm644 completions/zsh $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_${PKGNAME}
  79. install -Dm644 completions/fish $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d/${PKGNAME}.fish
  80. for lang in ${LANGS}; do \
  81. install -Dm644 ${LOCALEDIR}/$${lang}.mo $(DESTDIR)$(PREFIX)/share/locale/$$lang/LC_MESSAGES/${PKGNAME}.mo; \
  82. done
  83. .PHONY: uninstall
  84. uninstall:
  85. rm -f $(DESTDIR)$(PREFIX)/bin/${BIN}
  86. rm -f $(DESTDIR)$(PREFIX)/share/man/man8/${PKGNAME}.8
  87. rm -f $(DESTDIR)$(PREFIX)/share/bash-completion/completions/${PKGNAME}
  88. rm -f $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_${PKGNAME}
  89. rm -f $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d/${PKGNAME}.fish
  90. for lang in ${LANGS}; do \
  91. rm -f $(DESTDIR)$(PREFIX)/share/locale/$$lang/LC_MESSAGES/${PKGNAME}.mo; \
  92. done
  93. $(BIN): $(SOURCES)
  94. $(GO) build $(FLAGS) -ldflags '$(LDFLAGS)' $(EXTRA_FLAGS) -o $@
  95. $(RELEASE_DIR):
  96. mkdir $(RELEASE_DIR)
  97. $(PACKAGE): $(BIN) $(RELEASE_DIR) ${MOFILES}
  98. strip ${BIN}
  99. cp -t $(RELEASE_DIR) ${BIN} doc/${PKGNAME}.8 completions/* ${MOFILES}
  100. tar -czvf $(PACKAGE) $(RELEASE_DIR)
  101. locale:
  102. xgotext -in . -out po
  103. for lang in ${LANGS}; do \
  104. test -f po/$$lang.po || msginit -l po/$$lang.po -i po/${POTFILE} -o po/$$lang.po \
  105. msgmerge -U po/$$lang.po po/${POTFILE}; \
  106. touch po/$$lang.po; \
  107. done
  108. ${LOCALEDIR}/%.mo: ${LOCALEDIR}/%.po
  109. msgfmt $< -o $@