Update Makefile to build shared libraries.

The Makefile didn't build libbspatch and libbsdiff. This patch includes
those libraries in the Makefile and moves the header files exposed by
those to an include/bsdiff subdirectory following the Android
convention so calling program can include "bsdiff/bspatch.h" avoiding
any collision with other libraries.

The Android.mk is updated to export the new include path while keeping
the old style until calling programs are updated.

The new Makefile allows Chromium OS to build the new libraries.

Bug: None
Test: FEATURES=test emerge-link bsdiff; sudo emerge bsdiff
Test: mmma external/bsdiff

Change-Id: I2ea9251eb224e9418fe236e4c4c9c5621853f590
diff --git a/Android.mk b/Android.mk
index 9116f83..ffbe164 100644
--- a/Android.mk
+++ b/Android.mk
@@ -52,6 +52,12 @@
     extents_unittest.cc \
     test_utils.cc
 
+# TODO(deymo): Remove include/bsdiff when all callers use the "bsdiff/" prefix
+# when including code.
+lib_export_includes := \
+    $(LOCAL_PATH)/include \
+    $(LOCAL_PATH)/include/bsdiff
+
 # Target static libraries.
 
 include $(CLEAR_VARS)
@@ -59,7 +65,8 @@
 LOCAL_CPP_EXTENSION := .cc
 LOCAL_SRC_FILES := $(bspatch_src_files)
 LOCAL_CFLAGS := $(bsdiff_common_cflags)
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(lib_export_includes)
 LOCAL_STATIC_LIBRARIES := $(bsdiff_common_static_libs)
 include $(BUILD_STATIC_LIBRARY)
 
@@ -68,7 +75,8 @@
 LOCAL_CPP_EXTENSION := .cc
 LOCAL_SRC_FILES := $(bsdiff_src_files)
 LOCAL_CFLAGS := $(bsdiff_common_cflags)
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(lib_export_includes)
 LOCAL_STATIC_LIBRARIES := $(bsdiff_static_libs)
 include $(BUILD_STATIC_LIBRARY)
 
@@ -79,7 +87,8 @@
 LOCAL_CPP_EXTENSION := .cc
 LOCAL_SRC_FILES := $(bspatch_src_files)
 LOCAL_CFLAGS := $(bsdiff_common_cflags)
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(lib_export_includes)
 LOCAL_STATIC_LIBRARIES := $(bsdiff_common_static_libs)
 include $(BUILD_HOST_STATIC_LIBRARY)
 
@@ -88,7 +97,8 @@
 LOCAL_CPP_EXTENSION := .cc
 LOCAL_SRC_FILES := $(bsdiff_src_files)
 LOCAL_CFLAGS := $(bsdiff_common_cflags)
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(lib_export_includes)
 LOCAL_STATIC_LIBRARIES := $(bsdiff_static_libs)
 include $(BUILD_HOST_STATIC_LIBRARY)
 
diff --git a/Makefile b/Makefile
index 4214637..3db8c60 100644
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,16 @@
 # Default options
 USE_BSDIFF ?= y
 
-BINARIES-y = bspatch
-BINARIES-$(USE_BSDIFF) += bsdiff
+EXECUTABLES-y := bspatch
+LIBRARIES-y := libbspatch.so
+EXECUTABLES-$(USE_BSDIFF) += bsdiff
+LIBRARIES-$(USE_BSDIFF) += libbsdiff.so
 
-BINARIES += $(BINARIES-y)
+BINARIES := $(EXECUTABLES-y) $(LIBRARIES-y)
 
 INSTALL = install
-CFLAGS += -O3 -Wall -Werror
-CXXFLAGS += -std=c++11
+CPPFLAGS += -Iinclude
+CXXFLAGS += -std=c++11 -O3 -Wall -Werror -fPIC
 
 DESTDIR ?=
 PREFIX = /usr
@@ -16,74 +18,104 @@
 DATADIR = $(PREFIX)/share
 MANDIR = $(DATADIR)/man
 MAN1DIR = $(MANDIR)/man1
+INCLUDEDIR ?= $(PREFIX)/include
+GENTOO_LIBDIR ?= lib
+LIBDIR ?= $(PREFIX)/$(GENTOO_LIBDIR)
 INSTALL_PROGRAM ?= $(INSTALL) -c -m 755
 INSTALL_MAN ?= $(INSTALL) -c -m 444
 
-.PHONY: all test clean
+.PHONY: all test clean install
 all: $(BINARIES)
-test: unittests
+test: bsdiff_unittest
 clean:
-	rm -f *.o $(BINARIES) unittests
+	rm -f *.o $(BINARIES) bsdiff_unittest
 
-BSDIFF_LIBS = -lbz2 -ldivsufsort -ldivsufsort64
-BSDIFF_OBJS = \
-  bsdiff.o
+### List of source files for each project. Keep in sync with the Android.mk.
+# "bsdiff" program.
+bsdiff_src_files := \
+    bsdiff.cc
 
-BSPATCH_LIBS = -lbz2
-BSPATCH_OBJS = \
-  bspatch.o \
-  buffer_file.o \
-  extents.o \
-  extents_file.o \
-  file.o \
-  memory_file.o \
-  sink_file.o
+# "bspatch" program.
+bspatch_src_files := \
+    bspatch.cc \
+    buffer_file.cc \
+    extents.cc \
+    extents_file.cc \
+    file.cc \
+    memory_file.cc \
+    sink_file.cc
+
+# Unit test files.
+bsdiff_common_unittests := \
+    bsdiff_unittest.cc \
+    bspatch_unittest.cc \
+    extents_file_unittest.cc \
+    extents_unittest.cc \
+    test_utils.cc \
+    testrunner.cc
+
+
+BSDIFF_LIBS := -lbz2 -ldivsufsort -ldivsufsort64
+BSDIFF_OBJS := $(bsdiff_src_files:.cc=.o)
+
+BSPATCH_LIBS := -lbz2
+BSPATCH_OBJS := $(bspatch_src_files:.cc=.o)
 
 UNITTEST_LIBS = -lgmock -lgtest -lpthread
-UNITTEST_OBJS = \
-  bsdiff_unittest.o \
-  bspatch_unittest.o \
-  extents_file_unittest.o \
-  extents_unittest.o \
-  test_utils.o \
-  testrunner.o
+UNITTEST_OBJS := $(bsdiff_common_unittests:.cc=.o)
 
 bsdiff: $(BSDIFF_OBJS) bsdiff_main.o
 bsdiff: LDLIBS += $(BSDIFF_LIBS)
+libbsdiff.so: $(BSDIFF_OBJS)
+libbsdiff.so: LDLIBS += $(BSDIFF_LIBS)
 
 bspatch: $(BSPATCH_OBJS) bspatch_main.o
 bspatch: LDLIBS += $(BSPATCH_LIBS)
+libbspatch.so: $(BSPATCH_OBJS)
+libbspatch.so: LDLIBS += $(BSPATCH_LIBS)
 
-unittests: LDLIBS += $(BSDIFF_LIBS) $(BSPATCH_LIBS) $(UNITTEST_LIBS)
-unittests: $(BSPATCH_OBJS) $(BSDIFF_OBJS) $(UNITTEST_OBJS)
+bsdiff_unittest: LDLIBS += $(BSDIFF_LIBS) $(BSPATCH_LIBS) $(UNITTEST_LIBS)
+bsdiff_unittest: $(BSPATCH_OBJS) $(BSDIFF_OBJS) $(UNITTEST_OBJS)
 
-unittests bsdiff bspatch:
-	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ $^ $(LDLIBS)
+bsdiff_unittest bsdiff bspatch:
+	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDLIBS)
+
+libbsdiff.so libbspatch.so:
+	$(CXX) $(CXXFLAGS) $(LDFLAGS) -Wl,-soname,$@ -shared -o $@ $^ $(LDLIBS)
 
 # Source file dependencies.
-bsdiff.o: bsdiff.cc
-bsdiff_main.o: bsdiff_main.cc bsdiff.h
-bsdiff_unittest.o: bsdiff_unittest.cc bsdiff.h test_utils.h
-bspatch.o: bspatch.cc bspatch.h extents.h extents_file.h file_interface.h \
- file.h
-bspatch_main.o: bspatch_main.cc bspatch.h
-bspatch_unittest.o: bspatch_unittest.cc bspatch.h test_utils.h
-buffer_file.o: buffer_file.cc buffer_file.h file_interface.h bspatch.h
-extents.o: extents.cc extents.h extents_file.h file_interface.h
-extents_file.o: extents_file.cc extents_file.h file_interface.h
-extents_file_unittest.o: extents_file_unittest.cc extents_file.h \
- file_interface.h
-extents_unittest.o: extents_unittest.cc extents.h extents_file.h \
- file_interface.h
-file.o: file.cc file.h file_interface.h
-memory_file.o: memory_file.cc memory_file.h file_interface.h
-sink_file.o: sink_file.cc sink_file.h file_interface.h
-testrunner.o: testrunner.cc
+bspatch.o: bspatch.cc include/bsdiff/bspatch.h \
+ include/bsdiff/extents_file.h include/bsdiff/file_interface.h \
+ buffer_file.h extents.h file.h memory_file.h sink_file.h
+bspatch_main.o: bspatch_main.cc include/bsdiff/bspatch.h \
+ include/bsdiff/extents_file.h include/bsdiff/file_interface.h
+bspatch_unittest.o: bspatch_unittest.cc include/bsdiff/bspatch.h \
+ include/bsdiff/extents_file.h include/bsdiff/file_interface.h \
+ test_utils.h
+buffer_file.o: buffer_file.cc buffer_file.h \
+ include/bsdiff/file_interface.h include/bsdiff/bspatch.h \
+ include/bsdiff/extents_file.h
+extents.o: extents.cc extents.h include/bsdiff/extents_file.h \
+ include/bsdiff/file_interface.h
+extents_file.o: extents_file.cc include/bsdiff/extents_file.h \
+ include/bsdiff/file_interface.h
+extents_file_unittest.o: extents_file_unittest.cc \
+ include/bsdiff/extents_file.h include/bsdiff/file_interface.h
+extents_unittest.o: extents_unittest.cc extents.h \
+ include/bsdiff/extents_file.h include/bsdiff/file_interface.h
+file.o: file.cc file.h include/bsdiff/file_interface.h
+memory_file.o: memory_file.cc memory_file.h \
+ include/bsdiff/file_interface.h
+sink_file.o: sink_file.cc sink_file.h include/bsdiff/file_interface.h
+testrunner.o: testrunner.cc test_utils.h
 test_utils.o: test_utils.cc test_utils.h
 
 install:
-	mkdir -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(MAN1DIR)
-	$(INSTALL_PROGRAM) $(BINARIES) $(DESTDIR)$(BINDIR)
+	mkdir -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(MAN1DIR) \
+	  $(DESTDIR)/$(INCLUDEDIR)/bsdiff
+	$(INSTALL_PROGRAM) $(EXECUTABLES-y) $(DESTDIR)$(BINDIR)
+	$(INSTALL_PROGRAM) $(LIBRARIES-y) $(DESTDIR)$(LIBDIR)
+	$(INSTALL) -c -m 644 include/bsdiff/*.h $(DESTDIR)/$(INCLUDEDIR)/bsdiff
 ifndef WITHOUT_MAN
-	$(INSTALL_MAN) $(BINARIES:=.1) $(DESTDIR)$(MAN1DIR)
+	$(INSTALL_MAN) $(EXECUTABLES-y:=.1) $(DESTDIR)$(MAN1DIR)
 endif
diff --git a/bsdiff.cc b/bsdiff.cc
index cb2ca7c..854c882 100644
--- a/bsdiff.cc
+++ b/bsdiff.cc
@@ -28,7 +28,7 @@
 __FBSDID("$FreeBSD: src/usr.bin/bsdiff/bsdiff/bsdiff.c,v 1.1 2005/08/06 01:59:05 cperciva Exp $");
 #endif
 
-#include "bsdiff.h"
+#include "bsdiff/bsdiff.h"
 
 #include <sys/types.h>
 
diff --git a/bsdiff_main.cc b/bsdiff_main.cc
index db3026c..678da35 100644
--- a/bsdiff_main.cc
+++ b/bsdiff_main.cc
@@ -4,7 +4,7 @@
 
 #include <err.h>
 
-#include "bsdiff.h"
+#include "bsdiff/bsdiff.h"
 
 int main(int argc, char* argv[]) {
   if (argc != 4)
diff --git a/bsdiff_unittest.cc b/bsdiff_unittest.cc
index b3aae3e..7b5657d 100644
--- a/bsdiff_unittest.cc
+++ b/bsdiff_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "bsdiff.h"
+#include "bsdiff/bsdiff.h"
 
 #include <gtest/gtest.h>
 #include <string>
diff --git a/bspatch.cc b/bspatch.cc
index 058f9d0..c5f670a 100644
--- a/bspatch.cc
+++ b/bspatch.cc
@@ -28,7 +28,7 @@
 __FBSDID("$FreeBSD: src/usr.bin/bsdiff/bspatch/bspatch.c,v 1.1 2005/08/06 01:59:06 cperciva Exp $");
 #endif
 
-#include "bspatch.h"
+#include "bsdiff/bspatch.h"
 
 #include <bzlib.h>
 #include <errno.h>
@@ -45,11 +45,11 @@
 #include <limits>
 #include <vector>
 
+#include "bsdiff/extents_file.h"
+#include "bsdiff/file_interface.h"
 #include "buffer_file.h"
 #include "extents.h"
-#include "extents_file.h"
 #include "file.h"
-#include "file_interface.h"
 #include "memory_file.h"
 #include "sink_file.h"
 
diff --git a/bspatch_main.cc b/bspatch_main.cc
index 51ceebd..2a71a1c 100644
--- a/bspatch_main.cc
+++ b/bspatch_main.cc
@@ -5,7 +5,7 @@
 #include <err.h>
 #include <stdlib.h>
 
-#include "bspatch.h"
+#include "bsdiff/bspatch.h"
 
 #define USAGE_TEMPLATE_STR                                          \
   "usage: %s oldfile newfile patchfile [old-extents new-extents]\n" \
diff --git a/bspatch_unittest.cc b/bspatch_unittest.cc
index 04ec666..2a4589d 100644
--- a/bspatch_unittest.cc
+++ b/bspatch_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "bspatch.h"
+#include "bsdiff/bspatch.h"
 
 #include <unistd.h>
 
diff --git a/buffer_file.cc b/buffer_file.cc
index 1e1c213..01dd6d2 100644
--- a/buffer_file.cc
+++ b/buffer_file.cc
@@ -4,7 +4,7 @@
 
 #include "buffer_file.h"
 
-#include "bspatch.h"
+#include "bsdiff/bspatch.h"
 
 namespace bsdiff {
 
diff --git a/buffer_file.h b/buffer_file.h
index 514225b..0b9261c 100644
--- a/buffer_file.h
+++ b/buffer_file.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <vector>
 
-#include "file_interface.h"
+#include "bsdiff/file_interface.h"
 
 namespace bsdiff {
 
diff --git a/extents.h b/extents.h
index de3eb27..efc6716 100644
--- a/extents.h
+++ b/extents.h
@@ -7,7 +7,7 @@
 
 #include <vector>
 
-#include "extents_file.h"
+#include "bsdiff/extents_file.h"
 
 namespace bsdiff {
 
diff --git a/extents_file.cc b/extents_file.cc
index 01d31a6..7e2242f 100644
--- a/extents_file.cc
+++ b/extents_file.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "extents_file.h"
+#include "bsdiff/extents_file.h"
 
 #include <string.h>
 
diff --git a/extents_file_unittest.cc b/extents_file_unittest.cc
index 73cedb2..0bac750 100644
--- a/extents_file_unittest.cc
+++ b/extents_file_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "extents_file.h"
+#include "bsdiff/extents_file.h"
 
 #include <gtest/gtest.h>
 #include <gmock/gmock.h>
 #include <string>
 #include <vector>
 
-#include "file_interface.h"
+#include "bsdiff/file_interface.h"
 
 using std::string;
 using std::vector;
diff --git a/file.h b/file.h
index ad1fd2f..959c53e 100644
--- a/file.h
+++ b/file.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "file_interface.h"
+#include "bsdiff/file_interface.h"
 
 namespace bsdiff {
 
diff --git a/bsdiff.h b/include/bsdiff/bsdiff.h
similarity index 100%
rename from bsdiff.h
rename to include/bsdiff/bsdiff.h
diff --git a/bspatch.h b/include/bsdiff/bspatch.h
similarity index 97%
rename from bspatch.h
rename to include/bsdiff/bspatch.h
index 834715b..63efea8 100644
--- a/bspatch.h
+++ b/include/bsdiff/bspatch.h
@@ -9,7 +9,7 @@
 #include <memory>
 #include <vector>
 
-#include "extents_file.h"
+#include "bsdiff/extents_file.h"
 
 namespace bsdiff {
 
diff --git a/extents_file.h b/include/bsdiff/extents_file.h
similarity index 98%
rename from extents_file.h
rename to include/bsdiff/extents_file.h
index 865e2a2..0745ed5 100644
--- a/extents_file.h
+++ b/include/bsdiff/extents_file.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <vector>
 
-#include "file_interface.h"
+#include "bsdiff/file_interface.h"
 
 /*
  * Extent files.
diff --git a/file_interface.h b/include/bsdiff/file_interface.h
similarity index 100%
rename from file_interface.h
rename to include/bsdiff/file_interface.h
diff --git a/memory_file.h b/memory_file.h
index 2833649..4100fd6 100644
--- a/memory_file.h
+++ b/memory_file.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "file_interface.h"
+#include "bsdiff/file_interface.h"
 
 namespace bsdiff {
 
diff --git a/sink_file.h b/sink_file.h
index b2ce33f..e2c69d8 100644
--- a/sink_file.h
+++ b/sink_file.h
@@ -9,7 +9,7 @@
 
 #include <functional>
 
-#include "file_interface.h"
+#include "bsdiff/file_interface.h"
 
 using sink_func = std::function<size_t(const uint8_t*, size_t)>;