# ============================================================
#  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"
