1489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden##########
2489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# This makefile builds local unit tests that run locally on the development machine.  Note
3489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# that it may be necessary to install some libraries on the dev maching to make the tests
4489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# build.
5489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden#
6489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# The same unit tests are also built by Android.mk to run on the target device.  The tests
7489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# should always build and pass in both places.  The on-device test is what really matters,
8489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# of course, but debugging is often somewhat easier on the dev platform.
9489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden##########
10489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
11489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenBASE=../../../..
12489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenSUBS=system/core \
13489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	system/keymaster\
14489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	hardware/libhardware \
15489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	external/gtest
16489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenGTEST=$(BASE)/external/gtest
17489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenKEYMASTER=$(BASE)/system/keymaster
18489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
19489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenINCLUDES=$(foreach dir,$(SUBS),-I $(BASE)/$(dir)/include) \
20489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	-I $(BASE)/libnativehelper/include/nativehelper \
21489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	-I $(GTEST) -Iinclude
22489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
23489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# Add USE_CLANG=1 to the make command line to build with clang, which has better error
24489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# reporting and diagnoses some conditions that GCC doesn't.
25489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenifdef USE_CLANG
26489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCC=/usr/bin/clang
27489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCXX=/usr/bin/clang
28489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCLANG_TEST_DEFINE=-DKEYMASTER_CLANG_TEST_BUILD
29489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCOMPILER_SPECIFIC_ARGS=-std=c++11 $(CLANG_TEST_DEFINE)
30489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenelse
31489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCOMPILER_SPECIFIC_ARGS=-std=c++0x -fprofile-arcs
32489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenendif
33489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
3447d2616439c134502d9ee87a3d4bda065e3d5324Shawn WilldenCPPFLAGS=$(INCLUDES) -g -O0 -MD -DHOST_BUILD
35489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCXXFLAGS=-Wall -Werror -Wno-unused -Winit-self -Wpointer-arith	-Wunused-parameter \
36489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden        -Werror=sign-compare -Wmissing-declarations -ftest-coverage -fno-permissive \
37489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	-Wno-deprecated-declarations -fno-exceptions -DKEYMASTER_NAME_TAGS \
38489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	$(COMPILER_SPECIFIC_ARGS)
39489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
40489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# Uncomment to enable debug logging.
41489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# CXXFLAGS += -DDEBUG
42489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
43489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenLDLIBS=-lpthread -lstdc++ -lgcov
44489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
45489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# This list of sources is used for dependency generation and cleanup.  Add each new source
46489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# file here (not headers).
47489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenCPPSRCS=\
48489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	../auth_token_table.cpp \
4947d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	auth_token_table_test.cpp \
5047d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	gtest_main.cpp \
5147d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	$(KEYMASTER)/authorization_set.cpp \
5247d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	$(KEYMASTER)/keymaster_tags.cpp \
5347d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	$(KEYMASTER)/logger.cpp \
5447d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	$(KEYMASTER)/serializable.cpp
5547d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden
5647d2616439c134502d9ee87a3d4bda065e3d5324Shawn WilldenCCSRCS=$(GTEST)/src/gtest-all.cc
57489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
58489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden# This list of binaries determes what gets built and run.  Add each new test binary here.
59489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenBINARIES=\
60489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	auth_token_table_test
61489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
62489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden.PHONY: coverage memcheck massif clean run
63489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
64489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden%.run: %
65489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	./$<
66489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	touch $@
67489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
68489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenrun: $(BINARIES:=.run)
69489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
7047d2616439c134502d9ee87a3d4bda065e3d5324Shawn WilldenGTEST_OBJS = $(GTEST)/src/gtest-all.o gtest_main.o
7147d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden
72489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenauth_token_table_test: auth_token_table_test.o \
73489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	../auth_token_table.o \
7447d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	$(GTEST_OBJS) \
75489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	$(KEYMASTER)/authorization_set.o \
7647d2616439c134502d9ee87a3d4bda065e3d5324Shawn Willden	$(KEYMASTER)/keymaster_tags.o \
77489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	$(KEYMASTER)/logger.o \
78489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	$(KEYMASTER)/serializable.o
79489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
80489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdencoverage: coverage.info
81489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	genhtml coverage.info --output-directory coverage
82489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
83489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdencoverage.info: run
84489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	lcov --capture --directory=. --directory=.. -b . --output-file coverage.info
85489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
86489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden%.coverage : %
87489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	$(MAKE) clean && $(MAKE) $<
88489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	./$<
89489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	lcov --capture --directory=. --output-file coverage.info
90489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	genhtml coverage.info --output-directory coverage
91489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden#UNINIT_OPTS=--track-origins=yes
92489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenUNINIT_OPTS=--undef-value-errors=no
93489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
94489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenMEMCHECK_OPTS=--leak-check=full \
95489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	--show-reachable=yes \
96489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	--vgdb=full \
97489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	$(UNINIT_OPTS) \
98489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	--error-exitcode=1
99489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
100489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenMASSIF_OPTS=--tool=massif \
101489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	--stacks=yes
102489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
103489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden%.memcheck : %
104489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	valgrind $(MEMCHECK_OPTS) ./$< && \
105489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	touch $@
106489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
107489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden%.massif : %
108489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	valgrind $(MASSIF_OPTS) --massif-out-file=$@ ./$<
109489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
110489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenmemcheck: $(BINARIES:=.memcheck)
111489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
112489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenmassif: $(BINARIES:=.massif)
113489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
114489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenOBJS=$(CPPSRCS:.cpp=.o)
115489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenDEPS=$(CPPSRCS:.cpp=.d)
116489dfe1f3dbdb9377debce826e37294d48fe6754Shawn WilldenGCOV=$(CPPSRCS:.cpp=.gcov) $(CPPSRCS:.cpp=.gcda) $(CPPSRCS:.cpp=.gcno)
117489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
118489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willdenclean:
119489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	rm -f $(OBJS) $(DEPS) $(BINARIES) $(GCOV) \
120489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden		$(BINARIES:=.run) $(BINARIES:=.memcheck) $(BINARIES:=.massif) \
121489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden		*gcov *gcno *gcda coverage.info
122489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden	rm -rf coverage
123489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
124489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden-include $(CPPSRCS:.cpp=.d)
125489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden-include $(CCSRCS:.cc=.d)
126489dfe1f3dbdb9377debce826e37294d48fe6754Shawn Willden
127