必要なものが揃ったので、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