Add -Wextra-semi -Wundefined-func-template to the default CXXFLAGS

And fix the resulting compilation errors.

Change-Id: I16f679836a0cf2a3ff5dfcf6f6b67bfbfe4cdbd7
Refs: #4248
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
index ae20588..23873fe 100644
--- a/.waf-tools/default-compiler-flags.py
+++ b/.waf-tools/default-compiler-flags.py
@@ -7,23 +7,34 @@
                    help='''Compile in debugging mode with minimal optimizations (-O0 or -Og)''')
 
 def configure(conf):
-    cxx = conf.env['CXX_NAME'] # CXX_NAME represents generic name of the compiler
+    conf.start_msg('Checking C++ compiler version')
+
+    cxx = conf.env['CXX_NAME'] # CXX_NAME is the generic name of the compiler
     ccver = tuple(int(i) for i in conf.env['CC_VERSION'])
+    errmsg = ''
+    warnmsg = ''
     if cxx == 'gcc':
         if ccver < (4, 8, 2):
-            conf.fatal('The version of gcc you are using (%s) is too old.\n'
-                       'The minimum supported gcc version is 4.8.2.' %
-                       '.'.join(conf.env['CC_VERSION']))
+            errmsg = ('The version of gcc you are using is too old.\n'
+                      'The minimum supported gcc version is 4.8.2.')
         flags = GccFlags()
     elif cxx == 'clang':
         if ccver < (3, 4, 0):
-            conf.fatal('The version of clang you are using (%s) is too old.\n'
-                       'The minimum supported clang version is 3.4.0.' %
-                       '.'.join(conf.env['CC_VERSION']))
+            errmsg = ('The version of clang you are using is too old.\n'
+                      'The minimum supported clang version is 3.4.0.')
         flags = ClangFlags()
     else:
+        warnmsg = 'Note: %s compiler is unsupported' % cxx
         flags = CompilerFlags()
-        Logs.warn('The code has not yet been tested with %s compiler' % cxx)
+
+    if errmsg:
+        conf.end_msg('.'.join(conf.env['CC_VERSION']), color='RED')
+        conf.fatal(errmsg)
+    elif warnmsg:
+        conf.end_msg('.'.join(conf.env['CC_VERSION']), color='YELLOW')
+        Logs.warn(warnmsg)
+    else:
+        conf.end_msg('.'.join(conf.env['CC_VERSION']))
 
     areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
 
@@ -122,9 +133,9 @@
                               '-Wextra',
                               '-Werror',
                               '-Wnon-virtual-dtor',
-                              '-Wno-unused-parameter',
-                              '-Wno-error=maybe-uninitialized', # Bug #1615
                               '-Wno-error=deprecated-declarations', # Bug #3795
+                              '-Wno-error=maybe-uninitialized', # Bug #1615
+                              '-Wno-unused-parameter',
                               ]
         flags['LINKFLAGS'] += ['-fuse-ld=gold', '-Wl,-O1']
         return flags
@@ -170,17 +181,27 @@
     def getDebugFlags(self, conf):
         flags = super(ClangFlags, self).getDebugFlags(conf)
         flags['CXXFLAGS'] += ['-fcolor-diagnostics',
-                              '-Wno-unused-local-typedef', # Bugs #2657 and #3209
-                              '-Wno-error=unneeded-internal-declaration', # Bug #1588
+                              '-Wextra-semi',
+                              '-Wundefined-func-template',
                               '-Wno-error=deprecated-register',
-                              '-Wno-error=keyword-macro', # Bug #3235
                               '-Wno-error=infinite-recursion', # Bug #3358
+                              '-Wno-error=keyword-macro', # Bug #3235
+                              '-Wno-error=unneeded-internal-declaration', # Bug #1588
+                              '-Wno-unused-local-typedef', # Bugs #2657 and #3209
                               ]
+        version = tuple(int(i) for i in conf.env['CC_VERSION'])
+        if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
+            flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
         return flags
 
     def getOptimizedFlags(self, conf):
         flags = super(ClangFlags, self).getOptimizedFlags(conf)
         flags['CXXFLAGS'] += ['-fcolor-diagnostics',
+                              '-Wextra-semi',
+                              '-Wundefined-func-template',
                               '-Wno-unused-local-typedef', # Bugs #2657 and #3209
                               ]
+        version = tuple(int(i) for i in conf.env['CC_VERSION'])
+        if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
+            flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
         return flags
diff --git a/docs/doxygen.conf.in b/docs/doxygen.conf.in
index c62f891..8b06194 100644
--- a/docs/doxygen.conf.in
+++ b/docs/doxygen.conf.in
@@ -2050,15 +2050,13 @@
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 PREDEFINED             = DOXYGEN \
-                         NDN_LOG_INIT \
-                         BOOST_CONCEPT_ASSERT \
+                         DEPRECATED(x)=x \
+                         NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(x)= \
+                         NDN_LOG_INIT(x)= \
                          PUBLIC_WITH_TESTS_ELSE_PROTECTED=protected \
                          PUBLIC_WITH_TESTS_ELSE_PRIVATE=private \
                          PROTECTED_WITH_TESTS_ELSE_PRIVATE=private \
-                         VIRTUAL_WITH_TESTS \
-                         NDN_CXX_KEYCHAIN_REGISTER_PIB \
-                         NDN_CXX_KEYCHAIN_REGISTER_TPM \
-                         DEPRECATED(x)=x
+                         VIRTUAL_WITH_TESTS=
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
diff --git a/src/data.cpp b/src/data.cpp
index e982700..9a59089 100644
--- a/src/data.cpp
+++ b/src/data.cpp
@@ -84,12 +84,10 @@
 }
 
 template size_t
-Data::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder,
-                                       bool wantUnsignedPortionOnly) const;
+Data::wireEncode<encoding::EncoderTag>(EncodingBuffer&, bool) const;
 
 template size_t
-Data::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder,
-                                         bool wantUnsignedPortionOnly) const;
+Data::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, bool) const;
 
 const Block&
 Data::wireEncode(EncodingBuffer& encoder, const Block& signatureValue) const
diff --git a/src/data.hpp b/src/data.hpp
index eedea7a..2729e0d 100644
--- a/src/data.hpp
+++ b/src/data.hpp
@@ -241,6 +241,14 @@
   mutable Name m_fullName; ///< cached FullName computed from m_wire
 };
 
+#ifndef DOXYGEN
+extern template size_t
+Data::wireEncode<encoding::EncoderTag>(EncodingBuffer&, bool) const;
+
+extern template size_t
+Data::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, bool) const;
+#endif
+
 std::ostream&
 operator<<(std::ostream& os, const Data& data);
 
diff --git a/src/delegation-list.cpp b/src/delegation-list.cpp
index 7868943..e21d100 100644
--- a/src/delegation-list.cpp
+++ b/src/delegation-list.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -105,10 +105,10 @@
 }
 
 template size_t
-DelegationList::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&, uint32_t) const;
+DelegationList::wireEncode<encoding::EncoderTag>(EncodingBuffer&, uint32_t) const;
 
 template size_t
-DelegationList::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&, uint32_t) const;
+DelegationList::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, uint32_t) const;
 
 void
 DelegationList::wireDecode(const Block& block, bool wantSort)
diff --git a/src/delegation-list.hpp b/src/delegation-list.hpp
index b9eb6a9..a5cf58a 100644
--- a/src/delegation-list.hpp
+++ b/src/delegation-list.hpp
@@ -232,6 +232,14 @@
   friend bool operator==(const DelegationList&, const DelegationList&);
 };
 
+#ifndef DOXYGEN
+extern template size_t
+DelegationList::wireEncode<encoding::EncoderTag>(EncodingBuffer&, uint32_t) const;
+
+extern template size_t
+DelegationList::wireEncode<encoding::EstimatorTag>(EncodingEstimator&, uint32_t) const;
+#endif
+
 /** \brief compare whether two DelegationLists are equal
  *  \note Order matters! If two DelegationLists contain the same Delegations but at least one is
  *        unsorted, they may compare unequal if the Delegations appear in different order.
diff --git a/src/encoding/block.hpp b/src/encoding/block.hpp
index 031b00f..177d1f2 100644
--- a/src/encoding/block.hpp
+++ b/src/encoding/block.hpp
@@ -24,11 +24,9 @@
 #ifndef NDN_ENCODING_BLOCK_HPP
 #define NDN_ENCODING_BLOCK_HPP
 
-#include "../common.hpp"
-
 #include "buffer.hpp"
-#include "tlv.hpp"
 #include "encoding-buffer-fwd.hpp"
+#include "tlv.hpp"
 
 namespace boost {
 namespace asio {
diff --git a/src/encoding/encoding-buffer-fwd.hpp b/src/encoding/encoding-buffer-fwd.hpp
index 359864f..88f6dea 100644
--- a/src/encoding/encoding-buffer-fwd.hpp
+++ b/src/encoding/encoding-buffer-fwd.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2015 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,10 +22,12 @@
 #ifndef NDN_ENCODING_ENCODING_BUFFER_FWD_HPP
 #define NDN_ENCODING_ENCODING_BUFFER_FWD_HPP
 
+#include "../common.hpp"
+
 namespace ndn {
 namespace encoding {
 
-typedef bool Tag;
+using Tag = bool;
 
 /**
  * @brief Tag for EncodingImpl to indicate that Encoder is requested
@@ -44,8 +46,8 @@
 template<Tag TAG>
 class EncodingImpl;
 
-typedef EncodingImpl<EncoderTag> EncodingBuffer;
-typedef EncodingImpl<EstimatorTag> EncodingEstimator;
+using EncodingBuffer    = EncodingImpl<EncoderTag>;
+using EncodingEstimator = EncodingImpl<EstimatorTag>;
 
 } // namespace encoding
 
@@ -55,4 +57,16 @@
 
 } // namespace ndn
 
+#define NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(ClassName) \
+  extern template size_t \
+  ClassName::wireEncode<::ndn::encoding::EncoderTag>(::ndn::EncodingBuffer&) const; \
+  extern template size_t \
+  ClassName::wireEncode<::ndn::encoding::EstimatorTag>(::ndn::EncodingEstimator&) const \
+
+#define NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(ClassName) \
+  template size_t \
+  ClassName::wireEncode<::ndn::encoding::EncoderTag>(::ndn::EncodingBuffer&) const; \
+  template size_t \
+  ClassName::wireEncode<::ndn::encoding::EstimatorTag>(::ndn::EncodingEstimator&) const \
+
 #endif // NDN_ENCODING_ENCODING_BUFFER_FWD_HPP
diff --git a/src/encoding/encoding-buffer.hpp b/src/encoding/encoding-buffer.hpp
index 4f364fe..9b483c2 100644
--- a/src/encoding/encoding-buffer.hpp
+++ b/src/encoding/encoding-buffer.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,7 +22,6 @@
 #ifndef NDN_ENCODING_ENCODING_BUFFER_HPP
 #define NDN_ENCODING_ENCODING_BUFFER_HPP
 
-#include "../common.hpp"
 #include "encoding-buffer-fwd.hpp"
 #include "encoder.hpp"
 #include "estimator.hpp"
@@ -31,10 +30,10 @@
 namespace encoding {
 
 /**
- * @brief EncodingImpl specialization for real TLV encoding
+ * @brief EncodingImpl specialization for actual TLV encoding
  */
 template<>
-class EncodingImpl<EncoderTag> : public encoding::Encoder
+class EncodingImpl<EncoderTag> : public Encoder
 {
 public:
   explicit
@@ -51,10 +50,10 @@
 };
 
 /**
- * @brief EncodingImpl specialization TLV size estimation
+ * @brief EncodingImpl specialization for TLV size estimation
  */
 template<>
-class EncodingImpl<EstimatorTag> : public encoding::Estimator
+class EncodingImpl<EstimatorTag> : public Estimator
 {
 public:
   explicit
diff --git a/src/exclude.cpp b/src/exclude.cpp
index 900d933..f352948 100644
--- a/src/exclude.cpp
+++ b/src/exclude.cpp
@@ -144,11 +144,7 @@
   return totalLength;
 }
 
-template size_t
-Exclude::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-Exclude::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Exclude);
 
 const Block&
 Exclude::wireEncode() const
diff --git a/src/exclude.hpp b/src/exclude.hpp
index e3494f2..0bd6155 100644
--- a/src/exclude.hpp
+++ b/src/exclude.hpp
@@ -132,7 +132,7 @@
   bool
   operator!=(const Exclude& other) const;
 
-public: // interal storage
+public: // internal storage
   /**
    * @brief either a name::Component or "negative infinity"
    */
@@ -292,8 +292,7 @@
   operator<<(std::ostream& os, const Exclude& name);
 };
 
-std::ostream&
-operator<<(std::ostream& os, const Exclude& name);
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Exclude);
 
 bool
 operator==(const Exclude::ExcludeComponent& a, const Exclude::ExcludeComponent& b);
@@ -304,6 +303,9 @@
 std::ostream&
 operator<<(std::ostream& os, const Exclude::Range& range);
 
+std::ostream&
+operator<<(std::ostream& os, const Exclude& name);
+
 inline Exclude::const_iterator
 Exclude::begin() const
 {
diff --git a/src/interest.cpp b/src/interest.cpp
index 26b564e..60e284b 100644
--- a/src/interest.cpp
+++ b/src/interest.cpp
@@ -97,11 +97,7 @@
   return totalLength;
 }
 
-template size_t
-Interest::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-Interest::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Interest);
 
 const Block&
 Interest::wireEncode() const
diff --git a/src/interest.hpp b/src/interest.hpp
index 121541b..52cabf7 100644
--- a/src/interest.hpp
+++ b/src/interest.hpp
@@ -338,6 +338,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Interest);
+
 std::ostream&
 operator<<(std::ostream& os, const Interest& interest);
 
diff --git a/src/key-locator.cpp b/src/key-locator.cpp
index 8eef8cc..50453d9 100644
--- a/src/key-locator.cpp
+++ b/src/key-locator.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -74,11 +74,7 @@
   return totalLength;
 }
 
-template size_t
-KeyLocator::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-KeyLocator::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(KeyLocator);
 
 const Block&
 KeyLocator::wireEncode() const
diff --git a/src/key-locator.hpp b/src/key-locator.hpp
index b442854..50e4b99 100644
--- a/src/key-locator.hpp
+++ b/src/key-locator.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -162,6 +162,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(KeyLocator);
+
 std::ostream&
 operator<<(std::ostream& os, const KeyLocator& keyLocator);
 
diff --git a/src/lp/cache-policy.cpp b/src/lp/cache-policy.cpp
index 37dad5e..aea7d05 100644
--- a/src/lp/cache-policy.cpp
+++ b/src/lp/cache-policy.cpp
@@ -59,19 +59,15 @@
   if (m_policy == CachePolicyType::NONE) {
     BOOST_THROW_EXCEPTION(Error("CachePolicyType must be set"));
   }
+
   size_t length = 0;
-  length += prependNonNegativeIntegerBlock(encoder, tlv::CachePolicyType,
-                                           static_cast<uint32_t>(m_policy));
+  length += prependNonNegativeIntegerBlock(encoder, tlv::CachePolicyType, static_cast<uint32_t>(m_policy));
   length += encoder.prependVarNumber(length);
   length += encoder.prependVarNumber(tlv::CachePolicy);
   return length;
 }
 
-template size_t
-CachePolicy::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-CachePolicy::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(CachePolicy);
 
 const Block&
 CachePolicy::wireEncode() const
diff --git a/src/lp/cache-policy.hpp b/src/lp/cache-policy.hpp
index 45b9493..f35dc06 100644
--- a/src/lp/cache-policy.hpp
+++ b/src/lp/cache-policy.hpp
@@ -103,6 +103,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(CachePolicy);
+
 } // namespace lp
 } // namespace ndn
 
diff --git a/src/lp/nack-header.cpp b/src/lp/nack-header.cpp
index 9f3157c..3bbc985 100644
--- a/src/lp/nack-header.cpp
+++ b/src/lp/nack-header.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2015 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -61,18 +61,13 @@
 NackHeader::wireEncode(EncodingImpl<TAG>& encoder) const
 {
   size_t length = 0;
-  length += prependNonNegativeIntegerBlock(encoder, tlv::NackReason,
-                                           static_cast<uint32_t>(m_reason));
+  length += prependNonNegativeIntegerBlock(encoder, tlv::NackReason, static_cast<uint32_t>(m_reason));
   length += encoder.prependVarNumber(length);
   length += encoder.prependVarNumber(tlv::Nack);
   return length;
 }
 
-template size_t
-NackHeader::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-NackHeader::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(NackHeader);
 
 const Block&
 NackHeader::wireEncode() const
diff --git a/src/lp/nack-header.hpp b/src/lp/nack-header.hpp
index 4544f54..0c034f4 100644
--- a/src/lp/nack-header.hpp
+++ b/src/lp/nack-header.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2015 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -87,7 +87,9 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(NackHeader);
+
 } // namespace lp
 } // namespace ndn
 
-#endif // NDN_CXX_LP_NACK_HEADER_HPP
\ No newline at end of file
+#endif // NDN_CXX_LP_NACK_HEADER_HPP
diff --git a/src/meta-info.cpp b/src/meta-info.cpp
index dcafb18..e19c11d 100644
--- a/src/meta-info.cpp
+++ b/src/meta-info.cpp
@@ -152,8 +152,7 @@
 
   // FreshnessPeriod
   if (m_freshnessPeriod != DEFAULT_FRESHNESS_PERIOD) {
-    totalLength += prependNonNegativeIntegerBlock(encoder, tlv::FreshnessPeriod,
-                                                  m_freshnessPeriod.count());
+    totalLength += prependNonNegativeIntegerBlock(encoder, tlv::FreshnessPeriod, m_freshnessPeriod.count());
   }
 
   // ContentType
@@ -166,11 +165,7 @@
   return totalLength;
 }
 
-template size_t
-MetaInfo::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-MetaInfo::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(MetaInfo);
 
 const Block&
 MetaInfo::wireEncode() const
diff --git a/src/meta-info.hpp b/src/meta-info.hpp
index bec2275..e8e8a00 100644
--- a/src/meta-info.hpp
+++ b/src/meta-info.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -22,11 +22,11 @@
 #ifndef NDN_META_INFO_HPP
 #define NDN_META_INFO_HPP
 
-#include "common.hpp"
 #include "encoding/block.hpp"
 #include "encoding/encoding-buffer.hpp"
-#include "util/time.hpp"
 #include "name-component.hpp"
+#include "util/time.hpp"
+
 #include <list>
 
 namespace ndn {
@@ -198,11 +198,11 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(MetaInfo);
+
 std::ostream&
 operator<<(std::ostream& os, const MetaInfo& info);
 
-/////////////////////////////////////////////////////////////////////////
-
 inline uint32_t
 MetaInfo::getType() const
 {
diff --git a/src/mgmt/nfd/channel-status.cpp b/src/mgmt/nfd/channel-status.cpp
index e6e53f4..5fd93b1 100644
--- a/src/mgmt/nfd/channel-status.cpp
+++ b/src/mgmt/nfd/channel-status.cpp
@@ -47,11 +47,7 @@
   return totalLength;
 }
 
-template size_t
-ChannelStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
-
-template size_t
-ChannelStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(ChannelStatus);
 
 const Block&
 ChannelStatus::wireEncode() const
diff --git a/src/mgmt/nfd/channel-status.hpp b/src/mgmt/nfd/channel-status.hpp
index 04b3ed6..0345550 100644
--- a/src/mgmt/nfd/channel-status.hpp
+++ b/src/mgmt/nfd/channel-status.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -76,6 +76,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(ChannelStatus);
+
 bool
 operator==(const ChannelStatus& a, const ChannelStatus& b);
 
diff --git a/src/mgmt/nfd/control-parameters.cpp b/src/mgmt/nfd/control-parameters.cpp
index 465482f..61fb823 100644
--- a/src/mgmt/nfd/control-parameters.cpp
+++ b/src/mgmt/nfd/control-parameters.cpp
@@ -92,11 +92,7 @@
   return totalLength;
 }
 
-template size_t
-ControlParameters::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
-
-template size_t
-ControlParameters::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(ControlParameters);
 
 Block
 ControlParameters::wireEncode() const
diff --git a/src/mgmt/nfd/control-parameters.hpp b/src/mgmt/nfd/control-parameters.hpp
index c4d2167..791813f 100644
--- a/src/mgmt/nfd/control-parameters.hpp
+++ b/src/mgmt/nfd/control-parameters.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -484,6 +484,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(ControlParameters);
+
 std::ostream&
 operator<<(std::ostream& os, const ControlParameters& parameters);
 
diff --git a/src/mgmt/nfd/face-event-notification.cpp b/src/mgmt/nfd/face-event-notification.cpp
index 79a94f2..653a9d9 100644
--- a/src/mgmt/nfd/face-event-notification.cpp
+++ b/src/mgmt/nfd/face-event-notification.cpp
@@ -61,11 +61,7 @@
   return totalLength;
 }
 
-template size_t
-FaceEventNotification::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
-
-template size_t
-FaceEventNotification::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(FaceEventNotification);
 
 const Block&
 FaceEventNotification::wireEncode() const
diff --git a/src/mgmt/nfd/face-event-notification.hpp b/src/mgmt/nfd/face-event-notification.hpp
index 1c6ae4c..c933fbf 100644
--- a/src/mgmt/nfd/face-event-notification.hpp
+++ b/src/mgmt/nfd/face-event-notification.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -70,6 +70,8 @@
   FaceEventKind m_kind;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(FaceEventNotification);
+
 bool
 operator==(const FaceEventNotification& a, const FaceEventNotification& b);
 
diff --git a/src/mgmt/nfd/face-query-filter.cpp b/src/mgmt/nfd/face-query-filter.cpp
index 6bde1d4..5204aa9 100644
--- a/src/mgmt/nfd/face-query-filter.cpp
+++ b/src/mgmt/nfd/face-query-filter.cpp
@@ -83,11 +83,7 @@
   return totalLength;
 }
 
-template size_t
-FaceQueryFilter::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
-
-template size_t
-FaceQueryFilter::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(FaceQueryFilter);
 
 const Block&
 FaceQueryFilter::wireEncode() const
diff --git a/src/mgmt/nfd/face-query-filter.hpp b/src/mgmt/nfd/face-query-filter.hpp
index b0e9e5d..4b35293 100644
--- a/src/mgmt/nfd/face-query-filter.hpp
+++ b/src/mgmt/nfd/face-query-filter.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -218,6 +218,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(FaceQueryFilter);
+
 bool
 operator==(const FaceQueryFilter& a, const FaceQueryFilter& b);
 
diff --git a/src/mgmt/nfd/face-status.cpp b/src/mgmt/nfd/face-status.cpp
index 1cfc741..360865a 100644
--- a/src/mgmt/nfd/face-status.cpp
+++ b/src/mgmt/nfd/face-status.cpp
@@ -79,11 +79,7 @@
   return totalLength;
 }
 
-template size_t
-FaceStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
-
-template size_t
-FaceStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(FaceStatus);
 
 const Block&
 FaceStatus::wireEncode() const
diff --git a/src/mgmt/nfd/face-status.hpp b/src/mgmt/nfd/face-status.hpp
index d34973a..aa7accb 100644
--- a/src/mgmt/nfd/face-status.hpp
+++ b/src/mgmt/nfd/face-status.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -161,6 +161,8 @@
   uint64_t m_nOutBytes;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(FaceStatus);
+
 bool
 operator==(const FaceStatus& a, const FaceStatus& b);
 
diff --git a/src/mgmt/nfd/fib-entry.cpp b/src/mgmt/nfd/fib-entry.cpp
index db3b69f..ef47f6a 100644
--- a/src/mgmt/nfd/fib-entry.cpp
+++ b/src/mgmt/nfd/fib-entry.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -74,11 +74,7 @@
   return totalLength;
 }
 
-template size_t
-NextHopRecord::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
-
-template size_t
-NextHopRecord::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(NextHopRecord);
 
 const Block&
 NextHopRecord::wireEncode() const
@@ -190,11 +186,7 @@
   return totalLength;
 }
 
-template size_t
-FibEntry::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
-
-template size_t
-FibEntry::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(FibEntry);
 
 const Block&
 FibEntry::wireEncode() const
diff --git a/src/mgmt/nfd/fib-entry.hpp b/src/mgmt/nfd/fib-entry.hpp
index fa609ef..d91f651 100644
--- a/src/mgmt/nfd/fib-entry.hpp
+++ b/src/mgmt/nfd/fib-entry.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -84,6 +84,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(NextHopRecord);
+
 bool
 operator==(const NextHopRecord& a, const NextHopRecord& b);
 
@@ -165,6 +167,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(FibEntry);
+
 bool
 operator==(const FibEntry& a, const FibEntry& b);
 
diff --git a/src/mgmt/nfd/forwarder-status.cpp b/src/mgmt/nfd/forwarder-status.cpp
index 50eac63..27f506e 100644
--- a/src/mgmt/nfd/forwarder-status.cpp
+++ b/src/mgmt/nfd/forwarder-status.cpp
@@ -78,11 +78,7 @@
   return totalLength;
 }
 
-template size_t
-ForwarderStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
-
-template size_t
-ForwarderStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(ForwarderStatus);
 
 const Block&
 ForwarderStatus::wireEncode() const
diff --git a/src/mgmt/nfd/forwarder-status.hpp b/src/mgmt/nfd/forwarder-status.hpp
index d751165..d493048 100644
--- a/src/mgmt/nfd/forwarder-status.hpp
+++ b/src/mgmt/nfd/forwarder-status.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -219,6 +219,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(ForwarderStatus);
+
 bool
 operator==(const ForwarderStatus& a, const ForwarderStatus& b);
 
diff --git a/src/mgmt/nfd/rib-entry.cpp b/src/mgmt/nfd/rib-entry.cpp
index 475af15..c4c2d82 100644
--- a/src/mgmt/nfd/rib-entry.cpp
+++ b/src/mgmt/nfd/rib-entry.cpp
@@ -118,11 +118,7 @@
   return totalLength;
 }
 
-template size_t
-Route::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
-
-template size_t
-Route::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Route);
 
 const Block&
 Route::wireEncode() const
@@ -269,11 +265,7 @@
   return totalLength;
 }
 
-template size_t
-RibEntry::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
-
-template size_t
-RibEntry::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(RibEntry);
 
 const Block&
 RibEntry::wireEncode() const
diff --git a/src/mgmt/nfd/rib-entry.hpp b/src/mgmt/nfd/rib-entry.hpp
index e515e64..1ea73d3 100644
--- a/src/mgmt/nfd/rib-entry.hpp
+++ b/src/mgmt/nfd/rib-entry.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -131,6 +131,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Route);
+
 bool
 operator==(const Route& a, const Route& b);
 
@@ -217,6 +219,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(RibEntry);
+
 bool
 operator==(const RibEntry& a, const RibEntry& b);
 
diff --git a/src/mgmt/nfd/strategy-choice.cpp b/src/mgmt/nfd/strategy-choice.cpp
index 4c9ce37..e0496d6 100644
--- a/src/mgmt/nfd/strategy-choice.cpp
+++ b/src/mgmt/nfd/strategy-choice.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -51,11 +51,7 @@
   return totalLength;
 }
 
-template size_t
-StrategyChoice::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
-
-template size_t
-StrategyChoice::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(StrategyChoice);
 
 const Block&
 StrategyChoice::wireEncode() const
diff --git a/src/mgmt/nfd/strategy-choice.hpp b/src/mgmt/nfd/strategy-choice.hpp
index ba840f0..55871bb 100644
--- a/src/mgmt/nfd/strategy-choice.hpp
+++ b/src/mgmt/nfd/strategy-choice.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -87,6 +87,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(StrategyChoice);
+
 bool
 operator==(const StrategyChoice& a, const StrategyChoice& b);
 
diff --git a/src/name-component.cpp b/src/name-component.cpp
index 6bccced..1cdd8f9 100644
--- a/src/name-component.cpp
+++ b/src/name-component.cpp
@@ -444,7 +444,6 @@
   return encoder.block();
 }
 
-
 template<encoding::Tag TAG>
 size_t
 Component::wireEncode(EncodingImpl<TAG>& encoder) const
@@ -457,11 +456,7 @@
   return totalLength;
 }
 
-template size_t
-Component::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-Component::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Component);
 
 const Block&
 Component::wireEncode() const
diff --git a/src/name-component.hpp b/src/name-component.hpp
index 315ea0e..c537eb1 100644
--- a/src/name-component.hpp
+++ b/src/name-component.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -567,6 +567,8 @@
   // Block can be reinterpret_cast'ed as Component type.
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Component);
+
 inline std::ostream&
 operator<<(std::ostream& os, const Component& component)
 {
diff --git a/src/name.cpp b/src/name.cpp
index 6dc735f..d80fecf 100644
--- a/src/name.cpp
+++ b/src/name.cpp
@@ -140,11 +140,7 @@
   return totalLength;
 }
 
-template size_t
-Name::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-Name::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Name);
 
 const Block&
 Name::wireEncode() const
diff --git a/src/name.hpp b/src/name.hpp
index 890451f..a2efe1b 100644
--- a/src/name.hpp
+++ b/src/name.hpp
@@ -540,6 +540,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Name);
+
 inline bool
 operator==(const Name& lhs, const Name& rhs)
 {
diff --git a/src/net/detail/network-monitor-impl-rtnl.cpp b/src/net/detail/network-monitor-impl-rtnl.cpp
index 71274a1..dbc6815 100644
--- a/src/net/detail/network-monitor-impl-rtnl.cpp
+++ b/src/net/detail/network-monitor-impl-rtnl.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -154,24 +154,24 @@
 static const char*
 nlmsgTypeToString(uint16_t type)
 {
-#define NDN_NLMSG_STRING(x) case NLMSG_##x: return "<" #x ">"
-#define NDN_RTM_STRING(x) case RTM_##x: return "<" #x ">"
+#define NLMSG_STRINGIFY(x) case NLMSG_##x: return "<" #x ">"
+#define RTM_STRINGIFY(x) case RTM_##x: return "<" #x ">"
   switch (type) {
-    NDN_NLMSG_STRING(NOOP);
-    NDN_NLMSG_STRING(ERROR);
-    NDN_NLMSG_STRING(DONE);
-    NDN_NLMSG_STRING(OVERRUN);
-    NDN_RTM_STRING(NEWLINK);
-    NDN_RTM_STRING(DELLINK);
-    NDN_RTM_STRING(NEWADDR);
-    NDN_RTM_STRING(DELADDR);
-    NDN_RTM_STRING(NEWROUTE);
-    NDN_RTM_STRING(DELROUTE);
+    NLMSG_STRINGIFY(NOOP);
+    NLMSG_STRINGIFY(ERROR);
+    NLMSG_STRINGIFY(DONE);
+    NLMSG_STRINGIFY(OVERRUN);
+    RTM_STRINGIFY(NEWLINK);
+    RTM_STRINGIFY(DELLINK);
+    RTM_STRINGIFY(NEWADDR);
+    RTM_STRINGIFY(DELADDR);
+    RTM_STRINGIFY(NEWROUTE);
+    RTM_STRINGIFY(DELROUTE);
     default:
       return "";
   }
-#undef NDN_NLMSG_STRING
-#undef NDN_RTM_STRING
+#undef NLMSG_STRINGIFY
+#undef RTM_STRINGIFY
 }
 
 static InterfaceType
diff --git a/src/security/detail/openssl.hpp b/src/security/detail/openssl.hpp
index cde9efc..99d20cb 100644
--- a/src/security/detail/openssl.hpp
+++ b/src/security/detail/openssl.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -22,15 +22,11 @@
 #ifndef NDN_SECURITY_DETAIL_OPENSSL_HPP
 #define NDN_SECURITY_DETAIL_OPENSSL_HPP
 
-// suppress deprecation warnings in OSX >= 10.7
-
-#if defined(__APPLE__)
-
-#ifdef __clang__
+// suppress deprecation warnings on macOS >= 10.7
+#if defined(__APPLE__) && defined(__clang__)
+#pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif // __clang__
-
-#endif // __APPLE__
+#endif
 
 #include <openssl/bio.h>
 #include <openssl/crypto.h>
@@ -43,4 +39,8 @@
 #include <openssl/rsa.h>
 #include <openssl/x509.h>
 
+#if defined(__APPLE__) && defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+
 #endif // NDN_SECURITY_DETAIL_OPENSSL_HPP
diff --git a/src/security/safe-bag.cpp b/src/security/safe-bag.cpp
index 448847a..8315acf 100644
--- a/src/security/safe-bag.cpp
+++ b/src/security/safe-bag.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -20,7 +20,9 @@
  *
  * @author Zhiyi Zhang <dreamerbarrychang@gmail.com>
  */
+
 #include "safe-bag.hpp"
+#include "encoding/encoding-buffer.hpp"
 #include "encoding/tlv-security.hpp"
 #include "util/concepts.hpp"
 
@@ -74,11 +76,7 @@
   return totalLength;
 }
 
-template size_t
-SafeBag::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-SafeBag::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(SafeBag);
 
 const Block&
 SafeBag::wireEncode() const
diff --git a/src/security/safe-bag.hpp b/src/security/safe-bag.hpp
index 12555c9..13a2410 100644
--- a/src/security/safe-bag.hpp
+++ b/src/security/safe-bag.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -25,9 +25,8 @@
 
 #include "../common.hpp"
 #include "../data.hpp"
+#include "../encoding/block.hpp"
 #include "../encoding/buffer.hpp"
-#include "../encoding/encoder.hpp"
-#include "../encoding/encoding-buffer.hpp"
 #include "security-common.hpp"
 
 namespace ndn {
@@ -115,6 +114,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(SafeBag);
+
 } // namespace security
 } // namespace ndn
 
diff --git a/src/security/v1/sec-tpm-osx.cpp b/src/security/v1/sec-tpm-osx.cpp
index f43faa9..a54bf6e 100644
--- a/src/security/v1/sec-tpm-osx.cpp
+++ b/src/security/v1/sec-tpm-osx.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -149,7 +149,7 @@
       CFRelease(m_typeRef);
       m_typeRef = nullptr;
     }
-  };
+  }
 
   bool
   operator==(std::nullptr_t)
diff --git a/src/security/v2/additional-description.cpp b/src/security/v2/additional-description.cpp
index 6fdfd53..63b5ee6 100644
--- a/src/security/v2/additional-description.cpp
+++ b/src/security/v2/additional-description.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -109,11 +109,7 @@
   return totalLength;
 }
 
-template size_t
-AdditionalDescription::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-AdditionalDescription::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(AdditionalDescription);
 
 const Block&
 AdditionalDescription::wireEncode() const
diff --git a/src/security/v2/additional-description.hpp b/src/security/v2/additional-description.hpp
index d5142ae..ad9df37 100644
--- a/src/security/v2/additional-description.hpp
+++ b/src/security/v2/additional-description.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -52,7 +52,6 @@
   typedef std::map<std::string, std::string>::const_iterator const_iterator;
 
 public:
-
   /**
    * @brief Create an empty AdditionalDescription
    */
@@ -109,7 +108,6 @@
   wireDecode(const Block& wire);
 
 public: // EqualityComparable concept
-
   bool
   operator==(const AdditionalDescription& other) const;
 
@@ -117,12 +115,13 @@
   operator!=(const AdditionalDescription& other) const;
 
 private:
-
   std::map<std::string, std::string> m_info;
 
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(AdditionalDescription);
+
 std::ostream&
 operator<<(std::ostream& os, const AdditionalDescription& period);
 
diff --git a/src/security/validity-period.cpp b/src/security/validity-period.cpp
index 14ba0f2..c30497b 100644
--- a/src/security/validity-period.cpp
+++ b/src/security/validity-period.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -72,11 +72,7 @@
   return totalLength;
 }
 
-template size_t
-ValidityPeriod::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-ValidityPeriod::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(ValidityPeriod);
 
 const Block&
 ValidityPeriod::wireEncode() const
diff --git a/src/security/validity-period.hpp b/src/security/validity-period.hpp
index d09657f..e87c6ec 100644
--- a/src/security/validity-period.hpp
+++ b/src/security/validity-period.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -125,6 +125,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(ValidityPeriod);
+
 std::ostream&
 operator<<(std::ostream& os, const ValidityPeriod& period);
 
diff --git a/src/selectors.cpp b/src/selectors.cpp
index a207775..80c891f 100644
--- a/src/selectors.cpp
+++ b/src/selectors.cpp
@@ -109,11 +109,7 @@
   return totalLength;
 }
 
-template size_t
-Selectors::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-Selectors::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Selectors);
 
 const Block&
 Selectors::wireEncode() const
diff --git a/src/selectors.hpp b/src/selectors.hpp
index 960947f..5a80185 100644
--- a/src/selectors.hpp
+++ b/src/selectors.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -156,6 +156,8 @@
   mutable Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Selectors);
+
 } // namespace ndn
 
 #endif // NDN_SELECTORS_HPP
diff --git a/src/signature-info.cpp b/src/signature-info.cpp
index 1fc68f9..36964ac 100644
--- a/src/signature-info.cpp
+++ b/src/signature-info.cpp
@@ -82,11 +82,7 @@
   return totalLength;
 }
 
-template size_t
-SignatureInfo::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& encoder) const;
-
-template size_t
-SignatureInfo::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(SignatureInfo);
 
 const Block&
 SignatureInfo::wireEncode() const
diff --git a/src/signature-info.hpp b/src/signature-info.hpp
index 7ac8404..af6908d 100644
--- a/src/signature-info.hpp
+++ b/src/signature-info.hpp
@@ -162,6 +162,8 @@
   operator<<(std::ostream& os, const SignatureInfo& info);
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(SignatureInfo);
+
 bool
 operator==(const SignatureInfo& lhs, const SignatureInfo& rhs);
 
diff --git a/src/util/cf-releaser-osx.hpp b/src/util/cf-releaser-osx.hpp
index 61afeba..6c73ae8 100644
--- a/src/util/cf-releaser-osx.hpp
+++ b/src/util/cf-releaser-osx.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
@@ -138,7 +138,7 @@
       CFRelease(m_typeRef);
       m_typeRef = nullptr;
     }
-  };
+  }
 
 private:
   T m_typeRef;
diff --git a/src/util/logging.cpp b/src/util/logging.cpp
index 9961598..06948c1 100644
--- a/src/util/logging.cpp
+++ b/src/util/logging.cpp
@@ -30,6 +30,11 @@
 #include <iostream>
 #include <sstream>
 
+// suppress warning caused by <boost/log/sinks/text_ostream_backend.hpp>
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wundefined-func-template"
+#endif
+
 namespace ndn {
 namespace util {
 
diff --git a/src/util/regex/regex-pattern-list-matcher.hpp b/src/util/regex/regex-pattern-list-matcher.hpp
index fb0743b..ccac4b8 100644
--- a/src/util/regex/regex-pattern-list-matcher.hpp
+++ b/src/util/regex/regex-pattern-list-matcher.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2015 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -37,14 +37,9 @@
 public:
   RegexPatternListMatcher(const std::string& expr, shared_ptr<RegexBackrefManager> backrefManager);
 
-  virtual
-  ~RegexPatternListMatcher()
-  {
-  };
-
 protected:
-  virtual void
-  compile();
+  void
+  compile() override;
 
 private:
   bool
@@ -55,9 +50,6 @@
 
   int
   extractRepetition(size_t index);
-
-private:
-
 };
 
 } // namespace ndn
@@ -193,7 +185,6 @@
   }
 }
 
-
 } // namespace ndn
 
 #endif // NDN_UTIL_REGEX_REGEX_PATTERN_LIST_MATCHER_HPP
diff --git a/src/util/time-unit-test-clock.hpp b/src/util/time-unit-test-clock.hpp
index f099b84..7d67507 100644
--- a/src/util/time-unit-test-clock.hpp
+++ b/src/util/time-unit-test-clock.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 Regents of the University of California.
+/*
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -102,6 +102,9 @@
   nanoseconds m_currentTime;
 };
 
+extern template class UnitTestClock<system_clock>;
+extern template class UnitTestClock<steady_clock>;
+
 typedef UnitTestClock<system_clock> UnitTestSystemClock;
 typedef UnitTestClock<steady_clock> UnitTestSteadyClock;