diff --git a/Makefile b/Makefile deleted file mode 100644 index 89e3dcb60..000000000 --- a/Makefile +++ /dev/null @@ -1,204 +0,0 @@ -SHELL := /bin/bash - -ifndef SHELLFLAGS - SHELLFLAGS := -endif - -.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) - -ifndef OS - OS := unknown -endif - -ifeq (${OS},Windows_NT) -# Windows terminal is confusing it with its `cmd` builtin `rename` command - ifndef RENAME_BIN - RENAME_BIN := perl scripts/rename - endif - - ifndef ACTIVATE_SCRIPT - ACTIVATE_SCRIPT := pyenv/Scripts/activate - endif - - ifndef PYTHON_BIN - PYTHON_BIN := python - endif -else - ifndef RENAME_BIN - RENAME_BIN := scripts/rename - endif - - ifndef ACTIVATE_SCRIPT - ACTIVATE_SCRIPT := pyenv/bin/activate - endif - - ifndef PYTHON_BIN - PYTHON_BIN := python3 - endif -endif - -ifndef ANKI_EXTRA_PIP - ANKI_EXTRA_PIP := true -endif - -.DELETE_ON_ERROR: -SUBMAKE := $(MAKE) --print-directory -.SUFFIXES: - -BUILDFLAGS := --release --strip -DEVFLAGS := -RUNFLAGS := -CHECKABLE_PY := pylib qt -CHECKABLE_RS := rslib rspy -DEVEL := rslib rspy pylib ts qt - -.PHONY: all -all: run - -# - modern pip required for wheel -# - add qt if missing -pyenv: -# https://github.com/PyO3/maturin/issues/283 - Expected `python` to be a python interpreter inside a virtualenv - set -eu -o pipefail ${SHELLFLAGS}; \ - "${PYTHON_BIN}" -m venv pyenv; \ - case "$$(uname -s)" in CYGWIN*|MINGW*|MSYS*) \ - dos2unix "${ACTIVATE_SCRIPT}"; \ - VIRTUAL_ENV="$$(pwd)"; \ - VIRTUAL_ENV="$$(cygpath -m "$${VIRTUAL_ENV}")"; \ - sed -i -- "s@VIRTUAL_ENV=\".*\"@VIRTUAL_ENV=\"$$(pwd)/pyenv\"@g" "${ACTIVATE_SCRIPT}"; \ - sed -i -- "s@export PATH@export PATH; VIRTUAL_ENV=\"$${VIRTUAL_ENV}/pyenv\";@g" "${ACTIVATE_SCRIPT}"; \ - ;; esac; \ - . "${ACTIVATE_SCRIPT}"; \ - python --version; \ - python -m pip install --upgrade pip setuptools; \ - ${ANKI_EXTRA_PIP}; \ - if ! python -c 'import PyQt5' 2>/dev/null; then \ - python -m pip install -r qt/requirements.qt; \ - fi; - -# update build hash -.PHONY: buildhash -buildhash: - @set -eu -o pipefail ${SHELLFLAGS}; \ - oldhash=$$(test -f meta/buildhash && cat meta/buildhash || true); \ - newhash=$$(git rev-parse --short=8 HEAD || echo dev); \ - if [ "$$oldhash" != "$$newhash" ]; then \ - echo $$newhash > meta/buildhash; \ - fi - -.PHONY: develop -develop: pyenv buildhash prepare - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - for dir in $(DEVEL); do \ - $(SUBMAKE) -C $$dir develop DEVFLAGS="$(DEVFLAGS)"; \ - done - -.PHONY: run -run: develop - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - echo "Starting Anki..."; \ - python qt/runanki $(RUNFLAGS) - -.PHONY: prepare -prepare: rslib/ftl/repo qt/ftl/repo qt/po/repo - -rslib/ftl/repo: - $(MAKE) pull-i18n -qt/ftl/repo: - $(MAKE) pull-i18n -qt/po/repo: - $(MAKE) pull-i18n - -.PHONY: build -build: clean-dist build-ts build-rspy build-pylib build-qt add-buildhash - @echo - @echo "Build complete." - -.PHONY: build-ts -build-ts: - $(SUBMAKE) -C ts build - -.PHONY: build-rspy -build-rspy: pyenv buildhash - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - $(SUBMAKE) -C rspy build BUILDFLAGS="$(BUILDFLAGS)" - -.PHONY: build-pylib -build-pylib: - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - $(SUBMAKE) -C pylib build - -.PHONY: build-qt -build-qt: - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - $(SUBMAKE) -C qt build - -.PHONY: clean -clean: clean-dist - @set -eu -o pipefail ${SHELLFLAGS}; \ - for dir in $(DEVEL); do \ - $(SUBMAKE) -C $$dir clean; \ - done - -# remove any files in dist/ folder without current build hash -.PHONY: clean-dist -clean-dist: buildhash - "${FIND}" dist \! -name "*$$(cat meta/buildhash)*" -type f -delete - -.PHONY: check -check: pyenv buildhash prepare - @set -eu -o pipefail ${SHELLFLAGS}; \ - .github/scripts/trailing-newlines.sh; \ - . "${ACTIVATE_SCRIPT}"; \ - for dir in $(CHECKABLE_RS) ts $(CHECKABLE_PY); do \ - $(SUBMAKE) -C $$dir check; \ - done; - @echo - @echo "All checks passed!" - -.PHONY: fix -fix: develop - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - for dir in $(CHECKABLE_RS) $(CHECKABLE_PY); do \ - $(SUBMAKE) -C $$dir fix; \ - done; \ - -.PHONY: add-buildhash -add-buildhash: - @set -eu -o pipefail ${SHELLFLAGS}; \ - ver="$$(cat meta/version)"; \ - hash="$$(cat meta/buildhash)"; \ - ${RENAME_BIN} -f "s/-$${ver}(\.|-)/-$${ver}+$${hash}\$$1/" dist/*-"$${ver}"* - - -.PHONY: pull-i18n -pull-i18n: - (cd rslib/ftl && scripts/fetch-latest-translations) - (cd qt/ftl && scripts/fetch-latest-translations) - (cd qt/po && scripts/fetch-latest-translations) - -.PHONY: push-i18n-ftl -push-i18n-ftl: pull-i18n - (cd rslib/ftl && scripts/upload-latest-templates) - (cd qt/ftl && scripts/upload-latest-templates) - -.PHONY: push-i18n-po -push-i18n-po: pull-i18n - (cd qt/po && scripts/upload-latest-template) - -.PHONY: ts-dev -ts-dev: develop - @set -eu -o pipefail ${SHELLFLAGS}; \ - . "${ACTIVATE_SCRIPT}"; \ - tmux new -d -s anki-ts "ANKIDEV=1 ANKI_API_PORT=9001 python qt/runanki $(RUNFLAGS)" - tmux split-window "(cd ts && make dev)" - tmux attach diff --git a/pylib/Makefile b/pylib/Makefile deleted file mode 100644 index 5cb14e092..000000000 --- a/pylib/Makefile +++ /dev/null @@ -1,125 +0,0 @@ -SHELL := /bin/bash - -ifndef SHELLFLAGS - SHELLFLAGS := -endif - -.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - -RUNARGS := -MYPY_ARGS := -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) - -ifndef OS - OS := unknown -endif - -# https://anki.tenderapp.com/discussions/beta-testing/1860-error-unused-type-ignore-comment -ifneq (${OS},Windows_NT) - MYPY_ARGS := --warn-unused-ignores -endif - -.DELETE_ON_ERROR: -.SUFFIXES: -BLACKARGS := -t py36 anki tests setup.py tools/*.py --exclude='_pb2|buildinfo|_gen' -ISORTARGS := --profile black anki tests setup.py - -$(shell mkdir -p .build ../dist) - -PHONY: all -all: check - -.build/run-deps: setup.py - SKIP_ANKI_RSPY=true python -m pip install -e . - @touch $@ - -.build/dev-deps: requirements.dev - python -m pip install -r requirements.dev - @touch $@ - -PROTODEPS := ../proto/backend.proto ../proto/fluent.proto - -.build/py-proto: .build/dev-deps $(PROTODEPS) - protoc --proto_path=../proto --python_out=anki --mypy_out=anki $(PROTODEPS) - perl -i'' -pe 's/from fluent_pb2/from anki.fluent_pb2/' anki/backend_pb2.pyi - perl -i'' -pe 's/import fluent_pb2/import anki.fluent_pb2/' anki/backend_pb2.py - python tools/genbackend.py - python -m black -t py36 anki/rsbackend_gen.py - @touch $@ - -.build/hooks: tools/genhooks.py tools/hookslib.py - python tools/genhooks.py - python -m black -t py36 anki/hooks.py - @touch $@ - -BUILD_STEPS := .build/vernum .build/run-deps .build/dev-deps anki/buildinfo.py .build/py-proto .build/hooks - -# Checking -###################### - -.PHONY: check -check: $(BUILD_STEPS) .build/mypy .build/test .build/fmt .build/imports .build/lint - -.PHONY: fix -fix: $(BUILD_STEPS) - isort $(ISORTARGS) - python -m black $(BLACKARGS) - -.PHONY: clean -clean: - rm -rf .build anki.egg-info build dist - -# Checking python -###################### - -CHECKDEPS := $(shell "${FIND}" anki tests -name '*.py' | grep -v buildinfo.py) - -.build/mypy: $(CHECKDEPS) - python -m mypy ${MYPY_ARGS} anki - @touch $@ - -.build/test: $(CHECKDEPS) - SHIFT_CLOCK_HACK=1 python -m pytest --durations=1 -s - @touch $@ - -.build/lint: $(CHECKDEPS) - python -m pylint -j 0 --rcfile=.pylintrc -f colorized \ - --extension-pkg-whitelist=ankirspy anki tests setup.py - @touch $@ - -.build/imports: $(CHECKDEPS) - isort $(ISORTARGS) --check - @touch $@ - -.build/fmt: $(CHECKDEPS) - python -m black --check $(BLACKARGS) - @touch $@ - -# Building -###################### - -.PHONY: build -build: .build/build - -.build/build: $(BUILD_STEPS) $(CHECKDEPS) - rm -rf dist build - python setup.py -q bdist_wheel - rsync -a dist/*.whl ../dist/ - touch $@ - -# prepare code for running in place -.PHONY: develop -develop: $(BUILD_STEPS) - -anki/buildinfo.py: ../meta/version ../meta/buildhash - echo "buildhash='$$(cat ../meta/buildhash)'" > $@ - echo "version='$$(cat ../meta/version)'" >> $@ - -VER := $(shell cat ../meta/version) -.build/vernum: ../meta/version - sed -i.bak 's/.*automatically updated 1.*/ install_requires.append("ankirspy==$(VER)") # automatically updated 1/' setup.py - sed -i.bak 's/.*automatically updated 2.*/ version="$(VER)", # automatically updated 2/' setup.py - rm setup.py.bak - @touch $@ diff --git a/qt/Makefile b/qt/Makefile deleted file mode 100644 index d690ab52e..000000000 --- a/qt/Makefile +++ /dev/null @@ -1,157 +0,0 @@ -SHELL := /bin/bash - -ifndef SHELLFLAGS - SHELLFLAGS := -endif - -.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) -MYPY_ARGS := -PYLINT_ARGS := - -ifndef OS - OS := unknown -endif - -# https://anki.tenderapp.com/discussions/beta-testing/1860-error-unused-type-ignore-comment -ifneq (${OS},Windows_NT) - MYPY_ARGS := --warn-unused-ignores -else - PYLINT_ARGS := --ignored-modules=win32file,pywintypes,socket,win32pipe -endif - -.DELETE_ON_ERROR: -.SUFFIXES: - -BLACKARGS := -t py36 aqt tests setup.py tools/*.py --exclude='aqt/forms|buildinfo|colors' -ISORTARGS := --profile black aqt tests setup.py - -$(shell mkdir -p .build ../dist) - -PHONY: all -all: check - -.build/run-deps: setup.py - python -m pip install -e . - @touch $@ - -.build/dev-deps: requirements.dev - python -m pip install -r requirements.dev - @touch $@ - -.build/ui: $(shell "${FIND}" designer -type f) - ./tools/build_ui.sh - @touch $@ - -.build/i18n: $(wildcard po/repo/desktop/*/anki.po) - (cd po && \ - ./scripts/build-mo-files && \ - ./scripts/copy-qt-files) - @touch $@ - -TSDEPS := $(wildcard ts/src/*.ts) $(wildcard ts/scss/*.scss) $(wildcard ../ts/src/scss/*) - -.build/js: $(TSDEPS) - (cd ts && make build) - python ./tools/extract_scss_colors.py - @touch $@ - -.build/hooks: tools/genhooks_gui.py ../pylib/tools/hookslib.py - python tools/genhooks_gui.py - python -m black aqt/gui_hooks.py - @touch $@ - -BUILD_STEPS := .build/vernum .build/run-deps .build/dev-deps .build/js .build/ui aqt/buildinfo.py .build/hooks .build/i18n - -# Checking -###################### - -.PHONY: check -check: .build/pyaudio $(BUILD_STEPS) .build/mypy .build/test .build/fmt .build/imports .build/lint .build/ts-fmt - -# https://github.com/ankitects/anki/pull/611 - Automatically install pyaudio when running make check -.build/pyaudio: - python -m pip install pyaudio - @touch $@ - -.PHONY: fix -fix: $(BUILD_STEPS) - isort $(ISORTARGS) - python -m black $(BLACKARGS) - (cd ts && make fix) - -.PHONY: clean -clean: - rm -rf .build aqt.egg-info build dist - -# Checking Typescript -###################### - -JSDEPS := $(patsubst ts/src/%.ts, web/%.js, $(TSDEPS)) - -.build/ts-fmt: $(TSDEPS) - (cd ts && make check) - @touch $@ - -# Checking python -###################### - -PYLIB := ../pylib - -CHECKDEPS := $(shell "${FIND}" aqt tests -name '*.py' | grep -v buildinfo.py) - -.build/mypy: $(CHECKDEPS) .build/qt-stubs - python -m mypy ${MYPY_ARGS} aqt - @touch $@ - -.build/test: $(CHECKDEPS) - python -m pytest -s - @touch $@ - -.build/lint: $(CHECKDEPS) - python -m pylint -j 0 --rcfile=.pylintrc -f colorized ${PYLINT_ARGS} \ - --extension-pkg-whitelist=PyQt5,ankirspy aqt tests setup.py - @touch $@ - -.build/imports: $(CHECKDEPS) - isort $(ISORTARGS) --check - @touch $@ - -.build/fmt: $(CHECKDEPS) - python -m black --check $(BLACKARGS) - @touch $@ - -.build/qt-stubs: - ./tools/typecheck-setup.sh - @touch $@ - -# Building -###################### - -.PHONY: build -build: .build/build - -.build/build: $(BUILD_STEPS) $(CHECKDEPS) $(wildcard ../ts/dist/*) - rm -rf dist build - rsync -a ../ts/dist/ aqt_data/web/ - python setup.py -q bdist_wheel - rsync -a dist/*.whl ../dist/ - touch $@ - -.PHONY: develop -develop: $(BUILD_STEPS) $(wildcard ../ts/dist/*) - rsync -a ../ts/dist/ aqt_data/web/ - -aqt/buildinfo.py: ../meta/version ../meta/buildhash - echo "buildhash='$$(cat ../meta/buildhash)'" > $@ - echo "version='$$(cat ../meta/version)'" >> $@ - -VER := $(shell cat ../meta/version) -.build/vernum: ../meta/version - sed -i.bak 's/.*automatically updated 1.*/ "anki==$(VER)", # automatically updated 1/' setup.py - sed -i.bak 's/.*automatically updated 2.*/ version="$(VER)", # automatically updated 2/' setup.py - rm setup.py.bak - @touch $@ diff --git a/rslib/Makefile b/rslib/Makefile deleted file mode 100644 index 7a18b53e9..000000000 --- a/rslib/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -SHELL := /bin/bash - -ifndef SHELLFLAGS - SHELLFLAGS := -endif - -.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) -.DELETE_ON_ERROR: - -$(shell mkdir -p .build) - -.PHONY: all check fix clean develop - -all: check - -check: .build/vernum .build/check - -fix: - cargo fmt - -clean: - rm -rf .build target - -develop: .build/vernum ftl/repo - -ftl/repo: - (cd ftl && ./scripts/fetch-latest-translations) - -ALL_SOURCE := $(shell "${FIND}" src -type f | egrep -v "i18n/autogen|i18n/ftl|_proto.rs") $(wildcard ftl/*.ftl) - -# nightly currently required for ignoring files in rustfmt.toml -RUST_TOOLCHAIN := $(shell cat rust-toolchain) - -.build/rs-tools: rust-toolchain - rustup toolchain install $(RUST_TOOLCHAIN) - rustup component add rustfmt-preview --toolchain $(RUST_TOOLCHAIN) - rustup component add clippy-preview --toolchain $(RUST_TOOLCHAIN) - @touch $@ - -.build/check: ftl/repo .build/rs-tools $(ALL_SOURCE) - cargo test --lib -- --nocapture - cargo fmt -- --check - cargo clippy -- -D warnings - @touch $@ - -VER := $(shell cat ../meta/version) -.build/vernum: ../meta/version - sed -i.bak 's/.*automatically updated.*/version = "$(VER)" # automatically updated/' Cargo.toml - rm Cargo.toml.bak - @touch $@ diff --git a/rspy/Makefile b/rspy/Makefile deleted file mode 100644 index 5eb9ea8fd..000000000 --- a/rspy/Makefile +++ /dev/null @@ -1,112 +0,0 @@ -SHELL := /bin/bash - -ifndef SHELLFLAGS - SHELLFLAGS := -endif - -.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - -FIND := $(if $(wildcard /bin/find),/bin/find,/usr/bin/find) - -ifndef OS - OS := unknown -endif - -ifeq (${OS},Windows_NT) - ifndef PYTHON_FILE - PYTHON_FILE := $(shell which python) - USE_CYGPATH_COMMAND := case "$$(uname -s)" in CYGWIN*|MINGW*|MSYS*) printf "yes";; esac; - USE_CYGPATH := $(shell ${USE_CYGPATH_COMMAND}) - - ifneq (,${USE_CYGPATH}) - PYTHON_FILE := $(shell cygpath -w "${PYTHON_FILE}") - endif - endif -else - ifndef PYTHON_FILE - PYTHON_FILE := $(shell which python3) - endif -endif - -.DELETE_ON_ERROR: -$(shell mkdir -p .build ../dist) - -OUTDIR := ../dist -BUILDFLAGS := --release --strip -DEVFLAGS := -RSPY_TARGET_DIR ?= target - -QT_FTL_TEMPLATES := ../qt/ftl -QT_FTL_LOCALES := ../qt/ftl/repo/desktop - -BUILD_VARIABLES = FTL_TEMPLATE_DIRS="$(QT_FTL_TEMPLATES)" \ - FTL_LOCALE_DIRS="$(QT_FTL_LOCALES)" \ - CARGO_TARGET_DIR="$(RSPY_TARGET_DIR)" \ - MACOSX_DEPLOYMENT_TARGET=10.7 - -.PHONY: all develop build check fix clean - -all: develop - -develop: .build/develop - -DEPS := .build/tools .build/vernum ../meta/buildhash \ - $(wildcard $(QT_FTL_TEMPLATES)/*.ftl) \ - $(wildcard $(QT_FTL_LOCALES)/*/*.ftl) \ - $(shell "${FIND}" ../rslib/src -name '*.rs' -or -name '*.sql') $(wildcard ../proto/*) \ - $(shell "${FIND}" ../rslib/ftl -type f) \ - $(shell "${FIND}" ./src -type f) - -.build/develop: $(DEPS) - touch ../proto/backend.proto - ${BUILD_VARIABLES} \ - maturin develop $(DEVFLAGS) - touch $@ - -build: .build/build - -.build/build: $(DEPS) - touch ../proto/backend.proto - ${BUILD_VARIABLES} \ - maturin build -i "${PYTHON_FILE}" -o "$(OUTDIR)" $(BUILDFLAGS) - touch $@ - -check: .build/check - -clippy: .build/clippy - -fix: - cargo fmt - -clean: - rm -rf .build target - -# nightly currently required for ignoring files in rustfmt.toml -RUST_TOOLCHAIN := $(shell cat rust-toolchain) - -.build/tools: requirements.txt rust-toolchain - python -m pip install -r requirements.txt - rustup toolchain install $(RUST_TOOLCHAIN) - rustup component add rustfmt-preview --toolchain $(RUST_TOOLCHAIN) - rustup component add clippy-preview --toolchain $(RUST_TOOLCHAIN) - @touch $@ - -# we should not call clippy because it break things when running make check Mac OS -# https://github.com/ankitects/anki/pull/597 -.build/check: .build/develop - cargo fmt -- --check - @touch $@ - -# cargo clippy also run build.rs, thus it must be called using the BUILD_VARIABLES -.build/clippy: $(DEPS) - ${BUILD_VARIABLES} \ - cargo clippy -- -D warnings - @touch $@ - -VER := $(shell cat ../meta/version) -.build/vernum: ../meta/version - sed -i.bak 's/.*automatically updated.*/version = "$(VER)" # automatically updated/' Cargo.toml - rm Cargo.toml.bak - @touch $@ diff --git a/ts/Makefile b/ts/Makefile deleted file mode 100644 index 291893b72..000000000 --- a/ts/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -SHELL := /bin/bash - -ifndef SHELLFLAGS - SHELLFLAGS := -endif - -.SHELLFLAGS := -eu -o pipefail ${SHELLFLAGS} -c -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - -ifndef OS - OS := unknown -endif - -.DELETE_ON_ERROR: -.SUFFIXES: - -$(shell mkdir -p .build) - -PHONY: all -all: check - -PROTODEPS := ../proto/backend.proto ../proto/fluent.proto -BUILDDEPS := .build/npm webpack.config.js - -.build/proto: $(BUILDDEPS) $(PROTODEPS) - npx pbjs -t json-module -w es6 ../proto/backend.proto -o src/backend/proto.js - npx pbjs -t static-module ../proto/backend.proto | npx pbts -o src/backend/proto.d.ts - - @touch $@ - -PHONY: dev -dev: .build/proto - npm run dev - -PHONY: build -build: .build/build - -PHONY: develop -develop: .build/build - -.build/build: .build/proto $(BUILDDEPS) $(wildcard src/*/*.svelte src/*/*.ts src/*/*.scss) - npm run build - @touch $@ - -.build/npm: package.json - npm i - touch $@ - -.PHONY: check -check: .build/proto - npm run check - -.PHONY: fix -fix: .build/build - npm run fix - -.PHONY: clean -clean: - rm -rf .build node_modules src/backend/*