Mostly autogenerating string resources.
[tripe-android] / Makefile
CommitLineData
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
25PACKAGE = tripe-android
26VERSION := $(shell ./auto-version)
9190adc6 27VSN = 1
9c15124f
MW
28
29.SECONDEXPANSION: #sorry
30
31###--------------------------------------------------------------------------
9190adc6 32### Preliminary magic.
9c15124f 33
9190adc6
MW
34empty =
35space = $(empty) $(empty)
36comma = ,
a5ec891a 37
9190adc6
MW
38definedp = $(filter-out undefined,$(origin $1))
39defaulting = $(if $(call definedp,$1),$($1),$2)
9c15124f 40
9190adc6 41all::
9c15124f 42
9190adc6
MW
43###--------------------------------------------------------------------------
44### Build parameters.
9c15124f 45
9190adc6
MW
46abs_srcdir := $(abspath .)
47hostos := $(shell uname -s | tr A-Z a-z)
48hostcpu := $(shell uname -m | tr A-Z a-z)
9c15124f 49
9190adc6
MW
50## Of course we have `ccache'.
51CCACHE := $(shell \
52 if ccache --version >/dev/null 2>&1; then echo ccache; fi)
9c15124f 53
9190adc6
MW
54## Where to put the object files.
55OUTDIR = out
56CONFIGDIR = $(OUTDIR)/config
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 61explicit-tmpdir-p = $(if $(call definedp,TMPDIR),t,nil)
9c15124f
MW
62ifeq ($(explicit-tmpdir-p), t)
63 JAVADEFS += -Djava.io.tmpdir=$(TMPDIR)
64endif
65
66## Java compiler.
9190adc6
MW
67JAVAC = javac $(addprefix -J,$(JAVADEFS))
68JAVAFLAGS = -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.
77noip-available-p := $(shell noip echo t 2>/dev/null || echo nil)
78ifeq ($(noip-available-p), t)
79 NOIP = noip
80endif
81ifeq "$(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
85else
86 SCALAC = scalac $(JAVADEFS)
9190adc6 87 SCALA = scala $(JAVADEFS) -nc
9c15124f
MW
88 SCALAC_RESET =
89endif
5c2b1515
MW
90SCALAFLAGS = -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.
96CFLAGS = -O2 -g -Wall
97LDFLAGS = -Wl,-z,defs
98
99## Host toolchain.
100FLAVOURS += host
101ENV.host =
102CC.host = gcc
103CFLAGS.host = $(CFLAGS) -fPIC
104LD.host = $(CC.host)
105LDFLAGS.host = $(LDFLAGS)
106CONFIG.host =
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 $@
114REALCLEANFILES += $(CONFIGDIR)/jdkdir.mk
115include $(CONFIGDIR)/jdkdir.mk
116
117JDKPLAT := $(shell \
118 case $(hostos) in \
119 (darwin) echo macosx ;; \
120 (*) echo $(hostos) ;; \
121 esac)
122CFLAGS.host += -I$(JDKDIR)/include -I$(JDKDIR)/include/$(JDKPLAT)
123
124## Android SDK location.
125ANDROID_SDKDIR = /usr/local/android/sdk
126MINAPI = 15
127TARGETAPI = 23
128TOOLVERSION = 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.
132#ANDROID_ABIS += armeabi
9190adc6
MW
133GNUARCH.armeabi = arm-linux-androideabi
134PLATARCH.armeabi = arm
135CFLAGS.ndk-armeabi =
136
0157de02 137#ANDROID_ABIS += arm64-v8a
9190adc6
MW
138GNUARCH.arm64-v8a = aarch64-linux-android
139PLATARCH.arm64-v8a = arm64
140MINAPI.arm64-v8a = 21
141
142ANDROID_ABIS += x86
143TOOLCHAINDIR.x86 = x86
144GNUARCH.x86 = i686-linux-android
145PLATARCH.x86 = x86
146
0157de02 147#ANDROID_ABIS += x86_64
9190adc6
MW
148TOOLCHAINDIR.x86_64 = x86_64
149GNUARCH.x86_64 = x86_64-linux-android
150PLATARCH.x86_64 = x86_64
151MINAPI.x86_64 = 21
152
153FLAVOURS += $(ANDROID_ABIS)
154
155## Build variants.
156VARIANTS += debug
157AAPTFLAGS.debug = --debug-mode \
0157de02 158 --rename-manifest-package uk.org.distorted.tripe.debug
9190adc6
MW
159KEYSTORE.debug = debug.keystore
160JARSIGNERFLAGS.debug = -storepass public -keypass public
161
162VARIANTS += release
163KEYSTORE.release = release.keystore
164JARSIGNERFLAGS.release =
165
166## Android NDK location.
167ANDROID_NDKDIR = $(ANDROID_SDKDIR)/ndk-bundle
168NDK_HOSTARCH = $(hostos)-$(hostcpu)
169
170## Android NDK toolchains.
171ndk-sysroot = \
172 $(ANDROID_NDKDIR)/platforms/android-$(call defaulting,MINAPI.$1,$(MINAPI))/arch-$(PLATARCH.$1)
173ndk-toolchain-bin = \
174 $(ANDROID_NDKDIR)/toolchains/$(call defaulting,TOOLCHAINDIR.$1,$(GNUARCH.$1))-$(TOOLVERSION)/prebuilt/$(NDK_HOSTARCH)/bin
175ENV.ndk = env PATH=$(call ndk-toolchain-bin,$1):$$PATH
176CC.ndk = $(GNUARCH.$1)-gcc
177LD.ndk = $(CC.ndk)
0157de02
MW
178CFLAGS.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)
183LDFLAGS.ndk = $(LDFLAGS) -pie \
184 --sysroot=$(call ndk-sysroot,$1)
185CONFIG.ndk = --host=$(GNUARCH.$1)
186
187## Flavour options.
188tool = $(call defaulting,$2.$1,$(call $2.ndk,$1))
189
190## Subject name for debug key.
191DEBUGDN = CN=Straylight/Edgeware, L=Cambridge, C=GB
192
193## Android libraries.
194ANDROID_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 $@
203include $(CONFIGDIR)/scaladir.mk
204REALCLEANFILES += $(CONFIGDIR)/scaladir.mk
205SCALA_LIB = $(SCALADIR)/lib/scala-library.jar
9c15124f
MW
206
207## Silent-rules is on by default.
3a2f1a4b 208V = 0
9c15124f
MW
209
210## Allow local overrides at this point.
211-include local.mk
212
213###--------------------------------------------------------------------------
214### Silent-rules machinery.
215
3a2f1a4b
MW
216v_tag = $(call v_tag_$V,$1)
217v_tag_0 = @printf " %-8s %s\n" "$1" "$@";
9c15124f 218
3a2f1a4b
MW
219V_AT = $(V_AT_$V)
220V_AT_0 = @
221
9c15124f 222###--------------------------------------------------------------------------
9190adc6 223### Other handy functions.
3bb2303d
MW
224
225join-paths = $(if $(filter /%,$2),$2,$1/$2)
3a2f1a4b 226
9190adc6
MW
227## Datestamp files.
228STAMPDIR = $(OUTDIR)/stamp
229stamps = $(patsubst %,$(STAMPDIR)/%.$1-stamp,$2)
230stamp-base = $(patsubst $(STAMPDIR)/%-stamp,%,$1)
231stamp-name = $(basename $(call stamp-base,$1))
232stamp-type = $(patsubst .%,%,$(suffix $(call stamp-base,$1)))
8eabb4ff 233
9c15124f
MW
234###--------------------------------------------------------------------------
235### And now we can start building things.
236
3a2f1a4b
MW
237all::
238.PHONY: all
239
9c15124f
MW
240clean::
241.PHONY: clean
242
9190adc6
MW
243realclean:: clean
244.PHONY: realclean
3a2f1a4b 245
9190adc6
MW
246distclean:: realclean
247.PHONY: distclean
9c15124f 248
9190adc6
MW
249###--------------------------------------------------------------------------
250### External native packages.
9c15124f 251
9190adc6
MW
252## Definitions.
253EXTERNALS += adns
254adns_CONFIG = --disable-dynamic
2812483e 255
9190adc6
MW
256EXTERNALS += mLib
257mLib_DEPS = adns
258mLib_CONFIG = --enable-static --disable-shared --with-adns
9c15124f 259
9190adc6
MW
260EXTERNALS += catacomb
261catacomb_DEPS = mLib
262catacomb_CONFIG = --enable-static --disable-shared
9c15124f 263
9190adc6
MW
264EXTERNALS += tripe
265tripe_DEPS = mLib catacomb
266tripe_CONFIG = --without-wireshark --with-adns --with-tunnel=slip
267
268## Machinery.
269ext-stamps = $(foreach f,$2,$(call stamps,$f,$1))
270
271ext-srcdir = $(call defaulting,$1_SRCDIR,../$1)
272ext-builddir = $(OUTDIR)/build.$1/$2
273ext-prefix = $(OUTDIR)/inst.$1
274ext-absprefix = $(abs_srcdir)/$(call ext-prefix,$1)
275
276ext-stamp-srcdir = $(call ext-srcdir,$(call stamp-name,$1))
277ext-stamp-builddir = \
278 $(call ext-builddir,$(call stamp-type,$1),$(call stamp-name,$1))
279ext-stamp-absprefix = $(call ext-absprefix,$(call stamp-type,$1))
280ext-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
285EXTSTAMPS = $(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.$$*
325realclean:: $(foreach f,$(FLAVOURS),realclean-$f)
3a2f1a4b 326
9c15124f 327###--------------------------------------------------------------------------
9190adc6 328### Our own native programs.
9c15124f 329
9190adc6
MW
330## Fetching package configuration.
331PKG_CONFIG = pkg-config --static
332PKGS = catacomb mLib
3a2f1a4b 333
9190adc6
MW
334PCOPT.CFLAGS = --cflags
335PCOPT.LIBS = --libs
9c15124f 336
9190adc6
MW
337pkg-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.
342APKLIBS += libtripe.so
343libtripe.so_SRCS = jni.c
344libtripe.so_EXTS = mLib catacomb tripe
345libtripe.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)
352libtripe.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) \
357 $(call pkg-config,$1,mLib,LIBS)
358
359## Machinery for compiling.
360objdir = $(OUTDIR)/obj.$1
361objects = $(patsubst %.c,$(call objdir,$1)/%$3,$2)
362
363apklib-objects = $(call objects,$1,$($2_SRCS),$3)
364obj-base = $(patsubst $(OUTDIR)/obj.%.o,%,$1)
365obj-type = $(patsubst %/,%,$(dir $(call obj-base,$1)))
366obj-name = $(notdir $(call obj-base,$1))
367obj-tool = $(call tool,$(call obj-type,$1),$2)
368
369define obj-rule
370$1_OBJS := $$(foreach f,$$(FLAVOURS),\
371 $$(call objects,$$f,$$($1_SRCS),.o))
372DEPFILES += $$(foreach f,$$(FLAVOURS),\
373 $$(call objects,$$f,$$($1_SRCS),.d))
374$$($1_OBJS): $$(OUTDIR)/obj.%.o: \
375 $$$$(call obj-name,$$$$@).c \
376 $$$$(call stamps,$$$$(call obj-type,$$$$@),$$$$($1_EXTS))
377 $$(V_AT)mkdir -p $$(dir $$@)
378 $$(call v_tag,CC)$$(call obj-tool,$$@,ENV) \
379 $$(call obj-tool,$$@,CC) -c -o$$@ -MD \
380 $$(call obj-tool,$$@,CFLAGS) \
381 $$(call $1_CFLAGS,$$(call obj-type,$$@)) \
382 $$<
383endef
384$(foreach a,$(APKLIBS), $(eval $(call obj-rule,$a)))
385
386CLEANFILES += $(OUTDIR)/obj.*/*.o $(OUTDIR)/obj.*/*.d
387
388## Machinery for linking.
389JNIDIR.host = $(OUTDIR)
390JNIDIR.ndk = $(OUTDIR)/pkg/lib/$1
391
392define apklib-rule
393INSTFILES += $$(call tool,$1,JNIDIR)/$2
394$$(call tool,$1,JNIDIR)/$2: $$(call objects,$$f,$$($2_SRCS),.o)
395 $$(V_AT)mkdir -p $$(dir $$@)
396 $$(call v_tag,LD)$$(call tool,$1,ENV) \
397 $$(call tool,$1,LD) -o$$@ \
398 $$(call tool,$1,LDFLAGS) -shared \
399 $$^ \
400 $$(call $2_LIBS,$1)
401endef
402
403$(foreach f,$(FLAVOURS), \
404$(foreach a,$(APKLIBS), \
405 $(eval $(call apklib-rule,$f,$a))))
406
407CLEANFILES += $(OUTDIR)/pkg/lib/*/lib*.so $(OUTDIR)/lib*.so
8eabb4ff 408
9c15124f 409###--------------------------------------------------------------------------
7eb3f62e
MW
410### Android string resource generation.
411
412GENSTRINGS += package=PACKAGE
413GENSTRINGS += version=VERSION
414GENSTRINGS += vsn=VSN
415
416$(foreach e,$(EXTERNALS),\
417 $(eval GENSTRINGS += $e_version=$e_VERSION))
418
419BUILD := $(shell uuid -v4)
420GENSTRINGS += build_uuid=BUILD
421
422genstring-name = $(firstword $(subst =, ,$1))
423genstring-value = $($(word 2,$(subst =, ,$1)))
424
425define gen-strings
426 $(V_AT)mkdir -p $(dir $1)
427 $(call v_tag,GEN)set -e; rm -f $1.new; exec >$1.new; \
428 echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; \
429 echo "<resources>"; \
430 $(foreach g,$(GENSTRINGS), \
431 echo " <string name=\"auto_$(call genstring-name,$g)\">$(call genstring-value,$g)</string>";) \
432 echo "</resources>"
433 $(V_AT)mv $1.new $1
434endef
435$(OUTDIR)/res.dummy/values/auto.xml: Makefile
436 $(call gen-strings,$@)
437
438###--------------------------------------------------------------------------
9190adc6
MW
439### Java and Scala building.
440
441JARDIR = $(OUTDIR)/jar
442CLASSDIR = $(OUTDIR)/cls
443
444## External libraries we need to adopt. Grab them and feed them to `dx'
445## separately, because they take aaaaages and we don't want to have to do
446## this on every incremental build.
447JARS = $(SCALA_LIB)
448
449DEXJARS =
450define jar-rule
451DEXJARS += $$(JARDIR)/$$(notdir $1)
452$$(JARDIR)/$$(notdir $1): $1
453 $$(V_AT)mkdir -p $$(JARDIR)/
454 $$(V_AT)rm -f $$@ $$(basename $$@)-new.jar
455 $$(call v_tag,DX)dx --dex --output=$$(basename $$@)-new.jar $1
456 $$(V_AT)mv $$(basename $$@)-new.jar $$@
457endef
458$(foreach j,$(JARS), $(eval $(call jar-rule,$j)))
459
460REALCLEANFILES += $(JARDIR)/*.jar
9c15124f
MW
461
462## Writing things out longhand is tedious. `CLASSES' is a list of entries of
463## the form `SRC[:DEP,...]', saying that `SRC.ext', being a source file
9190adc6
MW
464## capable of being built into `.class' files and setting `SRC.class-stamp',
465## should be so built, and that it depends on other similar sources named DEP
466## having been so built.
2812483e 467CLASSES += util
9c15124f
MW
468CLASSES += sys:util
469CLASSES += admin:sys,util
470CLASSES += tar:util
0157de02 471CLASSES += dep:util
04a5abae
MW
472CLASSES += progress:sys,util
473CLASSES += keys:progress,tar,sys,util
474CLASSES += terminal:progress,sys,util
9190adc6
MW
475CLASSES += R
476CLASSES += toy-activity:R
477
478## Building class files.
479$(STAMPDIR)/%.class-stamp: %.java
480 $(V_AT)mkdir -p $(CLASSDIR)/
481 $(call v_tag,JAVAC)$(JAVAC) $(JAVAFLAGS) \
482 -bootclasspath $(ANDROID_JAR) \
483 -d $(CLASSDIR) -cp $(CLASSDIR) \
484 $<
485 $(V_AT)$(SCALAC_RESET)
486 $(V_AT)touch $@
487$(STAMPDIR)/%.class-stamp: %.scala
488 $(V_AT)mkdir -p $(CLASSDIR)/
489 $(call v_tag,SCALAC)$(SCALAC) $(SCALAFLAGS) \
490 -javabootclasspath $(ANDROID_JAR) \
491 -bootclasspath $(SCALA_LIB) \
492 -d $(CLASSDIR) -cp $(CLASSDIR) \
493 $<
494 $(V_AT)touch $@
9c15124f
MW
495
496## Machinery for parsing the `CLASSES' list.
9c15124f 497class-name = $(firstword $(subst :, ,$1))
9190adc6 498class-deps = $(subst $(comma), ,$(word 2,$(subst :, ,$1)))
9c15124f 499
9190adc6
MW
500CLASSNAMES = $(foreach c,$(CLASSES),$(call class-name,$c))
501CLASSSTAMPS = $(call stamps,class,$(CLASSNAMES))
9c15124f 502
9190adc6
MW
503$(foreach c,$(CLASSES), \
504$(eval $(call stamps,class,$(call class-name,$c)): \
a5ec891a 505 $(call stamps,class,$(call class-deps,$c))))
9c15124f 506
9190adc6
MW
507CLEANFILES += $(CLASSSTAMPS)
508clean::; rm -rf $(OUTDIR)/cls
a5ec891a
MW
509
510###--------------------------------------------------------------------------
9190adc6
MW
511### Android building machinery.
512
513VPATH += $(OUTDIR)/src
514CLEANFILES += $(OUTDIR)/*.apk
515
516AAPTFLAGS = \
517 --min-sdk-version $(MINAPI) --target-sdk-version $(TARGETAPI) \
7eb3f62e 518 --version-name "$(VERSION)" --version-code $(VSN) --auto-add-overlay
9190adc6 519
7eb3f62e 520$(OUTDIR)/src/R.java: AndroidManifest.xml $(OUTDIR)/res.dummy/values/auto.xml
9190adc6
MW
521 $(V_AT)mkdir -p $(dir $@)
522 $(call v_tag,AAPT)aapt package $(AAPTFLAGS) \
7eb3f62e
MW
523 -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.dummy/ \
524 -I $(ANDROID_JAR) \
9190adc6
MW
525 -J $(dir $@) --generate-dependencies
526CLEANFILES += $(OUTDIR)/src/R.java $(OUTDIR)/src/R.java.d
527-include $(OUTDIR)/src/R.java.d
528
529BINS = catsign key pathmtu
530CLEANFILES += $(INSTFILES)
531define bin-rule
532INSTFILES += $$(OUTDIR)/pkg/assets/bin/$1/$2
533$$(OUTDIR)/pkg/assets/bin/$1/$2: $$$$(call ext-stamps,$$$$(EXTERNALS),$1)
534 $$(V_AT)mkdir -p $$(dir $$@)
535 $$(call v_tag,CP)cp $$(call ext-prefix,$1)/bin/$2 $$@
536endef
0157de02 537$(foreach f,$(ANDROID_ABIS), \
9190adc6
MW
538$(foreach b,$(BINS), \
539 $(eval $(call bin-rule,$f,$b))))
540
541DISTCLEANFILES += debug.keystore
542debug.keystore:
543 $(call v_tag,KEYTOOL)keytool -genkeypair -alias debug \
544 -keyalg RSA -keysize 3072 \
545 -dname "$(DEBUGDN)" -validity 10000 \
546 -keystore $@ -storetype PKCS12 \
547 -storepass public -keypass public
548
549INSTFILES += $(OUTDIR)/pkg/classes.dex
550$(OUTDIR)/pkg/classes.dex: $(CLASSSTAMPS) $(DEXJARS)
551 $(V_AT)mkdir -p $(dir $@)
552 $(call v_tag,DX)dx --dex --output=$@ $(CLASSDIR) $(JARDIR)
553
7eb3f62e
MW
554$(OUTDIR)/res.volatile/values/auto.xml: $(INSTFILES)
555 $(call gen-strings,$@)
556
9190adc6 557$(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.unsigned.apk): \
7eb3f62e 558$(OUTDIR)/tripe-%.unsigned.apk: $(INSTFILES) $(OUTDIR)/res.volatile/values/auto.xml
9190adc6 559 $(call v_tag,AAPT)aapt package -f $(AAPTFLAGS) $(AAPTFLAGS.$*) \
7eb3f62e
MW
560 -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.volatile/ \
561 -I $(ANDROID_JAR) -F $@ $(OUTDIR)/pkg/
9190adc6
MW
562
563$(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.signed.apk): \
564$(OUTDIR)/tripe-%.signed.apk: $(OUTDIR)/tripe-%.unsigned.apk $$(KEYSTORE.$$*)
565 $(call v_tag,JARSIGN)jarsigner -keystore $(KEYSTORE.$*) \
566 $(JARSIGNERFLAGS.$*) \
567 -signedjar $@ $< $(call defaulting,KEYALIAS.$*,$*)
568
569$(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.apk): \
570$(OUTDIR)/tripe-%.apk: $(OUTDIR)/tripe-%.signed.apk
571 $(call v_tag,ZIPALGN)zipalign $(ZIPALIGNFLAGS.$*) -f 4 $< $@
572
573$(VARIANTS): %: $(OUTDIR)/tripe-%.apk
574.PHONY: $(VARIANTS)
9c15124f
MW
575
576###--------------------------------------------------------------------------
577### Finishing touches.
3a2f1a4b 578
9190adc6 579all:: debug
9c15124f 580
9190adc6
MW
581clean::; rm -f $(CLEANFILES)
582realclean::; rm -f $(REALCLEANFILES)
3a2f1a4b 583
0157de02
MW
584repl: $(CLASSSTAMPS) $(foreach a,$(APKLIBS),$(OUTDIR)/$a)
585 $(SCALA) -cp $(CLASSDIR) -Djava.lib.path=$(OUTDIR) -Yno-load-impl-class
586
9190adc6
MW
587t:; : $(show)
588.PHONY: t
2812483e 589
9190adc6 590-include $(DEPFILES)
3a2f1a4b 591
9c15124f 592###----- That's all, folks --------------------------------------------------