GNUmakefile.in 15.3 KB
Newer Older
1
#
2
# Copyright (c) 2000-2016 University of Utah and the Flux Group.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
22
#
23
24
# Testbed Makefile
#
25
26
27
28
29
SRCDIR		= @srcdir@
OBJDIR		= .
SUBDIR		= 
TESTBED_SRCDIR  = @top_srcdir@
DISTCLEAN_FILES = @DISTCLEAN_FILES@ 
30
EVENTSYS	= @EVENTSYS@
31
PELABSUPPORT	= @PELABSUPPORT@
32
PGENISUPPORT    = @PROTOGENI_SUPPORT@
33
ISMAINSITE	= @TBMAINSITE@
34
SPEWFROMOPS	= @SPEWFROMOPS@
35
36
SYSTEM	       := $(shell uname -s)

37
38
include Makeconf

39
40
41
#
# Ordering here matters!
# Things with no dependencies go first: 
42
#   assign db lib www
43
44
# Things that may have dependencies go next:
#   @optional_subdirs@ (has event)
45
#   ipod os security sensors 
46
# Then things that only depend on stuff we've done:
47
#   pxe tbsetup tmcd utils backend www tip vis
48
49
# Then things that depend on stuff we just did:
#
50
ifeq ($(STANDALONE_CLEARINGHOUSE),0)
51
52
53
SUBDIRS = \
	clientside/lib \
	db assign www @optional_subdirs@ clientside ipod security sensors \
54
	pxe tbsetup account tmcd utils backend tip ipod vis \
55
	sensors os xmlrpc autofs install/newnode_sshkeys \
56
	tools/svn wiki collab/exp-vis node_usage install
57
ifeq ($(ISMAINSITE),1)
58
SUBDIRS += tools/rmanage tools/whol
59
endif
60
ifeq ($(PGENISUPPORT),1)
61
SUBDIRS += protogeni apt
62
endif
63
64
65
else
SUBDIRS = db tbsetup account protogeni
endif
Christopher Alfeld's avatar
Christopher Alfeld committed
66

67
all:		all-subdirs just-builddirs 
68

69
70
71
72
73
74
75
#
# We used to statically link our event agents.  We no longer do this, but
# if you want "old style" agents, use this target.
#
all-static:
	@LDSTATIC=-static $(MAKE) all

76
ifeq ($(STANDALONE_CLEARINGHOUSE),0)
77
install:	
78
79
	@echo "Choose either boss-install, ops-install or fs-install"
	@echo "Choose opsfs-install instead of ops-install for a combined ops/fs machine"
80
	@echo "Choose tipserv-install for dedicated tip server machines."
81
82
83
else
install: clrhouse-install
endif
84
85

#
86
# For installation on boss node
87
# 
88
boss-install:	install-checks \
89
		install-subdirs install-mkdirs \
90
		install-setbuildinfo
91
	@echo "Boss node installed!"
92

93
# Same target, with the checks omitted
94
boss-install-force:	install-subdirs install-mkdirs install-setbuildinfo
95
	@echo "Boss node installed!"
96

97
# Skip only the schema checks, but do the other checks.
98
boss-install-noschemacheck: install-updatecheck \
99
100
101
102
103
		install-sitevarscheck install-dbfillcheck \
		install-genischemacheck install-subdirs install-mkdirs \
		install-setbuildinfo

# Skip the update check. 
104
boss-install-noupdatecheck: install-schemacheck \
105
		install-sitevarscheck install-dbfillcheck \
106
107
108
		install-genischemacheck install-subdirs install-mkdirs \
		install-setbuildinfo

109
# Only the checks:
110
install-checks: \
111
		install-updatecheck \
112
113
114
115
116
		install-schemacheck \
		install-sitevarscheck \
		install-dbfillcheck install-genischemacheck
	@echo "Installation checks completed!"

117
118
119
clrhouse-install:	install-subdirs install-mkdirs
	@echo "CleaingHouse code installed!"

120
post-install:
121
	@$(MAKE) -C db post-install
Mike Hibler's avatar
Mike Hibler committed
122
	@$(MAKE) -C ipod post-install
123
	@$(MAKE) -C tbsetup post-install
124
	@$(MAKE) -C account post-install
125
	@$(MAKE) -C security post-install
126
127
	@$(MAKE) -C vis post-install
	@$(MAKE) -C www post-install
128
ifeq ($(EVENTSYS),1)
129
	@$(MAKE) -C event post-install
130
endif
131
	@$(MAKE) -C tools post-install
132
	@$(MAKE) -C wiki post-install
133
	@$(MAKE) -C collab post-install
134
	@$(MAKE) -C utils post-install
135
136
137
ifeq ($(NODE_USAGE_SUPPORT),1)
	@$(MAKE) -C node_usage post-install
endif
138

139
#
140
# For installation on the 'ops' or 'users' node (okay, plastic)
141
# 
142
ops-install:
143
144
145
	-mkdir -p $(INSTALL_TOPDIR)/log
	-mkdir -p $(INSTALL_TOPDIR)/log/mysql
	-chmod 770 $(INSTALL_TOPDIR)/log/mysql
146
147
	-chown mysql $(INSTALL_TOPDIR)/log/mysql
	-chgrp mysql $(INSTALL_TOPDIR)/log/mysql
148
149
	-mkdir -p $(INSTALL_TOPDIR)/log/logfiles
	-chmod 777 $(INSTALL_TOPDIR)/log/logfiles
150
	@$(MAKE) -C rc.d control-install
151
152
	@$(MAKE) -C tbsetup control-install
	@$(MAKE) -C security control-install
153
154
	@$(MAKE) -C tip control-install
	@$(MAKE) -C db control-install
Mac Newbold's avatar
Mac Newbold committed
155
	@$(MAKE) -C utils control-install
156
	@$(MAKE) -C clientside control-install
157
ifeq ($(EVENTSYS),1)
158
	@$(MAKE) -C event control-install
159
endif
160
	@$(MAKE) -C xmlrpc control-install
Leigh B. Stoller's avatar
Leigh B. Stoller committed
161
	@$(MAKE) -C account control-install
162
163
164
ifeq ($(PELABSUPPORT),1)
	@$(MAKE) -C pelab control-install
endif
165

166
fs-install:
167
	@$(MAKE) -C rc.d fs-install
168
	@$(MAKE) -C tbsetup fs-install
169
	@$(MAKE) -C clientside fs-install
Timothy Stack's avatar
   
Timothy Stack committed
170
	@$(MAKE) -C sensors fs-install
171
172
173
174

opsfs-install: ops-install fs-install
	@echo "Combined ops/fs install done."

175
install-mkdirs:
176
	-mkdir -p $(INSTALL_TOPDIR)/db
177
178
	-mkdir -p $(INSTALL_TOPDIR)/locks
	-mkdir -p $(INSTALL_TOPDIR)/log
179
	-mkdir -p $(INSTALL_TOPDIR)/log/mysql
180
181
	-mkdir -p $(INSTALL_TOPDIR)/etc
	-mkdir -p $(INSTALL_TOPDIR)/www
182
	-mkdir -p $(INSTALL_TOPDIR)/suidbin
183
184
185
186
	-mkdir -p $(INSTALL_TOPDIR)/ssl
	-chmod 770 $(INSTALL_TOPDIR)/ssl
ifeq ($(STANDALONE_CLEARINGHOUSE),0)
	-mkdir -p $(INSTALL_TOPDIR)/opsdir
187
	-mkdir -p $(INSTALL_TOPDIR)/log/exports
188
	-mkdir -p $(INSTALL_TOPDIR)/lists
189
	-mkdir -p $(INSTALL_TOPDIR)/backup
190
	-mkdir -p $(INSTALL_TOPDIR)/expwork
191
192
	-mkdir -p $(INSTALL_TOPDIR)/batch
	-chmod 777 $(INSTALL_TOPDIR)/batch
193
194
	-mkdir -p $(INSTALL_TOPDIR)/expinfo
	-chmod 777 $(INSTALL_TOPDIR)/expinfo
195
196
	-mkdir -p $(INSTALL_TOPDIR)/exparchive
	-chmod 777 $(INSTALL_TOPDIR)/exparchive
197
198
	-mkdir -p $(INSTALL_TOPDIR)/exparchive/Archive
	-chmod 777 $(INSTALL_TOPDIR)/exparchive/Archive
199
200
	-mkdir -p $(INSTALL_TOPDIR)/images
	-chmod 775 $(INSTALL_TOPDIR)/images
201
	-ln -sf /usr/testbed/bin/nse $(INSTALL_TOPDIR)/bin
202
endif
203

204
205
206
207
just-builddirs:
	@$(MAKE) -C rc.d all
	@$(MAKE) -C apache all

208
209
tipserv-install:
	-mkdir -p $(INSTALL_TOPDIR)/log/tiplogs
210
	-mkdir -p $(INSTALL_TOPDIR)/etc
211
	@$(MAKE) -C tip tipserv-install
212
	@$(MAKE) -C clientside/os/capture tipserv-install
213
214
	@$(MAKE) -C tbsetup tipserv-install

215
216
client-mkdirs:
	-mkdir -p $(DESTDIR)$(CLIENT_BINDIR)
217
	-mkdir -p $(DESTDIR)$(CLIENT_MANDIR)
218
219

client:
Leigh B Stoller's avatar
Leigh B Stoller committed
220
	@$(MAKE) -C clientside client
221
	@$(MAKE) -C os client
222
ifneq ($(SYSTEM),CYGWIN_NT-5.1)
Timothy Stack's avatar
   
Timothy Stack committed
223
	@$(MAKE) -C tip client
224
endif
225
226

client-install: client client-mkdirs
Leigh B Stoller's avatar
Leigh B Stoller committed
227
	@$(MAKE) -C clientside client-install
228
	@$(MAKE) -C os client-install
229
ifneq ($(SYSTEM),CYGWIN_NT-5.1)
Timothy Stack's avatar
   
Timothy Stack committed
230
	@$(MAKE) -C tip client-install
231
endif
232

233
234
subboss: 
	@$(MAKE) -C clientside subboss
235
	@$(MAKE) -C os subboss
236
237
238
ifneq ($(SYSTEM),CYGWIN_NT-5.1)
	@$(MAKE) -C tip client
endif
Ryan Jackson's avatar
Ryan Jackson committed
239
240
	@$(MAKE) -C utils subboss

241
subboss-install: subboss
242
243
	@$(MAKE) -C clientside subboss-install
	@$(MAKE) -C os subboss-install
244
245
246
ifneq ($(SYSTEM),CYGWIN_NT-5.1)
	@$(MAKE) -C tip client-install
endif
Ryan Jackson's avatar
Ryan Jackson committed
247
	@$(MAKE) -C utils subboss-install
248
249
	@$(MAKE) -C db subboss-install
	@$(MAKE) -C rc.d subboss-install
250
	@$(MAKE) -C dhcpd subboss-install
251
252
253
	# Hack: this should probably be done by a subboss-install
	# script, but there isn't a huge need for that yet
	@rm -f $(INSTALL_RCDIR)/isc-dhcpd
Ryan Jackson's avatar
Ryan Jackson committed
254

255
256
257
TARBALLDESTDIR = /var/tmp/emulab-client

client-tarball:
258
	@$(MAKE) -C clientside client-tarball
259

260
261
262
263
264
265
266
client-src-tarball:
	@rm -f emulab-client-src.tar.gz
	tar clzf emulab-client-src.tar.gz -C clientside

# This is not finished yet.
client-shadow-rpm:
	-$(RM) -rf rpmbuild
267
	mkdir -p rpmbuild/SOURCES rpmbuild/SRPMS
268
269
270
271
	$(CP) emulab-client-src.tar.gz rpmbuild/SOURCES
	$(RPM) -v -bs --nodeps --define='_topdir $(TOPDIR)/rpmbuild' \
		clientside/shadow.spec

272
273
274
275
destdircheck:
	@if [ -z "$(DESTDIR)" ]; then \
	    echo "You must define DESTDIR for this target!"; \
	    false; \
276
277
278
279
	fi
	@if [ "$(DESTDIR)" = "/" ]; then \
	    echo "DESTDIR is '/', really really bad idea!"; \
	    false; \
280
281
	fi

282
283
mfsoscheck:
	@if [ `uname -s` != "FreeBSD" ]; then \
Mike Hibler's avatar
Mike Hibler committed
284
	    echo "Must build CDROM/MFS files on a FreeBSD system!"; \
285
286
287
288
	    false; \
	fi

mfs: mfsoscheck
289
	@$(MAKE) -C os mfs
Leigh B Stoller's avatar
Leigh B Stoller committed
290
	@$(MAKE) -C clientside mfs
291

Mike Hibler's avatar
Mike Hibler committed
292
293
mfs-nostatic: mfsoscheck
	@NOSTATIC=1 $(MAKE) -C os mfs
Leigh B Stoller's avatar
Leigh B Stoller committed
294
	@NOSTATIC=1 $(MAKE) -C clientside mfs
Mike Hibler's avatar
Mike Hibler committed
295

296
mfs-install: destdircheck mfs client-mkdirs
297
	@$(MAKE) -C os mfs-install
Leigh B Stoller's avatar
Leigh B Stoller committed
298
	@$(MAKE) -C clientside mfs-install
299

Mike Hibler's avatar
Mike Hibler committed
300
301
mfs-nostatic-install: destdircheck mfs-nostatic client-mkdirs
	@$(MAKE) -C os mfs-install
Leigh B Stoller's avatar
Leigh B Stoller committed
302
	@$(MAKE) -C clientside mfs-install
Mike Hibler's avatar
Mike Hibler committed
303

304
305
306
frisbee-mfs: mfsoscheck
	@$(MAKE) -C cdrom/groklilo client
	@$(MAKE) -C os frisbee-mfs
Leigh B Stoller's avatar
Leigh B Stoller committed
307
	@$(MAKE) -C clientside frisbee-mfs
308

Mike Hibler's avatar
Mike Hibler committed
309
310
311
frisbee-mfs-nostatic: mfsoscheck
	@NOSTATIC=1 $(MAKE) -C cdrom/groklilo client
	@NOSTATIC=1 $(MAKE) -C os frisbee-mfs
Leigh B Stoller's avatar
Leigh B Stoller committed
312
	@NOSTATIC=1 $(MAKE) -C clientside frisbee-mfs
Mike Hibler's avatar
Mike Hibler committed
313

314
315
316
frisbee-mfs-install: destdircheck frisbee-mfs
	@CLIENT_BINDIR=/etc/testbed $(MAKE) -e -C cdrom/groklilo client-install
	@$(MAKE) -C os frisbee-mfs-install
Leigh B Stoller's avatar
Leigh B Stoller committed
317
	@$(MAKE) -C clientside frisbee-mfs-install
318

Mike Hibler's avatar
Mike Hibler committed
319
320
321
frisbee-mfs-nostatic-install: destdircheck frisbee-mfs-nostatic
	@CLIENT_BINDIR=/etc/testbed $(MAKE) -e -C cdrom/groklilo client-install
	@$(MAKE) -C os frisbee-mfs-install
Leigh B Stoller's avatar
Leigh B Stoller committed
322
	@$(MAKE) -C clientside frisbee-mfs-install
Mike Hibler's avatar
Mike Hibler committed
323

324
325
326
327
328
329
330
331
332
333
334
335
newnode-mfs: mfsoscheck
	@$(MAKE) -C clientside newnode-mfs

newnode-mfs-nostatic: mfsoscheck
	@NOSTATIC=1 $(MAKE) -C clientside newnode-mfs

newnode-mfs-install: destdircheck newnode-mfs client-mkdirs
	@$(MAKE) -C clientside newnode-mfs-install

newnode-mfs-nostatic-install: destdircheck newnode-mfs-nostatic client-mkdirs
	@$(MAKE) -C clientside newnode-mfs-install

Mike Hibler's avatar
Mike Hibler committed
336
337
338
339
340
cdboot: mfsoscheck client
	@echo "CD/Dongle files built"

cdboot-install: destdircheck cdboot
	@$(MAKE) -C cdrom client-install
Leigh B Stoller's avatar
Leigh B Stoller committed
341
	@$(MAKE) -C clientside/tmcc/freebsd6 cdboot-install
Mike Hibler's avatar
Mike Hibler committed
342

343
344
345
346
flashboot: mfsoscheck client
	@echo "Flash dongle files built"

flashboot-install: destdircheck flashboot
Leigh B Stoller's avatar
Leigh B Stoller committed
347
	@$(MAKE) -C clientside/tmcc/freebsd6 cdboot-install
348
349
	@$(MAKE) -C os frisbee-mfs-install
	@$(MAKE) -C flash client-install
Leigh B Stoller's avatar
Leigh B Stoller committed
350
	@$(MAKE) -C clientside frisbee-mfs-install
351

352
353
354
355
#
# A check to see if this is a 'real' install. Kinda hacky, but as far as I can
# tell, you can't put ifeq()'s inside of targets
#
356
357
358
359
360
ifeq ($(TBROOT),/usr/testbed)
UPDATETESTBED= @cd $(OBJDIR)/install && perl update-testbed
else
UPDATETESTBED= @echo "Skipping update check, since prefix isn't /usr/testbed"
endif
361
362
363
364
365
366
367
ifeq ($(ISMAINSITE),1)
update-testbed: update-testbed-nostop
else
update-testbed:	update-testbed-install
endif

update-testbed-install:
368
369
370
	@echo "Updating the testbed ..."
	$(UPDATETESTBED) -i -s

371
372
373
374
375
376
377
378
update-testbed-noinstall:
	@echo "Updating the testbed ..."
	$(UPDATETESTBED)

update-testbed-nostop:
	@echo "Updating the testbed ..."
	$(UPDATETESTBED) -i

379
380
381
382
383
384
385
386
387
388
389
390
391
update-testbed-force:
	@echo "Updating the testbed in force mode ..."
	$(UPDATETESTBED) -f

ifeq ($(TBROOT),/usr/testbed)
UPDATECHECK= @cd $(OBJDIR)/install && perl update-testbed -v
else
UPDATECHECK= @echo "Skipping update checks, since prefix isn't /usr/testbed"
endif
install-updatecheck:
	@echo "Checking to see if updates need to be run"
	$(UPDATECHECK)

392
ifeq ($(TBROOT),/usr/testbed)
393
SCHEMACHECK= cd $(OBJDIR)/db && perl schemacheck
394
395
396
397
398
399
400
else
SCHEMACHECK= @echo "Skipping schema check, since prefix isn't /usr/testbed"
endif
install-schemacheck:
	@echo "Checking DB schema..."
	$(SCHEMACHECK)

Chad Barb's avatar
   
Chad Barb committed
401
402
403
404
405
406
407
408
409
ifeq ($(TBROOT),/usr/testbed)
SITEVARSCHECK= cd $(OBJDIR)/db && perl sitevarscheck
else
SITEVARSCHECK= @echo "Skipping sitevars check, since prefix isn't /usr/testbed"
endif
install-sitevarscheck:
	@echo "Checking Site variables..."
	$(SITEVARSCHECK)

410
411
412
413
414
415
416
417
418
ifeq ($(TBROOT),/usr/testbed)
DBFILLCHECK= cd $(OBJDIR)/db && perl dbfillcheck
else
DBFILLCHECK= @echo "Skipping DB fill check, since prefix isn't /usr/testbed"
endif
install-dbfillcheck:
	@echo "Checking Initial DB Fill ..."
	$(DBFILLCHECK)

419
420
421
422
423
424
425
426
427
ifeq ($(TBROOT),/usr/testbed)
SETBUILDINFO= cd $(OBJDIR)/utils && perl setbuildinfo
else
SETBUILDINFO= @echo "Skipping setbuildinfo, since prefix isn't /usr/testbed"
endif
install-setbuildinfo:
	@echo "Setting the Build and Version info"
	$(SETBUILDINFO)

428
install-genischemacheck:
429
ifeq ($(PGENISUPPORT),1)
430
	@$(MAKE) -C protogeni install-genischemacheck
431
endif
Leigh B. Stoller's avatar
Leigh B. Stoller committed
432
	@echo "Done"
433

434
435
436
437
438
BRANCHCHECK=
BRANCHECHO= @echo "Skipping branch check since not the Mothership"
ifeq ($(ISMAINSITE),1)
ifeq ($(TBROOT),/usr/testbed)
BRANCHCHECK= cd $(SRCDIR) && \
439
		git status --porcelain -s -b | head -1 | grep -q -s current
440
441
442
443
444
445
446
BRANCHECHO= @echo "Checking to make sure you are on the mothership branch"
endif
endif
install-branchcheck:
	$(BRANCHECHO)
	$(BRANCHCHECK)

447
448
449
# We use separate src and obj trees in Emulab, so the traditional distclean to
# clean "made" files from a mingled source-and-obj tree is unnecessary.
# However, this may be useful if you mistakenly configure and make a src tree.
450
451
clean:		clean-subdirs
distclean:	distclean-subdirs
Mike Hibler's avatar
Mike Hibler committed
452
	rm -f Makeconf GNUmakefile config.h config.status config.cache config.log
453
	rm -f $(DISTCLEAN_FILES)
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468

#
# Be careful, do not run these unless you are updating your installation
# with a new IP subnet or domain name. 
#
boss-updateip-clean:	clean
	@$(MAKE) -C rc.d clean
	@$(MAKE) -C apache clean
	@$(MAKE) -C named clean
	@$(MAKE) -C dhcpd clean

ops-updateip-clean:	clean
	@$(MAKE) -C rc.d clean
	@$(MAKE) -C apache clean

469
470
471
472
update-rcd:
	@$(MAKE) -C rc.d all
	@$(MAKE) -C rc.d install

473
474
475
476
#
# Here's a different approch to recover from just configure problems.  It cleans
# all files from an obj tree that have a corresponding .in file in the src tree.
undo-configure:
477
	find $SRCDIR -name '*.in' -a -not -name configure.in | \
478
	    sed -e "s;$SRCDIR;$OBJDIR;" -e 's;[.]in$;;' | xargs rm -f
479

480
481
482
483
484
485
#
# XXX a "temporary" hack for scripts that were evolving fast.
# We didn't want to have to remake the client image whenever we changed these.
# They are copied over to the embryonic boss and ops during setup.
#
elabinelab-scripts:
486
	mkdir -p $(INSTALL_TOPDIR)/etc
487
488
	cp -f $(SRCDIR)/clientside/tmcc/freebsd/mkextrafs.pl $(INSTALL_TOPDIR)/etc/
	cp -f $(SRCDIR)/clientside/tmcc/common/config/rc.mkelab $(INSTALL_TOPDIR)/etc/
489

490
ifeq ($(SPEWFROMOPS),1)
491
elabinelab-nogit: elabinelab-scripts
492
493
494
495
	-mkdir -p /share/emulab
	rm -f /share/emulab/emulab-src.tar.gz
	tar czf /share/emulab/emulab-src.tar.gz -C $(SRCDIR) --exclude=.git .

496
elabinelab-git: elabinelab-scripts
497
498
	-mkdir -p /share/emulab
	rm -f /share/emulab/emulab-src.tar.gz
499
	(cd $(SRCDIR); \
500
501
502
503
	 git archive HEAD > /share/emulab/emulab-src.tar)
	tar rf /share/emulab/emulab-src.tar -C $(SRCDIR) \
	 --exclude=.git protogeni/rspec-geni
	gzip /share/emulab/emulab-src.tar
504
else
505
elabinelab-nogit: elabinelab-scripts
506
507
	-mkdir -p $(INSTALL_TOPDIR)/src
	rm -f $(INSTALL_TOPDIR)/src/emulab-src.tar.gz
508
	tar czf $(INSTALL_TOPDIR)/src/emulab-src.tar.gz -C $(SRCDIR) --exclude=.git .
509

510
elabinelab-git: elabinelab-scripts
511
512
	-mkdir -p $(INSTALL_TOPDIR)/src
	rm -f $(INSTALL_TOPDIR)/src/emulab-src.tar.gz
513
	(cd $(SRCDIR); \
514
515
516
517
	 git archive HEAD > $(INSTALL_TOPDIR)/src/emulab-src.tar)
	tar rf $(INSTALL_TOPDIR)/src/emulab-src.tar -C $(SRCDIR) \
	 --exclude=.git protogeni/rspec-geni
	gzip $(INSTALL_TOPDIR)/src/emulab-src.tar
518
endif
519

520
521
522
523
524
# How to recursively descend into subdirectories to make general
# targets such as `all'.
%.MAKE:
	@$(MAKE) -C $(dir $@) $(basename $(notdir $@))
%-subdirs: $(addsuffix /%.MAKE,$(SUBDIRS)) ;
525

526
527
# By default, make any target by descending into subdirectories.
%: %-subdirs ;
528

529
530
.PHONY: post-install install-mkdirs clrhouse-install install \
	boss-install-noupdatecheck boss-install-noschemacheck \
531
532
	boss-install-force update-testbed update-testbed-install \
	update-testbed-noinstall update-testbed-nostop
533
534
535

# Get rid of a bunch of nasty built-in implicit rules.
.SUFFIXES: