blob: b4c7f7e97f0e6a755c1b568b27f371f75c99a9f2 [file] [log] [blame] [edit]
# Build RAPPOR C++ code.
default : \
_tmp/rappor_sim \
_tmp/encoder_demo \
_tmp/protobuf_encoder_demo \
_tmp/openssl_hash_impl_test
# All intermediate files live in _tmp/
clean :
rm -f --verbose _tmp/*
# Use protobuf compiler to generate .cc and .h files. The .o and the .d depend
# on .cc, so that is the target of this rule.
_tmp/%.pb.cc : ../proto/%.proto
protoc --cpp_out _tmp --proto_path=../proto $<
#
# Generate .d Makefile fragments.
#
# CXX flags:
# -MM: exclude system headers
# -I _tmp: So that protobuf files found
#
# Makefile stuff:
# $*: the part that matched the wildcard, e.g. 'rappor_sim' for '%.cc'
# matching 'rappor_sim.cc'
#
# We use $< (first prereq) to generate .d and and .o files from .cc, because
# it only needs the .cc file. We used $^ (all prereqs) to pass ALL the .o
# files to the link step.
_tmp/%.d : %.cc
./dotd.sh $* $@ \
$(CXX) -I _tmp/ -MM $(CPPFLAGS) $<
# Special case for .d file of generated source.
_tmp/%.pb.d : _tmp/%.pb.cc
./dotd.sh $*.pb $@ \
$(CXX) -I _tmp/ -MM $(CPPFLAGS) $<
#
# Include the Makefile fragments we generated, so that changes to headers will
# rebuild both .d files and .o files. ('-include' suppresses the error if they
# don't exist.)
#
# NOTE: We have to list them explicitly. Every time you add a source file, add
# the corresponding .d file here.
#
-include \
_tmp/encoder.d \
_tmp/libc_rand_impl.d \
_tmp/openssl_hash_impl.d \
_tmp/openssl_hash_impl_test.d \
_tmp/protobuf_encoder.d \
_tmp/protobuf_encoder_demo.d \
_tmp/rappor_sim.d \
_tmp/unix_kernel_rand_impl.d \
_tmp/rappor.pb.d \
_tmp/example_app.pb.d
# For example, -Wextra warns about unused params, but -Wall doesn't.
CXXFLAGS = -Wall -Wextra #-Wpedantic
#
# Build object files (-c: compile only)
#
# NOTE: More prerequisites to _tmp/%.o (header files) are added by the .d
# files, so we need $<.
_tmp/%.o : %.cc
$(CXX) $(CXXFLAGS) -I _tmp/ -c -o $@ $<
_tmp/%.pb.o : _tmp/%.pb.cc
$(CXX) $(CXXFLAGS) -I _tmp/ -c -o $@ $<
#
# Build executables
#
# CXX flag notes:
# -lcrypto from openssl
# -g for debug info
#
# You can add -std=c++0x for std::array, etc.
# $^ : all prerequisites
_tmp/rappor_sim : \
_tmp/encoder.o \
_tmp/libc_rand_impl.o \
_tmp/unix_kernel_rand_impl.o \
_tmp/openssl_hash_impl.o \
_tmp/rappor_sim.o
$(CXX) \
$(CXXFLAGS) \
-o $@ \
$^ \
-lcrypto \
-g
# $^ : all prerequisites
_tmp/encoder_demo: \
_tmp/encoder.o \
_tmp/unix_kernel_rand_impl.o \
_tmp/openssl_hash_impl.o \
_tmp/encoder_demo.o
$(CXX) \
$(CXXFLAGS) \
-o $@ \
$^ \
-lcrypto \
-g
# -I _tmp for protobuf headers
_tmp/protobuf_encoder_demo : \
_tmp/encoder.o \
_tmp/libc_rand_impl.o \
_tmp/unix_kernel_rand_impl.o \
_tmp/openssl_hash_impl.o \
_tmp/protobuf_encoder.o \
_tmp/protobuf_encoder_demo.o \
_tmp/example_app.pb.o \
_tmp/rappor.pb.o
$(CXX) \
$(CXXFLAGS) \
-I _tmp \
-o $@ \
$^ \
-lprotobuf \
-lcrypto \
-g
_tmp/openssl_hash_impl_test : \
_tmp/openssl_hash_impl.o \
_tmp/openssl_hash_impl_test.o
$(CXX) \
$(CXXFLAGS) \
-o $@ \
$^ \
-lcrypto \
-g
# Unittests are currently run manually, and require the Google gtest
# framework version 1.7.0 or greater, found at
# https://github.com/google/googletest/releases
# TODO(mdeshon-google): Installer script
unittest: _tmp/openssl_hash_impl_unittest _tmp/encoder_unittest
_tmp/openssl_hash_impl_unittest
_tmp/encoder_unittest
_tmp/openssl_hash_impl_unittest: openssl_hash_impl_unittest.cc openssl_hash_impl.cc
$(CXX) -g -o $@ $^ -lssl -lcrypto -lgtest
_tmp/encoder_unittest: encoder_unittest.cc encoder.cc unix_kernel_rand_impl.cc openssl_hash_impl.cc
$(CXX) -g -o $@ $^ -lssl -lcrypto -lgtest