nmstate/Makefile
Gris Ge 2ef5729781 packaging: Generate vendor tarbal for Rust 1.66 also
The `RELEASE=1 make release` will generate rust vendor tarball for Rust
1.66 also now using:

 * mio 0.8.9 (because mio 1.0.2 need new version of rust)
 * tokio 1.38.1 (last version of tokio using mio 0.8)
 * tokio-macros 2.3.0 (required by tokio 1.38.1)

The `packaging/download_rust_crate.py` is used by `make` command to
download specific crate and generate hash like `cargo vendor` did.

Signed-off-by: Gris Ge <fge@redhat.com>
2024-09-29 15:41:21 +08:00

320 lines
11 KiB
Makefile

ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
VERSION=$(shell cat $(ROOT_DIR)/VERSION)
VERSION_MAJOR=$(shell echo $(VERSION) | cut -f1 -d.)
VERSION_MINOR=$(shell echo $(VERSION) | cut -f2 -d.)
VERSION_MICRO=$(shell echo $(VERSION) | cut -f3 -d.)
GIT_COMMIT=$(shell git rev-parse --short HEAD)
TIMESTAMP=$(shell date +%Y%m%d)
COMMIT_COUNT=$(shell git rev-list --count HEAD --)
ifeq ($(RELEASE), 1)
TARBALL=nmstate-$(VERSION).tar.gz
VENDOR_TARBALL=nmstate-vendor-$(VERSION).tar.xz
VENDOR_TARBALL_RUST_1_66=nmstate-vendor-$(VERSION)-rust-1-66.tar.xz
else
TARBALL=nmstate-$(VERSION)-alpha-0.$(TIMESTAMP).$(COMMIT_COUNT)git$(GIT_COMMIT).tar.gz
VENDOR_TARBALL=nmstate-vendor-$(VERSION)-alpha-0.$(TIMESTAMP).$(COMMIT_COUNT)git$(GIT_COMMIT).tar.xz
endif
CLIB_SO_DEV=libnmstate.so
CLIB_A_DEV=libnmstate.a
CLIB_SO_MAN=$(CLIB_SO_DEV).$(VERSION_MAJOR)
CLIB_SO_FULL=$(CLIB_SO_DEV).$(VERSION)
RUST_DEBUG_BIN_DIR=./target/debug
RUST_RELEASE_BIN_DIR=./target/release
CLI_EXEC=nmstatectl
CLI_EXEC2=nmstate-autoconf
SYSTEMD_SERVICE_FILE=$(ROOT_DIR)/packaging/nmstate.service
CLIB_HEADER=rust/src/clib/nmstate.h
CLIB_SO_DEV_RELEASE=rust/target/release/$(CLIB_SO_DEV)
CLIB_SO_DEV_DEBUG=rust/target/debug/$(CLIB_SO_DEV)
CLIB_A_DEV_RELEASE=rust/target/release/$(CLIB_A_DEV)
CLIB_PKG_CONFIG=rust/src/clib/nmstate.pc
PYTHON_MODULE_NAME=libnmstate
PYTHON_MODULE_SRC=src/python/libnmstate
CLI_EXEC_RELEASE=rust/target/release/$(CLI_EXEC)
PREFIX ?= /usr/local
SYSCONFDIR ?= $(PREFIX)/etc
SYSTEMD_UNIT_DIR ?= $(PREFIX)/lib/systemd/system
GO_MODULE_SRC ?= rust/src/go/nmstate
CLI_MANPAGE=doc/nmstatectl.8
CLI_MANPAGE2=doc/nmstate-autoconf.8
SYSTEMD_UNIT_MANPAGE=doc/nmstate.service.8
ETC_README=doc/nmstate.service.README
SPEC_FILE=packaging/nmstate.spec
RPM_DATA=$(shell date +"%a %b %d %Y")
RUST_SOURCES := $(shell find rust/ -name "*.rs" -print)
#outdir is used by COPR as well: https://docs.pagure.org/copr.copr/user_documentation.html
outdir ?= $(ROOT_DIR)
CPU_BITS = $(shell getconf LONG_BIT)
ifeq ($(CPU_BITS), 32)
ifneq (,$(wildcard /etc/debian_version))
LIBDIR ?= $(PREFIX)/lib/i386-linux-gnu
else
LIBDIR ?= $(PREFIX)/lib
endif
else
ifneq (,$(wildcard /etc/debian_version))
LIBDIR ?= $(PREFIX)/lib/x86_64-linux-gnu
else
LIBDIR ?= $(PREFIX)/lib$(CPU_BITS)
endif
endif
INCLUDE_DIR ?= $(PREFIX)/include
PKG_CONFIG_LIBDIR ?= $(LIBDIR)/pkgconfig
MAN_DIR ?= $(PREFIX)/share/man
SKIP_PYTHON_INSTALL ?=0
RELEASE ?=0
PYTHON3_SITE_DIR ?=$(shell \
python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))")
$(CLI_EXEC_RELEASE) $(CLIB_SO_DEV_RELEASE): $(RUST_SOURCES)
cd rust; cargo build --all --release
$(CLIB_SO_DEV_DEBUG):
cd rust; cargo build --all
.PHONY: $(CLI_MANPAGE)
$(CLI_MANPAGE): $(CLI_MANPAGE).in
cp $(CLI_MANPAGE).in $(CLI_MANPAGE)
sed -i -e "s/@DATE@/$(shell date +'%B %d, %Y')/" $(CLI_MANPAGE)
sed -i -e "s/@VERSION@/$(VERSION)/" $(CLI_MANPAGE)
.PHONY: $(CLI_MANPAGE2)
$(CLI_MANPAGE2): $(CLI_MANPAGE2).in
cp $(CLI_MANPAGE2).in $(CLI_MANPAGE2)
sed -i -e "s/@DATE@/$(shell date +'%B %d, %Y')/" $(CLI_MANPAGE2)
sed -i -e "s/@VERSION@/$(VERSION)/" $(CLI_MANPAGE2)
.PHONY: $(SYSTEMD_UNIT_MANPAGE)
$(SYSTEMD_UNIT_MANPAGE): $(SYSTEMD_UNIT_MANPAGE).in
cp $(SYSTEMD_UNIT_MANPAGE).in $(SYSTEMD_UNIT_MANPAGE)
sed -i -e "s/@DATE@/$(shell date +'%B %d, %Y')/" $(SYSTEMD_UNIT_MANPAGE)
sed -i -e "s/@VERSION@/$(VERSION)/" $(SYSTEMD_UNIT_MANPAGE)
manpage: $(CLI_MANPAGE) $(CLI_MANPAGE2) $(SYSTEMD_UNIT_MANPAGE)
clib: $(CLIB_HEADER) $(CLIB_SO_DEV_RELEASE) $(CLIB_PKG_CONFIG)
.PHONY: $(SPEC_FILE)
$(SPEC_FILE):
env IS_RELEASE=$(RELEASE) packaging/make_spec.sh
.PHONY: $(CLIB_HEADER)
$(CLIB_HEADER): $(CLIB_HEADER).in
cp $(CLIB_HEADER).in $(CLIB_HEADER)
sed -i -e 's/@_VERSION_MAJOR@/$(VERSION_MAJOR)/' \
$(CLIB_HEADER)
sed -i -e 's/@_VERSION_MINOR@/$(VERSION_MINOR)/' \
$(CLIB_HEADER)
sed -i -e 's/@_VERSION_MICRO@/$(VERSION_MICRO)/' \
$(CLIB_HEADER)
.PHONY: $(CLIB_PKG_CONFIG)
$(CLIB_PKG_CONFIG): $(CLIB_PKG_CONFIG).in
cp $(CLIB_PKG_CONFIG).in $(CLIB_PKG_CONFIG)
sed -i -e 's|@VERSION@|$(VERSION)|' $(CLIB_PKG_CONFIG)
sed -i -e 's|@PREFIX@|$(PREFIX)|' $(CLIB_PKG_CONFIG)
sed -i -e 's|@LIBDIR@|$(LIBDIR)|' $(CLIB_PKG_CONFIG)
sed -i -e 's|@INCLUDE_DIR@|$(INCLUDE_DIR)|' $(CLIB_PKG_CONFIG)
.PHONY: dist
dist: manpage $(SPEC_FILE) $(CLIB_HEADER)
$(eval TMPDIR := $(shell mktemp -d))
git archive --prefix=nmstate-$(VERSION)/ --format=tar HEAD | \
tar x -C $(TMPDIR)
cp $(CLI_MANPAGE) $(TMPDIR)/nmstate-$(VERSION)/doc/
cp $(CLI_MANPAGE2) $(TMPDIR)/nmstate-$(VERSION)/doc/
cp $(SYSTEMD_UNIT_MANPAGE) $(TMPDIR)/nmstate-$(VERSION)/doc/
cp $(ETC_README) $(TMPDIR)/nmstate-$(VERSION)/doc/
cp $(SPEC_FILE) $(TMPDIR)/nmstate-$(VERSION)/packaging/
cp $(CLIB_HEADER) $(TMPDIR)/nmstate-$(VERSION)/rust/src/clib/
cp $(SYSTEMD_SERVICE_FILE) $(TMPDIR)/nmstate-$(VERSION)/
cd $(TMPDIR) && tar cfz $(TARBALL) nmstate-$(VERSION)/
mv $(TMPDIR)/$(TARBALL) ./
if [ $(RELEASE) == 1 ];then \
cd rust; \
cargo vendor-filterer $(TMPDIR)/vendor || \
(echo -en "\nNot cargo-vendor-filterer, Please install via "; \
echo -e "'cargo install cargo-vendor-filterer'\n";); \
cd $(TMPDIR); \
tar cfJ $(ROOT_DIR)/$(VENDOR_TARBALL) vendor ; \
rm -rf $(TMPDIR)/vendor/mio*; \
rm -rf $(TMPDIR)/vendor/tokio*; \
cd $(TMPDIR)/vendor; \
$(ROOT_DIR)/packaging/download_rust_crate.py mio 0.8.9; \
$(ROOT_DIR)/packaging/download_rust_crate.py tokio 1.38.1; \
$(ROOT_DIR)/packaging/download_rust_crate.py tokio-macros 2.3.0; \
cd $(TMPDIR); \
tar cfJ $(ROOT_DIR)/$(VENDOR_TARBALL_RUST_1_66) vendor ; \
else \
cd rust; \
cargo vendor $(TMPDIR)/vendor; \
cd $(TMPDIR); \
tar cfJ $(ROOT_DIR)/$(VENDOR_TARBALL) vendor ; \
fi
rm -rf $(TMPDIR)
echo $(TARBALL)
release: dist
if [ $(RELEASE) == 1 ];then \
gpg2 --armor --detach-sign $(TARBALL); \
fi
upstream_release:
$(ROOT_DIR)/automation/upstream_release.sh
.PHONY: srpm
srpm: dist
rpmbuild --define "_srcrpmdir $(outdir)/" -ts $(TARBALL)
rm -f $(TARBALL)
rm -f $(VENDOR_TARBALL)
.PHONY: rpm
rpm: dist
$(eval TMPDIR := $(shell mktemp -d))
rpmbuild --define "_rpmdir $(TMPDIR)/" -tb $(TARBALL)
find $(TMPDIR) -type f -exec mv -v {} $(ROOT_DIR) \;
rm -rf $(TMPDIR)
rm -f $(TARBALL)
rm -f $(VENDOR_TARBALL)
.PHONY: clib_check
clib_check: $(CLIB_SO_DEV_DEBUG) $(CLIB_HEADER)
$(eval TMPDIR := $(shell mktemp -d))
cp $(CLIB_SO_DEV_DEBUG) $(TMPDIR)/$(CLIB_SO_FULL)
ln -sfv $(CLIB_SO_FULL) $(TMPDIR)/$(CLIB_SO_MAN)
ln -sfv $(CLIB_SO_FULL) $(TMPDIR)/$(CLIB_SO_DEV)
rust/src/clib/test/check_clib_soname.sh $(TMPDIR)/$(CLIB_SO_DEV)
cp $(CLIB_HEADER) $(TMPDIR)/$(shell basename $(CLIB_HEADER))
cc -g -Wall -Wextra -L$(TMPDIR) -I$(TMPDIR) \
-o $(TMPDIR)/nmstate_json_test \
rust/src/clib/test/nmstate_json_test.c -lnmstate
cc -g -Wall -Wextra -L$(TMPDIR) -I$(TMPDIR) \
-o $(TMPDIR)/nmpolicy_json_test \
rust/src/clib/test/nmpolicy_json_test.c -lnmstate
cc -g -Wall -Wextra -L$(TMPDIR) -I$(TMPDIR) \
-o $(TMPDIR)/nmstate_yaml_test \
rust/src/clib/test/nmstate_yaml_test.c -lnmstate
cc -g -Wall -Wextra -L$(TMPDIR) -I$(TMPDIR) \
-o $(TMPDIR)/nmpolicy_yaml_test \
rust/src/clib/test/nmpolicy_yaml_test.c -lnmstate
cc -g -Wall -Wextra -L$(TMPDIR) -I$(TMPDIR) \
-o $(TMPDIR)/nmstate_gen_diff_test \
rust/src/clib/test/nmstate_gen_diff_test.c -lnmstate
cc -g -Wall -Wextra -L$(TMPDIR) -I$(TMPDIR) \
-o $(TMPDIR)/nmstate_fmt_test \
rust/src/clib/test/nmstate_fmt_test.c -lnmstate
LD_LIBRARY_PATH=$(TMPDIR) \
valgrind --trace-children=yes --leak-check=full \
--error-exitcode=1 \
$(TMPDIR)/nmstate_json_test 1>/dev/null
LD_LIBRARY_PATH=$(TMPDIR) \
valgrind --trace-children=yes --leak-check=full \
--error-exitcode=1 \
$(TMPDIR)/nmpolicy_json_test 1>/dev/null
LD_LIBRARY_PATH=$(TMPDIR) \
valgrind --trace-children=yes --leak-check=full \
--error-exitcode=1 \
$(TMPDIR)/nmstate_yaml_test 1>/dev/null
LD_LIBRARY_PATH=$(TMPDIR) \
valgrind --trace-children=yes --leak-check=full \
--error-exitcode=1 \
$(TMPDIR)/nmpolicy_yaml_test 1>/dev/null
LD_LIBRARY_PATH=$(TMPDIR) \
valgrind --trace-children=yes --leak-check=full \
--error-exitcode=1 \
$(TMPDIR)/nmstate_gen_diff_test 1>/dev/null
LD_LIBRARY_PATH=$(TMPDIR) \
valgrind --trace-children=yes --leak-check=full \
--error-exitcode=1 \
$(TMPDIR)/nmstate_fmt_test 1>/dev/null
rm -rf $(TMPDIR)
.PHONY: go_check
go_check: $(CLIB_SO_DEV_DEBUG) $(CLIB_HEADER)
$(eval TMPDIR := $(shell mktemp -d))
cp $(CLIB_SO_DEV_DEBUG) $(TMPDIR)/$(CLIB_SO_FULL)
ln -sfv $(CLIB_SO_FULL) $(TMPDIR)/$(CLIB_SO_MAN)
ln -sfv $(CLIB_SO_FULL) $(TMPDIR)/$(CLIB_SO_DEV)
cp $(CLIB_HEADER) $(TMPDIR)/$(shell basename $(CLIB_HEADER))
cd rust/src/go/nmstate; LD_LIBRARY_PATH=$(TMPDIR) \
CGO_CFLAGS="-I$(TMPDIR)" \
CGO_LDFLAGS="-L$(TMPDIR)" \
go test $(WHAT)
rm -rf $(TMPDIR)
rust_check:
cd rust; cargo test -- --test-threads=1 --show-output;
if [ "CHK$(CI)" != "CHKtrue" ]; then \
cd rust; cargo test -- --test-threads=1 \
--show-output --ignored; \
fi
check: rust_check clib_check go_check
clean:
rm -f $(CLI_MANPAGE)
rm -f $(CLI_MANPAGE2)
rm -f $(SYSTEMD_UNIT_MANPAGE)
rm -f $(SPEC_FILE)
rm -f $(TARBALL)
cd rust && cargo clean || true
cd rust/src/go/nmstate && go clean || true
rm -f nmstate-*.tar.gz
rm -f nmstate-*.tar.xz
rm -f nmstate-*.tar.gz.asc
rm -f *nmstate-*.rpm
install: $(CLI_EXEC_RELEASE) manpage clib
install -p -v -D -m755 $(CLI_EXEC_RELEASE) \
$(DESTDIR)$(PREFIX)/bin/$(CLI_EXEC)
ln -sfv $(CLI_EXEC) $(DESTDIR)$(PREFIX)/bin/$(CLI_EXEC2)
install -p -D -m755 $(CLIB_SO_DEV_RELEASE) \
$(DESTDIR)$(LIBDIR)/$(CLIB_SO_FULL)
install -p -D -m755 $(CLIB_A_DEV_RELEASE) \
$(DESTDIR)$(LIBDIR)/$(CLIB_A_DEV)
ln -sfv $(CLIB_SO_FULL) $(DESTDIR)$(LIBDIR)/$(CLIB_SO_MAN)
ln -sfv $(CLIB_SO_FULL) $(DESTDIR)$(LIBDIR)/$(CLIB_SO_DEV)
if [ $(SKIP_PYTHON_INSTALL) != 1 ];then \
cd rust/src/python; python3 setup.py install; \
fi
install -p -v -D -m644 $(CLIB_HEADER) \
$(DESTDIR)$(INCLUDE_DIR)/$(shell basename $(CLIB_HEADER))
install -p -v -D -m644 $(CLIB_PKG_CONFIG) \
$(DESTDIR)$(PKG_CONFIG_LIBDIR)/$(shell basename $(CLIB_PKG_CONFIG))
install -p -v -D -m644 $(CLI_MANPAGE) \
$(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(CLI_MANPAGE))
gzip $(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(CLI_MANPAGE))
install -p -v -D -m644 $(CLI_MANPAGE2) \
$(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(CLI_MANPAGE2))
gzip $(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(CLI_MANPAGE2))
install -p -v -D -m644 $(SYSTEMD_UNIT_MANPAGE) \
$(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(SYSTEMD_UNIT_MANPAGE))
gzip $(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(SYSTEMD_UNIT_MANPAGE))
install -p -v -D -m644 $(SYSTEMD_SERVICE_FILE) \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/$(shell basename $(SYSTEMD_SERVICE_FILE))
install -p -v -D -m644 $(ETC_README) \
$(DESTDIR)$(SYSCONFDIR)/nmstate/README
uninstall:
- rm -fv $(DESTDIR)$(PREFIX)/bin/$(CLI_EXEC)
- rm -fv $(DESTDIR)$(PREFIX)/bin/$(CLI_EXEC2)
- rm -fv $(DESTDIR)$(LIBDIR)/$(CLIB_SO_DEV)
- rm -fv $(DESTDIR)$(LIBDIR)/$(CLIB_SO_MAN)
- rm -fv $(DESTDIR)$(LIBDIR)/$(CLIB_SO_FULL)
- rm -fv $(DESTDIR)$(LIBDIR)/$(CLIB_A_DEV)
- rm -fv $(DESTDIR)$(INCLUDE_DIR)/$(shell basename $(CLIB_HEADER))
- rm -fv $(DESTDIR)$(INCLUDE_DIR)/$(shell basename $(CLIB_PKG_CONFIG))
- rm -fv $(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(CLI_MANPAGE))
- rm -fv $(DESTDIR)$(MAN_DIR)/man8/$(shell basename $(CLI_MANPAGE2))
- if [ $(SKIP_PYTHON_INSTALL) != 1 ];then \
rm -rfv $(DESTDIR)$(PYTHON3_SITE_DIR)/$(PYTHON_MODULE_NAME); \
fi
- rm -fv $(DESTDIR)$(SYSTEMD_UNIT_DIR)/$(shell basename $(SYSTEMD_SERVICE_FILE))
- rm -rf $(DESTDIR)$(SYSCONFDIR)/nmstate