1*2abb3134SXin Li# Build RAPPOR C++ code. 2*2abb3134SXin Li 3*2abb3134SXin Lidefault : \ 4*2abb3134SXin Li _tmp/rappor_sim \ 5*2abb3134SXin Li _tmp/encoder_demo \ 6*2abb3134SXin Li _tmp/protobuf_encoder_demo \ 7*2abb3134SXin Li _tmp/openssl_hash_impl_test 8*2abb3134SXin Li 9*2abb3134SXin Li# All intermediate files live in _tmp/ 10*2abb3134SXin Liclean : 11*2abb3134SXin Li rm -f --verbose _tmp/* 12*2abb3134SXin Li 13*2abb3134SXin Li# Use protobuf compiler to generate .cc and .h files. The .o and the .d depend 14*2abb3134SXin Li# on .cc, so that is the target of this rule. 15*2abb3134SXin Li 16*2abb3134SXin Li_tmp/%.pb.cc : ../proto/%.proto 17*2abb3134SXin Li protoc --cpp_out _tmp --proto_path=../proto $< 18*2abb3134SXin Li 19*2abb3134SXin Li# 20*2abb3134SXin Li# Generate .d Makefile fragments. 21*2abb3134SXin Li# 22*2abb3134SXin Li 23*2abb3134SXin Li# CXX flags: 24*2abb3134SXin Li# -MM: exclude system headers 25*2abb3134SXin Li# -I _tmp: So that protobuf files found 26*2abb3134SXin Li# 27*2abb3134SXin Li# Makefile stuff: 28*2abb3134SXin Li# $*: the part that matched the wildcard, e.g. 'rappor_sim' for '%.cc' 29*2abb3134SXin Li# matching 'rappor_sim.cc' 30*2abb3134SXin Li# 31*2abb3134SXin Li# We use $< (first prereq) to generate .d and and .o files from .cc, because 32*2abb3134SXin Li# it only needs the .cc file. We used $^ (all prereqs) to pass ALL the .o 33*2abb3134SXin Li# files to the link step. 34*2abb3134SXin Li 35*2abb3134SXin Li_tmp/%.d : %.cc 36*2abb3134SXin Li ./dotd.sh $* $@ \ 37*2abb3134SXin Li $(CXX) -I _tmp/ -MM $(CPPFLAGS) $< 38*2abb3134SXin Li 39*2abb3134SXin Li# Special case for .d file of generated source. 40*2abb3134SXin Li_tmp/%.pb.d : _tmp/%.pb.cc 41*2abb3134SXin Li ./dotd.sh $*.pb $@ \ 42*2abb3134SXin Li $(CXX) -I _tmp/ -MM $(CPPFLAGS) $< 43*2abb3134SXin Li 44*2abb3134SXin Li# 45*2abb3134SXin Li# Include the Makefile fragments we generated, so that changes to headers will 46*2abb3134SXin Li# rebuild both .d files and .o files. ('-include' suppresses the error if they 47*2abb3134SXin Li# don't exist.) 48*2abb3134SXin Li# 49*2abb3134SXin Li# NOTE: We have to list them explicitly. Every time you add a source file, add 50*2abb3134SXin Li# the corresponding .d file here. 51*2abb3134SXin Li# 52*2abb3134SXin Li 53*2abb3134SXin Li-include \ 54*2abb3134SXin Li _tmp/encoder.d \ 55*2abb3134SXin Li _tmp/libc_rand_impl.d \ 56*2abb3134SXin Li _tmp/openssl_hash_impl.d \ 57*2abb3134SXin Li _tmp/openssl_hash_impl_test.d \ 58*2abb3134SXin Li _tmp/protobuf_encoder.d \ 59*2abb3134SXin Li _tmp/protobuf_encoder_demo.d \ 60*2abb3134SXin Li _tmp/rappor_sim.d \ 61*2abb3134SXin Li _tmp/unix_kernel_rand_impl.d \ 62*2abb3134SXin Li _tmp/rappor.pb.d \ 63*2abb3134SXin Li _tmp/example_app.pb.d 64*2abb3134SXin Li 65*2abb3134SXin Li# For example, -Wextra warns about unused params, but -Wall doesn't. 66*2abb3134SXin LiCXXFLAGS = -Wall -Wextra #-Wpedantic 67*2abb3134SXin Li 68*2abb3134SXin Li# 69*2abb3134SXin Li# Build object files (-c: compile only) 70*2abb3134SXin Li# 71*2abb3134SXin Li 72*2abb3134SXin Li# NOTE: More prerequisites to _tmp/%.o (header files) are added by the .d 73*2abb3134SXin Li# files, so we need $<. 74*2abb3134SXin Li_tmp/%.o : %.cc 75*2abb3134SXin Li $(CXX) $(CXXFLAGS) -I _tmp/ -c -o $@ $< 76*2abb3134SXin Li 77*2abb3134SXin Li_tmp/%.pb.o : _tmp/%.pb.cc 78*2abb3134SXin Li $(CXX) $(CXXFLAGS) -I _tmp/ -c -o $@ $< 79*2abb3134SXin Li 80*2abb3134SXin Li# 81*2abb3134SXin Li# Build executables 82*2abb3134SXin Li# 83*2abb3134SXin Li 84*2abb3134SXin Li# CXX flag notes: 85*2abb3134SXin Li# -lcrypto from openssl 86*2abb3134SXin Li# -g for debug info 87*2abb3134SXin Li# 88*2abb3134SXin Li# You can add -std=c++0x for std::array, etc. 89*2abb3134SXin Li 90*2abb3134SXin Li# $^ : all prerequisites 91*2abb3134SXin Li_tmp/rappor_sim : \ 92*2abb3134SXin Li _tmp/encoder.o \ 93*2abb3134SXin Li _tmp/libc_rand_impl.o \ 94*2abb3134SXin Li _tmp/unix_kernel_rand_impl.o \ 95*2abb3134SXin Li _tmp/openssl_hash_impl.o \ 96*2abb3134SXin Li _tmp/rappor_sim.o 97*2abb3134SXin Li $(CXX) \ 98*2abb3134SXin Li $(CXXFLAGS) \ 99*2abb3134SXin Li -o $@ \ 100*2abb3134SXin Li $^ \ 101*2abb3134SXin Li -lcrypto \ 102*2abb3134SXin Li -g 103*2abb3134SXin Li 104*2abb3134SXin Li# $^ : all prerequisites 105*2abb3134SXin Li_tmp/encoder_demo: \ 106*2abb3134SXin Li _tmp/encoder.o \ 107*2abb3134SXin Li _tmp/unix_kernel_rand_impl.o \ 108*2abb3134SXin Li _tmp/openssl_hash_impl.o \ 109*2abb3134SXin Li _tmp/encoder_demo.o 110*2abb3134SXin Li $(CXX) \ 111*2abb3134SXin Li $(CXXFLAGS) \ 112*2abb3134SXin Li -o $@ \ 113*2abb3134SXin Li $^ \ 114*2abb3134SXin Li -lcrypto \ 115*2abb3134SXin Li -g 116*2abb3134SXin Li 117*2abb3134SXin Li# -I _tmp for protobuf headers 118*2abb3134SXin Li_tmp/protobuf_encoder_demo : \ 119*2abb3134SXin Li _tmp/encoder.o \ 120*2abb3134SXin Li _tmp/libc_rand_impl.o \ 121*2abb3134SXin Li _tmp/unix_kernel_rand_impl.o \ 122*2abb3134SXin Li _tmp/openssl_hash_impl.o \ 123*2abb3134SXin Li _tmp/protobuf_encoder.o \ 124*2abb3134SXin Li _tmp/protobuf_encoder_demo.o \ 125*2abb3134SXin Li _tmp/example_app.pb.o \ 126*2abb3134SXin Li _tmp/rappor.pb.o 127*2abb3134SXin Li $(CXX) \ 128*2abb3134SXin Li $(CXXFLAGS) \ 129*2abb3134SXin Li -I _tmp \ 130*2abb3134SXin Li -o $@ \ 131*2abb3134SXin Li $^ \ 132*2abb3134SXin Li -lprotobuf \ 133*2abb3134SXin Li -lcrypto \ 134*2abb3134SXin Li -g 135*2abb3134SXin Li 136*2abb3134SXin Li_tmp/openssl_hash_impl_test : \ 137*2abb3134SXin Li _tmp/openssl_hash_impl.o \ 138*2abb3134SXin Li _tmp/openssl_hash_impl_test.o 139*2abb3134SXin Li $(CXX) \ 140*2abb3134SXin Li $(CXXFLAGS) \ 141*2abb3134SXin Li -o $@ \ 142*2abb3134SXin Li $^ \ 143*2abb3134SXin Li -lcrypto \ 144*2abb3134SXin Li -g 145*2abb3134SXin Li 146*2abb3134SXin Li# Unittests are currently run manually, and require the Google gtest 147*2abb3134SXin Li# framework version 1.7.0 or greater, found at 148*2abb3134SXin Li# https://github.com/google/googletest/releases 149*2abb3134SXin Li# TODO(mdeshon-google): Installer script 150*2abb3134SXin Liunittest: _tmp/openssl_hash_impl_unittest _tmp/encoder_unittest 151*2abb3134SXin Li _tmp/openssl_hash_impl_unittest 152*2abb3134SXin Li _tmp/encoder_unittest 153*2abb3134SXin Li 154*2abb3134SXin Li_tmp/openssl_hash_impl_unittest: openssl_hash_impl_unittest.cc openssl_hash_impl.cc 155*2abb3134SXin Li $(CXX) -g -o $@ $^ -lssl -lcrypto -lgtest 156*2abb3134SXin Li 157*2abb3134SXin Li_tmp/encoder_unittest: encoder_unittest.cc encoder.cc unix_kernel_rand_impl.cc openssl_hash_impl.cc 158*2abb3134SXin Li $(CXX) -g -o $@ $^ -lssl -lcrypto -lgtest 159