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
)
28 .SECONDEXPANSION
: #sorry
30 ###--------------------------------------------------------------------------
33 abs_builddir
:= $(shell pwd
)
35 ## Where to put the object files.
40 CFLAGS
= -O2
-g
-Wall
-pedantic
-Werror
46 ## External `pkg-config' packages required.
49 ## Java development kit.
50 JDKDIR
= /usr
/lib
/jvm
/default-java
52 JNI_INCLUDES
= $(JDKDIR
)/include $(JDKDIR
)/include/$(JDK_PLAT
)
54 ## Default arguments for the Java runtime.
57 ## The Java runtime, for some reason, hardcodes its default for
58 ## `java.io.tmpdir', inviting security problems. If the user has defined a
59 ## `TMPDIR', then persuade Java to use it.
60 explicit-tmpdir-p
= $(if
$(filter-out undefined
,$(origin TMPDIR
)),t
,nil
)
61 ifeq ($(explicit-tmpdir-p
), t
)
62 JAVADEFS
+= -Djava.io.tmpdir
=$(TMPDIR
)
66 JAVAC
= javac
$(JAVADEFS
)
71 ## Unfortunately, `fsc' is a total security disaster. On the other hand,
72 ## `scalac' is rather slow. If we're running with a custom `TMPDIR', and the
73 ## `noip' wrapper <https://git.distorted.org.uk/~mdw/preload-hacks/> is
74 ## available, then we can tame `fsc' enough that it's probably safe to run;
75 ## otherwise, it's too risky to enable by default.
76 noip-available-p
:= $(shell noip echo t
2>/dev
/null || echo nil
)
77 ifeq ($(noip-available-p
), t
)
80 ifeq "$(explicit-tmpdir-p),$(noip-available-p)" "t,t"
81 SCALAC
= $(NOIP
) fsc
$(JAVADEFS
)
82 SCALAC_RESET
= $(SCALAC
) -reset
84 SCALAC
= scalac
$(JAVADEFS
)
87 SCALAFLAGS
= -optimise
-feature
-deprecation
-Xfatal-warnings \
88 -Xlint
-Xlint
:-package-object-classes \
89 -Yinline-warnings
:false
90 SCALA_REPL
= $(NOIP
) scala
$(JAVADEFS
)
92 ## Silent-rules is on by default.
95 ## Allow local overrides at this point.
98 ###--------------------------------------------------------------------------
99 ### Silent-rules machinery.
101 v_tag
= $(call v_tag_
$V,$1)
102 v_tag_0
= @printf
" %-8s %s\n" "$1" "$@";
107 ###--------------------------------------------------------------------------
108 ### External native packages.
110 EXTPREFIX
= $(abs_builddir
)/$(OUTDIR
)/inst
112 join-paths
= $(if
$(filter /%,$2),$2,$1/$2)
113 ext-srcdir
= $(or
$($1_SRCDIR),..
/$1)
115 PKG_CONFIG
= PKG_CONFIG_LIBDIR
=$(OUTDIR
)/inst
/lib
/pkgconfig \
118 PKGS_CFLAGS
:= $(foreach p
,$(PKGS
),$(shell $(PKG_CONFIG
) --cflags $p))
119 PKGS_LIBS
:= $(foreach p
,$(PKGS
),$(shell $(PKG_CONFIG
) --libs
$p))
121 ALL_CFLAGS
= $(CFLAGS
) -fPIC \
122 $(addprefix -I
,$(JNI_INCLUDES
)) \
123 -I
$(OUTDIR
)/inst
/include \
124 -I
$(call ext-srcdir
,tripe
)/common \
125 -I
$(call ext-srcdir
,tripe
)/priv \
126 -I
$(call ext-srcdir
,tripe
)/server \
127 -I
$(OUTDIR
)/build
/tripe
/config \
130 LIBS
= $(OUTDIR
)/build
/tripe
/server
/libtripe.a \
131 $(OUTDIR
)/build
/tripe
/priv
/libpriv.a \
132 $(OUTDIR
)/build
/tripe
/common
/libcommon.a \
133 -L
$(OUTDIR
)/inst
/lib
$(PKGS_LIBS
)
135 ###--------------------------------------------------------------------------
136 ### Various other tweaks and overrides.
138 ## Hack around https://issues.scala-lang.org/browse/SI-9689
139 SCALAFLAGS
+= -Yno-load-impl-class
141 ###--------------------------------------------------------------------------
142 ### And now we can start building things.
151 ###--------------------------------------------------------------------------
155 $(call v_tag
,CC
)mkdir
-p
$(OUTDIR
)/ && \
156 $(CC
) -c
$(ALL_CFLAGS
) -MMD
-o
$@
$<
159 DISTFILES
+= $(ALL_SOURCES
)
161 objects
= $(patsubst %.c
,$(OUTDIR
)/%$2,$1)
162 CLEANFILES
+= $(OUTDIR
)/*.o
$(OUTDIR
)/*.d
164 ###--------------------------------------------------------------------------
167 ## Java and Scala source files turn into multiple `.class' files with
168 ## unpredictable names. Rather than try to guess stable outputs for these
169 ## sources, we make artificial `timestamp' files and uses these in our
171 CLASSDIR
= $(OUTDIR
)/cls
172 stamps
= $(patsubst %,$(OUTDIR
)/%.
$1-stamp
,$2)
174 clean::; rm -rf
$(CLASSDIR
)
175 CLEANFILES
+= $(OUTDIR
)/*.class-stamp
177 ## Compiling actual Java code. Note that this confuses the resident Scala
178 ## compiler, so we have to reset it here.
180 $(OUTDIR
)/%.class-stamp
: %.java
181 $(call v_tag
,JAVAC
)mkdir
-p
$(CLASSDIR
)/ && \
182 $(JAVAC
) -d
$(CLASSDIR
) -cp
$(CLASSDIR
) $(JAVAFLAGS
) $< && \
184 $(V_AT
)$(SCALAC_RESET
)
186 ## Compiling Scala code.
188 $(OUTDIR
)/%.class-stamp
: %.scala
189 $(call v_tag
,SCALAC
)mkdir
-p
$(CLASSDIR
)/ && \
190 $(SCALAC
) -d
$(CLASSDIR
) -cp
$(CLASSDIR
) $(SCALAFLAGS
) $< && \
193 ###--------------------------------------------------------------------------
194 ### Native-code libraries.
197 tripe_SOURCES
= jni.c
199 shlibfile
= $(patsubst %,$(OUTDIR
)/lib
%.so
,$1)
200 SHLIBFILES
= $(call shlibfile
,$(SHLIBS
))
201 TARGETS
+= $(SHLIBFILES
)
202 ALL_SOURCES
+= $(foreach l
,$(SHLIBS
),$($l_SOURCES))
204 $(call objects
,$(tripe_SOURCES
),.o
): $(call stamps
,ext
,tripe
)
206 $(SHLIBFILES
): $(OUTDIR
)/lib
%.so
: $$(call objects
,$$($$*_SOURCES
),.o
)
207 $(call v_tag
,LD
)$(LD
) $(LDFLAGS.so
) -o
$@
$^
$(LIBS
)
209 ###--------------------------------------------------------------------------
212 ## Writing things out longhand is tedious. `CLASSES' is a list of entries of
213 ## the form `SRC[:DEP,...]', saying that `SRC.ext', being a source file
214 ## capable of being built into `.class' files and setting `SRC.stamp', should
215 ## be so built, and that it depends on other similar sources named DEP having
219 CLASSES
+= admin
:sys
,util
221 CLASSES
+= progress
:sys
,util
222 CLASSES
+= keys
:progress
,tar,sys
,util
223 CLASSES
+= terminal
:progress
,sys
,util
225 ## Machinery for parsing the `CLASSES' list.
227 class-name
= $(firstword $(subst :, ,$1))
228 class-deps
= $(subst $(COMMA
), ,$(word 2,$(subst :, ,$1)))
230 CLASS_NAMES
= $(foreach c
,$(CLASSES
),$(call class-name
,$c))
232 all:: $(call stamps
,class
,$(CLASS_NAMES
))
234 $(foreach c
,$(CLASSES
),$(eval
$(call stamps
,class
,$(call class-name
,$c)): \
235 $(call stamps
,class
,$(call class-deps
,$c))))
237 DISTFILES
+= $(foreach c
,$(CLASSES
),\
238 $(foreach e
,$(CLSEXT
),\
239 $(wildcard $(call class-name
,$c).
$e)))
241 ###--------------------------------------------------------------------------
242 ### External packages.
245 adns_CONFIG
= --disable-dynamic
249 mLib_CONFIG
= --enable-static
--disable-shared
--with-adns
251 EXTERNALS
+= catacomb
253 catacomb_CONFIG
= --enable-static
--disable-shared
256 tripe_DEPS
= mLib catacomb
257 tripe_CONFIG
= --without-wireshark
--with-adns
--with-tunnel
=slip
259 all:: $(call stamps
,ext
,$(EXTERNALS
))
260 CLEANFILES
+= $(OUTDIR
)/*.ext-stamp
261 clean::; rm -rf
$(OUTDIR
)/inst
$(OUTDIR
)/build
263 $(call stamps
,ext
,$(EXTERNALS
)): \
264 $(OUTDIR
)/%.ext-stamp
: $$(call stamps
,ext
,$$($$*_DEPS
))
265 $(V_AT
)rm -rf
$(OUTDIR
)/build
/$*/
266 $(V_AT
)mkdir
-p
$(OUTDIR
)/build
/$*/
267 cd
$(OUTDIR
)/build
/$*/ && \
268 $(call join-paths
,..
/..
/..
,$(call ext-srcdir
,$*))/configure \
269 --prefix=$(EXTPREFIX
) \
271 CFLAGS
="-O2 -g -fPIC -Wall -I$(EXTPREFIX)/include" \
272 LDFLAGS
="-L$(EXTPREFIX)/lib" \
273 PKG_CONFIG
="pkg-config --static" \
274 PKG_CONFIG_LIBDIR
=$(EXTPREFIX
)/lib
/pkgconfig
275 $(MAKE
) -C
$(OUTDIR
)/build
/$*/
276 $(MAKE
) -C
$(OUTDIR
)/build
/$*/ -s
install
279 ###--------------------------------------------------------------------------
280 ### Distribution arrangements.
283 DISTFILES
+= Makefile
284 DISTFILES
+= auto-version
286 distdir
= $(PACKAGE
)-$(VERSION
)
287 DISTTAR
= $(distdir
).
tar.gz
290 rm -rf
$(OUTDIR
)/$(distdir
)
291 mkdir
$(OUTDIR
)/$(distdir
)/
292 echo
$(VERSION
) >$(OUTDIR
)/$(distdir
)/RELEASE
293 set
-e
; for i in
$(DISTFILES
); do \
294 case
$$i in
*/*) mkdir
-p
$(OUTDIR
)/$(distdir
)/$${i
%/*}/ ;; esac
; \
295 cp
$$i $(OUTDIR
)/$(distdir
)/; \
300 set
-e
; cd
$(OUTDIR
)/; tar chozf ..
/$(DISTTAR
) $(distdir
)
304 ###--------------------------------------------------------------------------
305 ### Finishing touches.
309 clean::; rm -f
$(CLEANFILES
) $(TARGETS
)
312 $(SCALA_REPL
) -cp
$(CLASSDIR
) -Djava.library.path
=$(OUTDIR
)
315 -include $(call objects
,$(ALL_SOURCES
),.d
)
317 ###----- That's all, folks --------------------------------------------------