必要なものが揃ったので、Qpidのビルド

Mac OS Xの10.4.11で、アーキテクチャppcです。


1. Qpid-0.5の取得
http://www.apache.org/dist/qpid/0.5/から全部入りのqpid-0.5.tar.gzを取得して、展開します。
C++実装にしか興味がない人は、http://www.apache.org/dist/qpid/0.5/qpid-cpp-0.5.tar.gzをどうぞ。


2. 次のパッチをあてます

--- qpid-0.5/cpp/libtool.orig   2009-08-28 00:37:37.000000000 +0900
+++ qpid-0.5/cpp/libtool        2009-09-06 23:58:33.000000000 +0900
@@ -3640,7 +3640,8 @@
          versuffix="$major.$age.$revision"
          # Darwin ld doesn't like 0 for these options...
          minor_current=`expr $current + 1`
-         verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+#        verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+         verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
          ;;
 
        freebsd-aout)
--- qpid-0.5/cpp/src/Makefile.am.orig   2009-05-02 05:13:50.000000000 +0900
+++ qpid-0.5/cpp/src/Makefile.am        2009-09-07 00:21:04.000000000 +0900
@@ -280,10 +280,12 @@
   qpid/amqp_0_10/UnknownStruct.h \
   qpid/amqp_0_10/UnknownStruct.cpp 
 
+#LIB_UUID=-luuid
+LIB_UUID=
 libqpidcommon_la_LIBADD = \
   -lboost_program_options \
   -lboost_filesystem \
-  -luuid \
+  $(LIB_UUID) \
   $(LIB_DLOPEN) \
   $(LIB_CLOCK_GETTIME)
 
@@ -355,7 +357,7 @@
 libqpidcommon_la_LIBADD += -lsasl2
 endif
 
-libqpidbroker_la_LIBADD = libqpidcommon.la -luuid
+libqpidbroker_la_LIBADD = libqpidcommon.la $(LIB_UUID)
 
 libqpidbroker_la_SOURCES = \
   $(mgen_broker_cpp) \
@@ -431,7 +433,7 @@
   qpid/sys/TCPIOPlugin.cpp
 
 
-libqpidclient_la_LIBADD = libqpidcommon.la  -luuid
+libqpidclient_la_LIBADD = libqpidcommon.la  $(LIB_UUID)
 
 libqpidclient_la_SOURCES =                     \
   $(rgen_client_srcs)                          \
--- qpid-0.5/cpp/src/qpid/Msg.h.orig    2007-10-27 04:48:31.000000000 +0900
+++ qpid-0.5/cpp/src/qpid/Msg.h 2009-08-28 00:43:25.000000000 +0900
@@ -24,6 +24,7 @@

 #include <sstream>
 #include <iostream>
+#include <string>

 namespace qpid {

--- qpid-0.5/cpp/src/qpid/Plugin.cpp.orig       2008-07-17 09:03:50.000000000 +0900
+++ qpid-0.5/cpp/src/qpid/Plugin.cpp    2009-08-28 02:25:22.000000000 +0900
@@ -42,7 +42,7 @@
 Plugin::Target::~Target() { finalize(); }

 void Plugin::Target::finalize() {
-    for_each(finalizers.begin(), finalizers.end(), invoke);
+    std::for_each(finalizers.begin(), finalizers.end(), invoke);
     finalizers.clear();
 }
--- qpid-0.5/cpp/src/qpid/sys/posix/SystemInfo.cpp.orig 2009-02-24 23:15:28.000000000 +0900
+++ qpid-0.5/cpp/src/qpid/sys/posix/SystemInfo.cpp      2009-08-28 02:21:12.000000000 +0900
@@ -22,6 +22,7 @@

 #include <sys/ioctl.h>
 #include <sys/utsname.h>
+#include <sys/socket.h>
 #include <net/if.h>
 #include <unistd.h>
 #include <arpa/inet.h>
@@ -61,6 +62,7 @@
 void SystemInfo::getLocalIpAddresses (uint16_t port,
                                       std::vector<Address> &addrList) {
     int s = socket (PF_INET, SOCK_STREAM, 0);
+#if 0
     for (int i=1;;i++) {
         struct ifreq ifr;
         ifr.ifr_ifindex = i;
@@ -74,6 +76,25 @@
         if (addr != LOCALHOST)
             addrList.push_back(TcpAddress(addr, port));
     }
+#else
+    struct if_nameindex* arrayp = if_nameindex();
+    for (struct if_nameindex* idxp = arrayp;
+       idxp && idxp->if_index > 0 && idxp->if_name;
+       idxp++) {
+        struct ifreq ifr;
+       strcpy(ifr.ifr_name, idxp->if_name);
+        /* now ifr.ifr_name is set */
+        if (::ioctl (s, SIOCGIFADDR, &ifr) < 0)
+            continue;
+        struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
+        string addr(inet_ntoa(sin->sin_addr));
+        if (addr != LOCALHOST)
+            addrList.push_back(TcpAddress(addr, port));
+    }
+    if (arrayp) {
+       if_freenameindex(arrayp);
+    }
+#endif
     if (addrList.empty()) {
         addrList.push_back(TcpAddress(LOCALHOST, port));
     }
--- qpid-0.5/cpp/src/qpid/sys/posix/Thread.cpp.orig     2008-08-07 05:56:19.000000000 +0900
+++ qpid-0.5/cpp/src/qpid/sys/posix/Thread.cpp  2009-08-28 01:53:16.000000000 +0900
@@ -61,7 +61,7 @@

 unsigned long Thread::id() {
     if (impl)
-        return impl->thread;
+        return reinterpret_cast<unsigned long>(impl->thread);
     else
         return 0;
 }
--- qpid-0.5/cpp/src/qpid/sys/posix/Time.cpp.orig       2008-10-30 07:11:46.000000000 +0900
+++ qpid-0.5/cpp/src/qpid/sys/posix/Time.cpp    2009-08-28 01:48:05.000000000 +0900
@@ -45,7 +45,14 @@

 AbsTime AbsTime::now() {
     struct timespec ts;
+#if 0
     ::clock_gettime(CLOCK_REALTIME, &ts);
+#else
+    struct timeval tv;
+    ::gettimeofday(&tv, 0);
+    ts.tv_sec = tv.tv_sec;
+    ts.tv_nsec = tv.tv_usec * TIME_USEC;
+#endif
     AbsTime time_now;
     time_now.timepoint = toTime(ts).nanosecs;
     return time_now;

パッチについての補足です

  • libtoolはlinkerへのオプションを正しく渡すため。
  • Makefile.amは不要な「-luuid」を削除するため。
  • Msg.hはstd::stringを使っていながら、includeし忘れです。
  • Plugin.cppは単なるstdのつけ忘れです。
  • SystemInfo.cppはローカルインタフェースの取得のコードです。
  • Thread.cppは単なるキャストです。
  • Time.cppはclock_gettime()の代替コードです(configure実行時に存否チェックが行われているですけどね)。


3. config.statusを生成します
とりあえず、生成しておいて

& cd qpid-0.5/cpp
% env CPPFLAGS='-I/usr/local/include/stlport -I/usr/local/include/boost-1_39' LDFLAGS='-L/usr/local/lib -lstlport' ./configure --prefix=/usr/local

若干ですが、config.statusを修正します。

  • WARNING_CFLAGSから「-Werror -pedantic」を削除します。
  • LDFLAGSから「-L/usr/lib/openais -L/usr/lib64/openais -L/usr/lib/corosync -L/usr/lib64/corosync」を削除します。

それから、内容を反映します。

% sh ./config.status


4. でもって、ビルドしてインストールです
色々とウォーニングがですますが、とりあえず気にしないでください。

% gnumake
% sudo gnumake install