diff --git a/android/external/MakefileTemplate b/android/external/MakefileTemplate new file mode 100644 index 0000000..535bca0 --- /dev/null +++ b/android/external/MakefileTemplate @@ -0,0 +1,385 @@ +# Copyright 2019, pEp Foundation +# This file is part of pEpJNIAdapter for Android - [ARCH] build +# This file may be used under the terms of the GNU General Public License version 3 +# see LICENSE.txt + +include ../Makefile.conf + +#------------------------------------------------------------------------------# +# Makefile to build deps for use with pEpEngine +# based on gnupg-for-android/external/Makefile +#------------------------------------------------------------------------------# + +#------------------------------------------------------------------------------# +# Build parameters + +APP_ABI ?= [ARCH] +ANDROID_API ?= [ANDROID_API] + +all: build + +build: showsetup uuid-install sequoia-ffi-install libetpan-build + +#------------------------------------------------------------------------------# +# Manage paths for PREFIX, DESTDIR, LOCAL and PATH + +EXTERNAL_ROOT := $(shell pwd) + +# install root for built files +DESTDIR = $(EXTERNAL_ROOT)/.. +prefix = /output/$(APP_ABI) +LOCAL := $(DESTDIR)$(prefix) + +PATH := ${PATH}:$(NDK_TOOLCHAIN)/bin:$(LOCAL)/bin + +NDK_SYSROOT=$(ANDROID_NDK_HOME)/sysroot + +HOST = [HOST] +NDK_TOOLCHAIN = $([NDK_TOOLCHAIN_TARGET])-$(NDK_TOOLCHAIN_COMPILER) + +# include Android's build flags +TARGET_ARCH_ABI = $(APP_ABI) +include $(ANDROID_NDK)/build/core/toolchains/$(NDK_TOOLCHAIN)/setup.mk + +CC := $(ANDROID_NDK_HOME)/bin/$(HOST)[EXTRA_FLAGS_API]-clang +CXX := $(ANDROID_NDK_HOME)/bin/$(HOST)[EXTRA_FLAGS_API]-clang++ +AS := $(ANDROID_NDK_HOME)/bin/$(HOST)[EXTRA_FLAGS_API]-clang + +CFLAGS += -DANDROID -I$(LOCAL)/include $(TARGET_CFLAGS) -fPIE -fPIC -std=c99 +LDFLAGS += -llog -L$(LOCAL)/lib $(TARGET_LDFLAGS) -pie + +# change 'release' to 'debug' for unoptimized debug builds +CFLAGS += $([ARCH_DEBUG_CFLAGS]) + +#------------------------------------------------------------------------------# +# GNU Tools trickery + +# point pkg-config to the .pc files generated from these builds +export PKG_CONFIG_PATH=$(LOCAL)/lib/pkgconfig + +# workaround for cross-compiling bug in autoconf +export ac_cv_func_malloc_0_nonnull=yes + +#------------------------------------------------------------------------------# +# debugging stuff + +showsetup: + @echo "NDK_TOOLCHAIN: $(NDK_TOOLCHAIN)" + @echo "NDK_SYSROOT: $(NDK_SYSROOT)" + @echo "APP_ABI: $(APP_ABI)" + @echo "HOST: $(HOST)" + @echo "CC: $(CC)" + @echo "LD: $(LD)" + @echo "CFLAGS: $(CFLAGS)" + @echo "LDFLAGS: $(LDFLAGS)" + +#------------------------------------------------------------------------------# +# libiconv + +libiconv.src.stamp: ../downloads/libiconv-1.15.tar.gz + tar xvf $< + mv libiconv-1.15 libiconv + touch $@ + +libiconv-src: libiconv.src.stamp + +libiconv-clean: + rm -rf libiconv + rm -rf libiconv.src.stamp + +libiconv/Makefile: libiconv.src.stamp + cd libiconv && \ + CC="$(CC)" LD="$(LD)" AR="$(AR)" AS="$(AS)" RANLIB=$(RANLIB) STRIP="$(STRIP)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + ./configure \ + --with-lib-path=$(LOCAL)/lib \ + --with-include-path=$(LOCAL)/include \ + --host=$(HOST) \ + --enable-static \ + --disable-shared \ + --prefix=$(LOCAL) + +libiconv/lib/.libs/libiconv.a: libiconv/Makefile + $(MAKE) -C libiconv + +$(LOCAL)/lib/libiconv.a: libiconv/lib/.libs/libiconv.a + $(MAKE) -C libiconv DESTDIR=$(DESTDIR) prefix=$(prefix) install + ls -l $(LOCAL)/lib/libiconv.a + +libiconv-build: libiconv/lib/.libs/libiconv.a + +libiconv-install: $(LOCAL)/lib/libiconv.a + +#------------------------------------------------------------------------------# +# libetpan +libetpan.src.stamp: ../downloads/libetpan.tar.gz + mkdir -p libetpan + cd libetpan && tar xvf ../$< + touch $@ + +libetpan/Makefile: libetpan.src.stamp | libiconv-install + cd libetpan/build-android; ICONV_PREFIX=$(LOCAL) bash ./build.sh $(APP_ABI) + cp -r libetpan/build-android/libetpan-android-$(ANDROID_ETPAN_BUILD_VERSION)/$(APP_ABI)/lib/* $(LOCAL)/lib/ + cp -r libetpan/build-android/libetpan-android-$(ANDROID_ETPAN_BUILD_VERSION)/include/* $(LOCAL)/include/ + touch $@ + +libetpan-build: libetpan/Makefile + +libetpan-clean: + rm -rf libetpan + rm -rf libetpan.src.stamp + +#------------------------------------------------------------------------------# +# uuid + +uuid.src.stamp: ../downloads/ossp-uuid_1.6.2.orig-patched.tar.gz + tar xvf $< + mv uuid-1.6.2 uuid + touch $@ + +uuid-src: uuid.src.stamp + +uuid-clean: + rm -rf uuid + rm -rf uuid.src.stamp + +uuid/Makefile: uuid.src.stamp + $(SED) -i 's,AC_CHECK_VA_COPY(),,' uuid/uuid.ac + cd uuid && autoconf + cp ../config.sub uuid + cp ../config.guess uuid + cd uuid && \ + CC="$(CC)" AR="$(AR)" RANLIB=$(RANLIB) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + ./configure \ + --enable-static \ + --host=$(HOST) \ + --with-gnu-ld \ + --prefix=$(LOCAL) + +uuid/.libs/libuuid.so: uuid/Makefile + $(MAKE) -C uuid + +$(LOCAL)/lib/libuuid.so: uuid/.libs/libuuid.so + # install fails copying uuid cmdline tool, but libs are copied ... + -$(MAKE) -C uuid DESTDIR=$(DESTDIR) prefix=$(prefix) install + echo "****** THIS ERROR WAS WILLINGLY IGNORED ******" + ls -l $(LOCAL)/lib/libuuid.so + +uuid-build: uuid/.libs/libuuid.so + +uuid-prebuild: uuid/jni/Android.mk uuid/Makefile + +uuid-install: $(LOCAL)/lib/libuuid.so | uuid-prebuild + +uuid/jni/Android.mk: uuid.src.stamp + mkdir -p uuid/jni + cp ../libuuid.Android.mk uuid/jni/Android.mk + + +#------------------------------------------------------------------------------# +# Sequoia + +sequoia-deps-build: openssl-install nettle-install + +#------------------------------------------------------------------------------# +# OpenSSL + +openssl.src.stamp: ../downloads/openssl-$(OPENSSL_VERSION).tar.gz + tar xvf $< + mv openssl-$(OPENSSL_VERSION) openssl + touch $@ + +openssl-src: openssl.src.stamp + +openssl-clean: + rm -rf openssl + rm -rf openssl.src.stamp + +OPENSSL_ARCHITECTURE:=[OPENSSL_ARCHITECTURE] + +openssl/Makefile: openssl.src.stamp + cd openssl && \ + PATH="$(ANDROID_NDK_HOME)/bin:$(PATH)" ../../configure_openssl.sh ${OPENSSL_ARCHITECTURE} $(ANDROID_API) $(LOCAL) +openssl/libssl.so: | openssl/Makefile + PATH="$(ANDROID_NDK_HOME)/bin:$(PATH)" $(MAKE) -C openssl + +$(LOCAL)/lib/libssl.so: openssl/libssl.so + cd openssl && \ + cp libcrypto.so $(LOCAL)/lib && \ + cp libcrypto.a $(LOCAL)/lib && \ + cp libssl.so $(LOCAL)/lib && \ + cp libssl.a $(LOCAL)/lib + ls -l $(LOCAL)/lib/libssl.so + +openssl-build: openssl/libssl.so + +openssl-install: $(LOCAL)/lib/libssl.so + + +#------------------------------------------------------------------------------# +# GMP + +gmp.src.stamp: ../downloads/gmp-$(GMP_VERSION).tar.bz2 + tar xvf $< + mv gmp-$(GMP_VERSION) gmp + touch $@ + +gmp-src: gmp.src.stamp + +gmp-clean: + rm -rf gmp + rm -rf gmp.src.stamp + +gmp/Makefile: gmp.src.stamp + cd gmp && \ + CC="$(CC)" LD="$(LD)" AR="$(AR)" AS="$(AS)" RANLIB=$(RANLIB) STRIP="$(STRIP)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + ./configure \ + --host=$(HOST) \ + --prefix=$(LOCAL) \ + --disable-static[GMP_MAKEFILE_EXTRA] + + +gmp/.libs/libgmp.so: gmp/Makefile + $(MAKE) -C gmp + +$(LOCAL)/lib/libgmp.so: gmp/.libs/libgmp.so + $(MAKE) -C gmp DESTDIR=$(DESTDIR) prefix=$(prefix) install + #gmp/libtool --finish $(LOCAL)/lib/ + ls -l $(LOCAL)/lib/libgmp.so + touch $@ + +gmp-build: gmp/.libs/libgmp.so + +gmp-install: $(LOCAL)/lib/libgmp.so + + +#------------------------------------------------------------------------------# +# NETTLE + +nettle.src.stamp: ../downloads/nettle-$(NETTLE_VERSION)-patched.tar.gz $(LOCAL)/lib/libgmp.so + tar xvf $< + mv nettle-$(NETTLE_VERSION) nettle + touch $@ + +nettle-src: nettle.src.stamp + +nettle-clean: + rm -rf nettle + rm -rf nettle.src.stamp + +nettle/Makefile: nettle.src.stamp gmp-install + cd nettle && \ + CC="$(CC)" LD="$(LD)" AR="$(AR)" AS="$(AS)" RANLIB=$(RANLIB) STRIP="$(STRIP)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + ./configure \ + --with-lib-path=$(LOCAL)/lib \ + --with-include-path=$(LOCAL)/include \ + --disable-static \ + --disable-documentation \ + --host=$(HOST) \ + --prefix=$(LOCAL) + +nettle/libnettle.so: nettle/Makefile + $(MAKE) -C nettle + +$(LOCAL)/lib/libnettle.so: nettle/libnettle.so + $(MAKE) -C nettle DESTDIR=$(DESTDIR) prefix=$(prefix) install + cp nettle/libnettle.so $(LOCAL)/lib/libnettle.so + cp nettle/libhogweed.so $(LOCAL)/lib/libhogweed.so + +nettle-build: nettle/libnettle.so + +nettle-install: $(LOCAL)/lib/libnettle.so + + +#------------------------------------------------------------------------------# +# Sequoia-ffi + +CARGO_TARGET_DIR=$(EXTERNAL_ROOT)/../build/ + +sequoia.src.stamp: ../downloads/sequoia.tar.gz + mkdir -p sequoia + cd sequoia && tar xvf ../$< + $(SED) -i 's,1.48.0,1.49.0,' sequoia/rust-toolchain + cd sequoia && cargo update -p nettle-sys --precise 2.0.8 + mkdir -p $(LOCAL)/lib/ +# This is a bad fix, we should move this to a common makefile (but not the .conf one) + find -L $(ANDROID_NDK) -name libunwind.a -execdir sh -c 'echo "INPUT(-lunwind)" > $(LOCAL)/lib/libgcc.a' \; + touch $@ + +sequoia-ffi-clean: + rm -rf sequoia + rm -rf sequoia.src.stamp + +$(CARGO_TARGET_DIR)/[SEQUOIA_ARCH]/release/libsequoia_openpgp_ffi.so: sequoia.src.stamp sequoia-deps-build + cd sequoia && PATH="$(ANDROID_NDK_HOME)/bin:$(PATH)" \ + CC="$(CC)" LD="$(LD)" AR="$(AR)" AS="$(AS)" RANLIB=$(RANLIB) STRIP="$(STRIP)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + LD_LIBRARY_PATH=$(LOCAL)/lib/ \ + PKG_CONFIG_PATH=$(LOCAL)/lib/pkgconfig \ + PKG_CONFIG_ALLOW_CROSS=1 \ + ARMV7_LINUX_ANDROIDEABI_OPENSSL_LIB_DIR="$(LOCAL)/lib" \ + ARMV7_LINUX_ANDROIDEABI_OPENSSL_INCLUDE_DIR="$(LOCAL)/include" \ + ARMV7_LINUX_ANDROIDEABI_OPENSSL_DIR="$(LOCAL)/bin" \ + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) cargo build --target [SEQUOIA_ARCH] -p sequoia-openpgp-ffi --release + +$(LOCAL)/lib/libsequoia_openpgp_ffi.so: $(CARGO_TARGET_DIR)/[SEQUOIA_ARCH]/release/libsequoia_openpgp_ffi.so + cp $(CARGO_TARGET_DIR)/[SEQUOIA_ARCH]/release/libsequoia_openpgp_ffi.* $(LOCAL)/lib/ + cp -r sequoia/openpgp-ffi/include/* $(LOCAL)/include + + +sequoia-ffi-build: $(CARGO_TARGET_DIR)/[SEQUOIA_ARCH]/release/libsequoia_openpgp_ffi.so + +sequoia-ffi-install: sequoia-deps-build $(LOCAL)/lib/libsequoia_openpgp_ffi.so + +#------------------------------------------------------------------------------# +# assets for Android app + +#ASSETS := $(EXTERNAL_ROOT)/assets +# +#assets: clean-assets +# # add the new stuff +# install -d $(ASSETS) +# cp -a $(LOCAL)/* $(ASSETS) +# # remove all the stuff we don't need +# rm -f $(ASSETS)/bin/*-static +# rm -f $(ASSETS)/bin/curl* +# rm -f $(ASSETS)/lib/*.a $(ASSETS)/lib/*.la +# # remove lib symlinks since Android AssetManager copies them as files +# rm -f $(ASSETS)/lib/*.so +# # remove .so.0 symlink and rename the .so.0.12.0 file to it +# for f in $(ASSETS)/lib/*.so.[0-9]*; do \ +# echo $$f; \ +# test ! -L $$f || \ +# (rm $$f && mv $$f.[0-9]* $$f); \ +# done +# rm -rf $(ASSETS)/include +# rm -rf $(ASSETS)/share/man $(ASSETS)/share/info $(ASSETS)/share/doc +# rm -rf $(ASSETS)/tests +# + +#------------------------------------------------------------------------------# +# clean + +clean-assets: + rm -rf $(ASSETS) + +clean-install: + rm -rf $(LOCAL) + +clean: $(EXTERNAL_SRCS_CLEAN) clean-assets clean-install libetpan-clean + +clean-all: clean + rm -rf *.git + rm -rf *.stamp +#------------------------------------------------------------------------------# + +.PHONY = clean clean-install clean-assets libetpan-clean \ + libiconv-build libiconv-install \ + libetpan-build \ + uuid-build uuid-prebuild uuid-install \ + gmp-build gmp-install \ + sequoia-deps-build \ + openssl-build openssl-install \ + nettle-build nettle-install \ + sequoia-ffi-build sequoia-ffi-install\ + assets \ + $(EXTERNAL_LOCAL_GITS_UPDATE) $(EXTERNAL_SRCS) $(EXTERNAL_SRCS_CLEAN)\ + showsetup