File: Makefile.release

package info (click to toggle)
coccinelle 1.0.0~rc22.deb-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 15,456 kB
  • ctags: 12,190
  • sloc: ml: 79,759; ansic: 20,564; makefile: 1,805; perl: 1,576; python: 1,183; sh: 1,013; lisp: 832; awk: 70; cpp: 47; csh: 12
file content (333 lines) | stat: -rw-r--r-- 11,583 bytes parent folder | download
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
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333

##############################################################################
# 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 overriden in the environment
ifndef GIT
GIT=git
endif

# the release process rewrites the Makefile.config, so we need
# to save important configure flags.
remember_ocamlbuild:=$(FEATURE_OCAMLBUILD)

ifeq ($(remember_ocamlbuild),yes)
	extra_configure_flags := --enable-ocamlbuild
else
	extra_configure_flags :=
endif



# 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
#
#  The project is then automatically licensified.
#
#  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 aclocal -I setup, then autoconf"
	@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
	./configure --enable-release --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)"
	echo -n "$(VERSION)" > ./version
	$(GIT) add ./version
	$(GIT) add ./configure
	$(GIT) add setup/Makefile.in
	-$(GIT) commit -m "Release $(VERSION)"
	-$(GIT) tag -a -m "Release $(VERSION)" $(VERSION)
	$(GIT) push --mirror
	$(MAKE) licensify
	@echo "\n\tLicensify has run: do 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:
	./configure --enable-release --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
	./configure --enable-release --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
	./configure --enable-release --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.
# You may have first to do a 'make licensify'.
#
# 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 -f "$(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

#
# No need to licensify 'demos'. Because these are basic building blocks
# to use SmPL.
#
TOLICENSIFY=ctl engine globals parsing_cocci popl popl09 python scripts tools
licensify:
	ocaml str.cma tools/licensify.ml
	set -e; for i in $(TOLICENSIFY); do cd $$i; ocaml str.cma ../tools/licensify.ml; cd ..; done

# 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 ".cvsignore"      \
	--exclude ".svn"	    \
	--exclude "tests"           \
	--exclude "TODO"            \
	--cvs-exclude

packsrc: prepack
	$(MAKE) -C $(TMP)/$(PACKAGE)/debian lucid
	$(MAKE) -C $(TMP)/$(PACKAGE)/debian karmic
	$(MAKE) -C $(TMP)/$(PACKAGE)/debian maverick
	$(MAKE) -C $(TMP)/$(PACKAGE)/debian natty
	$(MAKE) -C $(TMP)/$(PACKAGE)/debian oneiric
	$(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)
	$(MAKE) -C $(TMP)/$(PACKAGE) licensify
	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) licensify
	$(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 *