summaryrefslogtreecommitdiffstats
path: root/git-rpm.mk
blob: a469995e1f5b21c34434eda9d6f1be7724185194 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# How to use this file:
#   0. run "git init"
#   1. copy this file as git-rpm.mk
#   2. create GNUmakefile with contents like
#      NAME = mypkg
#      include git-rpm.mk
#   3. run "make mkdir" to created the upload directory on the web server
#   4. write mypkg.spec, patches, Source: files, etc.
#   5. run "make" for a test build of the rpm files
#   6. if you do not like the result, go to 4
#   7. make sure NVR and %changelog are updated
#   8. Make sure you have "git commit"ed all your changes before
#   9. run "make tag" tag the current release
#  10. run "make upload" to upload the built rpm files to your webspace
#
# Settings best defined in ~/.git-rpm-settings.mk, but with potentially
# useful defaults:
#  1. RSYNC_USER and RSYNC_HOST or RSYNC_USHO
#  2. RSYNC_ROOT
#
# Benefits:
#  1. Reproducible local rpm builds:
#     $ make
#  2. Automatic generation of text reports (rpmlint, rpm content list):
#     $ make check
#  3. Easy versioning of NVRs using git tags
#     $ make tag
#  4. Easy upload via rsync/ssh to NVR specific places, nice for package review
#     $ make upload

RPMDIRS = rpm-build rpm-dist
UPLOAD_FILES =

OPTS =
OPTS += --define "_sourcedir $${PWD}"
OPTS += --define "_builddir $${PWD}/rpm-build"
OPTS += --define "_srcrpmdir $${PWD}/rpm-dist" --define "_rpmdir $${PWD}/rpm-dist"

NAME ?= packagename-to-be-defined

SPEC = $(NAME).spec

RPM_VERSION := $(shell rpm -q --specfile $(SPEC) --queryformat '%{VERSION}\n' | sed '1q')
RPM_RELEASE := $(shell rpm -q --specfile $(SPEC) --queryformat '%{RELEASE}\n' | sed '1q')
RPM_ARCH    := $(shell rpm -q --specfile $(SPEC) --queryformat '%{ARCH}\n' | sed '1q')

NVR = $(NAME)-$(RPM_VERSION)-$(RPM_RELEASE)

SRPM = rpm-dist/$(NVR).src.rpm
BRPM = rpm-dist/$(RPM_ARCH)/$(NVR).$(RPM_ARCH).rpm

-include $(HOME)/.git-rpm-settings.mk
RSYNC_USER ?= $(USER)
RSYNC_HOST ?= fedorapeople.org
RSYNC_USHO ?= $(RSYNC_USER)@$(RSYNC_HOST)
RSYNC_ROOT ?= public_html/packages
RSYNC_DIR = $(RSYNC_ROOT)/$(NAME)/$(RPM_VERSION)-$(RPM_RELEASE)

SOURCE_FILES = $(shell spectool --lf $(SPEC) | cut -d' ' -f2 | xargs -l basename)

.PHONY: all
all: build
build: rpm check

.PHONY: sources
sources:
	spectool -g $(SPEC)

.PHONY: srpm
srpm: $(SRPM)

clog: $(SPEC)
	rpm -q --specfile $(SPEC) --changelog | sed '1n; /^\*/,$$d' > $@
	cat $@

UPLOAD_FILES += $(NVR)/$(NVR).src.rpm
$(SRPM): $(SPEC) $(SOURCE_FILES)
	mkdir -p $(RPMDIRS)
	rpmbuild $(OPTS) -bs $(SPEC)
$(NVR)/$(NVR).src.rpm: $(SRPM)
	mkdir -p $(NVR)
	cp -p $< $@

.PHONY: rpm
rpm: $(BRPM)

UPLOAD_FILES += $(NVR)/build.log
$(BRPM) rpm-build/$(NVR).buildlog: $(SPEC) $(SOURCE_FILES)
	mkdir -p $(RPMDIRS)
	rpmbuild $(OPTS) -ba $(SPEC) 2>&1 | tee rpm-build/$(NVR).buildlog

$(NVR)/build.log: rpm-build/$(NVR).buildlog
	mkdir -p $(NVR)
	sed "s|$(USER)|build|g" < $< > $@

.PHONY: check
check: $(NVR)/rpmlint.txt $(NVR)/filelist.txt

UPLOAD_FILES += $(NVR)/rpmlint.txt
$(NVR)/rpmlint.txt: $(BRPM)
	mkdir -p $(NVR)
	rpmlint -i $(SPEC) $(SRPM) $(BRPM) 2>&1 | tee $@

UPLOAD_FILES += $(NVR)/filelist.txt
$(NVR)/filelist.txt: rpm-build/$(NVR).buildlog
	mkdir -p $(NVR)
	for pkg in rpm-dist/$(NVR).src.rpm rpm-dist/$(RPM_ARCH)/$(NAME)*-$(RPM_VERSION)-$(RPM_RELEASE).$(RPM_ARCH).rpm; do \
		echo "## $$(basename "$$pkg")"; \
		rpm -qpl --scripts "$$pkg"; \
		echo; \
	done > $@.new
	cp $@.new $@ && rm -f $@.new

.PHONY: mkdir
mkdir:
	ssh $(RSYNC_USHO) mkdir -p $(RSYNC_ROOT)/$(NAME)

.PHONY: upload
upload: $(NVR)

UPLOAD_FILES += $(NVR)/$(SPEC)
$(NVR)/$(SPEC): $(SPEC)
	mkdir -p $(NVR)
	cp -p $< $@

UPLOAD_FILES += $(foreach p, $(SOURCE_FILES), $(NVR)/$(p))
$(NVR)/%: %
	mkdir -p $(NVR)
	cp -p $< $@

$(NVR): $(UPLOAD_FILES)
	mkdir -p $(NVR)
	rsync -avz --delete $(NVR)/ $(RSYNC_USHO):$(RSYNC_DIR)/
	touch $@

.PHONY: clean
clean:
	rm -rf $(RPMDIRS)

.PHONY: tag
tag: clog
	@echo "List of git tags:"; git tag -n20
	@echo "Really add git tag $(NVR)? Ctrl-C to abort, Enter to continue"; read
	git tag -a -F clog $(NVR)

WORKDIR ?= $(PWD)
MOCKDIR ?= $(WORKDIR)
MOCKCFG ?= fedora-$(shell echo $(RPM_RELEASE) | sed -n 's/.*\.fc\([1-9][0-9]*\)$$/\1/p')-$(RPM_ARCH)
MOCKRESULTDIR ?= $(MOCKDIR)/$(NVR).mock

SCRATCHBUILD_KOJI_TAG = dist-f10

.PHONY: scratch-build
scratch-build: $(SRPM)
	/usr/bin/koji build --scratch $(SCRATCHBUILD_KOJI_TAG) $(SRPM)

.PHONY: mock-build
mock-build: $(MOCKRESULTDIR)

$(MOCKRESULTDIR): $(SRPM)
	mock $(MOCKARGS) -r $(MOCKCFG) --resultdir=$(MOCKRESULTDIR) rebuild $(SRPM)

.PHONY: help
help:
	@echo "NVR:             $(NVR)"
	@echo "Mock config:     $(MOCKCFG)"
	@echo "Mock result dir: $(MOCKRESULTDIR)"
	@echo "Source RPM:      $(SRPM)"
	@echo "Targets:"
	@echo "  build          build the RPM package(s) locally"
	@echo "  scratch-build  build scratch RPM via Fedora's koji"
	@echo "  mock-build     build RPM in local mock chroot"
	@echo "  sources        download all source files"
	@echo "  srpm           build SRPM package locally"

# Package specific rules, best put into package specific GNUmakefile

#$(NAME)-$(RPM_VERSION)-buildfixes.patch: $(wildcard $(NAME)-$(RPM_VERSION)/* $(NAME)-$(RPM_VERSION)-buildfixes/*)
#	diff -ru $(NAME)-$(RPM_VERSION) $(NAME)-$(RPM_VERSION)-buildfixes > $@;:

# End of file.