forked from onelab-eu/sfa
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
273 lines (216 loc) · 8.03 KB
/
Makefile
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
#
## (Re)builds Python metafile (__init__.py)
#
# overwritten by the specfile
DESTDIR="/"
PREFIX=/usr
##########
all: python wsdl
install: python-install wsdl-install tests-install
clean: python-clean wsdl-clean
uninstall: python-uninstall tests-uninstall
.PHONY: all install clean uninstall
##########
rpmversion:=$(shell rpm -q --specfile sfa.spec --queryformat="%{version}\n" | head -1)
# somehow %{taglevel} is empty, turns out %{release} has what we want
rpmtaglevel:=$(shell rpm -q --specfile sfa.spec --queryformat="%{release}\n" 2> /dev/null | head -1)
VERSIONTAG=$(rpmversion)-$(rpmtaglevel)
# this used to be 'should-be-redefined-by-specfile' and it indeed should be
SCMURL=git://git.onelab.eu/sfa.git
python: version
version: sfa/util/version.py
sfa/util/version.py: sfa/util/version.py.in force
sed -e "s,@VERSIONTAG@,$(VERSIONTAG),g" -e "s,@SCMURL@,$(SCMURL),g" sfa/util/version.py.in > $@
# postinstall steps - various cleanups and tweaks for a nicer rpm
python-install:
python setup.py install --prefix=$(PREFIX) --root=$(DESTDIR)
chmod 444 $(DESTDIR)/etc/sfa/default_config.xml
rm -rf $(DESTDIR)/usr/lib*/python*/site-packages/*egg-info
rm -rf $(DESTDIR)/usr/lib*/python*/site-packages/sfa/storage/migrations
(cd $(DESTDIR)/usr/bin ; ln -s sfi.py sfi; ln -s sfascan.py sfascan; ln -s sfaadmin.py sfaadmin)
python-clean: version-clean
python setup.py clean
# rm $(init)
version-clean:
rm -f sfa/util/version.py
.PHONY: python version python-install python-clean version-clean
##########
wsdl:
$(MAKE) -C wsdl
# propagate DESTDIR from the specfile
wsdl-install:
$(MAKE) -C wsdl install
wsdl-clean:
$(MAKE) -C wsdl clean
.PHONY: wsdl wsdl-install wsdl-clean
######################################## debian packaging
# The 'debian' target is called from the build with the following variables set
# (see build/Makefile and target_debian)
# (.) RPMTARBALL
# (.) RPMVERSION
# (.) RPMRELEASE
# (.) RPMNAME
#
PROJECT=$(RPMNAME)
DEBVERSION=$(RPMVERSION).$(RPMRELEASE)
DEBTARBALL=../$(PROJECT)_$(DEBVERSION).orig.tar.bz2
DATE=$(shell date -u +"%a, %d %b %Y %T")
debian: debian/changelog debian.source debian.package
debian/changelog: debian/changelog.in
sed -e "s|@VERSION@|$(DEBVERSION)|" -e "s|@DATE@|$(DATE)|" debian/changelog.in > debian/changelog
debian.source: force
rsync -a $(RPMTARBALL) $(DEBTARBALL)
debian.package:
debuild -uc -us -b
debian.clean:
$(MAKE) -f debian/rules clean
rm -rf build/ MANIFEST ../*.tar.gz ../*.dsc ../*.build
find . -name '*.pyc' -delete
##########
tests-install:
mkdir -p $(DESTDIR)/usr/share/sfa/tests
install -m 755 tests/*.py $(DESTDIR)/usr/share/sfa/tests/
tests-uninstall:
rm -rf $(DESTDIR)/usr/share/sfa/tests
.PHONY: tests-install tests-uninstall
########## refreshing methods package metafile
# Metafiles - manage Legacy/ and Accessors by hand
init := sfa/methods/__init__.py
index: $(init)
index-clean:
rm $(init)
methods_now := $(sort $(shell fgrep -v '"' sfa/methods/__init__.py 2>/dev/null))
# what should be declared
methods_paths := $(filter-out %/__init__.py, $(wildcard sfa/methods/*.py))
methods_files := $(sort $(notdir $(methods_paths:.py=)))
ifneq ($(methods_now),$(methods_files))
sfa/methods/__init__.py: force
endif
sfa/methods/__init__.py:
(echo '## Please use make index to update this file' ; echo 'all = """' ; cd sfa/methods; ls -1 *.py | grep -v __init__ | sed -e 's,.py$$,,' ; echo '""".split()') > $@
force:
##########
# a lot of stuff in the working dir is just noise
files:
@find . -type f | egrep -v '^\./\.|/\.git/|/\.svn/|TAGS|AA-|~$$|egg-info|\.(py[co]|doc|html|pdf|png|svg|out|bak|dg|pickle)$$'
git-files:
@git ls-files | grep -v '\.doc$$'
tags:
$(MAKE) git-files | xargs etags
.PHONY: files tags
signatures:
(cd sfa/methods; grep 'def.*call' *.py > SIGNATURES)
.PHONY: signatures
########## for uploading onto pypi
# use pypitest instead for tests (both entries need to be defined in your .pypirc)
PYPI_TARGET=pypi
PYPI_TARBALL_TOPDIR=/build/sfa
# a quick attempt on pypitest did not quite work as expected
# I was hoping to register the project using "setup.py register"
# but somehow most of my meta data did not make it up there
# and I could not find out why
# so I went for the manual method instead
# there also was a web dialog prompting for a zip file that would
# be used to initialize the project's home dir but this too
# did not seem to work the way I was trying to use it, so ...
# this target is still helpful to produce the readme in html from README.md
index.zip index.html: README.md
python readme.py
# I need to run this on my mac as my pypi
# run git pull first as this often comes afet a module-tag
# we need to re-run make so the version is right
git_pypi: git pypi
git:
git pull
$(MAKE) version
# run this only once the sources are in on the right tag
pypi: index.html
setup.py sdist upload -r $(PYPI_TARGET)
ssh $(PYPI_TARBALL_HOST) mkdir -p $(PYPI_TARBALL_TOPDIR)/$(VERSIONTAG)
rsync -av dist/sfa-$(VERSIONTAG).tar.gz $(PYPI_TARBALL_HOST):$(PYPI_TARBALL_TOPDIR)/$(VERSIONTAG)
# cleanup
clean: readme-clean
readme-clean:
rm -f index.html index.zip
########## sync
# 2 forms are supported
# (*) if your plc root context has direct ssh access:
# make sync PLC=private.one-lab.org
# (*) otherwise, for test deployments, use on your testmaster
# $ run export
# and cut'n paste the export lines before you run make sync
ifdef PLC
SSHURL:=root@$(PLC):/
SSHCOMMAND:=ssh root@$(PLC)
else
ifdef PLCHOSTLXC
SSHURL:=root@$(PLCHOSTLXC):/vservers/$(GUESTNAME)
SSHCOMMAND:=ssh root@$(PLCHOSTLXC) ssh -o StrictHostKeyChecking=no $(GUESTHOSTNAME)
else
ifdef PLCHOSTVS
SSHURL:=root@$(PLCHOSTVS):/vservers/$(GUESTNAME)
SSHCOMMAND:=ssh root@$(PLCHOSTVS) vserver $(GUESTNAME) exec
endif
endif
endif
synccheck:
ifeq (,$(SSHURL))
@echo "sync: I need more info from the command line, e.g."
@echo " make sync PLC=boot.planetlab.eu"
@echo " make sync PLCHOSTVS=.. GUESTNAME=.."
@echo " make sync PLCHOSTLXC=.. GUESTNAME=.. GUESTHOSTNAME=.."
@exit 1
endif
LOCAL_RSYNC_EXCLUDES += --exclude '*.pyc'
LOCAL_RSYNC_EXCLUDES += --exclude '*.png' --exclude '*.svg' --exclude '*.out'
RSYNC_EXCLUDES := --exclude .svn --exclude .git --exclude '*~' --exclude TAGS $(LOCAL_RSYNC_EXCLUDES)
RSYNC_COND_DRY_RUN := $(if $(findstring n,$(MAKEFLAGS)),--dry-run,)
RSYNC := rsync -a -v $(RSYNC_COND_DRY_RUN) --no-owner $(RSYNC_EXCLUDES)
CLIENTS = $(shell ls clientbin/*.py)
BINS = ./config/sfa-config-tty ./config/gen-sfa-cm-config.py \
./sfa/server/sfa-start.py \
./clientbin/sfaadmin.py \
$(CLIENTS)
synclib: synccheck
+$(RSYNC) --relative ./sfa/ --exclude migrations $(SSHURL)/usr/lib\*/python2.\*/site-packages/
synclibdeb: synccheck
+$(RSYNC) --relative ./sfa/ --exclude migrations $(SSHURL)/usr/share/pyshared/
syncbin: synccheck
+$(RSYNC) $(BINS) $(SSHURL)/usr/bin/
syncinit: synccheck
+$(RSYNC) ./init.d/sfa $(SSHURL)/etc/init.d/
syncconfig:
+$(RSYNC) ./config/default_config.xml $(SSHURL)/etc/sfa/
synctest: synccheck
+$(RSYNC) ./tests/ $(SSHURL)/root/tests-sfa
syncrestart: synccheck
-$(SSHCOMMAND) systemctl --system daemon-reload
$(SSHCOMMAND) service sfa restart
syncmig:
+$(RSYNC) ./sfa/storage/migrations $(SSHURL)/usr/share/sfa/
# full-fledged
sync: synclib syncbin syncinit syncconfig syncrestart
syncdeb: synclibdeb syncbin syncinit syncconfig syncrestart
# 99% of the time this is enough
syncfast: synclib syncrestart
.PHONY: synccheck synclib syncbin syncconfig synctest syncrestart sync syncfast
##########
CLIENTLIBFILES= \
sfa/examples/miniclient.py \
sfa/__init__.py \
sfa/client/{sfaserverproxy,sfaclientlib,__init__}.py \
sfa/trust/{certificate,__init__}.py \
sfa/util/{sfalogging,faults,genicode,enumeration,__init__}.py
clientlibsync:
@[ -d "$(CLIENTLIBTARGET)" ] || { echo "You need to set the make variable CLIENTLIBTARGET"; exit 1; }
rsync -av --relative $(CLIENTLIBFILES) $(CLIENTLIBTARGET)
#################### convenience, for debugging only
# make +foo : prints the value of $(foo)
# make ++foo : idem but verbose, i.e. foo=$(foo)
++%: varname=$(subst +,,$@)
++%:
@echo "$(varname)=$($(varname))"
+%: varname=$(subst +,,$@)
+%:
@echo "$($(varname))"