-
Notifications
You must be signed in to change notification settings - Fork 7
/
Makefile
385 lines (306 loc) · 11.8 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
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
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
# Master makefile for Elko server and applications
#
# Make operations are all in reference to a configured set of applications and
# components. These components are listed by name in the file 'components' or
# by defining COMPONENTS as an environment variable or on the make command
# line. Also, regardless how the set of components is configured externally,
# the components will always includes the core server itself.
#
# Instructions:
# make - Default make, currently same as "make build".
# make build - Make .jars for configured components.
# make clean - Remove intermediate files for configured components.
# make javadoc - Make a Javadoc site for the configured components.
# make sdk - Make a distribution package for developers (including
# documentation and support files). Uses a stripped
# version of the server .jar
# make db - Make MongoDB setup scripts
# make deploy - Make an Elko internal deployment package containing the
# configured components
#
# make <COMPONENTNAME> - Build a particular named component's .jar
# make all - Build all components
# Makefile hackery to allow the subst function to replace spaces (this is how
# the gnumake documentation says to do it, honest).
EMPTY :=
SPACE := $(EMPTY) $(EMPTY)
# What to make if no make target is otherwise specified.
default: build
# Make everything, mainly because people expect to be able to do this
all: export COMPONENTS = $(ALL_COMPONENTS)
all:
$(MAKE) build
# Extract the components list from the 'components' file.
export COMPONENTS ?= ServerCore $(shell cat components)
# List of directories where the various components are rooted
COMP_DIRS = $(COMPONENTS:%=../%)
# The directories where compiled .class files for configured components are put
CLA_DIRS = $(subst $(SPACE),:,$(COMPONENTS:%=../%/built/classes))
# The directories where Java source files for configured components are
JAV_DIRS = $(subst $(SPACE),:,$(COMPONENTS:%=../%/java))
# List of directories where MongoDB object definition files are found
DB_DIRS = $(COMPONENTS:%=../%/db)
# List of .jar files for configured components
COMP_JARS = $(COMPONENTS:%=../%/built/bin/*.jar)
# Directory where javadoc output goes
JAVADOC_DIR := Doc/Javadoc
# Directory where components are put for distribution
DIST_DIR := ../Distrib
# Directory from which to obtain 3rd party components
EXT_IMPORT_DIR := $(DIST_DIR)/External
# Directory to where built components are placed
INT_IMPORT_DIR := $(DIST_DIR)/Internal
# Directory into which shippable distribution files should be put
SHIP_DIR := $(DIST_DIR)/Ship
# Directory where the sources for the runtime environment files are
RUN_DIR := ../Run
# Current list of 3rd party components that the server requires
EXT_JARS = $(EXT_IMPORT_DIR)/mongo.jar:$(EXT_IMPORT_DIR)/ScalableSSL.jar:$(EXT_IMPORT_DIR)/zmq.jar
# Add 3rd party .jars to the class path
ifeq ($(CLASSPATH),)
CLASSPATH = $(CLA_DIRS):$(EXT_JARS)
else
CLASSPATH := $(CLASSPATH):$(CLA_DIRS):$(EXT_JARS)
endif
#############################################################
# Recursive invocation of various make targets on configured components
#############################################################
TASK ?= build
build: TASK = build
build: $(COMPONENTS)
clean: TASK = clean
clean: $(COMPONENTS)
installable: TASK = installable
installable: $(COMPONENTS)
%-build: $(@:%-build=%)
cd ../$(@:%-build=%)/build; make dist
%-clean: $(@:%-clean=%)
cd ../$(@:%-clean=%)/build; make clean
%-installable: $(@:%-installable=%)
cd ../$(@:%-installable=%)/build; make installable
#############################################################
# The available components
#############################################################
ALL_COMPONENTS = ServerCore ZeroMQ Example
# The server and its parts
ServerCore:
$(MAKE) $@-$(TASK)
ZeroMQ: ServerCore
$(MAKE) $@-$(TASK)
# The applications
Example: ServerCore
$(MAKE) $@-$(TASK)
#############################################################
# SDK related stuff
#############################################################
# Base name for the SDK package that gets generated by "make sdk"
SDK_NAME := ElkoSDK
# Pre-configured component set for the SDK
SDK_COMPONENTS := ServerCore
# Make the SDK
sdk: export COMPONENTS = $(SDK_COMPONENTS)
sdk: PKG_NAME = $(SDK_NAME)
sdk: PACK_FILES = $(SDK_NAME)
sdk: gen-tempdir do-sdk pack-tempdir
@echo
@echo '****************************************'
@echo '* SDK package is in $(PACK_TARGET)'
@echo '****************************************'
# Web client files
WEB_DIR = ../Web
WEB_FILES = \
READ.ME \
chat.html \
chatjq.html \
connection.html \
connection.js \
connectionjq.html \
connectionjq.js \
json.js \
session.js \
trace.js
DOC_DIR = ../ServerCore/doc
DOC_FILES = \
ElkoTutorial.pdf \
broker.html \
clientcui.html \
clientmods.html \
cui.html \
director.html \
gatekeeper.html \
httpjmsg.html \
index.html \
jmsg.html \
presence.html \
repository.html \
rtcp.txt \
serverconfig.html \
servercui.html \
servermods.html \
elko.css \
elkologosmall.png
# Example "game"
EXAMPLE_DIR = ../Example
# Gather the SDK package contents
do-sdk: do-sdk-deploy javadoc
cp ../LICENSE.md $(PKG_DIR)
mkdir $(PKG_DIR)/Doc
cp $(DOC_FILES:%=$(DOC_DIR)/%) $(PKG_DIR)/Doc
cp -rf $(JAVADOC_DIR) $(PKG_DIR)/Doc/javadoc
mkdir $(PKG_DIR)/Example
cp -rf $(EXAMPLE_DIR)/db $(EXAMPLE_DIR)/java $(PKG_DIR)/Example
mkdir $(PKG_DIR)/Web
cp $(WEB_FILES:%=$(WEB_DIR)/%) $(PKG_DIR)/Web
# Gather the deployment package contents that belong in the SDK
do-sdk-deploy: do-build
mkdir -p $(PKG_DIR)
cp $(COMP_JARS) $(PKG_DIR)
./stripjar $(PKG_DIR)/elkoserver.jar
mv $(PKG_DIR)/elkoserver.jar $(PKG_DIR)/elkosdk.jar
#############################################################
# Deployment related stuff
#############################################################
# Base name for the deployment package that gets generated by "make deploy"
DEPLOY_NAME := ElkoDeploy
# Make the deployment package
deploy: PKG_NAME = $(DEPLOY_NAME)
deploy: PACK_FILES = install $(DEPLOY_NAME)
deploy: gen-tempdir do-core-deploy do-private-deploy purge-rundirs pack-tempdir
@echo
@echo '****************************************'
@echo '* Built deployment package containing $(COMPONENTS)'
@echo '* Deployment package is in $(PACK_TARGET)'
@echo '****************************************'
# Common run-time environment files
RUN_COMMON_DIR = $(RUN_DIR)/common
RUN_COMMON_FILES = \
brokercmd \
brokerwatcher \
cleanRundir \
clearModules \
clusterStart \
clusterStop \
debugStart \
refreshModuleProperties \
rmModule \
setenvvars \
setlocvars \
startBrokerWatcher \
startComponent \
useModuleInternal \
useModuleUploaded \
validateModule
RUN_MANAGE_DIR = $(RUN_DIR)/manage
RUN_MANAGE_FILES = \
admin.js \
configurize.php \
genlaunch.php \
launcherfuncs.php \
manage.php \
manage_environ.php \
overview.php \
validatecluster.php \
elko.css \
elkologosmall.png \
title_bg.png
# Run environments for distribution
RUN_ENVS_CORE = \
run.basiccluster \
run.example \
run_template
# Gather the deployment package contents that are independent of destination
do-core-deploy: do-build db
mkdir -p $(PKG_DIR)/Distrib/Internal
cp $(COMP_JARS) $(PKG_DIR)/Distrib/Internal
mkdir $(PKG_DIR)/Scripts
mv $(DBINIT_SCRIPT) $(PKG_DIR)/Scripts
cp $(RUN_DIR)/mongosupport/mongohelper.js $(PKG_DIR)/Scripts
cp ./Scripts/* $(PKG_DIR)/Scripts
mkdir -p $(PKG_DIR)/Run/common
cp $(RUN_COMMON_FILES:%=$(RUN_COMMON_DIR)/%) $(PKG_DIR)/Run/common
mkdir -p $(PKG_DIR)/Run/manage
cp $(RUN_MANAGE_FILES:%=$(RUN_MANAGE_DIR)/%) $(PKG_DIR)/Run/manage
mkdir -p $(PKG_DIR)/Run/overview
$(foreach F,$(RUN_ENVS_CORE),cp -r $(RUN_DIR)/$(F) $(PKG_DIR)/Run/;)
# Run environments for organization internal use only
RUN_ENVS_PRIVATE = \
run.full_production
# Gather the deployment package contents that are strictly internal
do-private-deploy:
cp -Rf $(EXT_IMPORT_DIR)/ $(PKG_DIR)/Distrib/External
$(foreach F,$(RUN_ENVS_PRIVATE),cp -r $(RUN_DIR)/$(F) $(PKG_DIR)/Run/;)
purge-rundirs:
$(eval RUNDIRS := $(shell echo $(PKG_DIR)/Run/run.*))
$(foreach D,$(RUNDIRS),cd $(D); ../common/cleanRundir;)
#############################################################
# Packaging stuff, shared in common by deployment and SDK makes
#############################################################
# Recursive build, to allow the Makefile to override the components list
do-build:
$(MAKE) build
# Create a temporary place in which to accumulate a package's contents
gen-tempdir:
$(eval TEMP_DIR := $(shell mktemp -d -t elkoworkXXXXX))
$(eval PKG_DIR := $(TEMP_DIR)/$(PKG_NAME))
mkdir $(PKG_DIR)
# Bundle the contents of the temporary directory into a tarball
pack-tempdir:
cp ./install $(TEMP_DIR)
cd $(TEMP_DIR) ; touch .svn ; /bin/rm -rf `find . -name .svn`
$(eval PACK_TARGET := $(SHIP_DIR)/$(PKG_NAME).tar.gz)
$(eval TGT := $(shell cd $(dir $(PACK_TARGET)); pwd))
cd $(TEMP_DIR) ; tar cfz $(TGT)/$(notdir $(PACK_TARGET)) $(PACK_FILES)
rm -rf $(TEMP_DIR)
#############################################################
# MongoDB related stuff
#############################################################
# Mongo shell Javascript files for component-specific configuration setup
MONGODB_PREINITS = $(shell find $(COMP_DIRS) -path '*/db/*' -name 'dbinitpre.js')
MONGODB_POSTINITS = $(shell find $(COMP_DIRS) -path '*/db/*' -name 'dbinitpost.js')
# JSON object definitions supplied by the various components
MONGODB_OBJECTS = $(shell find $(COMP_DIRS) -path '*/db/*' -name '*.json')
# The file that actually gets produced by "make db"
DBINIT_SCRIPT = Built/dbinit.sh
# Make the database setup stuff
db: $(DBINIT_SCRIPT)
# Synthesize the database init script
$(DBINIT_SCRIPT):
java -cp ../ServerCore/built/bin/elkoserver.jar org.elkoserver.util.JSONValidator $(MONGODB_OBJECTS)
echo '#!/bin/bash' > $(DBINIT_SCRIPT)
echo 'mongo elko --shell mongohelper.js <<ENDINITS' >> $(DBINIT_SCRIPT)
cat $(MONGODB_PREINITS) >> $(DBINIT_SCRIPT)
$(foreach F,$(MONGODB_OBJECTS),echo "eupdate("`sed -e 's/\\\/\\\\\\\\/' -e 's/\\$$/\\\\$$/' < $(F)`")" >> $(DBINIT_SCRIPT);)
cat $(MONGODB_POSTINITS) >> $(DBINIT_SCRIPT)
echo 'ENDINITS' >> $(DBINIT_SCRIPT)
chmod +x $(DBINIT_SCRIPT)
#############################################################
# Javadoc related stuff
#############################################################
# Base URL for linkage into official Java API Javadoc pages
EXTERNAL_JAVADOC = http://java.sun.com/j2se/1.5/docs/api
# Java packages for configured components included in the Javadoc output
JAVADOC_PKGS = $(shell find $(COMP_DIRS) -name javadoc-package-list)
# Javadoc group definitions for configured components
JAVADOC_GROUPS = $(shell find $(COMP_DIRS) -name javadoc-group-defs)
# Root FQN for all our packages and classes
PKG_ROOT = org.elkoserver
# Make the Javadoc pages
javadoc: $(JAVADOC_DIR)
cat $(JAVADOC_PKGS) > _javadoc-package-list
rm -rf $(JAVADOC_DIR)/*
$(eval GROUP_PARAMS := $(shell cat $(JAVADOC_GROUPS)))
javadoc -d $(JAVADOC_DIR) \
-sourcepath $(JAV_DIRS) \
-classpath "$(CLASSPATH)" \
-link $(EXTERNAL_JAVADOC) \
-tag internal:Xa:"Internal:" \
-windowtitle "Elko Server Framework" \
@_javadoc-package-list \
$(GROUP_PARAMS)
mv _javadoc-package-list $(JAVADOC_DIR)/package-list
# Make the directory where the Javadoc output will go
$(JAVADOC_DIR):
mkdir -p $(JAVADOC_DIR)
#############################################################
.PHONY: default build clean installable sdk do-sdk deploy do-core-deploy do-private-deploy do-build gen-tempdir pack-tempdir db javadoc
.PHONY: ServerCore ZeroMQ