mirror of https://github.com/josh-berry/tab-stash
217 lines
6.3 KiB
Makefile
217 lines
6.3 KiB
Makefile
PACKAGE := $(shell node -e "x=`cat package.json`; console.log(x.name)")
|
|
VERSION := $(shell node -e "x=`cat assets/manifest.json`; console.log(x.version)")
|
|
COMMIT := $(shell git rev-parse --short HEAD)
|
|
DEV_TAG := $(if $(shell git tag --points-at=HEAD),,-dev)
|
|
DIRTY_TAG := $(if $(shell git status --porcelain),-dirty,)
|
|
FULL_VERSION := $(VERSION)$(DEV_TAG)-$(COMMIT)$(DIRTY_TAG)
|
|
|
|
ifeq ($(VERSION),)
|
|
$(error Unable to determine the current version number)
|
|
endif
|
|
|
|
ifeq ($(COMMIT),)
|
|
$(error Unable to determine the HEAD commit)
|
|
endif
|
|
|
|
RELEASE_DIR = releases
|
|
|
|
SRCPKG_DIR = $(PACKAGE)-src-$(FULL_VERSION)
|
|
SRC_PKG = $(RELEASE_DIR)/$(SRCPKG_DIR).tar.gz
|
|
DIST_PKG = $(RELEASE_DIR)/$(PACKAGE)-$(FULL_VERSION).zip
|
|
|
|
# Primary (user-facing) targets.
|
|
|
|
# The default target. This is unrolled so that the things that are most likely
|
|
# to fail and are fastest to fail, fail first, and so that style issues can be
|
|
# automatically fixed.
|
|
debug:
|
|
$(MAKE) check-types
|
|
$(MAKE) build-dbg build-chrome-dbg
|
|
$(MAKE) check-tests
|
|
$(MAKE) check-style || ( $(MAKE) fix-style && $(MAKE) debug )
|
|
.PHONY: debug
|
|
|
|
check: check-types check-tests check-style
|
|
.PHONY: check
|
|
|
|
check-types: node_modules
|
|
./node_modules/.bin/vue-tsc --noEmit
|
|
.PHONY: check-types
|
|
|
|
check-tests: node_modules
|
|
./node_modules/.bin/c8 ./node_modules/.bin/mocha
|
|
.PHONY: check-tests
|
|
|
|
check-style: node_modules
|
|
./node_modules/.bin/prettier --ignore-path .gitignore --check .
|
|
.PHONY: check-style
|
|
|
|
fix-style: node_modules
|
|
./node_modules/.bin/prettier --ignore-path .gitignore --write .
|
|
.PHONY: fix-style
|
|
|
|
rel:
|
|
$(MAKE) distclean release-tag
|
|
$(MAKE) rel-inner
|
|
.PHONY: rel
|
|
|
|
# rel-inner is separate from rel since the version-number variables at the top
|
|
# of this file will change after the release tag is created.
|
|
rel-inner:
|
|
$(MAKE) pkg-webext pkg-source
|
|
$(MAKE) -C $(RELEASE_DIR)/$(SRCPKG_DIR) release-tag pkg-webext pkg-source
|
|
@if [ ! -z "$$(diff -Nru dist $(RELEASE_DIR)/$(SRCPKG_DIR)/dist)" ]; then \
|
|
diff -Nru dist $(RELEASE_DIR)/$(SRCPKG_DIR)/dist; \
|
|
echo "!!!" >&2; \
|
|
echo "!!! Build did not reproduce correctly; check diff output above" >&2; \
|
|
echo "!!!" >&2; \
|
|
exit 1; \
|
|
fi
|
|
rm -rf $(RELEASE_DIR)/$(SRCPKG_DIR)
|
|
@echo ""
|
|
@echo "Ready for release $(VERSION)!"
|
|
@echo
|
|
@echo "Git tag: v$(VERSION)"
|
|
@echo "Release package: $(DIST_PKG)"
|
|
@echo "Source package: $(SRC_PKG)"
|
|
@echo
|
|
@echo "If everything looks good, run \"git push && git push --tags\", and"
|
|
@echo "upload to AMO."
|
|
@echo ""
|
|
.PHONY: rel-inner
|
|
|
|
# My version of `npm update`, since `npm update` seems to leave stale stuff
|
|
# lying around in package-lock.json. :/
|
|
up:
|
|
rm -rf package-lock.json node_modules
|
|
$(MAKE)
|
|
.PHONY: up
|
|
|
|
|
|
##
|
|
## Intermediate targets.
|
|
##
|
|
|
|
## Packaging and Release
|
|
|
|
pkg-webext: clean-working-tree build-rel
|
|
mkdir -p $(RELEASE_DIR)
|
|
cd dist && zip -9rvo ../$(DIST_PKG) `find . -type f`
|
|
.PHONY: pkg-webext
|
|
|
|
pkg-source: clean-working-tree
|
|
mkdir -p $(RELEASE_DIR)
|
|
rm -rf $(RELEASE_DIR)/$(SRCPKG_DIR) $(SRC_PKG)
|
|
git clone -b v$(VERSION) . $(RELEASE_DIR)/$(SRCPKG_DIR)
|
|
git -C $(RELEASE_DIR)/$(SRCPKG_DIR) fetch -f origin
|
|
git -C $(RELEASE_DIR)/$(SRCPKG_DIR) gc --aggressive
|
|
tar -C $(RELEASE_DIR) -czf $(SRC_PKG) $(SRCPKG_DIR)
|
|
.PHONY: pkg-source
|
|
|
|
release-tag: clean-working-tree
|
|
[ `git name-rev --tags --name-only HEAD` = "v$(VERSION)" ] || \
|
|
git tag v$(VERSION) HEAD
|
|
.PHONY: release-tag
|
|
.NOTPARALLEL: release-tag
|
|
|
|
clean-working-tree:
|
|
[ -z "$$(git status --porcelain)" ] # Working tree must be clean.
|
|
.PHONY: clean-working-tree
|
|
.NOTPARALLEL: clean-working-tree
|
|
|
|
|
|
## Build
|
|
|
|
build-chrome-dbg: build-dbg
|
|
rsync -aHvx --delete --force dist/ dist-chrome/
|
|
cp assets/manifest.json dist-chrome/
|
|
patch --no-backup-if-mismatch dist-chrome/manifest.json chrome-manifest.patch
|
|
.PHONY: build-chrome-dbg
|
|
|
|
build-dbg: node_modules icons dist/tab-stash.css
|
|
NODE_ENV=development ./node_modules/.bin/vite build -c vite.config.html.ts -m development
|
|
NODE_ENV=development ./node_modules/.bin/vite build -c vite.config.lib.ts -m development
|
|
./node_modules/.bin/copyfiles -u 1 'assets/**/*' dist
|
|
.PHONY: build-dbg
|
|
|
|
build-rel:
|
|
$(MAKE) clean
|
|
$(MAKE) node_modules icons dist/tab-stash.css
|
|
$(MAKE) check
|
|
NODE_ENV=production ./node_modules/.bin/vite build -c vite.config.html.ts -m production
|
|
NODE_ENV=production ./node_modules/.bin/vite build -c vite.config.lib.ts -m production
|
|
./node_modules/.bin/copyfiles -u 1 'assets/**/*' dist
|
|
./node_modules/.bin/web-ext lint -s dist -i 'test.*'
|
|
.PHONY: build-rel
|
|
|
|
node_modules: package-lock.json
|
|
node_modules package-lock.json: package.json
|
|
npm install
|
|
touch node_modules package-lock.json
|
|
|
|
dist/tab-stash.css: node_modules $(wildcard styles/*.less) $(wildcard styles/*/*.less)
|
|
@mkdir -p dist
|
|
./node_modules/.bin/lessc --math=strict styles/index.less dist/tab-stash.css
|
|
|
|
## Build Icons
|
|
|
|
DARK_ICONS = $(patsubst icons/%,dist/icons/dark/%,$(wildcard icons/*.svg))
|
|
LIGHT_ICONS = $(patsubst icons/%,dist/icons/light/%,$(wildcard icons/*.svg))
|
|
LOGO_ICONS = dist/icons/logo.svg \
|
|
dist/icons/warning.svg \
|
|
$(foreach size,16 32 48 64 96 128,dist/icons/logo-$(size).png)
|
|
TOOLBAR_ICONS = dist/icons/stash-one.svg \
|
|
$(foreach size,16 32 64,dist/icons/logo-$(size).png) \
|
|
$(foreach theme,dark light,$(foreach size,16 32 64,dist/icons/$(theme)/logo-$(size).png))
|
|
|
|
icons: $(DARK_ICONS) $(LIGHT_ICONS) $(LOGO_ICONS) $(TOOLBAR_ICONS)
|
|
.PHONY: icons
|
|
|
|
dist/icons/dark/%.svg: icons/%.svg
|
|
@mkdir -p $(dir $@)
|
|
sed 's%style="[^"]*"%style="fill:#fbfbfe"%g' <$< >$@
|
|
|
|
dist/icons/%.svg: icons/%.svg
|
|
@mkdir -p $(dir $@)
|
|
sed 's%style="[^"]*"%style="fill:#808080"%g' <$< >$@
|
|
|
|
dist/icons/light/%.svg: icons/%.svg
|
|
@mkdir -p $(dir $@)
|
|
sed 's%style="[^"]*"%style="fill:#222426"%g' <$< >$@
|
|
|
|
%-16.png: %.svg
|
|
inkscape "$<" -o "$@" -D -w 16 -h 16
|
|
%-32.png: %.svg
|
|
inkscape "$<" -o "$@" -D -w 32 -h 32
|
|
%-48.png: %.svg
|
|
inkscape "$<" -o "$@" -D -w 48 -h 48
|
|
%-64.png: %.svg
|
|
inkscape "$<" -o "$@" -D -w 64 -h 64
|
|
%-96.png: %.svg
|
|
inkscape "$<" -o "$@" -D -w 96 -h 96
|
|
%-128.png: %.svg
|
|
inkscape "$<" -o "$@" -D -w 128 -h 128
|
|
|
|
|
|
## Website
|
|
|
|
BUNDLE = $(if $(shell type /opt/homebrew/opt/ruby/bin/bundle),/opt/homebrew/opt/ruby/bin/bundle,bundle)
|
|
|
|
site:
|
|
cd docs; $(BUNDLE) install
|
|
cd docs; $(BUNDLE) exec jekyll serve -H 0.0.0.0
|
|
.PHONY: site
|
|
|
|
|
|
## Cleanup
|
|
|
|
distclean: clean
|
|
rm -rf node_modules docs/vendor \
|
|
$(RELEASE_DIR)/$(SRCPKG_DIR) $(SRC_PKG) $(DIST_PKG) \
|
|
releases/*-dirty* releases/*-dev*
|
|
.PHONY: distclean
|
|
|
|
clean:
|
|
rm -rf build.test dist dist-chrome docs/_site coverage
|
|
.PHONY: clean
|