diff options
author | Doug Ledford <dledford@redhat.com> | 2008-07-22 19:56:45 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2008-07-22 19:56:45 -0400 |
commit | b123410144699c7e92ff37d840d95fc67ea01426 (patch) | |
tree | 059a3f00720beebce37a77b733eae744123ce4cb | |
parent | b722923efa54ff4743b9162fb948aa336ca2e29b (diff) | |
download | common-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.common | 2 | ||||
-rw-r--r-- | Makefile.repo-git | 759 |
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) |