forked from coccinelle/coccinelle
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile.release
310 lines (271 loc) · 10.6 KB
/
Makefile.release
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
# This file is part of Coccinelle, licensed under the terms of the GPL v2.
# See copyright.txt in the Coccinelle source code for more information.
# The Coccinelle source code can be obtained at http://coccinelle.lip6.fr
##############################################################################
# Release rules to generate website archives
##############################################################################
PACKAGE=$(PRJNAME)-$(VERSION)
CCPACKAGE=coccicheck-$(CCVERSION)
EXCLUDE=$(PACKAGE)/debian .depend
DOC=docs/manual/manual.pdf \
docs/manual/options.pdf \
docs/manual/main_grammar.pdf \
# docs/html \
# docs/man \
docs/spatch.1 \
docs/manual/cocci-python.txt
BINSRC=spatch* env.sh env.csh standard.h standard.iso \
*.txt $(DOC) demos/* scripts/spatch*
BINSRC-PY=$(BINSRC) $(PYLIB) python/coccilib/
EXCL=$(EXCLUDE:%=--exclude=%)
BINSRC2=$(BINSRC:%=$(PACKAGE)/%)
BINSRC2-PY=$(BINSRC-PY:%=$(PACKAGE)/%)
# TMP should point to a folder that is private to the release
# process. In addition, it should not be the direct parent of
# the directory in which the release is performed, because it
# creates temporary directories that in this case could have
# a name clash with the current directory.
ifndef TMP
TMP=/var/tmp
endif
# should be defined by Makefile.config
ifndef OCAMLVERSION
OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;')
endif
# can be overridden in the environment
ifndef GIT
GIT=git
endif
# the release process rewrites the Makefile.config, so we need
# to save important configure flags.
extra_configure_flags :=
# Procedure to do first time:
# cd ~/release
# git clone ... coccinelle
# cd coccinelle
#
# Procedure to do each time:
#
# 1) make prerelease # WARN: These will clean your local rep. of pending modifications
#
# UPDATE VERSION number in ./version
# and commit it with
#
# 2) make release
#
# 3) make package
#
# if WEBSITE is set properly, you can also run 'make website'
# Check that run an ocaml in /usr/bin
# The 'git rebase' is in there just in case you started with
# unpushed changes. However, that is probably something you should
# not do in the first place.
release-help:
@echo "To make a release, perform the following steps:"
@echo ""
@echo "1. Make sure that all changes are committed and pushed."
@echo " (making a release will destroy any uncommitted changes)"
@echo " Preferably, start from a fresh clone of the coccinelle repo."
@echo "2. Run 'make prerelease'. It will generate some files that are not"
@echo " in the repository but part of the release tarballs."
@echo "3. Edit ./version. It must be a new version."
@echo "4. Run 'make release'. It makes changes to the git repository that"
@echo " are not idempotent. Running this step again is likely to result"
@echo " in some git errors. These are not dramatic and are therefore"
@echo " ignored."
@echo "5. Run 'make package'. It will build many tarballs."
@echo "6. Run 'make website'. Make sure that $(WEBBASE) exists beforehand."
@echo " Hint: run step 5 and 6 directly after each other. The tarballs"
@echo " are stored temporarily in $(TMP)."
@echo "7. Updated some webpages and commit them to svn."
prerelease:
@echo "Pulling changes from the repository"
$(GIT) pull --rebase
$(MAKE) fix-expected
$(MAKE) distclean KEEP_CONFIG=1
@echo "\n\tEdit ./version"
@echo "\n\tRun ./autogen --ignore_localversion"
@echo "\tCommit with 'make release'\n"
@echo "\t* set the GIT env variable to 'echo' to skip performing any git commands"
@echo "\t* changes to files other than ./version will not be committed automatically."
fix-expected:
@echo "going to generate: tests/SCORE_expected_orig.sexp"
$(MAKE) distclean
./autogen
./configure --disable-python $(extra_configure_flags)
$(MAKE) opt-only
yes | ./spatch.opt -testall --iso-file ./standard.iso --macro-file-builtins ./standard.h
cp tests/SCORE_actual.sexp tests/SCORE_expected_orig.sexp
@echo "generated: test/SCORE_expected_orig.sexp"
release:
@echo "Marking version: $(VERSION)"
$(GIT) add ./version
$(GIT) add setup/Makefile.in
$(GIT) commit -m "Release $(VERSION)"
$(GIT) tag -a -m "Release $(VERSION)" $(VERSION)
$(GIT) push origin $(VERSION) master:master
@echo "\n\tDo not commit any files from now on!"
@echo "\n\tRun 'make package'\n"
package:
$(MAKE) package-src
$(MAKE) package-nopython
$(MAKE) package-python
@echo "\tPut online with 'make website'"
@echo "\tThe coccinelle SVN repository must be in $(WEBBASE)\n"
package-src:
if [ ! -f ./configure ]; then ./autogen; fi
./configure --disable-python --disable-pcre-syntax $(extra_configure_flags)
$(MAKE) srctar
$(MAKE) coccicheck
# Reconfigures the project without Python support
# Note: we disable pcre syntax as well to eliminate the dependency
# on those libraries.
package-nopython:
$(MAKE) distclean
./autogen
./configure --disable-python --disable-pcre-syntax --disable-menhirLib --disable-pycaml $(extra_configure_flags)
$(MAKE) bintar
$(MAKE) bytecodetar
# Reconfigure project with Python support
# Note: we disable pcre syntax as well to eliminate the dependency
# on those libraries.
package-python:
$(MAKE) distclean
./autogen
./configure --enable-python --disable-pcre-syntax --disable-menhirLib --disable-pycaml $(extra_configure_flags)
$(MAKE) bintar-python
$(MAKE) bytecodetar-python
# I currently pre-generate the parser so the user does not have to
# install menhir on his machine. We could also do a few cleanups.
#
# update: make docs generates pdf but also some ugly .log files, so
# make clean is there to remove them while not removing the pdf
# (only distclean remove the pdfs).
srctar: Makefile.config
$(MAKE) docs
$(MAKE) -C parsing_cocci parser_cocci_menhir.ml
$(MAKE) -C parsing_cocci parser_cocci_menhir.mli
$(MAKE) distclean KEEP_GENERATED=1 KEEP_CONFIG=1
if test -L "$(TMP)/$(PACKAGE)"; then rm -f "$(TMP)/$(PACKAGE)"; fi # remove it if it is a symlink
$(MKDIR_P) "$(TMP)/$(PACKAGE)/"
cp -fa ./* "$(TMP)/$(PACKAGE)/"
rm -f $(TMP)/$(PACKAGE)/Makefile.config
cd $(TMP); tar cvfz $(PACKAGE).tgz --exclude-vcs $(EXCL) $(PACKAGE)
rm -rf $(TMP)/$(PACKAGE)
bintar: all-dev
$(MAKE) docs
rm -f $(TMP)/$(PACKAGE)
ln -s `pwd` $(TMP)/$(PACKAGE)
@if test -n "${PATCHELF}" -a -f spatch; then \
$(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch; fi
@if test -n "${PATCHELF}" -a -f spatch.opt; then \
$(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch.opt; fi
cd $(TMP); tar cvfz $(PACKAGE)-bin-x86.tgz --exclude-vcs $(BINSRC2)
rm -f $(TMP)/$(PACKAGE)
staticbintar: all-release
$(MAKE) docs
rm -f $(TMP)/$(PACKAGE)
ln -s `pwd` $(TMP)/$(PACKAGE)
$(MAKE) static
cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-static.tgz --exclude-vcs $(BINSRC2)
rm -f $(TMP)/$(PACKAGE)
bytecodetar: all-dev
$(MAKE) docs
rm -f $(TMP)/$(PACKAGE)
ln -s `pwd` $(TMP)/$(PACKAGE)
$(MAKE) purebytecode
$(MAKE) copy-stubs
@if test -n "${PATCHELF}" -a -f dllpycaml_stubs.so; then \
$(PATCHELF) --set-rpath "" dllpycaml_stubs.so; fi
@if test -n "${PATHCELF}" -a -f dllpcre_stubs.so; then \
$(PATCHELF) --set-rpath "" dllpcre_stubs.so; fi
cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude-vcs $(BINSRC2) $$(find -L $(PACKAGE) -maxdepth 1 -name 'dll*.so')
rm -f $(TMP)/$(PACKAGE)
rm -f dllpycaml_stubs.so dllpcre_stubs.so
bintar-python: all
$(MAKE) docs
@if test -n "${PATCHELF}" -a -f spatch; then \
$(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch; fi
@if test -n "${PATCHELF}" -a -f spatch.opt; then \
$(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch.opt; fi
rm -f $(TMP)/$(PACKAGE)
ln -s `pwd` $(TMP)/$(PACKAGE)
cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-python.tgz --exclude-vcs $(BINSRC2-PY)
rm -f $(TMP)/$(PACKAGE)
bytecodetar-python: all-dev
$(MAKE) docs
rm -f $(TMP)/$(PACKAGE)
ln -s `pwd` $(TMP)/$(PACKAGE)
$(MAKE) purebytecode
$(MAKE) copy-stubs
@if test -n "${PATCHELF}" -a -f dllpycaml_stubs.so; then \
$(PATCHELF) --set-rpath "" dllpycaml_stubs.so; fi
@if test -n "${PATHCELF}" -a -f dllpcre_stubs.so; then \
$(PATCHELF) --set-rpath "" dllpcre_stubs.so; fi
cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz --exclude-vcs $(BINSRC2-PY) $$(find -L $(PACKAGE) -maxdepth 1 -name 'dll*.so')
rm -f $(TMP)/$(PACKAGE)
rm -f dllpycaml_stubs.so dllpcre_stubs.so
coccicheck:
cp -a ./scripts/coccicheck $(TMP)/$(CCPACKAGE)
tar cvfz $(TMP)/$(CCPACKAGE).tgz -C $(TMP) --exclude-vcs $(CCPACKAGE)
rm -rf $(TMP)/$(CCPACKAGE)
clean-packages::
rm -f $(TMP)/$(PACKAGE).tgz
rm -f $(TMP)/$(PACKAGE)-bin-x86.tgz
rm -f $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz
rm -f $(TMP)/$(PACKAGE)-bin-x86-python.tgz
rm -f $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz
rm -f $(TMP)/$(CCPACKAGE).tgz
# When checking out the source from diku sometimes I have some "X in the future"
# error messages.
fixdates:
echo do 'touch **/*.*'
ocamlversion:
@echo $(OCAMLVERSION)
##############################################################################
# Packaging rules -- To build deb packages
##############################################################################
#
# Run 'make packsrc' to build a Deb source package
#
# The package is prepared in $(TMP), usually /tmp
# Once the package has been build, it is uploaded
# to a PPA on launchpad.
#
# You should have a "coccinelle" project configured
# for dput in your ~/.dput.cf file.
#
# The 'packbin' target is to build a deb package
# locally. It is only for testing purpose.
#
EXCL_SYNC=--exclude ".git" \
--exclude ".gitignore" \
--exclude "tests" \
--exclude "TODO" \
--cvs-exclude
packsrc: prepack
$(MAKE) -C $(TMP)/$(PACKAGE)/debian
$(MAKE) push
rm -rf $(TMP)/$(PACKAGE)/
packbin: prepack
$(MAKE) -C $(TMP)/$(PACKAGE)/debian binary
rm -rf $(TMP)/$(PACKAGE)/
rm -rf $(TMP)/$(PACKAGE)_$(VERSION)*_source.build
prepack:
rsync -a $(EXCL_SYNC) . $(TMP)/$(PACKAGE)
sed -i "s|^OCAMLCFLAGS=.*$$|OCAMLCFLAGS=|" $(TMP)/$(PACKAGE)/Makefile
rm -rf $(TMP)/$(PACKAGE)/tools
push:
cd $(TMP)/ && for p in `ls $(PRJNAME)_$(VERSION)*_source.changes`; do dput $(PRJNAME) $$p ; done
rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*_source.changes
rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*_source.$(PRJNAME).upload
rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*.dsc
rm -rf $(TMP)/$(PRJNAME)_$(VERSION)*.tar.gz
# Produces a source tarball
# Note: start from a fresh working directory
# Note: configure first
dist:
$(MAKE) docs
$(MAKE) -C parsing_cocci parser_cocci_menhir.ml
$(MAKE) distclean KEEP_CONFIG=1 KEEP_GENERATED=1
tar cvfz $(PACKAGE).tar.gz --transform="s,^,$(PACKAGE)/,S" --exclude=$(PACKAGE).tar.gz --exclude-backups --exclude-vcs *