libweave: Build with Makefile instead of GYP.

Mitigates the need for *.gyp, *.gypi, src/empty.cc, examples/build.sh,
examples/prerequisites.sh, but does not remove those files. Conditions
for clang have not been added yet.

"make" generates libweave.so
"make test" builds and runs tests
"make clean" does what you expect
"make third_party/lib/libevent.a" downloads and builds libevent
"make cleanall" runs clean, and cleans libevent and googletest

BUG: 26508278

Change-Id: I505f0b1275b6cf074a06d29c658367c257faf142
Reviewed-on: https://weave-review.googlesource.com/2167
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0eb4e12
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,81 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Run make with BUILD_MODE=Release for release.
+BUILD_MODE ?= Debug
+
+DEFS_Debug := \
+	-D_DEBUG
+
+DEFS_Release := \
+	-DNDEBUG
+
+INCLUDES := \
+	-I. \
+	-Iinclude \
+	-Ithird_party/chromium \
+	-Ithird_party/include \
+	-Ithird_party/libuweave \
+	-Ithird_party/modp_b64/modp_b64
+
+CFLAGS := \
+	-fno-exceptions \
+	-fPIC \
+	-fvisibility=hidden \
+	-Wall \
+	-Werror \
+	-Wextra \
+	-Wl,--exclude-libs,ALL \
+	-Wno-char-subscripts \
+	-Wno-format-nonliteral \
+	-Wno-missing-field-initializers \
+	-Wno-unused-local-typedefs \
+	-Wno-unused-parameter \
+	-Wpacked \
+	-Wpointer-arith \
+	-Wwrite-strings
+
+CFLAGS_Debug := \
+	-O0   \
+	-g3
+
+CFLAGS_Release := \
+	-Os
+
+CFLAGS_C := \
+	-std=c99
+
+CFLAGS_CC := \
+	-std=c++11
+
+include file_lists.mk third_party.mk examples.mk tests.mk
+
+###
+# libweave.so
+
+out/$(BUILD_MODE)/libweave.so : out/$(BUILD_MODE)/libweave_common.a
+	$(CXX) -shared -Wl,-soname=libweave.so -o $@ -Wl,--whole-archive $^ -Wl,--no-whole-archive -lcrypto -lexpat -lpthread -lrt
+
+###
+# src/
+
+weave_obj_files := $(WEAVE_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(weave_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave_common.a : $(weave_obj_files) $(third_party_chromium_base_obj_files) $(third_party_chromium_crypto_obj_files) $(third_party_modp_b64_obj_files) $(third_party_libuweave_obj_files)
+	rm -f $@
+	$(AR) crsT $@ $^
+
+all : out/$(BUILD_MODE)/libweave.so out/$(BUILD_MODE)/libweave_exports_testrunner out/$(BUILD_MODE)/libweave_testrunner all-examples
+
+clean :
+	rm -rf out
+
+cleanall : clean clean-gtest clean-libevent
+
+.PHONY : clean cleanall all
+
diff --git a/examples.mk b/examples.mk
new file mode 100644
index 0000000..970969e
--- /dev/null
+++ b/examples.mk
@@ -0,0 +1,58 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+###
+# examples
+
+examples_provider_obj_files := $(EXAMPLES_PROVIDER_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libevent.a, but the headers files in third_party/include.
+$(examples_provider_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libevent.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/examples_provider.a : $(examples_provider_obj_files)
+	rm -f $@
+	$(AR) crsT $@ $^
+
+# We don't need libevent.a, but the headers files in third_party/include.
+out/$(BUILD_MODE)/examples/daemon/%.o : examples/daemon/%.cc third_party/lib/libevent.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+daemon_common_flags := \
+	-Wl,-rpath=out/$(BUILD_MODE)/ \
+	-Lthird_party/lib \
+	-levent \
+	-levent_openssl \
+	-lpthread \
+	-lavahi-common \
+	-lavahi-client \
+	-lexpat \
+	-lcurl \
+	-lssl \
+	-lcrypto
+
+out/$(BUILD_MODE)/weave_daemon_ledflasher : out/$(BUILD_MODE)/examples/daemon/ledflasher/ledflasher.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_light : out/$(BUILD_MODE)/examples/daemon/light/light.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_lock : out/$(BUILD_MODE)/examples/daemon/lock/lock.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_oven : out/$(BUILD_MODE)/examples/daemon/oven/oven.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_sample : out/$(BUILD_MODE)/examples/daemon/sample/sample.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(daemon_common_flags)
+
+out/$(BUILD_MODE)/weave_daemon_speaker : out/$(BUILD_MODE)/examples/daemon/speaker/speaker.o out/$(BUILD_MODE)/examples_provider.a out/$(BUILD_MODE)/libweave.so
+	$(CXX) -o $@ $^ $(daemon_common_flags)
+
+all-examples : out/$(BUILD_MODE)/weave_daemon_ledflasher out/$(BUILD_MODE)/weave_daemon_light out/$(BUILD_MODE)/weave_daemon_lock out/$(BUILD_MODE)/weave_daemon_oven out/$(BUILD_MODE)/weave_daemon_sample out/$(BUILD_MODE)/weave_daemon_speaker
+
+.PHONY : all-examples
+
diff --git a/file_lists.mk b/file_lists.mk
new file mode 100644
index 0000000..1e78935
--- /dev/null
+++ b/file_lists.mk
@@ -0,0 +1,166 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+WEAVE_SRC_FILES := \
+	src/backoff_entry.cc \
+	src/base_api_handler.cc \
+	src/commands/cloud_command_proxy.cc \
+	src/commands/command_instance.cc \
+	src/commands/command_queue.cc \
+	src/commands/schema_constants.cc \
+	src/component_manager_impl.cc \
+	src/config.cc \
+	src/data_encoding.cc \
+	src/device_manager.cc \
+	src/device_registration_info.cc \
+	src/error.cc \
+	src/http_constants.cc \
+	src/json_error_codes.cc \
+	src/notification/notification_parser.cc \
+	src/notification/pull_channel.cc \
+	src/notification/xml_node.cc \
+	src/notification/xmpp_channel.cc \
+	src/notification/xmpp_iq_stanza_handler.cc \
+	src/notification/xmpp_stream_parser.cc \
+	src/privet/auth_manager.cc \
+	src/privet/cloud_delegate.cc \
+	src/privet/constants.cc \
+	src/privet/device_delegate.cc \
+	src/privet/device_ui_kind.cc \
+	src/privet/openssl_utils.cc \
+	src/privet/privet_handler.cc \
+	src/privet/privet_manager.cc \
+	src/privet/privet_types.cc \
+	src/privet/publisher.cc \
+	src/privet/security_manager.cc \
+	src/privet/wifi_bootstrap_manager.cc \
+	src/privet/wifi_ssid_generator.cc \
+	src/registration_status.cc \
+	src/states/state_change_queue.cc \
+	src/streams.cc \
+	src/string_utils.cc \
+	src/utils.cc
+
+WEAVE_TEST_SRC_FILES := \
+	src/test/fake_stream.cc \
+	src/test/fake_task_runner.cc \
+	src/test/unittest_utils.cc
+
+WEAVE_UNITTEST_SRC_FILES := \
+	src/backoff_entry_unittest.cc \
+	src/base_api_handler_unittest.cc \
+	src/commands/cloud_command_proxy_unittest.cc \
+	src/commands/command_instance_unittest.cc \
+	src/commands/command_queue_unittest.cc \
+	src/component_manager_unittest.cc \
+	src/config_unittest.cc \
+	src/data_encoding_unittest.cc \
+	src/device_registration_info_unittest.cc \
+	src/error_unittest.cc \
+	src/notification/notification_parser_unittest.cc \
+	src/notification/xml_node_unittest.cc \
+	src/notification/xmpp_channel_unittest.cc \
+	src/notification/xmpp_iq_stanza_handler_unittest.cc \
+	src/notification/xmpp_stream_parser_unittest.cc \
+	src/privet/auth_manager_unittest.cc \
+	src/privet/privet_handler_unittest.cc \
+	src/privet/security_manager_unittest.cc \
+	src/privet/wifi_ssid_generator_unittest.cc \
+	src/states/state_change_queue_unittest.cc \
+	src/streams_unittest.cc \
+	src/string_utils_unittest.cc \
+	src/test/weave_testrunner.cc
+
+WEAVE_EXPORTS_UNITTEST_SRC_FILES := \
+	src/weave_unittest.cc
+
+EXAMPLES_PROVIDER_SRC_FILES := \
+	examples/provider/avahi_client.cc \
+	examples/provider/bluez_client.cc \
+	examples/provider/curl_http_client.cc \
+	examples/provider/event_http_client.cc \
+	examples/provider/event_http_server.cc \
+	examples/provider/event_network.cc \
+	examples/provider/event_task_runner.cc \
+	examples/provider/file_config_store.cc \
+	examples/provider/ssl_stream.cc \
+	examples/provider/wifi_manager.cc
+
+THIRD_PARTY_CHROMIUM_BASE_SRC_FILES := \
+	third_party/chromium/base/bind_helpers.cc \
+	third_party/chromium/base/callback_internal.cc \
+	third_party/chromium/base/guid_posix.cc \
+	third_party/chromium/base/json/json_parser.cc \
+	third_party/chromium/base/json/json_reader.cc \
+	third_party/chromium/base/json/json_writer.cc \
+	third_party/chromium/base/json/string_escape.cc \
+	third_party/chromium/base/location.cc \
+	third_party/chromium/base/logging.cc \
+	third_party/chromium/base/memory/ref_counted.cc \
+	third_party/chromium/base/memory/weak_ptr.cc \
+	third_party/chromium/base/rand_util.cc \
+	third_party/chromium/base/rand_util_posix.cc \
+	third_party/chromium/base/strings/string_number_conversions.cc \
+	third_party/chromium/base/strings/string_piece.cc \
+	third_party/chromium/base/strings/stringprintf.cc \
+	third_party/chromium/base/strings/string_util.cc \
+	third_party/chromium/base/strings/string_util_constants.cc \
+	third_party/chromium/base/strings/utf_string_conversion_utils.cc \
+	third_party/chromium/base/third_party/dmg_fp/dtoa.cc \
+	third_party/chromium/base/third_party/dmg_fp/g_fmt.cc \
+	third_party/chromium/base/third_party/icu/icu_utf.cc \
+	third_party/chromium/base/time/clock.cc \
+	third_party/chromium/base/time/default_clock.cc \
+	third_party/chromium/base/time/time.cc \
+	third_party/chromium/base/time/time_posix.cc \
+	third_party/chromium/base/values.cc
+
+THIRD_PARTY_CHROMIUM_BASE_UNITTEST_SRC_FILES := \
+	third_party/chromium/base/bind_unittest.cc \
+	third_party/chromium/base/callback_list_unittest.cc \
+	third_party/chromium/base/callback_unittest.cc \
+	third_party/chromium/base/guid_unittest.cc \
+	third_party/chromium/base/json/json_parser_unittest.cc \
+	third_party/chromium/base/json/json_reader_unittest.cc \
+	third_party/chromium/base/json/json_writer_unittest.cc \
+	third_party/chromium/base/json/string_escape_unittest.cc \
+	third_party/chromium/base/logging_unittest.cc \
+	third_party/chromium/base/memory/ref_counted_unittest.cc \
+	third_party/chromium/base/memory/scoped_ptr_unittest.cc \
+	third_party/chromium/base/memory/weak_ptr_unittest.cc \
+	third_party/chromium/base/move_unittest.cc \
+	third_party/chromium/base/numerics/safe_numerics_unittest.cc \
+	third_party/chromium/base/observer_list_unittest.cc \
+	third_party/chromium/base/rand_util_unittest.cc \
+	third_party/chromium/base/scoped_clear_errno_unittest.cc \
+	third_party/chromium/base/strings/string_number_conversions_unittest.cc \
+	third_party/chromium/base/strings/string_piece_unittest.cc \
+	third_party/chromium/base/strings/string_util_unittest.cc \
+	third_party/chromium/base/strings/stringprintf_unittest.cc \
+	third_party/chromium/base/template_util_unittest.cc \
+	third_party/chromium/base/time/time_unittest.cc \
+	third_party/chromium/base/tuple_unittest.cc \
+	third_party/chromium/base/values_unittest.cc
+
+THIRD_PARTY_CHROMIUM_CRYPTO_SRC_FILES := \
+	third_party/chromium/crypto/p224.cc \
+	third_party/chromium/crypto/p224_spake.cc \
+	third_party/chromium/crypto/sha2.cc
+
+THIRD_PARTY_CHROMIUM_CRYPTO_UNITTEST_SRC_FILES := \
+	third_party/chromium/crypto/p224_spake_unittest.cc \
+	third_party/chromium/crypto/p224_unittest.cc \
+	third_party/chromium/crypto/sha2_unittest.cc
+
+THIRD_PARTY_MODP_B64_SRC_FILES := \
+	third_party/modp_b64/modp_b64.cc
+
+THIRD_PARTY_LIBUWEAVE_SRC_FILES := \
+	third_party/libuweave/src/crypto_hmac.c \
+	third_party/libuweave/src/crypto_utils.c \
+	third_party/libuweave/src/macaroon.c \
+	third_party/libuweave/src/macaroon_caveat.c \
+	third_party/libuweave/src/macaroon_context.c \
+	third_party/libuweave/src/macaroon_encoding.c
+
diff --git a/tests.mk b/tests.mk
new file mode 100644
index 0000000..64fc622
--- /dev/null
+++ b/tests.mk
@@ -0,0 +1,48 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+###
+# tests
+
+weave_test_obj_files := $(WEAVE_TEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(weave_test_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave-test.a : $(weave_test_obj_files)
+	$(AR) crs $@ $^
+
+weave_unittest_obj_files := $(WEAVE_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(weave_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave_testrunner : $(weave_unittest_obj_files) $(third_party_chromium_crypto_unittest_obj_files) $(third_party_chromium_base_unittest_obj_files) out/$(BUILD_MODE)/libweave_common.a out/$(BUILD_MODE)/libweave-test.a
+	$(CXX) -o $@ $^ -lcrypto -lexpat -lgmock -lgtest -lpthread -lrt -Lthird_party/lib
+
+test : out/$(BUILD_MODE)/libweave_testrunner
+	$<
+
+###
+# export tests
+
+weave_exports_unittest_obj_files := $(WEAVE_EXPORTS_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(weave_exports_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+out/$(BUILD_MODE)/libweave_exports_testrunner : $(weave_exports_unittest_obj_files) out/$(BUILD_MODE)/libweave.so out/$(BUILD_MODE)/libweave-test.a out/$(BUILD_MODE)/src/test/weave_testrunner.o
+	$(CXX) -o $@ $^ -lcrypto -lexpat -lgmock -lgtest -lpthread -lrt -Lthird_party/lib -Wl,-rpath=out/$(BUILD_MODE)/
+
+export-test : out/$(BUILD_MODE)/libweave_exports_testrunner
+	$<
+
+.PHONY : test export-test
+
diff --git a/third_party.mk b/third_party.mk
new file mode 100644
index 0000000..638d8a7
--- /dev/null
+++ b/third_party.mk
@@ -0,0 +1,77 @@
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+###
+# third_party/chromium/
+
+third_party_chromium_base_obj_files := $(THIRD_PARTY_CHROMIUM_BASE_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(third_party_chromium_base_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+third_party_chromium_base_unittest_obj_files := $(THIRD_PARTY_CHROMIUM_BASE_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(third_party_chromium_base_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+third_party_chromium_crypto_obj_files := $(THIRD_PARTY_CHROMIUM_CRYPTO_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(third_party_chromium_crypto_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+third_party_chromium_crypto_unittest_obj_files := $(THIRD_PARTY_CHROMIUM_CRYPTO_UNITTEST_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+# We don't need libgtest.a, but the headers files in third_party/include.
+$(third_party_chromium_crypto_unittest_obj_files) : out/$(BUILD_MODE)/%.o : %.cc third_party/lib/libgtest.a
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+###
+# third_party/modp_b64/
+
+third_party_modp_b64_obj_files := $(THIRD_PARTY_MODP_B64_SRC_FILES:%.cc=out/$(BUILD_MODE)/%.o)
+
+$(third_party_modp_b64_obj_files) : out/$(BUILD_MODE)/%.o : %.cc
+	mkdir -p $(dir $@)
+	$(CXX) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_CC) -c -o $@ $<
+
+###
+# third_party/libuweave/
+
+third_party_libuweave_obj_files := $(THIRD_PARTY_LIBUWEAVE_SRC_FILES:%.c=out/$(BUILD_MODE)/%.o)
+
+$(third_party_libuweave_obj_files) : out/$(BUILD_MODE)/%.o : %.c
+	mkdir -p $(dir $@)
+	$(CC) $(DEFS_$(BUILD_MODE)) $(INCLUDES) $(CFLAGS) $(CFLAGS_$(BUILD_MODE)) $(CFLAGS_C) -c -o $@ $<
+
+###
+# libgtest and libgmock (third_party, downloaded on build)
+
+third_party/lib/libgtest.a :
+	@echo Downloading and building libgtest and libgmock...
+	third_party/get_gtest.sh
+	@echo Finished downloading and building libgtest and libgmock.
+
+clean-gtest :
+	rm -rf third_party/include/gtest third_party/include/gmock
+	rm -rf third_party/lib/libgmock* third_party/lib/libgtest*
+	rm -rf third_party/googletest
+
+###
+# libevent (third_party, downloaded on build)
+
+third_party/lib/libevent.a :
+	@echo Downloading and building libevent...
+	DISABLE_LIBEVENT_TEST=1 third_party/get_libevent.sh
+	@echo Finished downloading and building libevent.
+
+clean-libevent :
+	rm -rf third_party/include/ev* third_party/include/event2
+	rm -rf third_party/lib/libevent*
+	rm -rf third_party/libevent
+
diff --git a/third_party/get_gtest.sh b/third_party/get_gtest.sh
new file mode 100755
index 0000000..0a2e952
--- /dev/null
+++ b/third_party/get_gtest.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Make gtest and gmock.
+cd $(dirname "$0")
+THIRD_PARTY=$(pwd)
+
+mkdir -p include lib
+
+rm -rf $THIRD_PARTY/googletest
+git clone https://github.com/google/googletest.git || exit 1
+cd googletest
+
+# gtest is in process of changing of dir structure and it has broken build
+# files. So this is temporarily workaround to fix that.
+git reset --hard d945d8c000a0ade73585d143532266968339bbb3
+mv googletest googlemock/gtest
+
+for SUB_DIR in googlemock/gtest googlemock; do
+  cd $THIRD_PARTY/googletest/$SUB_DIR || exit 1
+  autoreconf -fvi || exit 1
+  ./configure --disable-shared || exit 1
+  make || exit 1
+  cp -rf include/* $THIRD_PARTY/include/ || exit 1
+  cp -rf lib/.libs/* $THIRD_PARTY/lib/ || exit 1
+done
+
+rm -rf $THIRD_PARTY/googletest
diff --git a/third_party/get_libevent.sh b/third_party/get_libevent.sh
new file mode 100755
index 0000000..9985bc0
--- /dev/null
+++ b/third_party/get_libevent.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright 2015 The Weave Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Make libevent.
+# Example uses libevent to implement HTTPS server. This capability is
+# available only in version 2.1.x-alpha. Step could be replaced with apt-get
+# in future.
+cd $(dirname "$0")
+THIRD_PARTY=$(pwd)
+
+mkdir -p include lib
+
+rm -rf $THIRD_PARTY/libevent
+git clone https://github.com/libevent/libevent.git || exit 1
+cd libevent || exit 1
+
+./autogen.sh || exit 1
+./configure --disable-shared || exit 1
+make || exit 1
+if [ -z "$DISABLE_LIBEVENT_TEST" ]; then
+  echo -e "\n\nTesting libevent...\nCan take several minutes.\n"
+  make verify || exit 1
+fi
+cp -rf include/*.h include/event2 $THIRD_PARTY/include/ || exit 1
+cp -f .libs/lib* $THIRD_PARTY/lib/ || exit 1
+
+rm -rf $THIRD_PARTY/libevent