ARCHIVE_FEATURES = archive-tar \
archive-zip \
compression-flate2 \
compression-zip-deflate \
compression-zip-bzip2 \
signatures \
checksums \
s3-auth
REQWEST_FEATURES = $(ARCHIVE_FEATURES)
UREQ_FEATURES = ureq default-tls $(ARCHIVE_FEATURES)
ASYNC_FEATURES = async $(ARCHIVE_FEATURES)
SELF_UPDATE_EXAMPLES = github gitlab gitea s3 custom
SELF_UPDATE_EXAMPLE_TARGETS = $(addprefix examples/, $(SELF_UPDATE_EXAMPLES))
EXAMPLE_TARGETS = examples $(SELF_UPDATE_EXAMPLE_TARGETS)
TEST_TARGETS = tests tests/default tests/reqwest tests/ureq tests/async
DOC_TARGETS = docs docs/readme
CHECK_TARGETS = check check/fmt check/readme check/clippy check/clippy/reqwest check/clippy/ureq check/clippy/async check/help
CLEAN_TARGETS = clean clean/cargo
HELP_TARGETS = help ci $(EXAMPLE_TARGETS) $(TEST_TARGETS) $(DOC_TARGETS) fmt $(CHECK_TARGETS) $(CLEAN_TARGETS)
CARGO_COMMAND = cargo
README_CC = $(CARGO_COMMAND) readme
README_CCFLAGS = --no-indent-headings
FMT_CC = $(CARGO_COMMAND) fmt
FMT_CCFLAGS =
export RUST_BACKTRACE = 1
ci: check tests examples
help:
@for target in $(HELP_TARGETS); do \
case "$$target" in \
help) desc="List all supported Make targets" ;; \
ci) desc="Run the full CI pipeline (checks, tests, example builds)" ;; \
examples) desc="Build every backend example" ;; \
examples/*) desc="Build the '$${target#examples/}' backend example (full features)" ;; \
tests) desc="Run the full test matrix (default, reqwest, ureq)" ;; \
tests/default) desc="Run tests with default features (reqwest + default-tls)" ;; \
tests/reqwest) desc="Run tests with the full reqwest feature set" ;; \
tests/ureq) desc="Run tests with the full ureq feature set" ;; \
tests/async) desc="Run tests with the async API (reqwest + async)" ;; \
docs) desc="Sync generated documentation artifacts" ;; \
docs/readme) desc="Regenerate README.md from src/lib.rs" ;; \
fmt) desc="Format the source code" ;; \
check) desc="Run all verification checks" ;; \
check/fmt) desc="Verify formatting without changing files" ;; \
check/readme) desc="Verify README.md matches src/lib.rs" ;; \
check/clippy) desc="Run clippy on both http clients" ;; \
check/clippy/reqwest) desc="Run clippy with the full reqwest feature set" ;; \
check/clippy/ureq) desc="Run clippy with the full ureq feature set" ;; \
check/clippy/async) desc="Run clippy with the async API feature set" ;; \
check/help) desc="Verify the help output covers every supported target" ;; \
clean) desc="Remove all generated artifacts" ;; \
clean/cargo) desc="Run cargo clean" ;; \
*) desc="" ;; \
esac; \
if [ -z "$$desc" ]; then \
echo "Missing help text for $$target" >&2; \
exit 1; \
fi; \
printf "%-26s %s\n" "$$target" "$$desc"; \
done
.check-examples-expanded:
@output="$$( $(MAKE) -n --no-print-directory $(SELF_UPDATE_EXAMPLE_TARGETS) )"; \
echo "$$output" | grep -Eq 'build --example' || (>&2 echo 'Example targets did not expand to build commands'; exit 1)
examples: .check-examples-expanded $(SELF_UPDATE_EXAMPLE_TARGETS)
$(SELF_UPDATE_EXAMPLE_TARGETS): examples/%:
@echo [$@]: Building example $*...
$(CARGO_COMMAND) build --example $* --features "$(REQWEST_FEATURES)"
tests: tests/default tests/reqwest tests/ureq tests/async
tests/default:
@echo "[$@]: Running tests (default features)..."
$(CARGO_COMMAND) test
tests/reqwest:
@echo "[$@]: Running tests (reqwest + full features)..."
$(CARGO_COMMAND) test --features "$(REQWEST_FEATURES)"
tests/ureq:
@echo "[$@]: Running tests (ureq + full features)..."
$(CARGO_COMMAND) test --no-default-features --features "$(UREQ_FEATURES)"
tests/async:
@echo "[$@]: Running tests (async + full features)..."
$(CARGO_COMMAND) test --features "$(ASYNC_FEATURES)"
docs: docs/readme
docs/readme: README.md
README.md: src/lib.rs
@echo [$@]: Updating $@...
$(README_CC) $(README_CCFLAGS) > $@
fmt:
@echo [$@]: Formatting code...
$(FMT_CC) $(FMT_CCFLAGS)
check: check/fmt check/readme check/clippy check/help
check/fmt: FMT_CCFLAGS += --check
check/fmt:
@echo [$@]: Checking code format...
$(FMT_CC) $(FMT_CCFLAGS)
check/readme:
@echo [$@]: Checking README.md...
$(README_CC) $(README_CCFLAGS) > _tmp_readme.md
cmp README.md _tmp_readme.md
rm -f _tmp_readme.md
check/clippy: check/clippy/reqwest check/clippy/ureq check/clippy/async
check/clippy/reqwest:
@echo "[$@]: Running clippy (reqwest)..."
$(CARGO_COMMAND) clippy --all-targets --features "$(REQWEST_FEATURES)" -- -D warnings
check/clippy/ureq:
@echo "[$@]: Running clippy (ureq)..."
$(CARGO_COMMAND) clippy --all-targets --no-default-features --features "$(UREQ_FEATURES)" -- -D warnings
check/clippy/async:
@echo "[$@]: Running clippy (async)..."
$(CARGO_COMMAND) clippy --all-targets --features "$(ASYNC_FEATURES)" -- -D warnings
check/help:
@echo [$@]: Checking help coverage...
@expected="$$(printf '%s\n' $(HELP_TARGETS) | sort -u)"; \
documented="$$( $(MAKE) --no-print-directory help | awk '{print $$1}' | sort -u )"; \
if [ "$$expected" != "$$documented" ]; then \
echo "Expected targets:" >&2; \
printf '%s\n' "$$expected" >&2; \
echo "Documented targets:" >&2; \
printf '%s\n' "$$documented" >&2; \
exit 1; \
fi
clean: clean/cargo
clean/cargo:
@echo [$@]: Removing cargo artifacts...
$(CARGO_COMMAND) clean
.PHONY: $(HELP_TARGETS) .check-examples-expanded