forked from microsoft/cpprestsdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
176 lines (155 loc) · 6.08 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# Configuration parameters
ANDROID_API = 18
ANDROID_ABI = armeabi-v7a
ANDROID_HOST = linux-x86_64
ANDROID_TOOLCHAIN = gcc
ANDROID_GCC_VERSION = 4.8
OPENSSL_VERSION = 1.0.2k
OPENSSL_PACKAGE = openssl-$(OPENSSL_VERSION)
OPENSSL_PATCH = $(OPENSSL_PACKAGE).patch
OPENSSL_TARBALL = $(OPENSSL_PACKAGE).tar.gz
OPENSSL_URL = https://www.openssl.org/source/$(OPENSSL_TARBALL)
OPENSSL_OPTIONS = -no-ssl2 -no-ssl3 -no-comp -no-hw -no-engine
OPENSSL_PREFIX = android-$(ANDROID_API)-$(ANDROID_ABI)-$(ANDROID_TOOLCHAIN)
OPENSSL_SOURCE = $(OPENSSL_PACKAGE)-$(ANDROID_ABI)
# Setup target parameters from ABI
ifneq ($(findstring armeabi,$(ANDROID_ABI)),)
ANDROID_ARCH := arm
ANDROID_TRIPLE := arm-linux-androideabi
ANDROID_TOOLARCH := $(ANDROID_TRIPLE)
OPENSSL_MACHINE := armv7
OPENSSL_SYSTEM := android
OPENSSL_TARGET := android-armeabi
endif
ifneq ($(findstring aarch64,$(ANDROID_ABI)),)
ANDROID_ARCH := arm64
ANDROID_TRIPLE := aarch64-linux-android
ANDROID_TOOLARCH := $(ANDROID_TRIPLE)
OPENSSL_MACHINE := aarch64
OPENSSL_SYSTEM := android64
OPENSSL_TARGET := android64-aarch64
endif
ifneq ($(findstring x86,$(ANDROID_ABI)),)
ANDROID_ARCH := x86
ANDROID_TRIPLE := i686-linux-android
ANDROID_TOOLARCH := $(ANDROID_ARCH)
OPENSSL_MACHINE := i686
OPENSSL_SYSTEM := android
OPENSSL_TARGET := android-x86
endif
# Validate Android NDK directory paths and use fallback directories where applicable
define direxists =
$(if $(wildcard $(1)),$(strip $(1)),"")
endef
define findfirstdir =
$(call direxists,$(firstword $(filter-out "",$(foreach val,$(3),$(call direxists,$(subst $(2),$(strip $(val)),$(1)))))))
endef
ifeq ($(call direxists,$(ANDROID_NDK)),"")
$(error invalid Android NDK root directory)
endif
ANDROID_LINK_SYSROOT := $(ANDROID_NDK)/platforms/android-$(ANDROID_API)/arch-$(ANDROID_ARCH)
ifeq ($(call direxists,$(ANDROID_LINK_SYSROOT)),"")
$(error invalid Android ABI or API level, could not locate Android NDK sysroot directory)
endif
ANDROID_SYSROOT := $(ANDROID_NDK)/sysroot
ifeq ($(call direxists,$(ANDROID_SYSROOT)),"")
ANDROID_SYSROOT := $(ANDROID_LINK_SYSROOT)
endif
ANDROID_GCC_VERSIONS := $(ANDROID_GCC_VERSION) 4.9 4.8
ANDROID_GCC_PREBUILT_template := $(ANDROID_NDK)/toolchains/$(ANDROID_TOOLARCH)-<<VERSION>>/prebuilt
ANDROID_GCC_PREBUILT := $(call findfirstdir,$(ANDROID_GCC_PREBUILT_template),<<VERSION>>,$(ANDROID_GCC_VERSIONS))
ifeq ($(ANDROID_GCC_PREBUILT),"")
$(error could not determine Android NDK GCC toolchain prebuilt directory)
endif
ANDROID_HOSTS := $(ANDROID_HOST) linux-x86_64 linux-x86 darwin-x86_64 darwin-x86
ANDROID_GCC_TOOLCHAIN_template := $(ANDROID_GCC_PREBUILT)/<<HOST>>
ANDROID_GCC_TOOLCHAIN := $(call findfirstdir,$(ANDROID_GCC_TOOLCHAIN_template),<<HOST>>,$(ANDROID_HOSTS))
ifeq ($(ANDROID_GCC_TOOLCHAIN),"")
$(error could not determine Android NDK GCC toolchain host directory)
endif
ANDROID_LLVM_VERSIONS := llvm llvm-3.6 llvm-3.5 llvm-3.4
ANDROID_LLVM_TOOLCHAIN_template := $(ANDROID_NDK)/toolchains/<<LLVM>>/prebuilt/$(notdir $(ANDROID_GCC_TOOLCHAIN))
ANDROID_LLVM_TOOLCHAIN := $(call findfirstdir,$(ANDROID_LLVM_TOOLCHAIN_template),<<LLVM>>,$(ANDROID_LLVM_VERSIONS))
ifeq ($(ANDROID_LLVM_TOOLCHAIN),"")
$(error could not determine Android NDK LLVM toolchain directory)
endif
# Configure toolchain
OPENSSL_CROSS_COMPILE :=
OPENSSL_CC :=
OPENSSL_RANLIB := $(ANDROID_GCC_TOOLCHAIN)/bin/$(ANDROID_TRIPLE)-ranlib
ifneq ($(findstring clang,$(ANDROID_TOOLCHAIN)),)
OPENSSL_TARGET := $(OPENSSL_TARGET)-clang
OPENSSL_CC := $(ANDROID_LLVM_TOOLCHAIN)/bin/clang
endif
ifneq ($(findstring gcc,$(ANDROID_TOOLCHAIN)),)
OPENSSL_CROSS_COMPILE := $(ANDROID_TRIPLE)-
OPENSSL_CC := $(ANDROID_GCC_TOOLCHAIN)/bin/$(ANDROID_TRIPLE)-gcc
endif
ifeq ($(OPENSSL_CC),)
$(error invalid toolchain specified for ANDROID_TOOLCHAIN)
endif
all: info $(OPENSSL_PREFIX)/lib/libssl.a
$(OPENSSL_TARBALL):
@echo "Downloading OpenSSL tarball"
wget $(OPENSSL_URL)
$(OPENSSL_PREFIX)/lib/libssl.a: $(OPENSSL_TARBALL)
@echo "Decompressing OpenSSL package" && \
( \
set -e; \
rm -rf $(OPENSSL_SOURCE); \
rm -rf $(OPENSSL_PACKAGE); \
tar xzf $(OPENSSL_TARBALL); \
) && \
mv $(OPENSSL_PACKAGE) $(OPENSSL_SOURCE)
@if test -f $(OPENSSL_PATCH); then \
echo "Patching OpenSSL source tree"; \
( cd $(OPENSSL_SOURCE) && patch -p1 < ../$(OPENSSL_PATCH) ); \
fi
@echo "Building OpenSSL" && \
export ANDROID_NDK="$(ANDROID_NDK)" && \
export ANDROID_API="$(ANDROID_API)" && \
export ANDROID_ARCH="$(ANDROID_ARCH)" && \
export ANDROID_TRIPLE="$(ANDROID_TRIPLE)" && \
export ANDROID_SYSROOT="$(ANDROID_SYSROOT)" && \
export ANDROID_LINK_SYSROOT="$(ANDROID_LINK_SYSROOT)" && \
export ANDROID_GCC_TOOLCHAIN="$(ANDROID_GCC_TOOLCHAIN)" && \
export CROSS_SYSROOT="$(ANDROID_SYSROOT)" && \
export SYSROOT="$(ANDROID_SYSROOT)" && \
export ARCH="$(ANDROID_ARCH)" && \
export MACHINE="$(OPENSSL_MACHINE)" && \
export SYSTEM="$(OPENSSL_SYSTEM)" && \
export CROSS_COMPILE="$(OPENSSL_CROSS_COMPILE)" && \
export HOSTCC="$(ANDROID_TOOLCHAIN)" && \
export PATH="$(ANDROID_GCC_TOOLCHAIN)/bin:$(ANDROID_LLVM_TOOLCHAIN)/bin:$(PATH)" && \
( \
cd $(OPENSSL_SOURCE); \
perl Configure $(OPENSSL_TARGET) shared $(OPENSSL_OPTIONS) --prefix="`pwd`/../$(OPENSSL_PREFIX)" $(OPENSSL_CFLAGS) && \
make depend && \
make all && \
make install CC=$(OPENSSL_CC) RANLIB=$(OPENSSL_RANLIB); \
)
clean:
@echo "Cleaning"
rm -rf $(OPENSSL_SOURCE)
rm -rf $(OPENSSL_PACKAGE)
rm -rf $(OPENSSL_PREFIX)
info:
@echo "OpenSSL build options"
@echo "ANDROID_NDK = $(ANDROID_NDK)"
@echo "ANDROID_API = $(ANDROID_API)"
@echo "ANDROID_ABI = $(ANDROID_ABI)"
@echo "ANDROID_HOST = $(ANDROID_HOST)"
@echo "ANDROID_TOOLCHAIN = $(ANDROID_TOOLCHAIN)"
@echo "ANDROID_TRIPLE = $(ANDROID_TRIPLE)"
@echo "ANDROID_SYSROOT = $(ANDROID_SYSROOT)"
@echo "ANDROID_LINK_SYSROOT = $(ANDROID_LINK_SYSROOT)"
@echo "ANDROID_GCC_TOOLCHAIN = $(ANDROID_GCC_TOOLCHAIN)"
@echo "ANDROID_LLVM_TOOLCHAIN = $(ANDROID_LLVM_TOOLCHAIN)"
@echo "OPENSSL_VERSION = $(OPENSSL_VERSION)"
@echo "OPENSSL_URL = $(OPENSSL_URL)"
@echo "OPENSSL_OPTIONS = $(OPENSSL_OPTIONS)"
@echo "OPENSSL_PREFIX = $(OPENSSL_PREFIX)"
@echo "OPENSSL_CFLAGS = $(OPENSSL_CFLAGS)"
@echo "OPENSSL_CC = $(OPENSSL_CC)"
@echo "OPENSSL_RANLIB = $(OPENSSL_RANLIB)"
.PHONY: all clean info