libweave: Add clang support to Makefile.

To use: "CLANG=1 make all -j"

BUG: 26508278

Change-Id: I6b09e6574634d8e07ce2438c31907466e953eb0f
Reviewed-on: https://weave-review.googlesource.com/2185
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/Makefile b/Makefile
index 0eb4e12..c49462f 100644
--- a/Makefile
+++ b/Makefile
@@ -49,6 +49,23 @@
 CFLAGS_CC := \
 	-std=c++11
 
+comma := ,
+ifeq (1, $(CLANG))
+  CC = $(shell which clang-3.6)
+  CXX = $(shell which clang++-3.6)
+  CFLAGS := $(filter-out -Wl$(comma)--exclude-libs$(comma)ALL,$(CFLAGS))
+  CFLAGS += \
+    -fno-omit-frame-pointer \
+    -Wno-deprecated-register \
+    -Wno-inconsistent-missing-override
+  ifeq (Debug, $(BUILD_MODE))
+    CFLAGS += \
+      -fsanitize=address
+    LDFLAGS += \
+      -fsanitize=address
+  endif
+endif
+
 include file_lists.mk third_party.mk examples.mk tests.mk
 
 ###
diff --git a/examples.mk b/examples.mk
index 970969e..a25194c 100644
--- a/examples.mk
+++ b/examples.mk
@@ -35,22 +35,22 @@
 	-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)
+	$(CXX) -o $@ $^ $(CFLAGS) $(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)
+	$(CXX) -o $@ $^ $(CFLAGS) $(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)
+	$(CXX) -o $@ $^ $(CFLAGS) $(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)
+	$(CXX) -o $@ $^ $(CFLAGS) $(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)
+	$(CXX) -o $@ $^ $(CFLAGS) $(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)
+	$(CXX) -o $@ $^ $(CFLAGS) $(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
 
diff --git a/tests.mk b/tests.mk
index 64fc622..aa9ee53 100644
--- a/tests.mk
+++ b/tests.mk
@@ -23,7 +23,7 @@
 	$(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
+	$(CXX) -o $@ $^ $(CFLAGS) -lcrypto -lexpat -lgmock -lgtest -lpthread -lrt -Lthird_party/lib
 
 test : out/$(BUILD_MODE)/libweave_testrunner
 	$<
@@ -39,7 +39,7 @@
 	$(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)/
+	$(CXX) -o $@ $^ $(CFLAGS) -lcrypto -lexpat -lgmock -lgtest -lpthread -lrt -Lthird_party/lib -Wl,-rpath=out/$(BUILD_MODE)/
 
 export-test : out/$(BUILD_MODE)/libweave_exports_testrunner
 	$<