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
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.
103 CFLAGS.host
= $(CFLAGS
) -fPIC
105 LDFLAGS.host
= $(LDFLAGS
)
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
+= -I
$(JDKDIR
)/include -I
$(JDKDIR
)/include/$(JDKPLAT
)
124 ## Android SDK location.
125 ANDROID_SDKDIR
= /usr
/local
/android
/sdk
130 ## Android ABI definitions.
131 ANDROID_ABIS
+= armeabi
132 GNUARCH.armeabi
= arm-linux-androideabi
133 PLATARCH.armeabi
= arm
136 ANDROID_ABIS.inhibit
+= armeabi-v7a
137 GNUARCH.armeabi-v7a
= arm-linux-androideabi
138 PLATARCH.armeabi-v7a
= arm
139 CFLAGS.ndk-armeabi-v7a
=
141 ANDROID_ABIS.inhibit
+= arm64-v8a
142 GNUARCH.arm64-v8a
= aarch64-linux-android
143 PLATARCH.arm64-v8a
= arm64
144 MINAPI.arm64-v8a
= 21
147 TOOLCHAINDIR.x86
= x86
148 GNUARCH.x86
= i686-linux-android
151 ANDROID_ABIS.inhibit
+= x86_64
152 TOOLCHAINDIR.x86_64
= x86_64
153 GNUARCH.x86_64
= x86_64-linux-android
154 PLATARCH.x86_64
= x86_64
157 FLAVOURS
+= $(ANDROID_ABIS
)
161 AAPTFLAGS.debug
= --debug-mode \
162 --rename-manifest-package uk.org.distorted.tripe-debug
163 KEYSTORE.debug
= debug.keystore
164 JARSIGNERFLAGS.debug
= -storepass public
-keypass public
167 KEYSTORE.release
= release.keystore
168 JARSIGNERFLAGS.release
=
170 ## Android NDK location.
171 ANDROID_NDKDIR
= $(ANDROID_SDKDIR
)/ndk-bundle
172 NDK_HOSTARCH
= $(hostos
)-$(hostcpu
)
174 ## Android NDK toolchains.
176 $(ANDROID_NDKDIR
)/platforms
/android-
$(call defaulting
,MINAPI.
$1,$(MINAPI
))/arch-
$(PLATARCH.
$1)
177 ndk-toolchain-bin
= \
178 $(ANDROID_NDKDIR
)/toolchains
/$(call defaulting
,TOOLCHAINDIR.
$1,$(GNUARCH.
$1))-$(TOOLVERSION
)/prebuilt
/$(NDK_HOSTARCH
)/bin
179 ENV.ndk
= env PATH
=$(call ndk-toolchain-bin
,$1):$$PATH
180 CC.ndk
= $(GNUARCH.
$1)-gcc
182 CFLAGS.ndk
= $(CFLAGS
) -fPIC
-D__ANDROID_API__
=$(MINAPI
) \
184 --sysroot
=$(call ndk-sysroot
,$1) \
185 -isystem
$(ANDROID_NDKDIR
)/sysroot
/usr
/include \
186 -isystem
$(ANDROID_NDKDIR
)/sysroot
/usr
/include/$(GNUARCH.
$1)
187 LDFLAGS.ndk
= $(LDFLAGS
) -pie \
188 --sysroot
=$(call ndk-sysroot
,$1)
189 CONFIG.ndk
= --host
=$(GNUARCH.
$1)
192 tool
= $(call defaulting
,$2.
$1,$(call
$2.ndk
,$1))
194 ## Subject name for debug key.
195 DEBUGDN
= CN
=Straylight
/Edgeware
, L
=Cambridge
, C
=GB
197 ## Android libraries.
199 $(ANDROID_SDKDIR
)/platforms
/android-
$(MINAPI
)/android.jar
202 $(CONFIGDIR
)/scaladir.mk
:
203 $(V_AT
)mkdir
-p
$(dir $@
)
204 $(call v_tag
,CONFIG
)$(SCALA
) -J-XshowSettings
:properties
-help
2>&1 | \
205 sed
-n
's:^ *scala\.home *= *:SCALADIR = :p' >$@.new
207 include $(CONFIGDIR
)/scaladir.mk
208 REALCLEANFILES
+= $(CONFIGDIR
)/scaladir.mk
209 SCALA_LIB
= $(SCALADIR
)/lib
/scala-library.jar
211 ## Silent-rules is on by default.
214 ## Allow local overrides at this point.
217 ###--------------------------------------------------------------------------
218 ### Silent-rules machinery.
220 v_tag
= $(call v_tag_
$V,$1)
221 v_tag_0
= @printf
" %-8s %s\n" "$1" "$@";
226 ###--------------------------------------------------------------------------
227 ### Other handy functions.
229 join-paths
= $(if
$(filter /%,$2),$2,$1/$2)
232 STAMPDIR
= $(OUTDIR
)/stamp
233 stamps
= $(patsubst %,$(STAMPDIR
)/%.
$1-stamp
,$2)
234 stamp-base
= $(patsubst $(STAMPDIR
)/%-stamp
,%,$1)
235 stamp-name
= $(basename $(call stamp-base
,$1))
236 stamp-type
= $(patsubst .
%,%,$(suffix $(call stamp-base
,$1)))
238 ###--------------------------------------------------------------------------
239 ### And now we can start building things.
250 distclean:: realclean
253 ###--------------------------------------------------------------------------
254 ### External native packages.
258 adns_CONFIG
= --disable-dynamic
262 mLib_CONFIG
= --enable-static
--disable-shared
--with-adns
264 EXTERNALS
+= catacomb
266 catacomb_CONFIG
= --enable-static
--disable-shared
269 tripe_DEPS
= mLib catacomb
270 tripe_CONFIG
= --without-wireshark
--with-adns
--with-tunnel
=slip
273 ext-stamps
= $(foreach f
,$2,$(call stamps
,$f,$1))
275 ext-srcdir
= $(call defaulting
,$1_SRCDIR,..
/$1)
276 ext-builddir
= $(OUTDIR
)/build.
$1/$2
277 ext-prefix
= $(OUTDIR
)/inst.
$1
278 ext-absprefix
= $(abs_srcdir
)/$(call ext-prefix
,$1)
280 ext-stamp-srcdir
= $(call ext-srcdir
,$(call stamp-name
,$1))
281 ext-stamp-builddir
= \
282 $(call ext-builddir
,$(call stamp-type
,$1),$(call stamp-name
,$1))
283 ext-stamp-absprefix
= $(call ext-absprefix
,$(call stamp-type
,$1))
284 ext-stamp-tool
= $(call tool
,$(call stamp-type
,$1),$2)
286 EXTSTAMPS
= $(call ext-stamps
,$(EXTERNALS
),$(FLAVOURS
))
289 $(STAMPDIR
)/%-stamp
: \
290 $$(call ext-stamps
, \
291 $$($$(call stamp-name
,$$@
)_DEPS
), \
292 $$(call stamp-type
,$$@
))
293 $(V_AT
)mkdir
-p
$(STAMPDIR
)
294 $(V_AT
)rm -rf
$(call ext-stamp-builddir
,$@
)
295 $(V_AT
)mkdir
-p
$(call ext-stamp-builddir
,$@
)
296 cd
$(call ext-stamp-builddir
,$@
) && \
297 $(call ext-stamp-tool
,$@
,ENV
) \
298 $(call join-paths
,..
/..
/..
,$(call ext-stamp-srcdir
,$@
))/configure \
299 --prefix=$(call ext-stamp-absprefix
,$@
) \
300 $(call ext-stamp-tool
,$@
,CONFIG
) \
301 $($(call stamp-name
,$@
)_CONFIG
) \
302 CC
="$(CCACHE) $(call ext-stamp-tool,$@,CC)" \
303 CFLAGS
="$(call ext-stamp-tool,$@,CFLAGS) -I$(call ext-stamp-absprefix,$@)/include" \
304 LD
="$(call ext-stamp-tool,$@,LD)" \
305 LDFLAGS
="$(call ext-stamp-tool,$@,LDFLAGS) -L$(call ext-stamp-absprefix,$@)/lib" \
306 PKG_CONFIG
="pkg-config --static" \
307 PKG_CONFIG_LIBDIR
=$(call ext-stamp-absprefix
,$@
)/lib
/pkgconfig
308 $(call ext-stamp-tool
,$@
,ENV
) \
309 $(MAKE
) -C
$(call ext-stamp-builddir
,$@
)
310 $(call ext-stamp-tool
,$@
,ENV
) \
311 $(MAKE
) -C
$(call ext-stamp-builddir
,$@
) install
314 $(foreach f
,$(FLAVOURS
),$(foreach e
,$(EXTERNALS
),clean-
$e.
$f)): clean-
%:
315 rm -f
$(STAMPDIR
)/$*-stamp
316 rm -rf
$(call ext-stamp-builddir
,$*)
317 .PHONY
: $(foreach f
,$(FLAVOURS
),$(foreach e
,$(EXTERNALS
),clean-
$e.
$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
)
359 ## Machinery for compiling.
360 objdir
= $(OUTDIR
)/obj.
$1
361 objects
= $(patsubst %.c
,$(call objdir
,$1)/%$3,$2)
363 apklib-objects
= $(call objects
,$1,$($2_SRCS),$3)
364 obj-base
= $(patsubst $(OUTDIR
)/obj.
%.o
,%,$1)
365 obj-type
= $(patsubst %/,%,$(dir $(call obj-base
,$1)))
366 obj-name
= $(notdir $(call obj-base
,$1))
367 obj-tool
= $(call tool
,$(call obj-type
,$1),$2)
370 $1_OBJS := $$(foreach f
,$$(FLAVOURS
),\
371 $$(call objects
,$$f,$$($1_SRCS),.o
))
372 DEPFILES
+= $$(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
,$$@
)) \
384 $(foreach a
,$(APKLIBS
), $(eval
$(call obj-rule
,$a)))
386 CLEANFILES
+= $(OUTDIR
)/obj.
*/*.o
$(OUTDIR
)/obj.
*/*.d
388 ## Machinery for linking.
389 JNIDIR.host
= $(OUTDIR
)
390 JNIDIR.ndk
= $(OUTDIR
)/pkg
/lib
/$1
393 INSTFILES
+= $$(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 \
403 $(foreach f
,$(FLAVOURS
), \
404 $(foreach a
,$(APKLIBS
), \
405 $(eval
$(call apklib-rule
,$f,$a))))
407 CLEANFILES
+= $(OUTDIR
)/pkg
/lib
/*/lib
*.so
$(OUTDIR
)/lib
*.so
409 ###--------------------------------------------------------------------------
410 ### Java and Scala building.
412 JARDIR
= $(OUTDIR
)/jar
413 CLASSDIR
= $(OUTDIR
)/cls
415 ## External libraries we need to adopt. Grab them and feed them to `dx'
416 ## separately, because they take aaaaages and we don't want to have to do
417 ## this on every incremental build.
422 DEXJARS
+= $$(JARDIR
)/$$(notdir $1)
423 $$(JARDIR
)/$$(notdir $1): $1
424 $$(V_AT
)mkdir
-p
$$(JARDIR
)/
425 $$(V_AT
)rm -f
$$@
$$(basename $$@
)-new.jar
426 $$(call v_tag
,DX
)dx
--dex
--output
=$$(basename $$@
)-new.jar
$1
427 $$(V_AT
)mv
$$(basename $$@
)-new.jar
$$@
429 $(foreach j
,$(JARS
), $(eval
$(call jar-rule
,$j)))
431 REALCLEANFILES
+= $(JARDIR
)/*.jar
433 ## Writing things out longhand is tedious. `CLASSES' is a list of entries of
434 ## the form `SRC[:DEP,...]', saying that `SRC.ext', being a source file
435 ## capable of being built into `.class' files and setting `SRC.class-stamp',
436 ## should be so built, and that it depends on other similar sources named DEP
437 ## having been so built.
440 CLASSES
+= admin
:sys
,util
442 CLASSES
+= progress
:sys
,util
443 CLASSES
+= keys
:progress
,tar,sys
,util
444 CLASSES
+= terminal
:progress
,sys
,util
446 CLASSES
+= toy-activity
:R
448 ## Building class files.
449 $(STAMPDIR
)/%.class-stamp
: %.java
450 $(V_AT
)mkdir
-p
$(CLASSDIR
)/
451 $(call v_tag
,JAVAC
)$(JAVAC
) $(JAVAFLAGS
) \
452 -bootclasspath
$(ANDROID_JAR
) \
453 -d
$(CLASSDIR
) -cp
$(CLASSDIR
) \
455 $(V_AT
)$(SCALAC_RESET
)
457 $(STAMPDIR
)/%.class-stamp
: %.scala
458 $(V_AT
)mkdir
-p
$(CLASSDIR
)/
459 $(call v_tag
,SCALAC
)$(SCALAC
) $(SCALAFLAGS
) \
460 -javabootclasspath
$(ANDROID_JAR
) \
461 -bootclasspath
$(SCALA_LIB
) \
462 -d
$(CLASSDIR
) -cp
$(CLASSDIR
) \
466 ## Machinery for parsing the `CLASSES' list.
467 class-name
= $(firstword $(subst :, ,$1))
468 class-deps
= $(subst $(comma
), ,$(word 2,$(subst :, ,$1)))
470 CLASSNAMES
= $(foreach c
,$(CLASSES
),$(call class-name
,$c))
471 CLASSSTAMPS
= $(call stamps
,class
,$(CLASSNAMES
))
473 $(foreach c
,$(CLASSES
), \
474 $(eval
$(call stamps
,class
,$(call class-name
,$c)): \
475 $(call stamps
,class
,$(call class-deps
,$c))))
477 CLEANFILES
+= $(CLASSSTAMPS
)
478 clean::; rm -rf
$(OUTDIR
)/cls
480 ###--------------------------------------------------------------------------
481 ### Android building machinery.
483 VPATH
+= $(OUTDIR
)/src
484 CLEANFILES
+= $(OUTDIR
)/*.apk
487 --min-sdk-version
$(MINAPI
) --target-sdk-version
$(TARGETAPI
) \
488 --version-name
"$(VERSION)" --version-code
$(VSN
)
490 $(OUTDIR
)/src
/R.java
: AndroidManifest.xml
491 $(V_AT
)mkdir
-p
$(dir $@
)
492 $(call v_tag
,AAPT
)aapt package
$(AAPTFLAGS
) \
493 -M AndroidManifest.xml
-S res
/ -I
$(ANDROID_JAR
) \
494 -J
$(dir $@
) --generate-dependencies
495 CLEANFILES
+= $(OUTDIR
)/src
/R.java
$(OUTDIR
)/src
/R.java.d
496 -include $(OUTDIR
)/src
/R.java.d
498 BINS
= catsign key pathmtu
499 CLEANFILES
+= $(INSTFILES
)
501 INSTFILES
+= $$(OUTDIR
)/pkg
/assets
/bin
/$1/$2
502 $$(OUTDIR
)/pkg
/assets
/bin
/$1/$2: $$$$(call ext-stamps
,$$$$(EXTERNALS
),$1)
503 $$(V_AT
)mkdir
-p
$$(dir $$@
)
504 $$(call v_tag
,CP
)cp
$$(call ext-prefix
,$1)/bin
/$2 $$@
506 $(foreach f
,$(FLAVOURS
), \
507 $(foreach b
,$(BINS
), \
508 $(eval
$(call bin-rule
,$f,$b))))
510 DISTCLEANFILES
+= debug.keystore
512 $(call v_tag
,KEYTOOL
)keytool
-genkeypair
-alias debug \
513 -keyalg RSA
-keysize
3072 \
514 -dname
"$(DEBUGDN)" -validity
10000 \
515 -keystore
$@
-storetype PKCS12 \
516 -storepass public
-keypass public
518 INSTFILES
+= $(OUTDIR
)/pkg
/classes.dex
519 $(OUTDIR
)/pkg
/classes.dex
: $(CLASSSTAMPS
) $(DEXJARS
)
520 $(V_AT
)mkdir
-p
$(dir $@
)
521 $(call v_tag
,DX
)dx
--dex
--output
=$@
$(CLASSDIR
) $(JARDIR
)
523 $(foreach v
,$(VARIANTS
),$(OUTDIR
)/tripe-
$v.unsigned.apk
): \
524 $(OUTDIR
)/tripe-
%.unsigned.apk
: $(INSTFILES
)
525 $(call v_tag
,AAPT
)aapt package
-f
$(AAPTFLAGS
) $(AAPTFLAGS.
$*) \
526 -M AndroidManifest.xml
-S res
/ -I
$(ANDROID_JAR
) \
529 $(foreach v
,$(VARIANTS
),$(OUTDIR
)/tripe-
$v.signed.apk
): \
530 $(OUTDIR
)/tripe-
%.signed.apk
: $(OUTDIR
)/tripe-
%.unsigned.apk
$$(KEYSTORE.
$$*)
531 $(call v_tag
,JARSIGN
)jarsigner
-keystore
$(KEYSTORE.
$*) \
532 $(JARSIGNERFLAGS.
$*) \
533 -signedjar
$@
$< $(call defaulting
,KEYALIAS.
$*,$*)
535 $(foreach v
,$(VARIANTS
),$(OUTDIR
)/tripe-
$v.apk
): \
536 $(OUTDIR
)/tripe-
%.apk
: $(OUTDIR
)/tripe-
%.signed.apk
537 $(call v_tag
,ZIPALGN
)zipalign
$(ZIPALIGNFLAGS.
$*) -f
4 $< $@
539 $(VARIANTS
): %: $(OUTDIR
)/tripe-
%.apk
542 ###--------------------------------------------------------------------------
543 ### Finishing touches.
547 clean::; rm -f
$(CLEANFILES
)
548 realclean::; rm -f
$(REALCLEANFILES
)
555 ###----- That's all, folks --------------------------------------------------