1 ##### 2 # Local unit test Makefile 3 # 4 # This makefile builds and runs the trusty_keymaster unit tests locally on the development 5 # machine, not on an Android device. 6 # 7 # To build and run these tests, one pre-requisite must be manually installed: BoringSSL. 8 # This Makefile expects to find BoringSSL in a directory adjacent to $ANDROID_BUILD_TOP. 9 # To get and build it, first install the Ninja build tool (e.g. apt-get install 10 # ninja-build), then do: 11 # 12 # cd $ANDROID_BUILD_TOP/.. 13 # git clone https://boringssl.googlesource.com/boringssl 14 # cd boringssl 15 # mdkir build 16 # cd build 17 # cmake -GNinja .. 18 # ninja 19 # 20 # Then return to $ANDROID_BUILD_TOP/system/keymaster and run "make". 21 ##### 22 23 BASE=../../../.. 24 SUBS=system/core \ 25 system/keymaster \ 26 hardware/libhardware \ 27 external/gtest 28 GTEST=$(BASE)/external/gtest 29 KM=$(BASE)/system/keymaster 30 31 INCLUDES=$(foreach dir,$(SUBS),-I $(BASE)/$(dir)/include) \ 32 -I $(BASE)/libnativehelper/include/nativehelper \ 33 -I ../tipc/include \ 34 -I $(BASE)/system/keymaster \ 35 -I $(GTEST) \ 36 -I$(BASE)/../boringssl/include 37 38 ifdef USE_CLANG 39 CC=/usr/bin/clang 40 CXX=/usr/bin/clang 41 CLANG_TEST_DEFINE=-DKEYMASTER_CLANG_TEST_BUILD 42 COMPILER_SPECIFIC_ARGS=-std=c++11 $(CLANG_TEST_DEFINE) 43 else 44 COMPILER_SPECIFIC_ARGS=-std=c++0x -fprofile-arcs 45 endif 46 47 CPPFLAGS=$(INCLUDES) -g -O0 -MD 48 CXXFLAGS=-Wall -Werror -Wno-unused -Winit-self -Wpointer-arith -Wunused-parameter \ 49 -Wmissing-declarations -ftest-coverage \ 50 -Wno-deprecated-declarations -fno-exceptions -DKEYMASTER_NAME_TAGS \ 51 $(COMPILER_SPECIFIC_ARGS) 52 LDLIBS=-L$(BASE)/../boringssl/build/crypto -lcrypto -lpthread -lstdc++ 53 54 CPPSRCS=\ 55 $(KM)/aead_mode_operation.cpp \ 56 $(KM)/aes_key.cpp \ 57 $(KM)/aes_operation.cpp \ 58 $(KM)/android_keymaster.cpp \ 59 $(KM)/android_keymaster_messages.cpp \ 60 $(KM)/android_keymaster_messages_test.cpp \ 61 $(KM)/android_keymaster_test.cpp \ 62 $(KM)/android_keymaster_test_utils.cpp \ 63 $(KM)/android_keymaster_utils.cpp \ 64 $(KM)/asymmetric_key.cpp \ 65 $(KM)/auth_encrypted_key_blob.cpp \ 66 $(KM)/auth_encrypted_key_blob.cpp \ 67 $(KM)/authorization_set.cpp \ 68 $(KM)/authorization_set_test.cpp \ 69 $(KM)/ec_key.cpp \ 70 $(KM)/ec_keymaster0_key.cpp \ 71 $(KM)/ecdsa_operation.cpp \ 72 $(KM)/hmac_key.cpp \ 73 $(KM)/hmac_operation.cpp \ 74 $(KM)/integrity_assured_key_blob.cpp \ 75 $(KM)/key.cpp \ 76 $(KM)/key_blob_test.cpp \ 77 $(KM)/keymaster0_engine.cpp \ 78 $(KM)/logger.cpp \ 79 $(KM)/ocb_utils.cpp \ 80 $(KM)/openssl_err.cpp \ 81 $(KM)/openssl_utils.cpp \ 82 $(KM)/operation.cpp \ 83 $(KM)/operation_table.cpp \ 84 $(KM)/rsa_key.cpp \ 85 $(KM)/rsa_keymaster0_key.cpp \ 86 $(KM)/rsa_operation.cpp \ 87 $(KM)/serializable.cpp \ 88 $(KM)/soft_keymaster_context.cpp \ 89 $(KM)/symmetric_key.cpp \ 90 $(KM)/unencrypted_key_blob.cpp \ 91 trusty_keymaster_device.cpp \ 92 trusty_keymaster_device_test.cpp 93 CCSRCS=$(GTEST)/src/gtest-all.cc 94 CSRCS=ocb.c 95 96 OBJS=$(CPPSRCS:.cpp=.o) $(CCSRCS:.cc=.o) $(CSRCS:.c=.o) 97 DEPS=$(CPPSRCS:.cpp=.d) $(CCSRCS:.cc=.d) $(CSRCS:.c=.d) 98 GCDA=$(CPPSRCS:.cpp=.gcda) $(CCSRCS:.cc=.gcda) $(CSRCS:.c=.gcda) 99 GCNO=$(CPPSRCS:.cpp=.gcno) $(CCSRCS:.cc=.gcno) $(CSRCS:.c=.gcno) 100 101 LINK.o=$(LINK.cc) 102 103 BINARIES=trusty_keymaster_device_test 104 105 ifdef TRUSTY 106 BINARIES += trusty_keymaster_device_test 107 endif # TRUSTY 108 109 .PHONY: coverage memcheck massif clean run 110 111 %.run: % 112 ./$< 113 touch $@ 114 115 run: $(BINARIES:=.run) 116 117 coverage: coverage.info 118 genhtml coverage.info --output-directory coverage 119 120 coverage.info: run 121 lcov --capture --directory=. --output-file coverage.info 122 123 %.coverage : % 124 $(MAKE) clean && $(MAKE) $< 125 ./$< 126 lcov --capture --directory=. --output-file coverage.info 127 genhtml coverage.info --output-directory coverage 128 129 #UNINIT_OPTS=--track-origins=yes 130 UNINIT_OPTS=--undef-value-errors=no 131 132 MEMCHECK_OPTS=--leak-check=full \ 133 --show-reachable=yes \ 134 --vgdb=full \ 135 $(UNINIT_OPTS) \ 136 --error-exitcode=1 137 138 MASSIF_OPTS=--tool=massif \ 139 --stacks=yes 140 141 %.memcheck : % 142 valgrind $(MEMCHECK_OPTS) ./$< && \ 143 touch $@ 144 145 %.massif : % 146 valgrind $(MASSIF_OPTS) --massif-out-file=$@ ./$< 147 148 memcheck: $(BINARIES:=.memcheck) 149 150 massif: $(BINARIES:=.massif) 151 152 trusty_keymaster_device_test: trusty_keymaster_device_test.o \ 153 trusty_keymaster_device.o \ 154 $(KM)/aead_mode_operation.o \ 155 $(KM)/aes_key.o \ 156 $(KM)/aes_operation.o \ 157 $(KM)/android_keymaster.o \ 158 $(KM)/android_keymaster_messages.o \ 159 $(KM)/android_keymaster_test_utils.o \ 160 $(KM)/android_keymaster_utils.o \ 161 $(KM)/asymmetric_key.o \ 162 $(KM)/auth_encrypted_key_blob.o \ 163 $(KM)/auth_encrypted_key_blob.o \ 164 $(KM)/authorization_set.o \ 165 $(KM)/ec_key.o \ 166 $(KM)/ec_keymaster0_key.cpp \ 167 $(KM)/ecdsa_operation.o \ 168 $(KM)/hmac_key.o \ 169 $(KM)/hmac_operation.o \ 170 $(KM)/integrity_assured_key_blob.o \ 171 $(KM)/key.o \ 172 $(KM)/keymaster0_engine.o \ 173 $(KM)/logger.o \ 174 $(KM)/ocb.o \ 175 $(KM)/ocb_utils.o \ 176 $(KM)/openssl_err.o \ 177 $(KM)/openssl_utils.o \ 178 $(KM)/operation.o \ 179 $(KM)/operation_table.o \ 180 $(KM)/rsa_key.o \ 181 $(KM)/rsa_keymaster0_key.o \ 182 $(KM)/rsa_operation.o \ 183 $(KM)/serializable.o \ 184 $(KM)/soft_keymaster_context.o \ 185 $(KM)/symmetric_key.o \ 186 $(GTEST)/src/gtest-all.o 187 188 $(GTEST)/src/gtest-all.o: CXXFLAGS:=$(subst -Wmissing-declarations,,$(CXXFLAGS)) 189 ocb.o: CFLAGS=$(CLANG_TEST_DEFINE) 190 191 clean: 192 rm -f $(OBJS) $(DEPS) $(GCDA) $(GCNO) $(BINARIES) \ 193 $(BINARIES:=.run) $(BINARIES:=.memcheck) $(BINARIES:=.massif) \ 194 coverage.info 195 rm -rf coverage 196 197 -include $(CPPSRCS:.cpp=.d) 198 -include $(CCSRCS:.cc=.d) 199 200