# ============================================================ # gbuild — C rewrite build system # ============================================================ CC = gcc CFLAGS = -Wall -Wextra -O2 -Iinclude LDLIBS_GBUILD = -lncurses LDLIBS_GCONFIG = # ---- package metadata -------------------------------------- NAME = gbuild VERSION = 1.0.0 ARCH := $(shell uname -m) DEB_ARCH := $(shell dpkg --print-architecture 2>/dev/null || \ echo $(ARCH) | sed 's/x86_64/amd64/;s/aarch64/arm64/') RPM_DATE := $(shell date "+%a %b %d %Y") PREFIX = /usr/local # ---- release output dirs ----------------------------------- DIST = dist DEB_ROOT = $(DIST)/deb RPM_ROOT = $(DIST)/rpmbuild # ---- sources ----------------------------------------------- COMMON_SRCS = src/config.c GBUILD_SRCS = \ src/gbuild.c \ src/git_ops.c \ src/logger.c \ src/make_ops.c \ src/tui.c \ $(COMMON_SRCS) GCONFIG_SRCS = \ src/gconfig.c \ $(COMMON_SRCS) HEADERS = $(wildcard include/*.h) # ============================================================ # Standard targets # ============================================================ .PHONY: all clean install uninstall \ release release-src release-bin release-deb release-rpm all: bin/gbuild bin/gconfig bin/gbuild: $(GBUILD_SRCS) $(HEADERS) | bin $(CC) $(CFLAGS) -o $@ $(GBUILD_SRCS) $(LDLIBS_GBUILD) bin/gconfig: $(GCONFIG_SRCS) $(HEADERS) | bin $(CC) $(CFLAGS) -o $@ $(GCONFIG_SRCS) $(LDLIBS_GCONFIG) bin: mkdir -p bin clean: rm -rf bin/ dist/ install: all install -Dm755 bin/gbuild $(DESTDIR)$(PREFIX)/bin/gbuild install -Dm755 bin/gconfig $(DESTDIR)$(PREFIX)/bin/gconfig uninstall: rm -f $(DESTDIR)$(PREFIX)/bin/gbuild rm -f $(DESTDIR)$(PREFIX)/bin/gconfig # ============================================================ # release — build all four artefacts into dist/ # ============================================================ # # dist/ # ├── gbuild-1.0.0.tar.gz ← source tarball # ├── gbuild-1.0.0-x86_64-bin.tar.gz ← stripped binaries # ├── gbuild_1.0.0_amd64.deb ← Debian package # └── gbuild-1.0.0-1.x86_64.rpm ← RPM package # release: release-src release-bin release-deb release-rpm @echo "" @echo "Release artefacts:" @ls -1sh $(DIST)/*.tar.gz $(DIST)/*.deb $(DIST)/*.rpm 2>/dev/null \ | awk '{print " " $$0}' # ============================================================ # release-src — source tarball # ============================================================ release-src: @echo ">>> [1/4] Source tarball ..." mkdir -p $(DIST) mkdir -p $(DIST)/$(NAME)-$(VERSION) cp -r src include pkg Makefile README.md $(DIST)/$(NAME)-$(VERSION)/ tar -C $(DIST) -czf $(DIST)/$(NAME)-$(VERSION).tar.gz \ $(NAME)-$(VERSION) rm -rf $(DIST)/$(NAME)-$(VERSION) @echo " OK $(DIST)/$(NAME)-$(VERSION).tar.gz" # ============================================================ # release-bin — stripped binary tarball # ============================================================ release-bin: all @echo ">>> [2/4] Binary tarball ..." mkdir -p $(DIST) mkdir -p $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin/usr/local/bin cp bin/gbuild $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin/usr/local/bin/ cp bin/gconfig $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin/usr/local/bin/ strip $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin/usr/local/bin/gbuild strip $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin/usr/local/bin/gconfig tar -C $(DIST) -czf \ $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin.tar.gz \ $(NAME)-$(VERSION)-$(ARCH)-bin rm -rf $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin @echo " OK $(DIST)/$(NAME)-$(VERSION)-$(ARCH)-bin.tar.gz" # ============================================================ # release-deb — Debian .deb package # ============================================================ release-deb: all @echo ">>> [3/4] .deb package ..." mkdir -p $(DIST) rm -rf $(DEB_ROOT) install -Dm755 bin/gbuild $(DEB_ROOT)/usr/local/bin/gbuild install -Dm755 bin/gconfig $(DEB_ROOT)/usr/local/bin/gconfig strip $(DEB_ROOT)/usr/local/bin/gbuild strip $(DEB_ROOT)/usr/local/bin/gconfig install -dm755 $(DEB_ROOT)/usr/share/doc/$(NAME) cp README.md $(DEB_ROOT)/usr/share/doc/$(NAME)/ install -dm755 $(DEB_ROOT)/DEBIAN sed -e 's/@VERSION@/$(VERSION)/g' \ -e 's/@DEB_ARCH@/$(DEB_ARCH)/g' \ pkg/deb/DEBIAN/control.in > $(DEB_ROOT)/DEBIAN/control sed -e 's/@VERSION@/$(VERSION)/g' \ pkg/deb/DEBIAN/postinst.in > $(DEB_ROOT)/DEBIAN/postinst chmod 755 $(DEB_ROOT)/DEBIAN/postinst dpkg-deb --build --root-owner-group $(DEB_ROOT) \ $(DIST)/$(NAME)_$(VERSION)_$(DEB_ARCH).deb rm -rf $(DEB_ROOT) @echo " OK $(DIST)/$(NAME)_$(VERSION)_$(DEB_ARCH).deb" # ============================================================ # release-rpm — RPM package # ============================================================ release-rpm: release-src @echo ">>> [4/4] .rpm package ..." rm -rf $(RPM_ROOT) mkdir -p $(RPM_ROOT)/BUILD $(RPM_ROOT)/BUILDROOT $(RPM_ROOT)/RPMS $(RPM_ROOT)/SOURCES $(RPM_ROOT)/SPECS $(RPM_ROOT)/SRPMS cp $(DIST)/$(NAME)-$(VERSION).tar.gz \ $(RPM_ROOT)/SOURCES/ sed -e 's/@VERSION@/$(VERSION)/g' \ -e 's/@RPM_DATE@/$(RPM_DATE)/g' \ pkg/rpm/gbuild.spec.in > $(RPM_ROOT)/SPECS/$(NAME).spec rpmbuild -bb --nodeps \ --define "_topdir $(CURDIR)/$(RPM_ROOT)" \ $(RPM_ROOT)/SPECS/$(NAME).spec find $(RPM_ROOT)/RPMS -name "*.rpm" -exec cp {} $(DIST)/ \; rm -rf $(RPM_ROOT) @echo " OK $(DIST)/$(NAME)-$(VERSION)-1.$(ARCH).rpm"