summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2008-07-22 19:56:45 -0400
committerDoug Ledford <dledford@redhat.com>2008-07-22 19:56:45 -0400
commitb123410144699c7e92ff37d840d95fc67ea01426 (patch)
tree059a3f00720beebce37a77b733eae744123ce4cb
parentb722923efa54ff4743b9162fb948aa336ca2e29b (diff)
downloadcommon-b123410144699c7e92ff37d840d95fc67ea01426.tar.gz
common-b123410144699c7e92ff37d840d95fc67ea01426.tar.xz
common-b123410144699c7e92ff37d840d95fc67ea01426.zip
OK, we have our first pseudo working Makefile.repo-git
Targets are greatly changed and should not likely conflict with upstream's Makefile targets. Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--Makefile.common2
-rw-r--r--Makefile.repo-git759
2 files changed, 147 insertions, 614 deletions
diff --git a/Makefile.common b/Makefile.common
index 8be363b..a2ab78d 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -33,5 +33,3 @@ LAYOUT := $(shell $(find-layout))
include $(COMMON_DIR)/Makefile.$(LAYOUT)-$(SCM)
-$(error This package is setup as $(NAME) using Makefile.$(LAYOUT)-$(SCM))
-
diff --git a/Makefile.repo-git b/Makefile.repo-git
index 57019c4..ce9e9ea 100644
--- a/Makefile.repo-git
+++ b/Makefile.repo-git
@@ -37,52 +37,50 @@ WORKDIR := $(shell pwd)
endif
## of course all this can also be overridden in your RPM macros file,
## but this way you can separate your normal RPM setup from your repo
-## setup. Override RPM_WITH_DIRS in ~/.cvspkgsrc to avoid the usage of
+## setup. Override RPM_WITH_DIRS in ~/.fedora-repo-rc to avoid the usage of
## these variables.
-SRCRPMDIR ?= $(WORKDIR)
-BUILDDIR ?= $(WORKDIR)
-RPMDIR ?= $(WORKDIR)
-MOCKDIR ?= $(WORKDIR)
+SRCRPMDIR ?= $(WORKDIR)/distropkg/rpm/SRPMS
+BUILDDIR ?= $(WORKDIR)/distropkg/rpm/BUILD
+RPMDIR ?= $(WORKDIR)/distropkg/rpm/RPMS
+MOCKDIR ?= $(WORKDIR)/distropkg/rpm/MOCK
ifeq ($(DISTVAR),epel)
DISTVAR := rhel
MOCKCFG ?= fedora-$(DISTVAL)-$(BUILDARCH)-epel
else
MOCKCFG ?= fedora-$(DISTVAL)-$(BUILDARCH)
-## 4, 5, 6 need -core
-ifeq ($(DISTVAL),4)
-MOCKCFG = fedora-$(DISTVAL)-$(BUILDARCH)-core
-endif
-ifeq ($(DISTVAL),5)
-MOCKCFG = fedora-$(DISTVAL)-$(BUILDARCH)-core
-endif
-ifeq ($(DISTVAL),6)
-MOCKCFG = fedora-$(DISTVAL)-$(BUILDARCH)-core
-endif
## Devel builds use -devel mock config
ifeq ($(BRANCH),devel)
MOCKCFG = fedora-devel-$(BUILDARCH)
endif
endif
-## SOURCEDIR is special; it has to match the CVS checkout directory,
-## because the CVS checkout directory contains the patch files. So it basically
-## can't be overridden without breaking things. But we leave it a variable
-## for consistency, and in hopes of convincing it to work sometime.
+## SOURCEDIR is special in a dist layout, in an exploded repo layout it should
+## be rarely, if ever, used. However, for the purposes of creating srpms from
+## exploded source repos by outputing commits as patches, this is where we
+## want all that stuff to go.
ifndef SOURCEDIR
-SOURCEDIR := $(shell pwd)
+SOURCEDIR := $(shell pwd)/distropkg/rpm/SOURCES
endif
ifndef SPECDIR
SPECDIR := $(shell pwd)/distropkg
endif
-ifndef RPM_DEFINES
-RPM_DEFINES = --define "_sourcedir $(SOURCEDIR)" \
+ifndef SRPM_RPM_DEFINES
+SRPM_RPM_DEFINES = --define "_sourcedir $(SOURCEDIR)" \
--define "_specdir $(SPECDIR)" \
--define "_builddir $(BUILDDIR)" \
--define "_srcrpmdir $(SRCRPMDIR)" \
--define "_rpmdir $(RPMDIR)" \
$(DIST_DEFINES)
endif
+ifndef REPO_RPM_DEFINES
+REPO_RPM_DEFINES = --define "_sourcedir $(SPECDIR)" \
+ --define "_specdir $(SPECDIR)" \
+ --define "_builddir $(WORKDIR)" \
+ --define "_srcrpmdir $(SRCRPMDIR)" \
+ --define "_rpmdir $(RPMDIR)" \
+ $(DIST_DEFINES)
+endif
# Initialize the variables that we need, but are not defined
# the version of the package
@@ -96,9 +94,7 @@ endif
ifndef RELEASE
RELEASE := $(shell rpm $(RPM_DEFINES) $(DIST_DEFINES) -q --qf "%{RELEASE}\n" --specfile $(SPECFILE)| head -1)
endif
-# this is used in make patch, maybe make clean eventually.
-# would be nicer to autodetermine from the spec file...
-RPM_BUILD_DIR ?= $(BUILDDIR)/$(NAME)-$(VERSION)
+NVR := $(NAME)-$(VERSION)-$(RELEASE)
## for secondary arch only packages we cant build on the primary hub
## we need to go direct to the secondary arch hub
@@ -112,25 +108,15 @@ ifndef SECONDARY_CONFIG
SECONDARY_CONFIG := $(shell $(secondary-arch))
endif
-# default target: just make sure we've got the sources
-all: sources
-
# user specific configuration
-CVS_EXTRAS_RC := $(shell if test -f $(HOME)/.cvspkgsrc ; then echo $(HOME)/.cvspkgsrc ; fi)
-ifdef CVS_EXTRAS_RC
-include $(CVS_EXTRAS_RC)
+FEDORA_REPO_RC := $(shell if test -f $(HOME)/.fedora-repo-rc ; then echo $(HOME)/.fedora-repo-rc ; fi)
+ifdef FEDORA_REPO_RC
+include $(FEDORA_REPO_RC)
endif
# The repository and the clients we use for the files
-REPOSITORY ?= http://cvs.fedoraproject.org/repo/pkgs
-UPLOAD_REPOSITORY ?= https://cvs.fedoraproject.org/repo/pkgs/upload.cgi
-
-# We define CURL and WGET in a way that makes if possible to have them
-# overwritten from the module's Makefiles. Then CLIENT picks CURL, otherwise WGET
-CURL ?= $(shell if test -f /usr/bin/curl ; then echo "curl -H Pragma: -O -R -S --fail --show-error" ; fi)
-WGET ?= $(shell if test -f /usr/bin/wget ; then echo "wget -nd -m" ; fi)
-CLIENT ?= $(if $(CURL),$(CURL),$(if $(WGET),$(WGET)))
-PLAGUE_CLIENT ?= $(shell which plague-client 2>/dev/null)
+REPOSITORY ?= $(shell git config --get remote.fedora.url)
+
BUILD_CLIENT ?= $(shell which koji 2>/dev/null)
BODHI_CLIENT ?= $(shell which bodhi 2>/dev/null)
@@ -140,623 +126,172 @@ BODHI_CLIENT ?= $(shell which bodhi 2>/dev/null)
ifndef RPM
RPM := rpmbuild
endif
-ifndef RPM_WITH_DIRS
-RPM_WITH_DIRS = $(RPM) $(RPM_DEFINES)
+ifndef RPM_WITH_REPO_DIRS
+RPM_WITH_REPO_DIRS = $(RPM) $(REPO_RPM_DEFINES)
+endif
+ifndef RPM_WITH_SRPM_DIRS
+RPM_WITH_SRPM_DIRS = $(RPM) $(SRPM_RPM_DEFINES)
endif
-# CVS-safe version/release -- a package name like 4Suite screws things
-# up, so we have to remove the leaving digits from the name
-TAG_NAME := $(shell echo $(NAME) | sed -e s/\\\./_/g -e s/^[0-9]\\\+//g)
-TAG_VERSION := $(shell echo $(VERSION) | sed s/\\\./_/g)
-TAG_RELEASE := $(shell echo $(RELEASE) | sed s/\\\./_/g)
-
-# tag to export, defaulting to current tag in the spec file
-TAG?=$(TAG_NAME)-$(TAG_VERSION)-$(TAG_RELEASE)
-
-# where to cvs export temporarily
-TMPCVS := $(WORKDIR)/cvs-$(TAG)
+# tag to export, defaulting to current tag in the spec file if it exists, HEAD
+# otherwise
+TAG?=$(shell if [ -z `git tag | grep $(NVR)` ]; then echo HEAD; else echo $(NVR); fi)
-# source file basenames
-SOURCEFILES := $(shell cat sources 2>/dev/null | awk '{ print $$2 }')
-# full path to source files
-FULLSOURCEFILES := $(addprefix $(SOURCEDIR)/,$(SOURCEFILES))
+URL := $(REPOSITORY)\#$(BRANCH)\#$(TAG)
-# retrieve the stored md5 sum for a source download
-define get_sources_md5
-$(shell cat sources 2>/dev/null | while read m f ; do if test "$$f" = "$@" ; then echo $$m ; break ; fi ; done)
-endef
+# allow overriding buildarch so you can do, say, an i386 build on x86_64
+ifndef BUILDARCH
+BUILDARCH := $(shell rpm --eval "%{_arch}")
+endif
-# list the possible targets for valid arches
+# list the possible arches usable during building or prepping
ARCHES = noarch i386 i586 i686 x86_64 ia64 s390 s390x ppc ppc64 pseries ppc64pseries iseries ppc64iseries athlon alpha alphaev6 sparc sparc64 sparcv9 sparcv9v sparc64v i164 mac sh mips geode
-# for the modules that do different "make prep" depending on what arch we build for
-PREP_ARCHES = $(addprefix prep-,$(ARCHES))
-
-## list all our bogus targets
-.PHONY :: $(ARCHES) sources uploadsource upload export check build-check plague koji build cvsurl chain-build test-srpm srpm tag force-tag verrel new clean patch prep compile install install-short compile-short FORCE local scratch-build scratch-build-%
-
-# The TARGETS define is meant for local module targets that should be
-# made in addition to the SOURCEFILES whenever needed
-TARGETS ?=
-
-# default target - retrieve the sources and make the module specific targets
-sources: $(SOURCEFILES) $(TARGETS)
-
-# Retrieve the sources we do not have in CVS
-$(SOURCEFILES): #FORCE
- @mkdir -p $(SOURCEDIR)
- @echo "Downloading $@..."
- @for i in `find ../ -maxdepth 2 -name "$@"`; do \
- if test "$$(md5sum $$i | awk '{print $$1}')" = "$(get_sources_md5)" ; then \
- echo "Copying from $$i" ; \
- ln $$i $@ ; \
- break ; \
- fi ; \
- done
- @if [ -z "$(CLIENT)" ]; then echo "Can't download, need curl or wget installed." ; exit 1; fi
- @if [ ! -e "$@" ] ; then $(CLIENT) $(REPOSITORY)/$(NAME)/$@/$(get_sources_md5)/$@ ; fi
- @if [ ! -e "$@" ] ; then echo "Could not download source file: $@ does not exist" ; exit 1 ; fi
- @if test "$$(md5sum $@ | awk '{print $$1}')" != "$(get_sources_md5)" ; then \
- echo "md5sum of the downloaded $@ does not match the one from 'sources' file" ; \
- echo "Local copy: $$(md5sum $@)" ; \
- echo "In sources: $$(grep $@ sources)" ; \
- exit 1 ; \
- else \
- ls -l $@ ; \
- fi
-
-# Support for uploading stuff into the repository. Since this is
-# pretty specific to the upload.cgi we use, we hardwire the assumption
-# that we're always using upload.cgi
-ifdef FILES
-
-# we hardwire curl in here because the upload rules are very dependent
-# on curl's behavior on missing pages, ISEs, etc.
-UPLOAD_CERT = $(shell if test -f $(HOME)/.fedora.cert ; then echo " --cert $(HOME)/.fedora.cert" ; fi)
-UPLOAD_CHECK = curl -k $(UPLOAD_CERT) --fail --silent
-UPLOAD_CLIENT = curl -k $(UPLOAD_CERT) --fail --show-error --progress-bar
-
-upload-check = $(UPLOAD_CHECK) -F "name=$(NAME)" -F "md5sum=$${m%%[[:space:]]*}" -F "filename=$$f" $(UPLOAD_REPOSITORY)
-upload-file = $(UPLOAD_CLIENT) -F "name=$(NAME)" -F "md5sum=$${m%%[[:space:]]*}" -F "file=@$$f" $(UPLOAD_REPOSITORY)
-
-define upload-request
-echo "Checking : $$b on $(UPLOAD_REPOSITORY)..." ; \
-check=$$($(upload-check)) ; retc=$$? ; \
-if test $$retc -ne 0 ; then \
- echo "ERROR: could not check remote file status" ; \
- exit -1 ; \
-elif test "$$check" = "Available" ; then \
- echo "This file ($$m) is already uploaded" ; \
-elif test "$$check" = "Missing" ; then \
- echo "Uploading: $$b to $(UPLOAD_REPOSITORY)..." ; \
- $(upload-file) || exit 1 ; \
-else \
- echo "$$check" ; \
- exit 1 ; \
-fi
-endef
+## ===================================================
+## Here ends variable setting and starts build targets
+## ===================================================
-OPENSSL=$(shell which openssl 2>/dev/null)
-define check-cert
- @if ! test -f $(HOME)/.fedora.cert ; then echo "ERROR: You need to download your Fedora client certificate" >&2 ; echo " from https://admin.fedoraproject.org/accounts/" >&2; echo " and save it in a file named ~/.fedora.cert" >&2; exit 1 ; fi
- @if [ -x ${OPENSSL} ]; then \
- ${OPENSSL} x509 -checkend 6000 -noout -in ${HOME}/.fedora.cert ; \
- if [ $$? -ne 0 ]; then \
- echo "ERROR: Your Fedora client-side certificate expired." >&2 ; \
- echo " You need to download a new client-side certificate" >&2 ; \
- echo " from https://admin.fedoraproject.org/accounts/" >&2 ; \
- echo " and save it in a file named ~/.fedora.cert" >&2 ; \
- exit 1 ; \
- fi ; \
- fi
-endef
+## list all our bogus targets, both hidden and public
+.PHONY :: bp bp-% bc bc-% bi bi-% bb bb-% commit-check distrohelp fedora-default mockbuild new notag-check repourl repo-push rpmclean scratch-build scratch-build-% tag-check tarball verrel
-# Upload the FILES, adding to the ./sources manifest
-upload: $(FILES)
- $(check-cert)
- @if ! test -f ./sources ; then touch ./sources ; fi
- @if ! test -f ./.cvsignore ; then touch ./.cvsignore ; fi
- @for f in $(FILES); do \
- if ! test -s $$f ; then echo "SKIPPING EMPTY FILE: $$f" ; continue ; fi ; \
- b="$$(basename $$f)" ; \
- m="$$(cd $$(dirname $$f) && md5sum $$b)" ; \
- if test "$$m" = "$$(grep $$b sources)" ; then \
- echo "ERROR: file $$f is already listed in the sources file..." ; \
- exit 1 ; \
- fi ; \
- chmod +r $$f ; \
- echo ; $(upload-request) ; echo ; \
- if test -z "$$(egrep ""[[:space:]]$$b$$"" sources)" ; then \
- echo "$$m" >> sources ; \
- else \
- egrep -v "[[:space:]]$$b$$" sources > sources.new ; \
- echo "$$m" >> sources.new ; \
- mv sources.new sources ; \
- fi ; \
- if test -z "$$(egrep ""^$$b$$"" .cvsignore)" ; then \
- echo $$b >> .cvsignore ; \
- fi \
- done
- @if grep "^/sources/" CVS/Entries >/dev/null; then true ; else cvs -Q add sources; fi
- @echo "Source upload succeeded. Don't forget to commit the new ./sources file"
- @cvs update sources .cvsignore
-
-# Upload FILES and recreate the ./sources file to include only these FILES
-new-source new-sources: $(FILES)
- $(check-cert)
- @rm -f sources && touch sources
- @rm -f .cvsignore && touch .cvsignore
- @for f in $(FILES); do \
- if ! test -s $$f ; then echo "SKIPPING EMPTY FILE: $$f" ; continue ; fi ; \
- b="$$(basename $$f)" ; \
- m="$$(cd $$(dirname $$f) && md5sum $$b)" ; \
- chmod +r $$f ; \
- echo ; $(upload-request) ; echo ; \
- echo "$$m" >> sources ; \
- echo "$$b" >> .cvsignore ; \
- done
- @if grep "^/sources/" CVS/Entries >/dev/null; then true ; else cvs -Q add sources; fi
- @echo "Source upload succeeded. Don't forget to commit the new ./sources file"
- @cvs update sources .cvsignore
-endif
+# The first target in the Makefile is always the default. Generally, we won't
+# have to worry about ever being first because the upstream make targets will
+# come first and we will be included after them. However, should upstream
+# include us before their own make targets, we include this do nothing default
+# so we don't go around doing things by accident.
+fedora-default:
-# allow overriding buildarch so you can do, say, an i386 build on x86_64
-ifndef BUILDARCH
-BUILDARCH := $(shell rpm --eval "%{_arch}")
-endif
+# Now the rest of our make targets
+bp :
+ $(RPM_WITH_REPO_DIRS) -bp $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# test build in mock
-mockbuild : srpm
- mock $(MOCKARGS) -r $(MOCKCFG) --resultdir=$(MOCKDIR)/$(TAG) rebuild $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm
+bp-% :
+ $(RPM_WITH_REPO_DIRS) --target=$* -bp $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# build for a particular arch
-$(ARCHES) : sources $(TARGETS)
- $(RPM_WITH_DIRS) --target $@ -ba $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
+bc :
+ $(RPM_WITH_REPO_DIRS) -bc $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# empty target to force checking of md5sums in FULLSOURCEFILES
-FORCE:
+bc-% :
+ $(RPM_WITH_REPO_DIRS) --target=$* -bc $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# build whatever's appropriate for the local architecture
-local: $(if $(shell grep -i '^BuildArch:.*noarch' $(SPECFILE)), noarch, $(shell uname -m))
+bc-short :
+ $(RPM_WITH_REPO_DIRS) -bc --short-circuit $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# attempt to apply all the patches, optionally only for a particular arch
-ifdef PREPARCH
-prep: sources $(TARGETS)
- $(RPM_WITH_DIRS) --nodeps -bp --target $(PREPARCH) $(SPECFILE)
-else
-prep: sources $(TARGETS)
- $(RPM_WITH_DIRS) --nodeps -bp $(SPECFILE)
-endif
+bc-short-% :
+ $(RPM_WITH_REPO_DIRS) --target=$* -bc --short-circuit $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# this allows for make prep-i686, make prep-ppc64, etc
-prep-% : Makefile
- $(MAKE) prep PREPARCH=$*
-
-compile: sources $(TARGETS)
- $(RPM_WITH_DIRS) -bc $(SPECFILE)
-
-install: sources $(TARGETS)
- $(RPM_WITH_DIRS) -bi $(SPECFILE)
-
-compile-short: sources $(TARGETS)
- $(RPM_WITH_DIRS) --nodeps --short-circuit -bc $(SPECFILE)
-
-install-short: sources $(TARGETS)
- $(RPM_WITH_DIRS) --nodeps --short-circuit -bi $(SPECFILE)
-
-CVS_ROOT := $(shell if [ -f CVS/Root ] ; then cat CVS/Root ; fi)
-CVS_REPOSITORY := $(shell if [ -f CVS/Repository ] ; then cat CVS/Repository ; fi)
-CVS_URL := cvs://cvs.fedoraproject.org/cvs/pkgs?$(CVS_REPOSITORY)\#$(TAG)
-
-## create a clean exported copy in $(TMPCVS)
-export:: sources
- @mkdir -p $(WORKDIR)
- /bin/rm -rf $(TMPCVS)
- @if test -z "$(TAG)" ; then echo "Must specify a tag to check out" ; exit 1; fi
- @mkdir -p $(TMPCVS)
- @cd $(TMPCVS) && \
- cvs -Q -d $(CVS_ROOT) export -r$(TAG) -d $(NAME) $(CVS_REPOSITORY) && \
- cvs -Q -d $(CVS_ROOT) export -rHEAD common
- @if [ -n "$(FULLSOURCEFILES)" ]; then ln -f $(FULLSOURCEFILES) $(TMPCVS)/$(NAME) 2> /dev/null || cp -f $(FULLSOURCEFILES) $(TMPCVS)/$(NAME) ; fi
- @echo "Exported $(TMPCVS)/$(NAME)"
-
-## build a test-srpm and see if it will -bp on all arches
-# XXX: I am not sure exactly what this is supposed to really do, since the
-# query format returns (none) most of the time, and that is not
-# handled --gafton
-check: test-srpm
- @archs=`rpm -qp $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm --qf "[%{EXCLUSIVEARCH}\n]" | egrep -v "(i586)|(i686)|(athlon)"` ;\
- if test -z "$$archs"; then archs=noarch; fi ; \
- echo "Checking arches: $$archs" ; \
- for arch in $$archs; do \
- echo "Checking $$arch..."; \
- if ! $(RPM_WITH_DIRS) -bp --target $$arch $(SPECFILE); then \
- echo "*** make prep failed for $$arch"; \
- exit 1; \
- fi; \
- done;
-
-## use this to build an srpm locally
-srpm: sources $(TARGETS)
- $(RPM_WITH_DIRS) $(DIST_DEFINES) --nodeps -bs $(SPECFILE)
-
-test-srpm: srpm
+bi :
+ $(RPM_WITH_REPO_DIRS) -bi $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-verrel:
- @echo $(NAME)-$(VERSION)-$(RELEASE)
+bi-% :
+ $(RPM_WITH_REPO_DIRS) --target=$* -bi $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-# If you build a new version into the tree, first do "make tag",
-# then "make srpm", then build the package.
-tag:: $(SPECFILE) $(COMMON_DIR)/branches
- cvs tag $(TAG_OPTS) -c $(TAG)
- @echo "Tagged with: $(TAG)"
- @echo
+bi-short :
+ $(RPM_WITH_REPO_DIRS) -bi --short-circuit $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-force-tag: $(SPECFILE) $(COMMON_DIR)/branches
- @$(MAKE) tag TAG_OPTS="-F $(TAG_OPTS)"
+bi-short-% :
+ $(RPM_WITH_REPO_DIRS) --target=$* -bi --short-circuit $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-define find-user
-if [ `cat CVS/Root |grep -c [^:]@` -ne 0 ]; then cat CVS/Root |cut -d @ -f 1 | sed 's/:.*://' ; else echo $(USER); fi
-endef
-USER := $(shell $(find-user))
+bb :
+ $(RPM_WITH_REPO_DIRS) -bb $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
-oldbuild: $(COMMON_DIR)/branches
- @if [ -z "$(TARGET)" -a ! -d CVS ]; then echo "Must be in a branch subdirectory"; exit 1; fi
+bb-% :
+ $(RPM_WITH_REPO_DIRS) --target $* -bb $(SPECFILE) 2>&1 | tee .build-$(VERSION)-$(RELEASE).log ; exit $${PIPESTATUS[0]}
- @cvs status -v $(SPECFILE) 2>/dev/null | grep -q $(TAG); ret=$$? ;\
- if [ $$ret -ne 0 ]; then echo "$(SPECFILE) not tagged with tag $(TAG)"; exit 1; fi
+# build whatever's appropriate for the local architecture
+local: $(if $(shell grep -i '^BuildArch:.*noarch' $(SPECFILE)), noarch, bb-$(shell uname -m))
- @(pushd $(COMMON_DIR) >/dev/null ;\
- rm -f tobuild ;\
- cvs -Q update -C tobuild ;\
- echo -e "$(USER)\t$(CVS_REPOSITORY)\t$(TAG)\t$(TARGET)" >> tobuild ;\
- cvs commit -m "request build of $(CVS_REPOSITORY) $(TAG) for $(TARGET)" tobuild ;\
- popd >/dev/null)
+## create a tarball export of either $(TAG) or head of branch
+tarball:
+ git-archive --format=tar --prefix=$(NVR)/ $(TAG) | bzip2 -9 > $(SRCRPMDIR)/$(NVR).tar.bz2
-build-check: $(SPECFILE)
- @if [ -z "$(TARGET)" -o ! -d CVS ]; then echo "Must be in a branch subdirectory"; exit 1; fi
- @cvs -f status -v $(SPECFILE) 2>/dev/null | grep -q $(TAG); ret=$$? ;\
- if [ $$ret -ne 0 ]; then echo "$(SPECFILE) not tagged with tag $(TAG)"; exit 1; fi
+commit-check:
+ git status | grep "nothing to commit" && { echo "Working directory is in need of a commit"; exit 1 }
-plague: build-check $(COMMON_DIR)/branches
- @if [ ! -x "$(PLAGUE_CLIENT)" ]; then echo "Must have plague-client installed - see http://fedoraproject.org/wiki/Extras/BuildSystemClientSetup"; exit 1; fi
- $(PLAGUE_CLIENT) build $(NAME) $(TAG) $(TARGET)
+repo-push:
+ git push fedora && { echo "Failure pushing repo to fedora"; exit 1 }
-koji: build-check $(COMMON_DIR)/branches
- @if [ ! -x "$(BUILD_CLIENT)" ]; then echo "Must have koji installed - see http://fedoraproject.org/wiki/BuildSystemClientSetup"; exit 1; fi
- $(BUILD_CLIENT) $(SECONDARY_CONFIG) build $(BUILD_FLAGS) $(TARGET) '$(CVS_URL)'
+# test build in mock
+mockbuild : tarball
+ mock $(MOCKARGS) -r $(MOCKCFG) --resultdir=$(MOCKDIR)/$(NVR) rebuild $(SRCRPMDIR)/$(NVR).tar.bz2
-ifneq (, $(filter devel F-10 F-9 F-8 F-7 OLPC-2 OLPC-3, $(BRANCH)))
-build: koji
-else
-build: plague
-endif
+verrel:
+ @echo $(NVR)
+
+## We submit new builds as one of two types: fresh, in which case no tag
+## exists and the build system builds the HEAD of our branch and tags it
+## for us on successful completion, or a tagged build in which case we are
+## rebuilding something that had been built before. This means that before
+## we do certain things that assume the build has completed with the tag
+## specified, such as a bhodi update, we should check to see if the build
+## actually succeeded and if we have a tag.
+tag-check:
+ git fetch fedora
+ git checkout -f `git branch | awk '/^\* /{ print $2 }'`
+ git tag | grep $(NVR) && { echo "The current tag has not been successfully built through the build system"; exit 1 }
+
+notag-check:
+ git fetch fedora
+ git checkout -f `git branch | awk '/^\* /{ print $2 }'`
+ git tag | grep $(NVR) || { echo "The current tag has already been successfully built through the build system"; exit 1 }
+
+koji-build: commit-check repo-push $(COMMON_DIR)/branches
+ @if [ ! -x "$(BUILD_CLIENT)" ]; then echo "Must have koji installed - see http://fedoraproject.org/wiki/BuildSystemClientSetup"; exit 1; fi
+ $(BUILD_CLIENT) $(SECONDARY_CONFIG) build $(BUILD_FLAGS) $(TARGET) '$(URL)'
-scratch-build: build-check
+koji-scratch: commit-check repo-push $(COMMON_DIR)/branches
@if [ ! -x "$(BUILD_CLIENT)" ]; then echo "Must have koji installed - see http://fedoraproject.org/wiki/BuildSystemClientSetup"; exit 1; fi
- $(BUILD_CLIENT) $(SECONDARY_CONFIG) build --scratch $(BUILD_FLAGS) $(TARGET) '$(CVS_URL)'
+ $(BUILD_CLIENT) $(SECONDARY_CONFIG) build --scratch $(BUILD_FLAGS) $(TARGET) '$(URL)'
-scratch-build-%: build-check
+koji-scratch-%: commit-check repo-push $(COMMON_DIR)/branches
@if [ ! -x "$(BUILD_CLIENT)" ]; then echo "Must have koji installed - see http://fedoraproject.org/wiki/BuildSystemClientSetup"; exit 1; fi
- $(BUILD_CLIENT) $(SECONDARY_CONFIG) build --scratch --arch-override=$* $(BUILD_FLAGS) $(TARGET) '$(CVS_URL)'
-
-
-bodhi: build-check $(COMMON_DIR)/branches clog
- @if [ ! -x "$(BODHI_CLIENT)" ]; then echo "Must have bodhi-client installed"; exit 1; fi
- @echo -e "\
-# [ $(NAME)-$(VERSION)-$(RELEASE) ]\n\
-# type=[S|B|E] (S=security, B=bugfix, E=enhancement) (required)\n\
-# request=[T|S] (T=testing, S=stable) (default: testing)\n\
-# bug=123,456\n\
-# all other text will be considered to be part of the update notes\n\
-type=" > bodhi.template
- @grep -Z '#' clog | xargs -0n1 | sed -n -e 's,^#\([0-9]*\)$$,\1,p' | xargs | tr ' ' ',' > $(NAME).bugs
- @if [ `cat $(NAME).bugs` ]; then echo "bug=`cat $(NAME).bugs`" >> bodhi.template; fi
- @sed -e '/^#/d' < bodhi.template > bodhi.template.orig
- @if [ -z "$$EDITOR" ]; then vi bodhi.template; else $$EDITOR bodhi.template; fi
- @if [ -n "`sed -e '/^#/d' < bodhi.template | diff bodhi.template.orig -`" ]; then \
- $(BODHI_CLIENT) --new --release $(subst -,,$(BRANCH)) \
- --file bodhi.template $(NAME)-$(VERSION)-$(RELEASE) -u $(BODHI_USER); \
- else \
- echo "Bodhi update aborted!"; \
- fi
- @rm -f bodhi.template{,.orig} $(NAME).bugs clog
-
-ifndef $(BODHI_USER)
-BODHI_USER=$(USER)
-endif
-
-ifneq (, $(filter F-9 F-8 F-7, $(BRANCH)))
-update: bodhi
-endif
+ $(BUILD_CLIENT) $(SECONDARY_CONFIG) build --scratch --arch-override=$* $(BUILD_FLAGS) $(TARGET) '$(URL)'
-cvsurl:
- @echo '$(CVS_URL)'
-
-chain-build: build-check
- @if [ -z "$(CHAIN)" ]; then \
- echo "Missing CHAIN variable, please specify the order of packages to" ; \
- echo "chain build. For example: make chain-build CHAIN='foo bar'" ; \
- exit 1 ; \
- fi ; \
- set -e ; \
- subdir=`basename $$(pwd)` ; \
- urls="" ; \
- for component in $(CHAIN) ; do \
- if [ "$$component" = "$(NAME)" ]; then \
- echo "$(NAME) must not appear in CHAIN" ; \
- exit 1 ; \
- fi ; \
- if [ "$$component" = ":" ]; then \
- urls="$$urls :" ; \
- continue ; \
- elif [ -n "$$urls" -a -z "$(findstring :,$(CHAIN))" ]; then \
- urls="$$urls :" ; \
- fi ; \
- rm -rf .tmp-$$$$ ; \
- mkdir -p .tmp-$$$$ ; \
- pushd .tmp-$$$$ > /dev/null ; \
- cvs -f -Q -z 3 -d $(CVS_ROOT) co $$component ; \
- urls="$$urls `make -s -C $$component/$$subdir cvsurl`" ; \
- popd > /dev/null ; \
- rm -rf .tmp-$$$$ ; \
- done ; \
- if [ -z "$(findstring :,$(CHAIN))" ]; then \
- urls="$$urls :" ; \
- fi ; \
- urls="$$urls `make -s cvsurl`" ; \
- $(BUILD_CLIENT) chain-build $(BUILD_FLAGS) $(TARGET) $$urls
-
-# "make new | less" to see what has changed since the last tag was assigned
-new:
- -@cvs diff -u -r$$(cvs log Makefile 2>/dev/null | awk '/^symbolic names:$$/ {getline; sub(/^[ \t]*/, "") ; sub (/:.*$$/, ""); print; exit 0}')
+repourl:
+ @echo '$(URL)'
# mop up, printing out exactly what was mopped.
-clean ::
+rpmclean ::
@echo "Running the %clean script of the rpmbuild..."
- -@$(RPM_WITH_DIRS) --clean --nodeps $(SPECFILE)
- @for F in $(FULLSOURCEFILES); do \
- if test -e $$F ; then \
- echo "Deleting $$F" ; /bin/rm -f $$F ; \
- fi; \
- done
- @if test -d $(TMPCVS); then \
- echo "Deleting CVS dir $(TMPCVS)" ; \
- /bin/rm -rf $(TMPCVS); \
- fi
- @if test -e $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm ; then \
- echo "Deleting $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm" ; \
- /bin/rm -f $(SRCRPMDIR)/$(NAME)-$(VERSION)-$(RELEASE).src.rpm ; \
- fi
+ -@$(RPM_WITH_REPO_DIRS) --clean --nodeps $(SPECFILE)
+ @echo "Removing tarballs..."
+ @find $(SRCRPMDIR) -type f -a ! -name .gitignore -printf '%f\n' -delete
+ @echo "Removing patches..."
+ @find $(SOURCEDIR) -type f -a ! -name .gitignore -printf '%f\n' -delete
+ @echo "Removing build dirs..."
+ @find $(BUILDDIR) -mindepth 1 -maxdepth 1 -type d -printf '%f\n' -exec rm -rf \{\} \;
+ @echo "Removing mock dirs..."
+ @find $(MOCKDIR) -mindepth 1 -maxdepth 1 -type d -printf '%f\n' -exec rm -rf \{\} \;
@rm -fv *~ clog
+ @echo "Leaving any prebuilt binary RPMs in $(RPMDIR)"
@echo "Fully clean!"
-# To prevent CVS noise due to changing file timestamps, upgrade
-# to patchutils-0.2.23-3 or later, and add to ~/.cvspkgsrc:
-# FILTERDIFF := filterdiff --remove-timestamps
-ifndef FILTERDIFF
-FILTERDIFF := cat
-endif
-
-ifdef CVE
-PATCHFILE := $(NAME)-$(VERSION)-CVE-$(CVE).patch
-SUFFIX := cve$(shell echo $(CVE) | sed s/.*-//)
-else
-PATCHFILE := $(NAME)-$(VERSION)-$(SUFFIX).patch
-endif
-
-patch:
- @if test -z "$(SUFFIX)"; then echo "Must specify SUFFIX=whatever" ; exit 1; fi
- (cd $(RPM_BUILD_DIR)/.. && gendiff $(NAME)-$(VERSION) .$(SUFFIX) | $(FILTERDIFF)) > $(PATCHFILE) || true
- @if ! test -s $(PATCHFILE); then echo "Patch is empty!"; exit 1; fi
- @echo "Created $(PATCHFILE)"
- @grep "$(PATCHFILE)" CVS/Entries >&/dev/null || cvs add -ko $(PATCHFILE) || true
-
-# Recreates the patch file of specified suffix from the current working sources
-# but keeping any comments at the top of file intact, and backing up the old copy
-# with a '~' suffix.
-rediff:
- @if test -z "$(SUFFIX)"; then echo "Must specify SUFFIX=whatever" ; exit 1; fi
- @if ! test -f "$(PATCHFILE)"; then echo "$(PATCHFILE) not found"; exit 1; fi
- @mv -f $(PATCHFILE) $(PATCHFILE)\~
- @sed '/^--- /,$$d' < $(PATCHFILE)\~ > $(PATCHFILE)
- @(cd $(RPM_BUILD_DIR)/.. && gendiff $(NAME)-$(VERSION) .$(SUFFIX) | $(FILTERDIFF)) >> $(PATCHFILE) || true
-
-clog: $(SPECFILE)
- @sed -n '/^%changelog/,/^$$/{/^%/d;/^$$/d;s/%%/%/g;p}' $(SPECFILE) | tee $@
-
-help:
+distrohelp:
@echo "Usage: make <target>"
@echo "Available targets are:"
- @echo " help Show this text"
- @echo " sources Download source files [default]"
- @echo " upload FILES=<files> Add <files> to CVS"
- @echo " new-sources FILES=<files> Replace sources in CVS with <files>"
- @echo " <arch> Local test rpmbuild binary"
+ @echo " distrohelp Show this text"
+ @echo " bp[-arch] Local test rpmbuild prep"
+ @echo " bc[-arch] Local test rpmbuild compile"
+ @echo " bc-short[-arch] Local test rpmbuild short-circuit compile"
+ @echo " bi[-arch] Local test rpmbuild install"
+ @echo " bi-short[-arch] Local test rpmbuild short-circuit install"
+ @echo " bb[-arch] Local test rpmbuild binary"
@echo " local Local test rpmbuild binary"
- @echo " prep Local test rpmbuild prep"
- @echo " compile Local test rpmbuild compile"
- @echo " install Local test rpmbuild install"
- @echo " compile-short Local test rpmbuild short-circuit compile"
- @echo " install-short Local test rpmbuild short-circuit install"
- @echo " export Create clean export in \"cvs-$(TAG)\""
- @echo " check Check test srpm preps on all archs"
- @echo " srpm Create a srpm"
- @echo " tag Tag sources as \"$(TAG)\""
- @echo " build Request build of \"$(TAG)\" for $(TARGET)"
- @echo " chain-build Build current package in order with other packages"
- @echo " example: make chain-build CHAIN='libwidget libgizmo'"
- @echo " The current package is added to the end of the CHAIN list."
- @echo " Colons (:) can be used in the CHAIN parameter to define dependency groups."
- @echo " Packages in a single group will be built in parallel, and all packages"
- @echo " in a group must build successfully and populate the repository before"
- @echo " the next group will begin building."
- @echo " If no groups are defined, packages will be built sequentially."
- @echo " scratch-build Request scratch build of \"$(TAG)\" for $(TARGET)"
- @echo " scratch-build-<archs> Request scratch build of \"$(TAG)\" for $(TARGET) and archs <archs>"
- @echo " examples: make scratch-build-i386,ppc64"
- @echo " make scratch-build-x86_64"
+ @echo " tarball Create clean tarball in \$$(SRCRPMDIR)"
+ @echo " koji-build Initiate koji build of \$$(BRANCH)#HEAD in"
+ @echo " \$$(TARGET)"
+ @echo " scratch-build Scratch version of make build"
+ @echo " scratch-build-<arches> Scratch build, specifying arches"
+ @echo " examples: make scratch-build-i386,ppc64"
+ @echo " make scratch-build-x86_64"
@echo " mockbuild Local test build using mock"
- @echo " verrel Echo \"$(NAME)-$(VERSION)-$(RELEASE)\""
- @echo " new Diff against last tag"
- @echo " clog Make a clog file containing top changelog entry"
- @echo " clean Remove srcs ($(SOURCEFILES)), export dir (cvs-$(TAG)) and srpm ($(NAME)-$(VERSION)-$(RELEASE).src.rpm)"
- @echo " patch SUFFIX=<suff> Create and add a gendiff patch file"
- @echo " rediff SUFFIX=<suff> Recreates a gendiff patch file, retaining comments"
- @echo " unused-patches Print list of patches not referenced by name in specfile"
- @echo " unused-fedora-patches Print Fedora patches not used by Patch and/or ApplyPatch directives"
+ @echo " verrel Print \$$(NAME)-\$$(VERSION)-\$$(RELEASE) as found"
+ @echo " in the spec file"
@echo " gimmespec Print the name of the specfile"
- @echo " update Submit $(NAME)-$(VERSION)-$(RELEASE) as an update for $(BRANCH)"
+ @echo " repo-push Push repo changes to remote fedora repo"
+ @echo " rpmclean Do a very thorough clean, including rpm cruft"
gimmespec:
@echo "$(SPECFILE)"
-unused-patches:
- @for f in *.patch; do if [ -e $$f ]; then grep -q $$f $(SPECFILE) || echo $$f; fi; done
-
-unused-fedora-patches:
- @for f in *.patch; do if [ -e $$f ]; then (egrep -q "^Patch[[:digit:]]+:[[:space:]]+$$f" $(SPECFILE) || echo "Unused: $$f") && egrep -q "^ApplyPatch[[:space:]]+$$f" $(SPECFILE) || echo "Unapplied: $$f"; fi; done
-
-##################### EXPERIMENTAL ##########################
-# this stuff is very experimental in nature and should not be
-# relied upon until these targets are moved above this line
-
-# This section contains some hacks that instrument
-# download-from-upstream support. You'll have to talk to gafton, he
-# knows how this shit works.
-
-# Add to the list of hardcoded upstream files the contents of the
-# ./upstream file
-UPSTREAM_FILES += $(shell if test -f ./upstream ; then cat ./upstream ; fi)
-# extensions for signature files we need to retrieve for verification
-# Warning: if you update the set of defaults, please make sure to
-# update/add to the checking rules further down
-UPSTREAM_CHECKS ?= sign asc sig md5
-
-# check the signatures for the downloaded upstream stuff
-UPSTREAM_CHECK_FILES = $(foreach e, $(UPSTREAM_CHECKS), $(addsuffix .$(e), $(UPSTREAM_FILES)))
-
-# Download a file from a particular host.
-# First argument contains the url base, the second the filename,
-# third extra curl options
-define download-host-file
-if test ! -e "$(2)" ; then \
- echo -n "URL: $(1)/$(2) ..." ; \
- $(CURL) --silent --head $(1)/$(2) && \
- { \
- echo "OK, downloading..." ; \
- $(CURL) $(3) $(1)/$(2) ; \
- } || \
- echo "not found" ; \
-fi
-endef
-
-# Download a file, trying each mirror in sequence. Also check for
-# signatures, if available
-# First argument contains the file name. We read the list of mirrors
-# from the ./mirrors file
-define download-file
-$(foreach h, $(shell cat mirrors),
- $(call download-host-file,$(h),$(1))
- if test -e $(1) ; then \
- $(foreach e,$(UPSTREAM_CHECKS),$(call download-host-file,$(h),$(1).$(e),--silent) ; ) \
- fi
-)
-if test ! -e $(1) ; then \
- echo "ERROR: Could not download file: $(1)" ; \
- exit -1 ; \
-else \
- echo "File $(1) available for local use" ; \
-fi
-endef
-
-# Download all the UPSTREAM files
-define download-files
-$(foreach f, $(UPSTREAM_FILES),
- $(call download-file,$(f))
- echo
-)
-endef
-
-# Make sure the signature files we download are properly added
-define cvs-add-upstream-sigs
-for s in $(UPSTREAM_CHECK_FILES) ; do \
- if test -f "$$s" ; then \
- if ! grep "^/$$s/" CVS/Entries >/dev/null 2>/dev/null ; then \
- cvs -Q add "$$s" ; \
- fi ; \
- fi ; \
-done
-endef
-
-download : upstream mirrors
- @$(download-files)
- $(MAKE) download-checks
-
-download-checks :: import-upstream-gpg
-download-checks :: $(UPSTREAM_CHECK_FILES)
-
-# how to check for a gpg signature, given a separate signature file
-define check-upstream-gpg-sig
-echo -n "Checking GPG signature on $* from $@ : "
-if ! test -f $@ ; then \
- echo "ERROR" ; echo "GPG signature file $@ not found" ; \
- exit 1 ; \
-fi
-if ! gpg --no-secmem-warning --no-permission-warning -q --verify $@ $* 2>/dev/null ; then \
- echo "FAILED" ; \
- exit 1 ; \
-else \
- echo "OK" ; \
-fi
-endef
-
-# how to check for a md5sum, given a separate .md5 file
-define check-upstream-md5sum
-echo -n "Checking md5sum on $* from $@ : "
-if ! test -f $@ ; then \
- echo "ERROR" ; echo "md5sum file $@ not found" ; \
- exit 1 ; \
-fi
-if ! md5sum $* | diff >/dev/null --brief "$@" - ; then \
- echo "FAILED" ; \
- exit 1 ; \
-else \
- echo "OK" ; \
-fi
-endef
-
-# and now the rules, specific to each extension
-$(addsuffix .sign,$(UPSTREAM_FILES)): %.sign: % FORCE
- @$(check-upstream-gpg-sig)
-$(addsuffix .asc,$(UPSTREAM_FILES)): %.asc: % FORCE
- @$(check-upstream-gpg-sig)
-$(addsuffix .sig,$(UPSTREAM_FILES)): %.sig: % FORCE
- @$(check-upstream-gpg-sig)
-$(addsuffix .md5,$(UPSTREAM_FILES)): %.md5: % FORCE
- @$(check-upstream-md5sum)
-
-# We keep all the relevant GPG keys in the upstream-key.gpg so we can
-# check the signatures...
-import-upstream-gpg : upstream-key.gpg FORCE
- mkdir -p $(HOME)/.gnupg
- gpg --quiet --import --no-secmem-warning --no-permission-warning $< || :
-
-# A handy target to download the latest and greatest from upstream and
-# check it into the lookaside cache.
-# new-base assumes that all the sources are downloaded from upstream, so it uses "make new-source"
-# rebase uses the standard "make upload"
-new-base : clean download
- $(MAKE) new-source FILES="$(UPSTREAM_FILES)"
- @$(cvs-add-upstream-sigs)
- @echo "Don't forget to do a 'cvs commit' for your new sources file."
-
-rebase : clean download
- $(MAKE) upload FILES="$(UPSTREAM_FILES)"
- @$(cvs-add-upstream-sigs)
- @echo "Don't forget to do a 'cvs commit' for your new sources file."
-
-# there is more stuff to clean, now that we have upstream files
-clean ::
- @rm -fv $(UPSTREAM_FILES)