Commit | Line | Data |
---|---|---|
3a2f1a4b | 1 | ### -*-makefile-*- |
9c15124f MW |
2 | ### |
3 | ### Build script for the TrIPE Android app | |
4 | ### | |
5 | ### (c) 2018 Straylight/Edgeware | |
6 | ### | |
3a2f1a4b | 7 | |
9c15124f MW |
8 | ###----- Licensing notice --------------------------------------------------- |
9 | ### | |
10 | ### This file is part of the Trivial IP Encryption (TrIPE) Android app. | |
11 | ### | |
12 | ### TrIPE is free software: you can redistribute it and/or modify it under | |
13 | ### the terms of the GNU General Public License as published by the Free | |
14 | ### Software Foundation; either version 3 of the License, or (at your | |
15 | ### option) any later version. | |
16 | ### | |
17 | ### TrIPE is distributed in the hope that it will be useful, but WITHOUT | |
18 | ### ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
19 | ### FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
20 | ### for more details. | |
21 | ### | |
22 | ### You should have received a copy of the GNU General Public License | |
23 | ### along with TrIPE. If not, see <https://www.gnu.org/licenses/>. | |
24 | ||
25 | PACKAGE = tripe-android | |
26 | VERSION := $(shell ./auto-version) | |
9190adc6 | 27 | VSN = 1 |
9c15124f MW |
28 | |
29 | .SECONDEXPANSION: #sorry | |
30 | ||
31 | ###-------------------------------------------------------------------------- | |
9190adc6 | 32 | ### Preliminary magic. |
9c15124f | 33 | |
9190adc6 MW |
34 | empty = |
35 | space = $(empty) $(empty) | |
36 | comma = , | |
a5ec891a | 37 | |
9190adc6 MW |
38 | definedp = $(filter-out undefined,$(origin $1)) |
39 | defaulting = $(if $(call definedp,$1),$($1),$2) | |
9c15124f | 40 | |
9190adc6 | 41 | all:: |
9c15124f | 42 | |
9190adc6 MW |
43 | ###-------------------------------------------------------------------------- |
44 | ### Build parameters. | |
9c15124f | 45 | |
9190adc6 MW |
46 | abs_srcdir := $(abspath .) |
47 | hostos := $(shell uname -s | tr A-Z a-z) | |
48 | hostcpu := $(shell uname -m | tr A-Z a-z) | |
9c15124f | 49 | |
9190adc6 MW |
50 | ## Of course we have `ccache'. |
51 | CCACHE := $(shell \ | |
52 | if ccache --version >/dev/null 2>&1; then echo ccache; fi) | |
9c15124f | 53 | |
9190adc6 MW |
54 | ## Where to put the object files. |
55 | OUTDIR = out | |
ad64fbfa | 56 | CONFIGDIR = $(OUTDIR)/config-$(hostcpu) |
9c15124f MW |
57 | |
58 | ## The Java runtime, for some reason, hardcodes its default for | |
59 | ## `java.io.tmpdir', inviting security problems. If the user has defined a | |
60 | ## `TMPDIR', then persuade Java to use it. | |
9190adc6 | 61 | explicit-tmpdir-p = $(if $(call definedp,TMPDIR),t,nil) |
9c15124f MW |
62 | ifeq ($(explicit-tmpdir-p), t) |
63 | JAVADEFS += -Djava.io.tmpdir=$(TMPDIR) | |
64 | endif | |
65 | ||
66 | ## Java compiler. | |
9190adc6 MW |
67 | JAVAC = javac $(addprefix -J,$(JAVADEFS)) |
68 | JAVAFLAGS = -source 1.6 -target 1.6 | |
9c15124f MW |
69 | |
70 | ## Scala compiler. | |
71 | ## | |
72 | ## Unfortunately, `fsc' is a total security disaster. On the other hand, | |
73 | ## `scalac' is rather slow. If we're running with a custom `TMPDIR', and the | |
74 | ## `noip' wrapper <https://git.distorted.org.uk/~mdw/preload-hacks/> is | |
75 | ## available, then we can tame `fsc' enough that it's probably safe to run; | |
76 | ## otherwise, it's too risky to enable by default. | |
77 | noip-available-p := $(shell noip echo t 2>/dev/null || echo nil) | |
78 | ifeq ($(noip-available-p), t) | |
79 | NOIP = noip | |
80 | endif | |
81 | ifeq "$(explicit-tmpdir-p),$(noip-available-p)" "t,t" | |
9190adc6 MW |
82 | SCALAC = noip fsc $(JAVADEFS) |
83 | SCALA = noip scala $(JAVADEFS) | |
9c15124f MW |
84 | SCALAC_RESET = $(SCALAC) -reset |
85 | else | |
86 | SCALAC = scalac $(JAVADEFS) | |
9190adc6 | 87 | SCALA = scala $(JAVADEFS) -nc |
9c15124f MW |
88 | SCALAC_RESET = |
89 | endif | |
5c2b1515 MW |
90 | SCALAFLAGS = -optimise -feature -deprecation -Xfatal-warnings \ |
91 | -Xlint -Xlint:-package-object-classes \ | |
9190adc6 MW |
92 | -Yinline-warnings:false -target:jvm-1.6 \ |
93 | -Yno-load-impl-class | |
94 | ||
95 | ## Basic C toolchain flags. | |
96 | CFLAGS = -O2 -g -Wall | |
97 | LDFLAGS = -Wl,-z,defs | |
98 | ||
99 | ## Host toolchain. | |
ad64fbfa MW |
100 | FLAVOURS += host-$(hostcpu) |
101 | ENV.host-$(hostcpu) = | |
102 | CC.host-$(hostcpu) = gcc | |
103 | CFLAGS.host-$(hostcpu) = $(CFLAGS) -fPIC | |
104 | LD.host-$(hostcpu) = $(CC.host-$(hostcpu)) | |
105 | LDFLAGS.host-$(hostcpu) = $(LDFLAGS) | |
106 | CONFIG.host-$(hostcpu) = | |
9190adc6 MW |
107 | |
108 | ## Host JNI machinery. | |
109 | $(CONFIGDIR)/jdkdir.mk: | |
110 | $(V_AT)mkdir -p $(dir $@) | |
111 | $(call v_tag,CONFIG)java -XshowSettings:properties 2>&1 | \ | |
112 | sed -n 's:^ *java\.home *= *\(.*\)/jre$$:JDKDIR = \1:p' >$@.new | |
113 | $(V_AT)mv $@.new $@ | |
114 | REALCLEANFILES += $(CONFIGDIR)/jdkdir.mk | |
115 | include $(CONFIGDIR)/jdkdir.mk | |
116 | ||
117 | JDKPLAT := $(shell \ | |
118 | case $(hostos) in \ | |
119 | (darwin) echo macosx ;; \ | |
120 | (*) echo $(hostos) ;; \ | |
121 | esac) | |
ad64fbfa | 122 | CFLAGS.host-$(hostcpu) += -I$(JDKDIR)/include -I$(JDKDIR)/include/$(JDKPLAT) |
9190adc6 MW |
123 | |
124 | ## Android SDK location. | |
125 | ANDROID_SDKDIR = /usr/local/android/sdk | |
126 | MINAPI = 15 | |
127 | TARGETAPI = 23 | |
128 | TOOLVERSION = 4.9 | |
129 | ||
0157de02 MW |
130 | ## Android ABI definitions. We don't bother with `armeabi-v7a': we'll use |
131 | ## fancy CPU features if we detect that they're available at runtime anyway. | |
d5f0ba62 | 132 | ANDROID_ABIS += armeabi |
9190adc6 MW |
133 | GNUARCH.armeabi = arm-linux-androideabi |
134 | PLATARCH.armeabi = arm | |
135 | CFLAGS.ndk-armeabi = | |
136 | ||
d5f0ba62 | 137 | ANDROID_ABIS += arm64-v8a |
9190adc6 MW |
138 | GNUARCH.arm64-v8a = aarch64-linux-android |
139 | PLATARCH.arm64-v8a = arm64 | |
140 | MINAPI.arm64-v8a = 21 | |
141 | ||
142 | ANDROID_ABIS += x86 | |
143 | TOOLCHAINDIR.x86 = x86 | |
144 | GNUARCH.x86 = i686-linux-android | |
145 | PLATARCH.x86 = x86 | |
146 | ||
d5f0ba62 | 147 | ANDROID_ABIS += x86_64 |
9190adc6 MW |
148 | TOOLCHAINDIR.x86_64 = x86_64 |
149 | GNUARCH.x86_64 = x86_64-linux-android | |
150 | PLATARCH.x86_64 = x86_64 | |
151 | MINAPI.x86_64 = 21 | |
152 | ||
153 | FLAVOURS += $(ANDROID_ABIS) | |
154 | ||
155 | ## Build variants. | |
156 | VARIANTS += debug | |
157 | AAPTFLAGS.debug = --debug-mode \ | |
0157de02 | 158 | --rename-manifest-package uk.org.distorted.tripe.debug |
9190adc6 MW |
159 | KEYSTORE.debug = debug.keystore |
160 | JARSIGNERFLAGS.debug = -storepass public -keypass public | |
161 | ||
162 | VARIANTS += release | |
163 | KEYSTORE.release = release.keystore | |
164 | JARSIGNERFLAGS.release = | |
165 | ||
166 | ## Android NDK location. | |
167 | ANDROID_NDKDIR = $(ANDROID_SDKDIR)/ndk-bundle | |
168 | NDK_HOSTARCH = $(hostos)-$(hostcpu) | |
169 | ||
170 | ## Android NDK toolchains. | |
171 | ndk-sysroot = \ | |
172 | $(ANDROID_NDKDIR)/platforms/android-$(call defaulting,MINAPI.$1,$(MINAPI))/arch-$(PLATARCH.$1) | |
173 | ndk-toolchain-bin = \ | |
174 | $(ANDROID_NDKDIR)/toolchains/$(call defaulting,TOOLCHAINDIR.$1,$(GNUARCH.$1))-$(TOOLVERSION)/prebuilt/$(NDK_HOSTARCH)/bin | |
175 | ENV.ndk = env PATH=$(call ndk-toolchain-bin,$1):$$PATH | |
176 | CC.ndk = $(GNUARCH.$1)-gcc | |
177 | LD.ndk = $(CC.ndk) | |
0157de02 MW |
178 | CFLAGS.ndk = $(CFLAGS) -fPIC $(CFLAGS.ndk-$1) \ |
179 | -D__ANDROID_API__=$(call defaulting,MINAPI.$1,$(MINAPI)) \ | |
9190adc6 MW |
180 | --sysroot=$(call ndk-sysroot,$1) \ |
181 | -isystem $(ANDROID_NDKDIR)/sysroot/usr/include \ | |
182 | -isystem $(ANDROID_NDKDIR)/sysroot/usr/include/$(GNUARCH.$1) | |
183 | LDFLAGS.ndk = $(LDFLAGS) -pie \ | |
184 | --sysroot=$(call ndk-sysroot,$1) | |
185 | CONFIG.ndk = --host=$(GNUARCH.$1) | |
186 | ||
187 | ## Flavour options. | |
188 | tool = $(call defaulting,$2.$1,$(call $2.ndk,$1)) | |
189 | ||
190 | ## Subject name for debug key. | |
191 | DEBUGDN = CN=Straylight/Edgeware, L=Cambridge, C=GB | |
192 | ||
193 | ## Android libraries. | |
194 | ANDROID_JAR = \ | |
195 | $(ANDROID_SDKDIR)/platforms/android-$(MINAPI)/android.jar | |
196 | ||
197 | ## Scala libraries. | |
198 | $(CONFIGDIR)/scaladir.mk: | |
199 | $(V_AT)mkdir -p $(dir $@) | |
200 | $(call v_tag,CONFIG)$(SCALA) -J-XshowSettings:properties -help 2>&1 | \ | |
201 | sed -n 's:^ *scala\.home *= *:SCALADIR = :p' >$@.new | |
202 | $(V_AT)mv $@.new $@ | |
203 | include $(CONFIGDIR)/scaladir.mk | |
204 | REALCLEANFILES += $(CONFIGDIR)/scaladir.mk | |
205 | SCALA_LIB = $(SCALADIR)/lib/scala-library.jar | |
9c15124f MW |
206 | |
207 | ## Silent-rules is on by default. | |
3a2f1a4b | 208 | V = 0 |
9c15124f MW |
209 | |
210 | ## Allow local overrides at this point. | |
211 | -include local.mk | |
212 | ||
213 | ###-------------------------------------------------------------------------- | |
214 | ### Silent-rules machinery. | |
215 | ||
3a2f1a4b MW |
216 | v_tag = $(call v_tag_$V,$1) |
217 | v_tag_0 = @printf " %-8s %s\n" "$1" "$@"; | |
9c15124f | 218 | |
3a2f1a4b MW |
219 | V_AT = $(V_AT_$V) |
220 | V_AT_0 = @ | |
221 | ||
9c15124f | 222 | ###-------------------------------------------------------------------------- |
9190adc6 | 223 | ### Other handy functions. |
3bb2303d MW |
224 | |
225 | join-paths = $(if $(filter /%,$2),$2,$1/$2) | |
3a2f1a4b | 226 | |
9190adc6 MW |
227 | ## Datestamp files. |
228 | STAMPDIR = $(OUTDIR)/stamp | |
229 | stamps = $(patsubst %,$(STAMPDIR)/%.$1-stamp,$2) | |
230 | stamp-base = $(patsubst $(STAMPDIR)/%-stamp,%,$1) | |
231 | stamp-name = $(basename $(call stamp-base,$1)) | |
232 | stamp-type = $(patsubst .%,%,$(suffix $(call stamp-base,$1))) | |
8eabb4ff | 233 | |
9c15124f MW |
234 | ###-------------------------------------------------------------------------- |
235 | ### And now we can start building things. | |
236 | ||
3a2f1a4b MW |
237 | all:: |
238 | .PHONY: all | |
239 | ||
9c15124f MW |
240 | clean:: |
241 | .PHONY: clean | |
242 | ||
9190adc6 MW |
243 | realclean:: clean |
244 | .PHONY: realclean | |
3a2f1a4b | 245 | |
9190adc6 MW |
246 | distclean:: realclean |
247 | .PHONY: distclean | |
9c15124f | 248 | |
9190adc6 MW |
249 | ###-------------------------------------------------------------------------- |
250 | ### External native packages. | |
9c15124f | 251 | |
9190adc6 MW |
252 | ## Definitions. |
253 | EXTERNALS += adns | |
254 | adns_CONFIG = --disable-dynamic | |
2812483e | 255 | |
9190adc6 MW |
256 | EXTERNALS += mLib |
257 | mLib_DEPS = adns | |
258 | mLib_CONFIG = --enable-static --disable-shared --with-adns | |
9c15124f | 259 | |
9190adc6 MW |
260 | EXTERNALS += catacomb |
261 | catacomb_DEPS = mLib | |
262 | catacomb_CONFIG = --enable-static --disable-shared | |
9c15124f | 263 | |
9190adc6 MW |
264 | EXTERNALS += tripe |
265 | tripe_DEPS = mLib catacomb | |
266 | tripe_CONFIG = --without-wireshark --with-adns --with-tunnel=slip | |
267 | ||
268 | ## Machinery. | |
269 | ext-stamps = $(foreach f,$2,$(call stamps,$f,$1)) | |
270 | ||
271 | ext-srcdir = $(call defaulting,$1_SRCDIR,../$1) | |
272 | ext-builddir = $(OUTDIR)/build.$1/$2 | |
273 | ext-prefix = $(OUTDIR)/inst.$1 | |
274 | ext-absprefix = $(abs_srcdir)/$(call ext-prefix,$1) | |
275 | ||
276 | ext-stamp-srcdir = $(call ext-srcdir,$(call stamp-name,$1)) | |
277 | ext-stamp-builddir = \ | |
278 | $(call ext-builddir,$(call stamp-type,$1),$(call stamp-name,$1)) | |
279 | ext-stamp-absprefix = $(call ext-absprefix,$(call stamp-type,$1)) | |
280 | ext-stamp-tool = $(call tool,$(call stamp-type,$1),$2) | |
281 | ||
7eb3f62e MW |
282 | $(foreach e,$(EXTERNALS),\ |
283 | $(eval $e_VERSION := $$(shell cd $$(call ext-srcdir,$e) && $$(abs_srcdir)/auto-version))) | |
284 | ||
9190adc6 MW |
285 | EXTSTAMPS = $(call ext-stamps,$(EXTERNALS),$(FLAVOURS)) |
286 | ||
287 | $(EXTSTAMPS): \ | |
288 | $(STAMPDIR)/%-stamp: \ | |
289 | $$(call ext-stamps, \ | |
290 | $$($$(call stamp-name,$$@)_DEPS), \ | |
291 | $$(call stamp-type,$$@)) | |
292 | $(V_AT)mkdir -p $(STAMPDIR) | |
293 | $(V_AT)rm -rf $(call ext-stamp-builddir,$@) | |
294 | $(V_AT)mkdir -p $(call ext-stamp-builddir,$@) | |
295 | cd $(call ext-stamp-builddir,$@) && \ | |
296 | $(call ext-stamp-tool,$@,ENV) \ | |
297 | $(call join-paths,../../..,$(call ext-stamp-srcdir,$@))/configure \ | |
298 | --prefix=$(call ext-stamp-absprefix,$@) \ | |
299 | $(call ext-stamp-tool,$@,CONFIG) \ | |
300 | $($(call stamp-name,$@)_CONFIG) \ | |
301 | CC="$(CCACHE) $(call ext-stamp-tool,$@,CC)" \ | |
302 | CFLAGS="$(call ext-stamp-tool,$@,CFLAGS) -I$(call ext-stamp-absprefix,$@)/include" \ | |
303 | LD="$(call ext-stamp-tool,$@,LD)" \ | |
304 | LDFLAGS="$(call ext-stamp-tool,$@,LDFLAGS) -L$(call ext-stamp-absprefix,$@)/lib" \ | |
305 | PKG_CONFIG="pkg-config --static" \ | |
306 | PKG_CONFIG_LIBDIR=$(call ext-stamp-absprefix,$@)/lib/pkgconfig | |
307 | $(call ext-stamp-tool,$@,ENV) \ | |
308 | $(MAKE) -C$(call ext-stamp-builddir,$@) | |
309 | $(call ext-stamp-tool,$@,ENV) \ | |
310 | $(MAKE) -C$(call ext-stamp-builddir,$@) install | |
311 | $(V_AT)touch $@ | |
312 | ||
313 | $(foreach f,$(FLAVOURS),$(foreach e,$(EXTERNALS),clean-$e.$f)): clean-%: | |
314 | rm -f $(STAMPDIR)/$*-stamp | |
315 | rm -rf $(call ext-stamp-builddir,$*) | |
316 | .PHONY: $(foreach f,$(FLAVOURS),$(foreach e,$(EXTERNALS),clean-$e.$f)) | |
0157de02 | 317 | $(foreach e,$(EXTERNALS),clean-$e): clean-%: $(foreach f,$(FLAVOURS),clean-%.$f) |
9190adc6 MW |
318 | $(foreach f,$(FLAVOURS),clean-inst.$f): clean-inst.%: |
319 | rm -rf $(call ext-prefix,$*) | |
320 | .PHONY: $(foreach f,$(FLAVOURS),clean-inst.$f) | |
321 | ||
322 | $(foreach f,$(FLAVOURS),realclean-$f): realclean-%: \ | |
323 | $$(foreach e,$$(EXTERNALS),clean-$$e.$$*) \ | |
324 | clean-inst.$$* | |
325 | realclean:: $(foreach f,$(FLAVOURS),realclean-$f) | |
3a2f1a4b | 326 | |
9c15124f | 327 | ###-------------------------------------------------------------------------- |
9190adc6 | 328 | ### Our own native programs. |
9c15124f | 329 | |
9190adc6 MW |
330 | ## Fetching package configuration. |
331 | PKG_CONFIG = pkg-config --static | |
332 | PKGS = catacomb mLib | |
3a2f1a4b | 333 | |
9190adc6 MW |
334 | PCOPT.CFLAGS = --cflags |
335 | PCOPT.LIBS = --libs | |
9c15124f | 336 | |
9190adc6 MW |
337 | pkg-config = $(shell \ |
338 | env PKG_CONFIG_LIBDIR=$(call ext-prefix,$1)/lib/pkgconfig \ | |
339 | $(PKG_CONFIG) $(PCOPT.$3) $2) | |
3bb2303d | 340 | |
9190adc6 MW |
341 | ## Definitions. |
342 | APKLIBS += libtripe.so | |
343 | libtripe.so_SRCS = jni.c | |
344 | libtripe.so_EXTS = mLib catacomb tripe | |
345 | libtripe.so_CFLAGS = -I$(call ext-prefix,$1)/include \ | |
346 | -I$(call ext-srcdir,tripe)/common \ | |
347 | -I$(call ext-srcdir,tripe)/priv \ | |
348 | -I$(call ext-srcdir,tripe)/server \ | |
349 | -I$(call ext-builddir,$1,tripe)/config \ | |
350 | $(call pkg-config,$1,mLib,CFLAGS) \ | |
351 | $(call pkg-config,$1,catacomb,CFLAGS) | |
352 | libtripe.so_LIBS = $(call ext-builddir,$1,tripe)/server/libtripe.a \ | |
353 | $(call ext-builddir,$1,tripe)/priv/libpriv.a \ | |
354 | $(call ext-builddir,$1,tripe)/common/libcommon.a \ | |
355 | -L$(call ext-prefix,$1)/lib \ | |
356 | $(call pkg-config,$1,catacomb,LIBS) \ | |
d5f0ba62 MW |
357 | $(call pkg-config,$1,mLib,LIBS) \ |
358 | -ladns | |
9190adc6 MW |
359 | |
360 | ## Machinery for compiling. | |
361 | objdir = $(OUTDIR)/obj.$1 | |
362 | objects = $(patsubst %.c,$(call objdir,$1)/%$3,$2) | |
363 | ||
364 | apklib-objects = $(call objects,$1,$($2_SRCS),$3) | |
365 | obj-base = $(patsubst $(OUTDIR)/obj.%.o,%,$1) | |
366 | obj-type = $(patsubst %/,%,$(dir $(call obj-base,$1))) | |
367 | obj-name = $(notdir $(call obj-base,$1)) | |
368 | obj-tool = $(call tool,$(call obj-type,$1),$2) | |
369 | ||
370 | define obj-rule | |
371 | $1_OBJS := $$(foreach f,$$(FLAVOURS),\ | |
372 | $$(call objects,$$f,$$($1_SRCS),.o)) | |
373 | DEPFILES += $$(foreach f,$$(FLAVOURS),\ | |
374 | $$(call objects,$$f,$$($1_SRCS),.d)) | |
375 | $$($1_OBJS): $$(OUTDIR)/obj.%.o: \ | |
376 | $$$$(call obj-name,$$$$@).c \ | |
377 | $$$$(call stamps,$$$$(call obj-type,$$$$@),$$$$($1_EXTS)) | |
378 | $$(V_AT)mkdir -p $$(dir $$@) | |
379 | $$(call v_tag,CC)$$(call obj-tool,$$@,ENV) \ | |
380 | $$(call obj-tool,$$@,CC) -c -o$$@ -MD \ | |
381 | $$(call obj-tool,$$@,CFLAGS) \ | |
382 | $$(call $1_CFLAGS,$$(call obj-type,$$@)) \ | |
383 | $$< | |
384 | endef | |
385 | $(foreach a,$(APKLIBS), $(eval $(call obj-rule,$a))) | |
386 | ||
387 | CLEANFILES += $(OUTDIR)/obj.*/*.o $(OUTDIR)/obj.*/*.d | |
388 | ||
389 | ## Machinery for linking. | |
ad64fbfa | 390 | JNIDIR.host-$(hostcpu) = $(OUTDIR)/lib.host-$(hostcpu) |
9190adc6 MW |
391 | JNIDIR.ndk = $(OUTDIR)/pkg/lib/$1 |
392 | ||
393 | define apklib-rule | |
394 | INSTFILES += $$(call tool,$1,JNIDIR)/$2 | |
395 | $$(call tool,$1,JNIDIR)/$2: $$(call objects,$$f,$$($2_SRCS),.o) | |
396 | $$(V_AT)mkdir -p $$(dir $$@) | |
397 | $$(call v_tag,LD)$$(call tool,$1,ENV) \ | |
398 | $$(call tool,$1,LD) -o$$@ \ | |
399 | $$(call tool,$1,LDFLAGS) -shared \ | |
400 | $$^ \ | |
401 | $$(call $2_LIBS,$1) | |
402 | endef | |
403 | ||
404 | $(foreach f,$(FLAVOURS), \ | |
405 | $(foreach a,$(APKLIBS), \ | |
406 | $(eval $(call apklib-rule,$f,$a)))) | |
407 | ||
ad64fbfa MW |
408 | CLEANFILES += $(OUTDIR)/pkg/lib/*/lib*.so |
409 | CLEANFILES += $(OUTDIR)/lib.host-$(hostcpu)/lib*.so | |
8eabb4ff | 410 | |
9c15124f | 411 | ###-------------------------------------------------------------------------- |
7eb3f62e MW |
412 | ### Android string resource generation. |
413 | ||
414 | GENSTRINGS += package=PACKAGE | |
415 | GENSTRINGS += version=VERSION | |
416 | GENSTRINGS += vsn=VSN | |
417 | ||
418 | $(foreach e,$(EXTERNALS),\ | |
419 | $(eval GENSTRINGS += $e_version=$e_VERSION)) | |
420 | ||
421 | BUILD := $(shell uuid -v4) | |
422 | GENSTRINGS += build_uuid=BUILD | |
423 | ||
424 | genstring-name = $(firstword $(subst =, ,$1)) | |
425 | genstring-value = $($(word 2,$(subst =, ,$1))) | |
426 | ||
427 | define gen-strings | |
428 | $(V_AT)mkdir -p $(dir $1) | |
429 | $(call v_tag,GEN)set -e; rm -f $1.new; exec >$1.new; \ | |
430 | echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; \ | |
431 | echo "<resources>"; \ | |
432 | $(foreach g,$(GENSTRINGS), \ | |
433 | echo " <string name=\"auto_$(call genstring-name,$g)\">$(call genstring-value,$g)</string>";) \ | |
434 | echo "</resources>" | |
435 | $(V_AT)mv $1.new $1 | |
436 | endef | |
437 | $(OUTDIR)/res.dummy/values/auto.xml: Makefile | |
438 | $(call gen-strings,$@) | |
439 | ||
440 | ###-------------------------------------------------------------------------- | |
9190adc6 MW |
441 | ### Java and Scala building. |
442 | ||
443 | JARDIR = $(OUTDIR)/jar | |
444 | CLASSDIR = $(OUTDIR)/cls | |
445 | ||
446 | ## External libraries we need to adopt. Grab them and feed them to `dx' | |
447 | ## separately, because they take aaaaages and we don't want to have to do | |
448 | ## this on every incremental build. | |
449 | JARS = $(SCALA_LIB) | |
450 | ||
451 | DEXJARS = | |
452 | define jar-rule | |
453 | DEXJARS += $$(JARDIR)/$$(notdir $1) | |
454 | $$(JARDIR)/$$(notdir $1): $1 | |
455 | $$(V_AT)mkdir -p $$(JARDIR)/ | |
456 | $$(V_AT)rm -f $$@ $$(basename $$@)-new.jar | |
457 | $$(call v_tag,DX)dx --dex --output=$$(basename $$@)-new.jar $1 | |
458 | $$(V_AT)mv $$(basename $$@)-new.jar $$@ | |
459 | endef | |
460 | $(foreach j,$(JARS), $(eval $(call jar-rule,$j))) | |
461 | ||
462 | REALCLEANFILES += $(JARDIR)/*.jar | |
9c15124f MW |
463 | |
464 | ## Writing things out longhand is tedious. `CLASSES' is a list of entries of | |
465 | ## the form `SRC[:DEP,...]', saying that `SRC.ext', being a source file | |
9190adc6 MW |
466 | ## capable of being built into `.class' files and setting `SRC.class-stamp', |
467 | ## should be so built, and that it depends on other similar sources named DEP | |
468 | ## having been so built. | |
2812483e | 469 | CLASSES += util |
9c15124f MW |
470 | CLASSES += sys:util |
471 | CLASSES += admin:sys,util | |
472 | CLASSES += tar:util | |
0157de02 | 473 | CLASSES += dep:util |
04a5abae MW |
474 | CLASSES += progress:sys,util |
475 | CLASSES += keys:progress,tar,sys,util | |
476 | CLASSES += terminal:progress,sys,util | |
9190adc6 | 477 | CLASSES += R |
ad64fbfa MW |
478 | CLASSES += app:R |
479 | CLASSES += toy-activity:app,R | |
9190adc6 MW |
480 | |
481 | ## Building class files. | |
482 | $(STAMPDIR)/%.class-stamp: %.java | |
483 | $(V_AT)mkdir -p $(CLASSDIR)/ | |
484 | $(call v_tag,JAVAC)$(JAVAC) $(JAVAFLAGS) \ | |
485 | -bootclasspath $(ANDROID_JAR) \ | |
486 | -d $(CLASSDIR) -cp $(CLASSDIR) \ | |
487 | $< | |
488 | $(V_AT)$(SCALAC_RESET) | |
489 | $(V_AT)touch $@ | |
490 | $(STAMPDIR)/%.class-stamp: %.scala | |
491 | $(V_AT)mkdir -p $(CLASSDIR)/ | |
492 | $(call v_tag,SCALAC)$(SCALAC) $(SCALAFLAGS) \ | |
493 | -javabootclasspath $(ANDROID_JAR) \ | |
494 | -bootclasspath $(SCALA_LIB) \ | |
495 | -d $(CLASSDIR) -cp $(CLASSDIR) \ | |
496 | $< | |
497 | $(V_AT)touch $@ | |
9c15124f MW |
498 | |
499 | ## Machinery for parsing the `CLASSES' list. | |
9c15124f | 500 | class-name = $(firstword $(subst :, ,$1)) |
9190adc6 | 501 | class-deps = $(subst $(comma), ,$(word 2,$(subst :, ,$1))) |
9c15124f | 502 | |
9190adc6 MW |
503 | CLASSNAMES = $(foreach c,$(CLASSES),$(call class-name,$c)) |
504 | CLASSSTAMPS = $(call stamps,class,$(CLASSNAMES)) | |
9c15124f | 505 | |
9190adc6 MW |
506 | $(foreach c,$(CLASSES), \ |
507 | $(eval $(call stamps,class,$(call class-name,$c)): \ | |
a5ec891a | 508 | $(call stamps,class,$(call class-deps,$c)))) |
9c15124f | 509 | |
9190adc6 MW |
510 | CLEANFILES += $(CLASSSTAMPS) |
511 | clean::; rm -rf $(OUTDIR)/cls | |
a5ec891a MW |
512 | |
513 | ###-------------------------------------------------------------------------- | |
9190adc6 MW |
514 | ### Android building machinery. |
515 | ||
516 | VPATH += $(OUTDIR)/src | |
517 | CLEANFILES += $(OUTDIR)/*.apk | |
518 | ||
519 | AAPTFLAGS = \ | |
520 | --min-sdk-version $(MINAPI) --target-sdk-version $(TARGETAPI) \ | |
7eb3f62e | 521 | --version-name "$(VERSION)" --version-code $(VSN) --auto-add-overlay |
9190adc6 | 522 | |
7eb3f62e | 523 | $(OUTDIR)/src/R.java: AndroidManifest.xml $(OUTDIR)/res.dummy/values/auto.xml |
9190adc6 MW |
524 | $(V_AT)mkdir -p $(dir $@) |
525 | $(call v_tag,AAPT)aapt package $(AAPTFLAGS) \ | |
7eb3f62e MW |
526 | -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.dummy/ \ |
527 | -I $(ANDROID_JAR) \ | |
9190adc6 MW |
528 | -J $(dir $@) --generate-dependencies |
529 | CLEANFILES += $(OUTDIR)/src/R.java $(OUTDIR)/src/R.java.d | |
530 | -include $(OUTDIR)/src/R.java.d | |
531 | ||
532 | BINS = catsign key pathmtu | |
533 | CLEANFILES += $(INSTFILES) | |
534 | define bin-rule | |
535 | INSTFILES += $$(OUTDIR)/pkg/assets/bin/$1/$2 | |
536 | $$(OUTDIR)/pkg/assets/bin/$1/$2: $$$$(call ext-stamps,$$$$(EXTERNALS),$1) | |
537 | $$(V_AT)mkdir -p $$(dir $$@) | |
538 | $$(call v_tag,CP)cp $$(call ext-prefix,$1)/bin/$2 $$@ | |
539 | endef | |
0157de02 | 540 | $(foreach f,$(ANDROID_ABIS), \ |
9190adc6 MW |
541 | $(foreach b,$(BINS), \ |
542 | $(eval $(call bin-rule,$f,$b)))) | |
543 | ||
544 | DISTCLEANFILES += debug.keystore | |
545 | debug.keystore: | |
546 | $(call v_tag,KEYTOOL)keytool -genkeypair -alias debug \ | |
547 | -keyalg RSA -keysize 3072 \ | |
548 | -dname "$(DEBUGDN)" -validity 10000 \ | |
549 | -keystore $@ -storetype PKCS12 \ | |
550 | -storepass public -keypass public | |
551 | ||
552 | INSTFILES += $(OUTDIR)/pkg/classes.dex | |
553 | $(OUTDIR)/pkg/classes.dex: $(CLASSSTAMPS) $(DEXJARS) | |
554 | $(V_AT)mkdir -p $(dir $@) | |
555 | $(call v_tag,DX)dx --dex --output=$@ $(CLASSDIR) $(JARDIR) | |
556 | ||
7eb3f62e MW |
557 | $(OUTDIR)/res.volatile/values/auto.xml: $(INSTFILES) |
558 | $(call gen-strings,$@) | |
559 | ||
9190adc6 | 560 | $(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.unsigned.apk): \ |
7eb3f62e | 561 | $(OUTDIR)/tripe-%.unsigned.apk: $(INSTFILES) $(OUTDIR)/res.volatile/values/auto.xml |
9190adc6 | 562 | $(call v_tag,AAPT)aapt package -f $(AAPTFLAGS) $(AAPTFLAGS.$*) \ |
7eb3f62e MW |
563 | -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.volatile/ \ |
564 | -I $(ANDROID_JAR) -F $@ $(OUTDIR)/pkg/ | |
9190adc6 MW |
565 | |
566 | $(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.signed.apk): \ | |
567 | $(OUTDIR)/tripe-%.signed.apk: $(OUTDIR)/tripe-%.unsigned.apk $$(KEYSTORE.$$*) | |
568 | $(call v_tag,JARSIGN)jarsigner -keystore $(KEYSTORE.$*) \ | |
569 | $(JARSIGNERFLAGS.$*) \ | |
570 | -signedjar $@ $< $(call defaulting,KEYALIAS.$*,$*) | |
571 | ||
572 | $(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.apk): \ | |
573 | $(OUTDIR)/tripe-%.apk: $(OUTDIR)/tripe-%.signed.apk | |
574 | $(call v_tag,ZIPALGN)zipalign $(ZIPALIGNFLAGS.$*) -f 4 $< $@ | |
575 | ||
576 | $(VARIANTS): %: $(OUTDIR)/tripe-%.apk | |
577 | .PHONY: $(VARIANTS) | |
9c15124f MW |
578 | |
579 | ###-------------------------------------------------------------------------- | |
580 | ### Finishing touches. | |
3a2f1a4b | 581 | |
9190adc6 | 582 | all:: debug |
9c15124f | 583 | |
9190adc6 MW |
584 | clean::; rm -f $(CLEANFILES) |
585 | realclean::; rm -f $(REALCLEANFILES) | |
3a2f1a4b | 586 | |
ad64fbfa MW |
587 | repl: $(CLASSSTAMPS) $(foreach a,$(APKLIBS),$(JNIDIR.host-$(hostcpu))/$a) |
588 | $(SCALA) -cp $(CLASSDIR) -Yno-load-impl-class \ | |
b1ec59e3 | 589 | -Djava.library.path=$(JNIDIR.host-$(hostcpu)) \ |
0157de02 | 590 | |
9190adc6 MW |
591 | t:; : $(show) |
592 | .PHONY: t | |
2812483e | 593 | |
9190adc6 | 594 | -include $(DEPFILES) |
3a2f1a4b | 595 | |
9c15124f | 596 | ###----- That's all, folks -------------------------------------------------- |