CARGO ?= cargo
CARGO_NIGHTLY ?= cargo +nightly
ifneq (, $(shell which cargo-hack))
define cargo_hack
$(1) hack --feature-powerset $(2)
endef
else
define cargo_hack
$(1) $(2) --all-features
endef
endif
CARGO_CHECK := $(call cargo_hack,$(CARGO),check)
CARGO_CLIPPY := $(call cargo_hack,$(CARGO),clippy)
CARGO_LLVM_COV := $(call cargo_hack,$(CARGO_NIGHTLY),llvm-cov)
EXTRA_RUSTC_FLAGS ?=
RUSTC_FLAGS := -C panic=abort $(EXTRA_RUSTC_FLAGS)
EXTRA_CARGO_FLAGS ?=
CARGO_FLAGS := --features=capi $(EXTRA_CARGO_FLAGS)
SRC_FILES = $(wildcard Cargo.*) $(shell find . -name '*.rs')
.DEFAULT: debug
.PHONY: debug
debug: target/debug/libpathrs.so target/debug/libpathrs.a
target/debug/libpathrs.so: LIBPATHRS_CAPI_BUILDMODE := cdylib
target/debug/libpathrs.so: $(SRC_FILES)
LIBPATHRS_CAPI_BUILDMODE=$(LIBPATHRS_CAPI_BUILDMODE) \
hack/with-crate-type.sh --crate-type=$(LIBPATHRS_CAPI_BUILDMODE) \
env RUSTFLAGS="$(RUSTC_FLAGS)" $(CARGO) build $(CARGO_FLAGS)
target/debug/libpathrs.a: LIBPATHRS_CAPI_BUILDMODE := staticlib
target/debug/libpathrs.a: $(SRC_FILES)
LIBPATHRS_CAPI_BUILDMODE=$(LIBPATHRS_CAPI_BUILDMODE) \
hack/with-crate-type.sh --crate-type=$(LIBPATHRS_CAPI_BUILDMODE) \
env RUSTFLAGS="$(RUSTC_FLAGS)" $(CARGO) build $(CARGO_FLAGS)
.PHONY: release
release: CARGO_FLAGS += --release
release: target/release/libpathrs.so target/release/libpathrs.a
target/release/libpathrs.so: LIBPATHRS_CAPI_BUILDMODE := cdylib
target/release/libpathrs.so: $(SRC_FILES)
LIBPATHRS_CAPI_BUILDMODE=$(LIBPATHRS_CAPI_BUILDMODE) \
hack/with-crate-type.sh --crate-type=$(LIBPATHRS_CAPI_BUILDMODE) \
env RUSTFLAGS="$(RUSTC_FLAGS)" $(CARGO) build $(CARGO_FLAGS)
target/release/libpathrs.a: LIBPATHRS_CAPI_BUILDMODE := staticlib
target/release/libpathrs.a: $(SRC_FILES)
LIBPATHRS_CAPI_BUILDMODE=$(LIBPATHRS_CAPI_BUILDMODE) \
hack/with-crate-type.sh --crate-type=$(LIBPATHRS_CAPI_BUILDMODE) \
env RUSTFLAGS="$(RUSTC_FLAGS)" $(CARGO) build $(CARGO_FLAGS)
.PHONY: smoke-test
smoke-test:
make -C examples smoke-test
.PHONY: clean
clean:
-rm -rf target/
.PHONY: lint
lint: validate-cbindgen lint-rust
.PHONY: lint-rust
lint-rust:
$(CARGO_NIGHTLY) fmt --all -- --check
$(CARGO_CLIPPY) --all-targets
$(CARGO_CHECK) $(CARGO_FLAGS) --all-targets
.PHONY: validate-cbindgen
validate-cbindgen:
$(eval TMPDIR := $(shell mktemp --tmpdir -d libpathrs-cbindgen-check.XXXXXXXX))
@ \
trap "rm -rf $(TMPDIR)" EXIT ; \
cbindgen -c cbindgen.toml -o $(TMPDIR)/pathrs.h ; \
if ! ( diff -u include/pathrs.h $(TMPDIR)/pathrs.h ); then \
echo -e \
"\n" \
"ERROR: include/pathrs.h is out of date.\n\n" \
"Changes to the C API in src/capi/ usually need to be paired with\n" \
"an update to include/pathrs.h using cbindgen. To fix this error,\n" \
"just run:\n\n" \
"\tcbindgen -c cbindgen.toml -o include/pathrs.h\n" ; \
exit 1 ; \
fi
.PHONY: validate-elf-symbols
validate-elf-symbols: release
./hack/check-elf-symbols.sh ./target/release/libpathrs.so
.PHONY: validate-keyring
validate-keyring:
./hack/keyring-validate.sh
.PHONY: test-rust-doctest
test-rust-doctest:
$(CARGO_LLVM_COV) --no-report --branch --doc
.PHONY: test-rust-unpriv
test-rust-unpriv:
./hack/rust-tests.sh --cargo="$(CARGO_NIGHTLY)"
./hack/rust-tests.sh --cargo="$(CARGO_NIGHTLY)" --enosys=openat2
./hack/rust-tests.sh --cargo="$(CARGO_NIGHTLY)" --enosys=statx "test(#tests::*procfs*)"
.PHONY: test-rust-root
test-rust-root:
./hack/rust-tests.sh --cargo="$(CARGO_NIGHTLY)" --sudo
./hack/rust-tests.sh --cargo="$(CARGO_NIGHTLY)" --sudo --enosys=openat2
./hack/rust-tests.sh --cargo="$(CARGO_NIGHTLY)" --sudo --enosys=statx "test(#tests::*procfs*)"
.PHONY: test-rust
test-rust:
-rm -rf target/llvm-cov*
make test-rust-{doctest,unpriv,root}
.PHONY: test-e2e
test-e2e:
make -C e2e-tests test-all
make -C e2e-tests RUN_AS=root test-all
.PHONY: test
test: test-rust test-e2e
$(CARGO_NIGHTLY) llvm-cov report
$(CARGO_NIGHTLY) llvm-cov report --open
.PHONY: docs
docs:
$(CARGO) doc --all-features --document-private-items --open
.PHONY: install
install: release
@echo "If you want to configure the install paths, use ./install.sh directly."
@echo "[Sleeping for 3 seconds.]"
@sleep 3s
./install.sh
GPG_KEYID ?= cyphar@cyphar.com
.PHONY: dist-release
dist-release:
./hack/release.sh -S $(GPG_KEYID)