Enable code coverage

To enable: './configure --enable-code-coverage'

To build and generate report: 'make check-code-coverage'

Tested:
Verified that 'make check-code-coverage' generates lcov report.

Signed-off-by: Priyanga <priyram1@in.ibm.com>
Change-Id: I36a9b501c441ef25595808ce77fc1ca36c1ac323
diff --git a/.lcovrc b/.lcovrc
new file mode 100644
index 0000000..da753fe
--- /dev/null
+++ b/.lcovrc
@@ -0,0 +1,4 @@
+geninfo_gcov_all_blocks = 1
+lcov_function_coverage = 1
+lcov_branch_coverage = 0
+
diff --git a/Makefile.am b/Makefile.am
index 406e1bc..0df10bb 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1,30 @@
+# Ignore system headers
+CODE_COVERAGE_IGNORE_PATTERN = '/include/*' '/usr/include/*' '$(includedir)/*'
+export CODE_COVERAGE_IGNORE_PATTERN
+CODE_COVERAGE_LCOV_SHOPTS = $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
+# Use our configuration file for lcov
+CODE_COVERAGE_LCOV_SHOPTS += --config-file $(abs_srcdir)/.lcovrc
+export CODE_COVERAGE_LCOV_SHOPTS
+CODE_COVERAGE_LCOV_OPTIONS = $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
+# Use our configuration file for lcov
+CODE_COVERAGE_LCOV_OPTIONS += --config-file $(abs_srcdir)/.lcovrc
+export CODE_COVERAGE_LCOV_OPTIONS
+CODE_COVERAGE_LCOV_RMOPTS = $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
+# Use our configuration file for lcov
+CODE_COVERAGE_LCOV_RMOPTS += --config-file $(abs_srcdir)/.lcovrc
+export CODE_COVERAGE_LCOV_RMOPTS
+CODE_COVERAGE_GENHTML_OPTIONS = $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
+# Use our configuration file for genhtml
+CODE_COVERAGE_GENHTML_OPTIONS += --config-file $(abs_srcdir)/.lcovrc
+# Don't generate the absolute path for each file in the HTML output
+CODE_COVERAGE_GENHTML_OPTIONS += --prefix $(abs_srcdir) --prefix $(abs_builddir)
+export CODE_COVERAGE_GENHTML_OPTIONS
+if AUTOCONF_CODE_COVERAGE_2019_01_06
+include $(top_srcdir)/aminclude_static.am
+clean-local: code-coverage-clean
+distclean-local: code-coverage-dist-clean
+else
+@CODE_COVERAGE_RULES@
+endif
+
 SUBDIRS = libpldm libpldmresponder test
diff --git a/configure.ac b/configure.ac
index b192d79..e7b9f44 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7,6 +7,19 @@
 AM_INIT_AUTOMAKE([subdir-objects -Wall -Werror foreign dist-xz])
 AM_SILENT_RULES([yes])
 
+# Make sure the default CFLAGS of `-O2 -g` don't override CODE_COVERAGE_CFLAGS
+# It is important that this comes before AC_PROG_C{C,XX}, as we are attempting
+# to stop them from populating default CFLAGS and CXXFLAGS.
+#AS_IF([test "x$enable_tests" = "xno"], [enable_code_coverage=no])
+AS_IF([test "x$enable_code_coverage" != "xno"], [
+    AS_IF([test "x${CXXFLAGS+set}" != "xset"], [
+        AC_SUBST(CXXFLAGS, [""])
+    ])
+    AS_IF([test "x${CFLAGS+set}" != "xset"], [
+        AC_SUBST(CFLAGS, [""])
+    ])
+])
+
 # Checks for programs.
 AC_PROG_CXX
 AC_PROG_CC
@@ -20,6 +33,14 @@
 # For linking
 LT_INIT
 
+# Code coverage
+AX_CODE_COVERAGE
+AM_EXTRA_RECURSIVE_TARGETS([check-code-coverage])
+m4_ifdef([_AX_CODE_COVERAGE_RULES],
+    [AM_CONDITIONAL(AUTOCONF_CODE_COVERAGE_2019_01_06, [true])],
+    [AM_CONDITIONAL(AUTOCONF_CODE_COVERAGE_2019_01_06, [false])])
+AX_ADD_AM_MACRO_STATIC([])
+
 # Check/set gtest specific functions.
 AX_PTHREAD([GTEST_CPPFLAGS="-DGTEST_HAS_PTHREAD=1"],[GTEST_CPPFLAGS="-DGTEST_HAS_PTHREAD=0"])
 AC_SUBST(GTEST_CPPFLAGS)
diff --git a/libpldm/Makefile.am b/libpldm/Makefile.am
index 3ff405b..5b95c39 100644
--- a/libpldm/Makefile.am
+++ b/libpldm/Makefile.am
@@ -5,8 +5,8 @@
 libpldmdir = ${libdir}
 libpldm_la_SOURCES = \
 	base.c
-libpldm_la_LDFLAGS = \
-        -version-info 1:0:0 -shared
-
+libpldm_la_LDFLAGS = -version-info 1:0:0 -shared
+libpldm_la_CFLAGS = $(CODE_COVERAGE_CFLAGS)
+libpldm_la_LIBADD = $(CODE_COVERAGE_LIBS)
 pkgconfiglibdir = ${libdir}/pkgconfig
 pkgconfiglib_DATA = libpldm.pc
diff --git a/libpldmresponder/Makefile.am b/libpldmresponder/Makefile.am
index f308394..a9b1507 100644
--- a/libpldmresponder/Makefile.am
+++ b/libpldmresponder/Makefile.am
@@ -3,6 +3,10 @@
 libpldmresponder_la_SOURCES = \
 	base.cpp
 libpldmresponder_la_LIBADD = \
-	../libpldm/libpldm.la
+	../libpldm/libpldm.la \
+	$(CODE_COVERAGE_LIBS)
 libpldmresponder_la_LDFLAGS = \
 	-version-info 1:0:0 -shared
+libpldmresponder_la_CXXFLAGS = $(CODE_COVERAGE_CXXFLAGS)
+libpldmresponder_la_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS)
+
diff --git a/test/Makefile.am b/test/Makefile.am
index 82101f7..35a7395 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -I$(top_srcdir)
+AM_CPPFLAGS = -I$(top_srcdir) $(CODE_COVERAGE_CPPFLAGS)
 
 TESTS = $(check_PROGRAMS)
 
@@ -12,7 +12,8 @@
 	$(AM_CPPFLAGS)
 
 test_cxxflags = \
-	$(PTHREAD_CFLAGS)
+	$(PTHREAD_CFLAGS) \
+	$(CODE_COVERAGE_CXXFLAGS)
 
 test_ldflags = \
 	-lgtest_main \
@@ -23,13 +24,14 @@
 libpldm_base_test_CPPFLAGS = $(test_cppflags)
 libpldm_base_test_CXXFLAGS = $(test_cxxflags)
 libpldm_base_test_LDFLAGS = $(test_ldflags)
-libpldm_base_test_LDADD = $(top_builddir)/libpldm/base.o
+libpldm_base_test_LDADD = $(top_builddir)/libpldm/libpldm_la-base.o $(CODE_COVERAGE_LIBS)
 libpldm_base_test_SOURCES = libpldm_base_test.cpp
 
 libpldmresponder_base_test_CPPFLAGS = $(test_cppflags)
 libpldmresponder_base_test_CXXFLAGS = $(test_cxxflags)
 libpldmresponder_base_test_LDFLAGS = $(test_ldflags)
 libpldmresponder_base_test_LDADD = \
-	$(top_builddir)/libpldm/base.o \
-	$(top_builddir)/libpldmresponder/base.o
+	$(top_builddir)/libpldm/libpldm_la-base.o \
+	$(top_builddir)/libpldmresponder/libpldmresponder_la-base.o $(CODE_COVERAGE_LIBS)
+
 libpldmresponder_base_test_SOURCES = libpldmresponder_base_test.cpp