3 ### Build script for the TrIPE Android app
5 ### (c) 2018 Straylight/Edgeware
8 ###----- Licensing notice ---------------------------------------------------
10 ### This file is part of the Trivial IP Encryption (TrIPE) Android app.
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.
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
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/>.
25 PACKAGE = tripe-android
26 VERSION := $(shell ./auto-version)
29 .SECONDEXPANSION: #sorry
31 ###--------------------------------------------------------------------------
32 ### Preliminary magic.
35 space = $(empty) $(empty)
38 definedp = $(filter-out undefined,$(origin $1))
39 defaulting = $(if $(call definedp,$1),$($1),$2)
43 ###--------------------------------------------------------------------------
46 abs_srcdir := $(abspath .)
47 hostos := $(shell uname -s | tr A-Z a-z)
48 hostcpu := $(shell uname -m | tr A-Z a-z)
50 ## Of course we have `ccache'.
52 if ccache --version >/dev/null 2>&1; then echo ccache; fi)
54 ## Where to put the object files.
56 CONFIGDIR = $(OUTDIR)/config-$(hostcpu)
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.
61 explicit-tmpdir-p = $(if $(call definedp,TMPDIR),t,nil)
62 ifeq ($(explicit-tmpdir-p), t)
63 JAVADEFS += -Djava.io.tmpdir=$(TMPDIR)
67 JAVAC = javac $(addprefix -J,$(JAVADEFS))
68 JAVAFLAGS = -source 1.6 -target 1.6
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)
81 ifeq "$(explicit-tmpdir-p),$(noip-available-p)" "t,t"
82 SCALAC = noip fsc $(JAVADEFS)
83 SCALA = noip scala $(JAVADEFS)
84 SCALAC_RESET = $(SCALAC) -reset
86 SCALAC = scalac $(JAVADEFS)
87 SCALA = scala $(JAVADEFS) -nc
90 SCALAFLAGS = -optimise -feature -deprecation -Xfatal-warnings \
91 -Xlint -Xlint:-package-object-classes \
92 -Yinline-warnings:false -target:jvm-1.6 \
95 ## Basic C toolchain flags.
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) =
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
114 REALCLEANFILES += $(CONFIGDIR)/jdkdir.mk
115 include $(CONFIGDIR)/jdkdir.mk
119 (darwin) echo macosx ;; \
120 (*) echo $(hostos) ;; \
122 CFLAGS.host-$(hostcpu) += -I$(JDKDIR)/include -I$(JDKDIR)/include/$(JDKPLAT)
124 ## Android SDK location.
125 ANDROID_SDKDIR = /usr/local/android/sdk
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
133 GNUARCH.armeabi = arm-linux-androideabi
134 PLATARCH.armeabi = arm
137 ANDROID_ABIS += arm64-v8a
138 GNUARCH.arm64-v8a = aarch64-linux-android
139 PLATARCH.arm64-v8a = arm64
140 MINAPI.arm64-v8a = 21
143 TOOLCHAINDIR.x86 = x86
144 GNUARCH.x86 = i686-linux-android
147 ANDROID_ABIS += x86_64
148 TOOLCHAINDIR.x86_64 = x86_64
149 GNUARCH.x86_64 = x86_64-linux-android
150 PLATARCH.x86_64 = x86_64
153 FLAVOURS += $(ANDROID_ABIS)
157 AAPTFLAGS.debug = --debug-mode \
158 --rename-manifest-package uk.org.distorted.tripe.debug
159 KEYSTORE.debug = debug.keystore
160 JARSIGNERFLAGS.debug = -storepass public -keypass public
163 KEYSTORE.release = release.keystore
164 JARSIGNERFLAGS.release =
166 ## Android NDK location.
167 ANDROID_NDKDIR = $(ANDROID_SDKDIR)/ndk-bundle
168 NDK_HOSTARCH = $(hostos)-$(hostcpu)
170 ## Android NDK toolchains.
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
178 CFLAGS.ndk = $(CFLAGS) -fPIC $(CFLAGS.ndk-$1) \
179 -D__ANDROID_API__=$(call defaulting,MINAPI.$1,$(MINAPI)) \
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)
188 tool = $(call defaulting,$2.$1,$(call $2.ndk,$1))
190 ## Subject name for debug key.
191 DEBUGDN = CN=Straylight/Edgeware, L=Cambridge, C=GB
193 ## Android libraries.
195 $(ANDROID_SDKDIR)/platforms/android-$(MINAPI)/android.jar
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
203 include $(CONFIGDIR)/scaladir.mk
204 REALCLEANFILES += $(CONFIGDIR)/scaladir.mk
205 SCALA_LIB = $(SCALADIR)/lib/scala-library.jar
207 ## Silent-rules is on by default.
210 ## Allow local overrides at this point.
213 ###--------------------------------------------------------------------------
214 ### Silent-rules machinery.
216 v_tag = $(call v_tag_$V,$1)
217 v_tag_0 = @printf " %-8s %s\n" "$1" "$@";
222 ###--------------------------------------------------------------------------
223 ### Other handy functions.
225 join-paths = $(if $(filter /%,$2),$2,$1/$2)
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)))
234 ###--------------------------------------------------------------------------
235 ### And now we can start building things.
246 distclean:: realclean
249 ###--------------------------------------------------------------------------
250 ### External native packages.
254 adns_CONFIG = --disable-dynamic
258 mLib_CONFIG = --enable-static --disable-shared --with-adns
260 EXTERNALS += catacomb
262 catacomb_CONFIG = --enable-static --disable-shared
265 tripe_DEPS = mLib catacomb
266 tripe_CONFIG = --without-wireshark --with-adns --with-tunnel=slip
269 ext-stamps = $(foreach f,$2,$(call stamps,$f,$1))
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)
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)
282 $(foreach e,$(EXTERNALS),\
283 $(eval $e_VERSION := $$(shell cd $$(call ext-srcdir,$e) && $$(abs_srcdir)/auto-version)))
285 EXTSTAMPS = $(call ext-stamps,$(EXTERNALS),$(FLAVOURS))
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
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))
317 $(foreach e,$(EXTERNALS),clean-$e): clean-%: $(foreach f,$(FLAVOURS),clean-%.$f)
318 $(foreach f,$(FLAVOURS),clean-inst.$f): clean-inst.%:
319 rm -rf $(call ext-prefix,$*)
320 .PHONY: $(foreach f,$(FLAVOURS),clean-inst.$f)
322 $(foreach f,$(FLAVOURS),realclean-$f): realclean-%: \
323 $$(foreach e,$$(EXTERNALS),clean-$$e.$$*) \
325 realclean:: $(foreach f,$(FLAVOURS),realclean-$f)
327 ###--------------------------------------------------------------------------
328 ### Our own native programs.
330 ## Fetching package configuration.
331 PKG_CONFIG = pkg-config --static
334 PCOPT.CFLAGS = --cflags
337 pkg-config = $(shell \
338 env PKG_CONFIG_LIBDIR=$(call ext-prefix,$1)/lib/pkgconfig \
339 $(PKG_CONFIG) $(PCOPT.$3) $2)
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) \
357 $(call pkg-config,$1,mLib,LIBS) \
360 ## Machinery for compiling.
361 objdir = $(OUTDIR)/obj.$1
362 objects = $(patsubst %.c,$(call objdir,$1)/%$3,$2)
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)
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,$$@)) \
385 $(foreach a,$(APKLIBS), $(eval $(call obj-rule,$a)))
387 CLEANFILES += $(OUTDIR)/obj.*/*.o $(OUTDIR)/obj.*/*.d
389 ## Machinery for linking.
390 JNIDIR.host-$(hostcpu) = $(OUTDIR)/lib.host-$(hostcpu)
391 JNIDIR.ndk = $(OUTDIR)/pkg/lib/$1
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 \
404 $(foreach f,$(FLAVOURS), \
405 $(foreach a,$(APKLIBS), \
406 $(eval $(call apklib-rule,$f,$a))))
408 CLEANFILES += $(OUTDIR)/pkg/lib/*/lib*.so
409 CLEANFILES += $(OUTDIR)/lib.host-$(hostcpu)/lib*.so
411 ###--------------------------------------------------------------------------
412 ### Android string resource generation.
414 GENSTRINGS += package=PACKAGE
415 GENSTRINGS += version=VERSION
416 GENSTRINGS += vsn=VSN
418 $(foreach e,$(EXTERNALS),\
419 $(eval GENSTRINGS += $e_version=$e_VERSION))
421 BUILD := $(shell uuid -v4)
422 GENSTRINGS += build_uuid=BUILD
424 genstring-name = $(firstword $(subst =, ,$1))
425 genstring-value = $($(word 2,$(subst =, ,$1)))
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>";) \
437 $(OUTDIR)/res.dummy/values/auto.xml: Makefile
438 $(call gen-strings,$@)
440 ###--------------------------------------------------------------------------
441 ### Java and Scala building.
443 JARDIR = $(OUTDIR)/jar
444 CLASSDIR = $(OUTDIR)/cls
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.
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 $$@
460 $(foreach j,$(JARS), $(eval $(call jar-rule,$j)))
462 REALCLEANFILES += $(JARDIR)/*.jar
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
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.
471 CLASSES += admin:sys,util
474 CLASSES += progress:sys,util
475 CLASSES += keys:progress,tar,sys,util
476 CLASSES += terminal:progress,sys,util
479 CLASSES += toy-activity:app,R
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) \
488 $(V_AT)$(SCALAC_RESET)
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) \
499 ## Machinery for parsing the `CLASSES' list.
500 class-name = $(firstword $(subst :, ,$1))
501 class-deps = $(subst $(comma), ,$(word 2,$(subst :, ,$1)))
503 CLASSNAMES = $(foreach c,$(CLASSES),$(call class-name,$c))
504 CLASSSTAMPS = $(call stamps,class,$(CLASSNAMES))
506 $(foreach c,$(CLASSES), \
507 $(eval $(call stamps,class,$(call class-name,$c)): \
508 $(call stamps,class,$(call class-deps,$c))))
510 CLEANFILES += $(CLASSSTAMPS)
511 clean::; rm -rf $(OUTDIR)/cls
513 ###--------------------------------------------------------------------------
514 ### Android building machinery.
516 VPATH += $(OUTDIR)/src
517 CLEANFILES += $(OUTDIR)/*.apk
520 --min-sdk-version $(MINAPI) --target-sdk-version $(TARGETAPI) \
521 --version-name "$(VERSION)" --version-code $(VSN) --auto-add-overlay
523 $(OUTDIR)/src/R.java: AndroidManifest.xml $(OUTDIR)/res.dummy/values/auto.xml
524 $(V_AT)mkdir -p $(dir $@)
525 $(call v_tag,AAPT)aapt package $(AAPTFLAGS) \
526 -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.dummy/ \
528 -J $(dir $@) --generate-dependencies
529 CLEANFILES += $(OUTDIR)/src/R.java $(OUTDIR)/src/R.java.d
530 -include $(OUTDIR)/src/R.java.d
532 BINS = catsign key pathmtu
533 CLEANFILES += $(INSTFILES)
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 $$@
540 $(foreach f,$(ANDROID_ABIS), \
541 $(foreach b,$(BINS), \
542 $(eval $(call bin-rule,$f,$b))))
544 DISTCLEANFILES += 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
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)
557 $(OUTDIR)/res.volatile/values/auto.xml: $(INSTFILES)
558 $(call gen-strings,$@)
560 $(foreach v,$(VARIANTS),$(OUTDIR)/tripe-$v.unsigned.apk): \
561 $(OUTDIR)/tripe-%.unsigned.apk: $(INSTFILES) $(OUTDIR)/res.volatile/values/auto.xml
562 $(call v_tag,AAPT)aapt package -f $(AAPTFLAGS) $(AAPTFLAGS.$*) \
563 -M AndroidManifest.xml -S res/ -S $(OUTDIR)/res.volatile/ \
564 -I $(ANDROID_JAR) -F $@ $(OUTDIR)/pkg/
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.$*,$*)
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 $< $@
576 $(VARIANTS): %: $(OUTDIR)/tripe-%.apk
579 ###--------------------------------------------------------------------------
580 ### Finishing touches.
584 clean::; rm -f $(CLEANFILES)
585 realclean::; rm -f $(REALCLEANFILES)
587 repl: $(CLASSSTAMPS) $(foreach a,$(APKLIBS),$(JNIDIR.host-$(hostcpu))/$a)
588 $(SCALA) -cp $(CLASSDIR) -Yno-load-impl-class \
589 -Djava.lib.path=$(JNIDIR.host-$(hostcpu)) \
596 ###----- That's all, folks --------------------------------------------------