# Makefile for maintaining glibc fedora-branch and creating Fedora source RPMs.

glibc.spec: # The default target.

tag-prefix := fedora-

.PHONY: update commit-merge tag archive finish_archive srpm rpm

snapshot-date-fmt := +'%Y-%m-%d %H:%M %Z'
snapshot-name-fmt := +'%Y%m%dT%H%M'

include branch.mk


on-branch = $(filter-out HEAD,$(glibc-base))

snapshot-date := $($(glibc-branch)-sync-date)
snapshot-name := $(shell date -u -d '$(snapshot-date)' $(snapshot-name-fmt))

tag-name := glibc$(patsubst glibc-%-branch,-%,\
			    $(filter-out HEAD,$(glibc-base)))
tar-name := $(subst _,.,$(tag-name))
select-snapshot = -r '$($(glibc-branch)-sync-tag)'
snapshot-id = $($(glibc-branch)-sync-tag)

branch-name := $(patsubst %-$(patsubst glibc-%,%,$(tag-name)),%,\
			  $(glibc-branch))

branch.mk-vars = glibc-branch glibc-base DIST_BRANCH COLLECTION \
		 releases-url

ifeq (,$(upstream-tag))
ifneq (,$(upstream))
upstream-tag := glibc-$(subst .,_,$(upstream))
endif
endif

update:
	now=`date -u $(snapshot-date-fmt)`; \
	$(if $(upstream-tag),new='$(upstream-tag)';,\
	name=`date -u -d "$$now" $(snapshot-name-fmt)`; \
	new="$(tag-prefix)$(tag-name)-$$name"; \
	cvs -Q rtag $(if $(on-branch),-r $(glibc-base),-D "$$now") $$new libc;\
	)\
	(echo '# This file is updated automatically by Makefile.'; \
	 $(foreach var,$(branch.mk-vars) $(if $(upstream-tag),upstream),\
		   $(if $($(var)),echo '$(var) := $($(var))';)) \
	 echo "$(glibc-branch)-sync-date := $$now"; \
	 echo "$(glibc-branch)-sync-tag := $$new"; \
	) > branch.mk; \
	cd ..; (set -x; cvs -q update -d -P \
			    -j'$($(glibc-branch)-sync-tag)' -j"$$new") \
		   2>&1 | tee fedora/update.log

.PHONY: snapshot-time
snapshot-time: branch.mk
	date -d '$(snapshot-date)'

commit-merge:
	cd ..; cvs -Q commit -m"Updated to $(snapshot-id)"

glibc.spec: glibc.spec.in ../version.h branch.mk
	(echo '%define glibcdate $(snapshot-name)'; \
	 echo '%define glibcname $(tar-name)'; \
	 echo '%define glibcsrcdir $(srcdir-name)'; \
	 echo '%define glibc_release_tarballs $(if $(upstream),1,0)'; \
	 sed -n '/VERSION/s/^.*"\([^"]*\)"$$/%define glibcversion \1/p' \
	     ../version.h; \
	 cat $<) > $@.new
	mv -f $@.new $@

ifeq (,$(wildcard glibc.spec))
Makefile: glibc.spec ;
else

spec-nvr := $(shell rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE}\n' \
			--specfile glibc.spec | sed 1q)
spec-tag = $(subst .,_,$(spec-nvr))

ifeq ($(tagged),no)
select-release = -r $(glibc-branch)-branch
else
select-release = -r $(tag-prefix)$(spec-tag)
endif

tag: glibc.spec
	cd ..; cvs -Q tag -c $(tag-prefix)$(spec-tag)

force-tag: glibc.spec
	cd ..; cvs -Q tag -F -c $(tag-prefix)$(spec-tag)

ifeq (,$(upstream))
srcdir-name = $(tar-name)-$(snapshot-name)
else
tar-name = glibc-$(upstream)
srcdir-name = $(tar-name)

ifneq ($($(glibc-branch)-sync-tag),$(upstream-tag))
define upstream-tag-check
	@echo Need to run make update upstream=$(upstream); exit 1
endef
endif
endif

# Note this rule assumes that your working directory (..) is up to date.
$(tar-name)-$(branch-name).patch: makepatch.awk glibc.spec \
				  ../ChangeLog ../*/ChangeLog
	$(upstream-tag-check)
# Use -kk to suppress patches for $ Id $ differences between branches.
	(cd ..; cvs -q diff -kk -upN $(select-snapshot) $(select-release)) | \
	awk -v OLDVER=$(srcdir-name) \
	    -v NEWVER=$(srcdir-name)-$(branch-name) \
	    -f $< > patch.tmp
	mv -f patch.tmp $@

# makepatch.awk omits these files from the patch; we put them in a tar file.
outside-patch = fedora c_stubs rtkaio \
		localedata/charmaps/GB18030 iconvdata/gb18030.c

$(tar-name)-$(branch-name)-$(snapshot-name).tar.bz2: Makefile branch.mk \
						     ../ChangeLog \
						     ../*/ChangeLog
	$(upstream-tag-check)
	@rm -rf libc
	cvs -Q export $(select-release) $(addprefix libc/,$(outside-patch))
	tar cf - -C libc $(outside-patch) | bzip2 -9 > $@.new
	rm -rf libc
	mv -f $@.new $@

glibc-tarballs = $(srcdir-name).tar.bz2
ifeq (,$(upstream))
$(srcdir-name).tar.bz2: Makefile branch.mk
	@rm -rf $(srcdir-name)
	cvs -Q export -d $(srcdir-name) $(select-snapshot) libc
	tar cf - $(srcdir-name) | bzip2 -9 > $@.new
	rm -rf $(srcdir-name)
	mv -f $@.new $@
else
glibc-tarballs += $(srcdir-name:glibc-%=glibc-linuxthreads-%).tar.bz2 \
		  $(srcdir-name:glibc-%=glibc-libidn-%).tar.bz2

$(glibc-tarballs):
	curl -O $(releases-url)/$@
endif

archives = $(glibc-tarballs) \
	   $(tar-name)-$(branch-name)-$(snapshot-name).tar.bz2 \
	   $(tar-name)-$(branch-name).patch

finish_archive: $(archives)

archive: glibc.spec
	$(MAKE) tag finish_archive

rpm srpm: $(spec-nvr).src.rpm
$(spec-nvr).src.rpm: glibc.spec $(archives)
	rpmbuild --define "_sourcedir `pwd`" \
		 --define "_specdir `pwd`" \
		 --define "_srcrpmdir `pwd`" \
		 --nodeps -bs $<

###
# These rules are for dealing with the Fedora package repository
# and build system.
#
# To use this, put in ~/.cvspkgsrc at least a line:
#	COMMON_DIR ?= /some/checkout/of/pkgs/common
# We will find cvs-import.sh there and use its CVS/Root for where to commit.

.PHONY: dist-import

-include ~/.cvspkgsrc

ifdef COMMON_DIR
DIST_BRANCH ?= devel
COLLECTION ?= dist-f8

pkgs-baseurl := cvs://cvs.fedoraproject.org/cvs/pkgs?rpms
pkgs-url = $(pkgs-baseurl)/glibc/$(DIST_BRANCH)\#$(spec-tag)

pkgs-import: $(spec-nvr).src.rpm
	$(COMMON_DIR)/cvs-import.sh -b $(DIST_BRANCH) $<
	rpm -qp $< --queryformat '[%{FILEMD5S}  %{FILENAMES}\n]' > $@.new
	mv -f $@.new $@

build: pkgs-import
	koji build $(BUILD_FLAGS) $(COLLECTION) '$(pkgs-url)'

endif
###

endif