From 527ce886369194ebbdaef842a0d96445203d171c Mon Sep 17 00:00:00 2001
From: Tudor Bosman <tudorb@fb.com>
Date: Tue, 20 May 2014 08:49:16 -0700
Subject: [PATCH] Some opensource build fixes

Summary:
- switch to new versions of ax_boost_*.m4
- versioning in libtool
- better checks in configure.ac

Test Plan: built in an Ubuntu VM

Reviewed By: davejwatson@fb.com

Subscribers: folly@lists

FB internal diff: D1338957
---
 .gitignore                  |   1 +
 README                      |   5 +-
 folly/Makefile.am           |   6 ++
 folly/configure.ac          |  11 +++-
 folly/m4/ax_boost_base.m4   |  22 ++++++--
 folly/m4/ax_boost_regex.m4  |  72 ++++++++++++------------
 folly/m4/ax_boost_thread.m4 | 106 ++++++++++++++++++------------------
 7 files changed, 128 insertions(+), 95 deletions(-)

diff --git a/.gitignore b/.gitignore
index 089c09e9..88fa1587 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 *.o
 *.lo
 *.la
+.dirstamp
 Makefile
 Makefile.in
 .libs
diff --git a/README b/README
index b8fb0aba..6c4f6737 100644
--- a/README
+++ b/README
@@ -46,7 +46,10 @@ Dependencies
     - libgoogle-glog-dev
     - libgflags-dev
     - scons (for double-conversion)
-
+    - binutils-dev      (optional)
+    - libiberty-dev     (optional)
+    - libjemalloc-dev   (optional)
+ 
   Fedora 17 64-bit
     - gcc
     - gcc-c++
diff --git a/folly/Makefile.am b/folly/Makefile.am
index e0e4d251..07fcb0d2 100644
--- a/folly/Makefile.am
+++ b/folly/Makefile.am
@@ -238,6 +238,8 @@ if !HAVE_BITS_FUNCTEXCEPT
 libfolly_la_SOURCES += detail/FunctionalExcept.cpp
 endif
 
+libfolly_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LT_VERSION)
+
 FingerprintTables.cpp: generate_fingerprint_tables
 	./generate_fingerprint_tables
 CLEANFILES += FingerprintTables.cpp
@@ -245,9 +247,13 @@ CLEANFILES += FingerprintTables.cpp
 libfollyfingerprint_la_SOURCES = \
 	FingerprintTables.cpp
 libfollyfingerprint_la_LIBADD = libfolly.la
+libfollyfingerprint_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LT_VERSION)
 
 libfollybenchmark_la_SOURCES = Benchmark.cpp
 libfollybenchmark_la_LIBADD = libfolly.la
+libfollybenchmark_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LT_VERSION)
 
 libfollytimeout_queue_la_SOURCES = TimeoutQueue.cpp
 libfollytimeout_queue_la_LIBADD = libfolly.la
+libfollytimeout_queue_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LT_VERSION)
+
diff --git a/folly/configure.ac b/folly/configure.ac
index 820ea036..b87ac670 100644
--- a/folly/configure.ac
+++ b/folly/configure.ac
@@ -4,12 +4,19 @@
 
 AC_PREREQ(2.59)
 AC_INIT(folly, 0.1, folly@fb.com)
+
+m4_define([folly_libtool_current], [1])
+
+# We assume all revisions are backwards incompatible.
+LT_VERSION=folly_libtool_current:0:0
+AC_SUBST(LT_VERSION)
+
 AC_CONFIG_SRCDIR([Likely.h])
 AC_CONFIG_HEADERS([config.h])
 AX_PREFIX_CONFIG_H([folly-config.h], [folly], [config.h])
 AC_CONFIG_AUX_DIR([build-aux])
 
-AM_INIT_AUTOMAKE([foreign dist-bzip2 nostdinc])
+AM_INIT_AUTOMAKE([foreign dist-bzip2 nostdinc subdir-objects])
 
 AC_CONFIG_MACRO_DIR([m4])
 
@@ -63,6 +70,8 @@ AC_CHECK_LIB([double-conversion],[ceil],[],[AC_MSG_ERROR(
 
 AC_CHECK_LIB([event], [event_set], [], [AC_MSG_ERROR([Unable to find libevent])])
 
+AC_CHECK_LIB([jemalloc], [rallocm])
+
 # Checks for typedefs, structures, and compiler characteristics.
 AC_HEADER_STDBOOL
 AC_C_CONST
diff --git a/folly/m4/ax_boost_base.m4 b/folly/m4/ax_boost_base.m4
index 35077885..8e6ee9a9 100644
--- a/folly/m4/ax_boost_base.m4
+++ b/folly/m4/ax_boost_base.m4
@@ -33,7 +33,7 @@
 #   and this notice are preserved. This file is offered as-is, without any
 #   warranty.
 
-#serial 20
+#serial 23
 
 AC_DEFUN([AX_BOOST_BASE],
 [
@@ -91,9 +91,23 @@ if test "x$want_boost" = "xyes"; then
     dnl are found, e.g. when only header-only libraries are installed!
     libsubdirs="lib"
     ax_arch=`uname -m`
-    if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = s390x -o $ax_arch = sparc64; then
+    case $ax_arch in
+      x86_64|ppc64|s390x|sparc64|aarch64)
         libsubdirs="lib64 lib lib64"
-    fi
+        ;;
+    esac
+
+    dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
+    dnl them priority over the other paths since, if libs are found there, they
+    dnl are almost assuredly the ones desired.
+    AC_REQUIRE([AC_CANONICAL_HOST])
+    libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
+
+    case ${host_cpu} in
+      i?86)
+        libsubdirs="lib/i386-${host_os} $libsubdirs"
+        ;;
+    esac
 
     dnl first we check the system location for boost libraries
     dnl this location ist chosen if boost libraries are installed with the --layout=system option
@@ -255,4 +269,4 @@ if test "x$want_boost" = "xyes"; then
     LDFLAGS="$LDFLAGS_SAVED"
 fi
 
-])
\ No newline at end of file
+])
diff --git a/folly/m4/ax_boost_regex.m4 b/folly/m4/ax_boost_regex.m4
index f3e5cc18..918f16a4 100644
--- a/folly/m4/ax_boost_regex.m4
+++ b/folly/m4/ax_boost_regex.m4
@@ -30,69 +30,69 @@
 #   and this notice are preserved. This file is offered as-is, without any
 #   warranty.
 
-#serial 20
+#serial 22
 
 AC_DEFUN([AX_BOOST_REGEX],
 [
-        AC_ARG_WITH([boost-regex],
-        AS_HELP_STRING([--with-boost-regex@<:@=special-lib@:>@],
+	AC_ARG_WITH([boost-regex],
+	AS_HELP_STRING([--with-boost-regex@<:@=special-lib@:>@],
                    [use the Regex library from boost - it is possible to specify a certain library for the linker
                         e.g. --with-boost-regex=boost_regex-gcc-mt-d-1_33_1 ]),
         [
         if test "$withval" = "no"; then
-                want_boost="no"
+			want_boost="no"
         elif test "$withval" = "yes"; then
             want_boost="yes"
             ax_boost_user_regex_lib=""
         else
-                    want_boost="yes"
-                        ax_boost_user_regex_lib="$withval"
-                                fi
+		    want_boost="yes"
+		ax_boost_user_regex_lib="$withval"
+		fi
         ],
         [want_boost="yes"]
-        )
+	)
 
-        if test "x$want_boost" = "xyes"; then
+	if test "x$want_boost" = "xyes"; then
         AC_REQUIRE([AC_PROG_CC])
-                CPPFLAGS_SAVED="$CPPFLAGS"
-                        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-                                            export CPPFLAGS
+		CPPFLAGS_SAVED="$CPPFLAGS"
+		CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+		export CPPFLAGS
 
-                                                   LDFLAGS_SAVED="$LDFLAGS"
-                                                        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-                                                                          export LDFLAGS
+		LDFLAGS_SAVED="$LDFLAGS"
+		LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
+		export LDFLAGS
 
         AC_CACHE_CHECK(whether the Boost::Regex library is available,
-                                                           ax_cv_boost_regex,
+					   ax_cv_boost_regex,
         [AC_LANG_PUSH([C++])
-                         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/regex.hpp>
-                                                                                                                            ]],
+			 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/regex.hpp>
+												]],
                                    [[boost::regex r(); return 0;]])],
                    ax_cv_boost_regex=yes, ax_cv_boost_regex=no)
          AC_LANG_POP([C++])
-                ])
-                        if test "x$ax_cv_boost_regex" = "xyes"; then
-                                AC_DEFINE(HAVE_BOOST_REGEX,,[define if the Boost::Regex library is available])
+		])
+		if test "x$ax_cv_boost_regex" = "xyes"; then
+			AC_DEFINE(HAVE_BOOST_REGEX,,[define if the Boost::Regex library is available])
             BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
             if test "x$ax_boost_user_regex_lib" = "x"; then
-                for libextension in `ls $BOOSTLIBDIR/libboost_regex*.so* $BOOSTLIBDIR/libboost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_regex.*\)\.so.*$;\1;' -e 's;^lib\(boost_regex.*\)\.a*$;\1;'` ; do
+                for libextension in `ls $BOOSTLIBDIR/libboost_regex*.so* $BOOSTLIBDIR/libboost_regex*.dylib* $BOOSTLIBDIR/libboost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_regex.*\)\.so.*$;\1;' -e 's;^lib\(boost_regex.*\)\.dylib.*;\1;' -e 's;^lib\(boost_regex.*\)\.a.*$;\1;'` ; do
                      ax_lib=${libextension}
-                                            AC_CHECK_LIB($ax_lib, exit,
+				    AC_CHECK_LIB($ax_lib, exit,
                                  [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break],
                                  [link_regex="no"])
-                                                        done
+				done
                 if test "x$link_regex" != "xyes"; then
-                for libextension in `ls $BOOSTLIBDIR/boost_regex*.{dll,a}* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_regex.*\)\.dll.*$;\1;' -e 's;^\(boost_regex.*\)\.a*$;\1;'` ; do
+                for libextension in `ls $BOOSTLIBDIR/boost_regex*.dll* $BOOSTLIBDIR/boost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_regex.*\)\.dll.*$;\1;' -e 's;^\(boost_regex.*\)\.a.*$;\1;'` ; do
                      ax_lib=${libextension}
-                                            AC_CHECK_LIB($ax_lib, exit,
+				    AC_CHECK_LIB($ax_lib, exit,
                                  [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break],
                                  [link_regex="no"])
-                                                        done
+				done
                 fi
 
             else
                for ax_lib in $ax_boost_user_regex_lib boost_regex-$ax_boost_user_regex_lib; do
-                                   AC_CHECK_LIB($ax_lib, main,
+				      AC_CHECK_LIB($ax_lib, main,
                                    [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break],
                                    [link_regex="no"])
                done
@@ -100,12 +100,12 @@ AC_DEFUN([AX_BOOST_REGEX],
             if test "x$ax_lib" = "x"; then
                 AC_MSG_ERROR(Could not find a version of the Boost::Regex library!)
             fi
-                        if test "x$link_regex" != "xyes"; then
-                                               AC_MSG_ERROR(Could not link against $ax_lib !)
-                                                                      fi
-                                                                        fi
+			if test "x$link_regex" != "xyes"; then
+				AC_MSG_ERROR(Could not link against $ax_lib !)
+			fi
+		fi
 
-                                                                                CPPFLAGS="$CPPFLAGS_SAVED"
-                                                                                LDFLAGS="$LDFLAGS_SAVED"
-                                                                                fi
-])
\ No newline at end of file
+		CPPFLAGS="$CPPFLAGS_SAVED"
+	LDFLAGS="$LDFLAGS_SAVED"
+	fi
+])
diff --git a/folly/m4/ax_boost_thread.m4 b/folly/m4/ax_boost_thread.m4
index 971f7ab8..79e12cdb 100644
--- a/folly/m4/ax_boost_thread.m4
+++ b/folly/m4/ax_boost_thread.m4
@@ -30,73 +30,73 @@
 #   and this notice are preserved. This file is offered as-is, without any
 #   warranty.
 
-#serial 23
+#serial 27
 
 AC_DEFUN([AX_BOOST_THREAD],
 [
-        AC_ARG_WITH([boost-thread],
-        AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@],
+	AC_ARG_WITH([boost-thread],
+	AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@],
                    [use the Thread library from boost - it is possible to specify a certain library for the linker
                         e.g. --with-boost-thread=boost_thread-gcc-mt ]),
         [
         if test "$withval" = "no"; then
-                want_boost="no"
+			want_boost="no"
         elif test "$withval" = "yes"; then
             want_boost="yes"
             ax_boost_user_thread_lib=""
         else
-                    want_boost="yes"
-                        ax_boost_user_thread_lib="$withval"
-                                fi
+		    want_boost="yes"
+		ax_boost_user_thread_lib="$withval"
+		fi
         ],
         [want_boost="yes"]
-        )
+	)
 
-        if test "x$want_boost" = "xyes"; then
+	if test "x$want_boost" = "xyes"; then
         AC_REQUIRE([AC_PROG_CC])
         AC_REQUIRE([AC_CANONICAL_BUILD])
-                CPPFLAGS_SAVED="$CPPFLAGS"
-                        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
-                                            export CPPFLAGS
+		CPPFLAGS_SAVED="$CPPFLAGS"
+		CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+		export CPPFLAGS
 
-                                                   LDFLAGS_SAVED="$LDFLAGS"
-                                                        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
-                                                                          export LDFLAGS
+		LDFLAGS_SAVED="$LDFLAGS"
+		LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
+		export LDFLAGS
 
         AC_CACHE_CHECK(whether the Boost::Thread library is available,
-                                                            ax_cv_boost_thread,
+					   ax_cv_boost_thread,
         [AC_LANG_PUSH([C++])
-                         CXXFLAGS_SAVE=$CXXFLAGS
+			 CXXFLAGS_SAVE=$CXXFLAGS
 
-                                         if test "x$host_os" = "xsolaris" ; then
-                                                              CXXFLAGS="-pthreads $CXXFLAGS"
-                                                                                         elif test "x$host_os" = "xmingw32" ; then
-                                                                                                                CXXFLAGS="-mthreads $CXXFLAGS"
-                                                                                                                                      else
-                                                                                                                                         CXXFLAGS="-pthread $CXXFLAGS"
-                                                                                                                                                              fi
-                                                                                                                                                                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/thread/thread.hpp>]],
+			 if test "x$host_os" = "xsolaris" ; then
+				 CXXFLAGS="-pthreads $CXXFLAGS"
+			 elif test "x$host_os" = "xmingw32" ; then
+				 CXXFLAGS="-mthreads $CXXFLAGS"
+			 else
+				CXXFLAGS="-pthread $CXXFLAGS"
+			 fi
+			 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/thread/thread.hpp>]],
                                    [[boost::thread_group thrds;
                                    return 0;]])],
                    ax_cv_boost_thread=yes, ax_cv_boost_thread=no)
-                                                 CXXFLAGS=$CXXFLAGS_SAVE
+			 CXXFLAGS=$CXXFLAGS_SAVE
              AC_LANG_POP([C++])
-                ])
-                        if test "x$ax_cv_boost_thread" = "xyes"; then
+		])
+		if test "x$ax_cv_boost_thread" = "xyes"; then
            if test "x$host_os" = "xsolaris" ; then
-                     BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS"
-                                                  elif test "x$host_os" = "xmingw32" ; then
-                                                              BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS"
-                                                                                           else
-                                                                                                          BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS"
-                                                                                                                                      fi
+			  BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS"
+		   elif test "x$host_os" = "xmingw32" ; then
+			  BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS"
+		   else
+			  BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS"
+		   fi
 
-                                                                                                                                        AC_SUBST(BOOST_CPPFLAGS)
+			AC_SUBST(BOOST_CPPFLAGS)
 
-                                                                                                                                          AC_DEFINE(HAVE_BOOST_THREAD,,[define if the Boost::Thread library is available])
+			AC_DEFINE(HAVE_BOOST_THREAD,,[define if the Boost::Thread library is available])
             BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
 
-                                             LDFLAGS_SAVE=$LDFLAGS
+			LDFLAGS_SAVE=$LDFLAGS
                         case "x$host_os" in
                           *bsd* )
                                LDFLAGS="-pthread $LDFLAGS"
@@ -104,24 +104,24 @@ AC_DEFUN([AX_BOOST_THREAD],
                           ;;
                         esac
             if test "x$ax_boost_user_thread_lib" = "x"; then
-                for libextension in `ls $BOOSTLIBDIR/libboost_thread*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_thread.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_thread*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_thread.*\)\.a*$;\1;'`; do
+                for libextension in `ls -r $BOOSTLIBDIR/libboost_thread* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'`; do
                      ax_lib=${libextension}
-                                            AC_CHECK_LIB($ax_lib, exit,
+				    AC_CHECK_LIB($ax_lib, exit,
                                  [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break],
                                  [link_thread="no"])
-                                                        done
+				done
                 if test "x$link_thread" != "xyes"; then
-                for libextension in `ls $BOOSTLIBDIR/boost_thread*.dll* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_thread.*\)\.dll.*$;\1;'` `ls $BOOSTLIBDIR/boost_thread*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_thread.*\)\.a*$;\1;'` ; do
+                for libextension in `ls -r $BOOSTLIBDIR/boost_thread* 2>/dev/null | sed 's,.*/,,' | sed 's,\..*,,'`; do
                      ax_lib=${libextension}
-                                            AC_CHECK_LIB($ax_lib, exit,
+				    AC_CHECK_LIB($ax_lib, exit,
                                  [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break],
                                  [link_thread="no"])
-                                                        done
+				done
                 fi
 
             else
                for ax_lib in $ax_boost_user_thread_lib boost_thread-$ax_boost_user_thread_lib; do
-                                   AC_CHECK_LIB($ax_lib, exit,
+				      AC_CHECK_LIB($ax_lib, exit,
                                    [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break],
                                    [link_thread="no"])
                   done
@@ -130,20 +130,20 @@ AC_DEFUN([AX_BOOST_THREAD],
             if test "x$ax_lib" = "x"; then
                 AC_MSG_ERROR(Could not find a version of the library!)
             fi
-                        if test "x$link_thread" = "xno"; then
-                                                AC_MSG_ERROR(Could not link against $ax_lib !)
+			if test "x$link_thread" = "xno"; then
+				AC_MSG_ERROR(Could not link against $ax_lib !)
                         else
                            case "x$host_os" in
                               *bsd* )
-                                                BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS"
+				BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS"
                               break;
                               ;;
                            esac
 
-                                        fi
-                                                fi
+			fi
+		fi
 
-                                                        CPPFLAGS="$CPPFLAGS_SAVED"
-                                                        LDFLAGS="$LDFLAGS_SAVED"
-                                                        fi
-])
\ No newline at end of file
+		CPPFLAGS="$CPPFLAGS_SAVED"
+	LDFLAGS="$LDFLAGS_SAVED"
+	fi
+])
-- 
2.34.1