diff --git a/sca-cpp/trunk/INSTALL b/sca-cpp/trunk/INSTALL index aaad7a0b30..d6e5229683 100644 --- a/sca-cpp/trunk/INSTALL +++ b/sca-cpp/trunk/INSTALL @@ -14,32 +14,44 @@ libtool-2.2.6 doxygen-1.6.1 Install the following binaries: -curl-7.19.5 -memcached-1.2.8 +curl-7.19.5 (http://curl.haxx.se) +memcached-1.2.8 (http://memcached.org/) Then install the following development dependencies: -HTTP server and APR -httpd-2.2-13 -libapr-1-0.3.8 +Apache HTTP server and APR: +httpd-2.2-13 (http://httpd.apache.org/) +libapr-1-0.3.8 (http://apr.apache.org/) libaprutil-1-0.3.9 -XML -libxml2-2.7.5 +XML: +libxml2-2.7.5 (http://xmlsoft.org/) -CURL -libcurl4-7.19.5 +CURL: +libcurl4-7.19.5 (http://curl.haxx.se) -JSON -SpiderMonkey libmozjs -(included in xulrunner-1.9.1.7) +JSON: +Mozilla SpiderMonkey libmozjs (http://www.mozilla.org/js/spidermonkey/) +included in xulrunner-1.9.1.7 Optional dependencies: -Axis2/C 1.6.0 -Python 2.6 -a Java 6 SDK +Web Services: +Apache Axis2/C 1.6.0 (http://ws.apache.org/axis2/c/) + +Queueing: +Apache Qpid/C++ 0.6 (http://qpid.apache.org/) + +Python: +Python 2.6 (http://www.python.org/) + +Java: +a Java 5+ JDK (http://openjdk.java.net/, http://harmony.apache.org/) + +XMPP Chat: +Libstrophe (http://code.stanziq.com/cgit/strophe/libstrophe/) +build it from source at git://code.stanziq.com//libstrophe To configure the Tuscany SCA build do this: @@ -61,9 +73,15 @@ To enable support for Python component implementations: To enable support for Java component implementations: --enable-java -To build the Web service utility component (using Axis2C): +To build the Web service utility component (requires Apache Axis2/C): --enable-webservice +To build the Queue utility component (requires Apache Qpid/C++): +--enable-queue + +To build the Chat utility component (requires Libstrophe): +--enable-chat + To generate doxygen documentation, add: --enable-doxygen @@ -72,18 +90,20 @@ in the configure help: ./configure --help -Here's an example configuration, tested on Ubuntu 9.10, with development -dependencies installed in the standard directories and HTTPD and Axis2C -installed under $HOME: +Here's an example configuration, tested on Ubuntu 9.10, with the system +dependencies installed in the standard system directories and some of the +dependencies installed under $HOME: ./configure --prefix=$HOME/tuscany-sca-cpp-bin \ --with-apr=$HOME/httpd-2.2.13-bin --with-httpd=$HOME/httpd-2.2.13-bin \ ---with-curl=/usr --with-libxml2=/usr \ +--with-libcurl=/usr --with-libxml2=/usr \ --with-js-include=/usr/include/xulrunner-1.9.1.7/unstable \ --with-js-lib=/usr/lib/xulrunner-1.9.1.7 \ --enable-python --with-python=/usr \ --enable-java --with-java=/usr/lib/jvm/default-java \ --enable-webservice --with-axis2c=$HOME/axis2c-1.6.0-bin \ +--enable-queue --with-qpidc=$HOME/qpidc-0.6-bin \ +--enable-chat --with-libstrophe=$HOME/libstrophe \ --enable-maintainer-mode @@ -113,17 +133,35 @@ make install Building dependencies from source ================================= -Here are example build and install steps for HTTPD (including APR) and Axis2/C: +Here are example build and install steps for some of the dependencies. +Apache HTTPD, including APR: ./configure --enable-ssl --enable-proxy --enable-rewrite --with-included-apr \ --with-mpm=prefork --prefix=$HOME/httpd-2.2.13-bin make make install export PATH=$HOME/httpd-2-2.13-bin/bin:$PATH +Apache Axis2/C: ./configure --enable-libxml2 --enable-openssl --enable-libcurl \ --with-apache2=$HOME/httpd-2.2.13-bin/include --prefix=$HOME/axis2c-1.6.0-bin make make install export AXIS2C_HOME=$HOME/axis2c-1.6.0-bin +Apache Qpid/C++: +./configure --prefix=$HOME/qpidc-0.6-bin +make +make install + +Libstrophe: +git clone git://code.stanziq.com/libstrophe +cd libstrophe +git submodule init +git submodule update +aclocal +automake --add-missing --foreign --copy +autoconf +./configure +make + diff --git a/sca-cpp/trunk/README b/sca-cpp/trunk/README index 7869d70b09..5a5b884efe 100644 --- a/sca-cpp/trunk/README +++ b/sca-cpp/trunk/README @@ -37,15 +37,14 @@ Here's a rough guide to the Tuscany SCA source tree: | | |-- python Support for Python components | | |-- scheme Support for Scheme components | | |-- server Apache HTTPD server integration - | | |-- xmpp XMPP protocol support | | | |-- components Useful SCA components - | | |-- cache Key/value cache (requires Memcached) + | | |-- cache Key/value cache | | |-- chat XMPP chat | | |-- log Logger - | | |-- queue AMQP message queue (requires Apache Qpid/C++) + | | |-- queue AMQP message queue | | |-- store Persistent store - | | |-- webservice Web service gateway (requires Apache Axis2/C) + | | |-- webservice Web service gateway | | | |-- test Integration tests | | diff --git a/sca-cpp/trunk/components/chat/Makefile.am b/sca-cpp/trunk/components/chat/Makefile.am index 09cb5fa26a..ea63a475e2 100644 --- a/sca-cpp/trunk/components/chat/Makefile.am +++ b/sca-cpp/trunk/components/chat/Makefile.am @@ -15,6 +15,17 @@ # specific language governing permissions and limitations # under the License. -if WANT_STORE +if WANT_CHAT + +INCLUDES = -I${LIBSTROPHE_INCLUDE} + +compdir=$(prefix)/components/chat +comp_LTLIBRARIES = libchat-sender.la libchat-listener.la + +libchat_sender_la_SOURCES = chat-sender.cpp +libchat_sender_la_LDFLAGS = -L${LIBSTROPHE_LIB} -R${LIBSTROPHE_LIB} -lstrophe -lexpat -lssl -lresolv + +libchat_listener_la_SOURCES = chat-listener.cpp +libchat_listener_la_LDFLAGS = -L${LIBSTROPHE_LIB} -R${LIBSTROPHE_LIB} -lstrophe -lexpat -lssl -lresolv endif diff --git a/sca-cpp/trunk/components/chat/chat-listener.cpp b/sca-cpp/trunk/components/chat/chat-listener.cpp new file mode 100644 index 0000000000..57642036a6 --- /dev/null +++ b/sca-cpp/trunk/components/chat/chat-listener.cpp @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +/** + * XMPP chat listener component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "xmpp.hpp" + +namespace tuscany { +namespace chat { + +/** + * Initialize the component. + */ +const failable<value> init(unused const list<value>& params) { + //TODO establish a session with an XMPP server for a JID and mark the current server instance busy + + return value(true); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "init") + return tuscany::chat::init(cdr(params)); + return tuscany::mkfailure<tuscany::value>(tuscany::string("Function not supported: ") + func); +} + +} diff --git a/sca-cpp/trunk/components/chat/chat-sender.cpp b/sca-cpp/trunk/components/chat/chat-sender.cpp new file mode 100644 index 0000000000..dfcae6796a --- /dev/null +++ b/sca-cpp/trunk/components/chat/chat-sender.cpp @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +/** + * XMPP chat sender component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "xmpp.hpp" + +namespace tuscany { +namespace chat { + +/** + * Post an item to an XMPP JID. + */ +const failable<value> post(unused const list<value>& params) { + + //TODO post the item + + return value(true); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "post") + return tuscany::chat::post(cdr(params)); + return tuscany::mkfailure<tuscany::value>(tuscany::string("Function not supported: ") + func); +} + +} diff --git a/sca-cpp/trunk/components/chat/chat.composite b/sca-cpp/trunk/components/chat/chat.composite index 8b797bf75b..2c19e2d0de 100644 --- a/sca-cpp/trunk/components/chat/chat.composite +++ b/sca-cpp/trunk/components/chat/chat.composite @@ -22,11 +22,24 @@ targetNamespace="http://tuscany.apache.org/xmlns/sca/components" name="chat"> - <component name="chat"> - <implementation.cpp path=".libs" library="libchat"/> + <component name="chat-sender"> + <implementation.cpp path=".libs" library="libchat-sender"/> <property name="jid">sample@apache.org</property> - <service name="chat"> - <t:binding.http uri="chat"/> + <service name="chat-sender"> + <t:binding.http uri="print-sender"/> + </service> + </component> + + <component name="chat-listener"> + <implementation.cpp path=".libs" library="libchat-listener"/> + <property name="jid">sample@apache.org</property> + <reference name="relay" target="print"/> + </component> + + <component name="print"> + <t:implementation.scheme script="server-test.scm"/> + <service name="print"> + <t:binding.http uri="print"/> </service> </component> diff --git a/sca-cpp/trunk/components/chat/server-test.scm b/sca-cpp/trunk/components/chat/server-test.scm new file mode 100644 index 0000000000..5fabe5aa17 --- /dev/null +++ b/sca-cpp/trunk/components/chat/server-test.scm @@ -0,0 +1,3 @@ +; Chat test case + +(define (print x) (display x)) diff --git a/sca-cpp/trunk/components/chat/xmpp.hpp b/sca-cpp/trunk/components/chat/xmpp.hpp new file mode 100644 index 0000000000..b9508f0a53 --- /dev/null +++ b/sca-cpp/trunk/components/chat/xmpp.hpp @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_queue_hpp +#define tuscany_queue_hpp + +/** + * XMPP support functions. + */ + +#include "strophe.h" + +namespace tuscany { +namespace chat { + +} +} + +#endif /* tuscany_xmpp_hpp */ diff --git a/sca-cpp/trunk/components/queue/Makefile.am b/sca-cpp/trunk/components/queue/Makefile.am index b2a9b3819e..cee3ce7820 100644 --- a/sca-cpp/trunk/components/queue/Makefile.am +++ b/sca-cpp/trunk/components/queue/Makefile.am @@ -17,4 +17,15 @@ if WANT_QUEUE +INCLUDES = -I${QPIDC_INCLUDE} + +compdir=$(prefix)/components/queue +comp_LTLIBRARIES = libqueue-sender.la libqueue-listener.la + +libqueue_sender_la_SOURCES = queue-sender.cpp +libqueue_sender_la_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient + +libqueue_listener_la_SOURCES = queue-listener.cpp +libqueue_listener_la_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient + endif diff --git a/sca-cpp/trunk/components/queue/qpid.hpp b/sca-cpp/trunk/components/queue/qpid.hpp new file mode 100644 index 0000000000..e6be319be0 --- /dev/null +++ b/sca-cpp/trunk/components/queue/qpid.hpp @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_queue_hpp +#define tuscany_queue_hpp + +/** + * AMQP queue access functions. + */ + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +#include <qpid/client/Connection.h> +#include <qpid/client/Session.h> + +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../../modules/scheme/eval.hpp" + +namespace tuscany { +namespace queue { + +/** + * Represents a Qpid connection. + */ +class QpidConnection { +public: + QpidConnection() : owner(true) { + c.open("localhost", 5672); + } + + QpidConnection(const QpidConnection& qc) : owner(false), c(qc.c) { + } + + ~QpidConnection() { + if (!owner) + return; + c.close(); + } + +private: + friend class QpidSession; + + const bool owner; + qpid::client::Connection c; + +}; + +/** + * Represents a Qpid session. + */ +class QpidSession { +public: + QpidSession(QpidConnection& qc) : owner(true), s(qc.c.newSession()) { + } + + QpidSession(const QpidSession& qs) : owner(false), s(qs.s) { + } + + ~QpidSession() { + if (!owner) + return; + s.close(); + } + +private: + friend qpid::client::Session session(const QpidSession& qs); + + const bool owner; + qpid::client::Session s; +}; + +qpid::client::Session session(const QpidSession& qs) { + return qs.s; +} + +/** + * Declare a key / AMQP queue pair. + */ +const failable<bool> declareQueue(const string& key, const string& name, QpidSession& qs) { + session(qs).queueDeclare(qpid::client::arg::queue=c_str(name)); + session(qs).exchangeBind(qpid::client::arg::exchange="amq.direct", qpid::client::arg::queue=c_str(name), qpid::client::arg::bindingKey=c_str(key)); + return true; +} + +/** + * Post a key / value pair in message to an AMQP broker. + */ +const failable<bool> post(const string& key, const value& val, QpidSession& qs) { + + // Convert the value to a string + const string vs(scheme::writeValue(val)); + + // Send in a message with the given key. + qpid::client::Message message; + message.getDeliveryProperties().setRoutingKey(c_str(key)); + message.setData(c_str(vs)); + session(qs).messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="amq.direct"); + return true; +} + +} +} + +// Re-enable conversion and redundant declarations warnings +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic warning "-Wconversion" +#pragma GCC diagnostic warning "-Wredundant-decls" +#endif + +#endif /* tuscany_qpid_hpp */ diff --git a/sca-cpp/trunk/components/queue/queue-listener.cpp b/sca-cpp/trunk/components/queue/queue-listener.cpp new file mode 100644 index 0000000000..6f1c54873c --- /dev/null +++ b/sca-cpp/trunk/components/queue/queue-listener.cpp @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +/** + * AMQP queue listener component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "qpid.hpp" + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +namespace tuscany { +namespace queue { + +QpidConnection qc; + +/** + * Initialize the component. + */ +const failable<value> init(const list<value>& params) { + QpidSession qs(qc); + + // Declare the configured AMQP key / queue pair + const value key = ((lambda<value(list<value>)>)caddr(params))(list<value>()); + const value qname = ((lambda<value(list<value>)>)cadddr(params))(list<value>()); + declareQueue(key, qname, qs); + + //TODO create a subscription and mark the current server instance busy + + return value(true); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "init") + return tuscany::queue::init(cdr(params)); + return tuscany::mkfailure<tuscany::value>(tuscany::string("Function not supported: ") + func); +} + +} diff --git a/sca-cpp/trunk/components/queue/queue-sender.cpp b/sca-cpp/trunk/components/queue/queue-sender.cpp new file mode 100644 index 0000000000..fbbbd0376b --- /dev/null +++ b/sca-cpp/trunk/components/queue/queue-sender.cpp @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +/** + * AMQP queue sender component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "qpid.hpp" + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +namespace tuscany { +namespace queue { + +QpidConnection qc; + +/** + * Post an item to a queue. + */ +const failable<value> post(const list<value>& params) { + QpidSession qs(qc); + + // Post the item + const value key = ((lambda<value(list<value>)>)cadr(params))(list<value>()); + post(key, car(params), qs); + + return value(true); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "post") + return tuscany::queue::post(cdr(params)); + return tuscany::mkfailure<tuscany::value>(tuscany::string("Function not supported: ") + func); +} + +} diff --git a/sca-cpp/trunk/components/queue/queue.composite b/sca-cpp/trunk/components/queue/queue.composite index c60427dcc5..b908481bad 100644 --- a/sca-cpp/trunk/components/queue/queue.composite +++ b/sca-cpp/trunk/components/queue/queue.composite @@ -24,7 +24,7 @@ <component name="queue-sender"> <implementation.cpp path=".libs" library="libqueue-sender"/> - <property name="uri">amqp://localhost:5672/print</property> + <property name="key">print</property> <service name="queue-sender"> <t:binding.http uri="print-sender"/> </service> @@ -32,12 +32,13 @@ <component name="queue-listener"> <implementation.cpp path=".libs" library="libqueue-listener"/> - <property name="uri">amqp://localhost:5672/print</property> + <property name="key">print</property> + <property name="queue">printq</property> <reference name="relay" target="print"/> </component> <component name="print"> - <t:implementation.scheme script="print.scm"/> + <t:implementation.scheme script="server-test.scm"/> <service name="print"> <t:binding.http uri="print"/> </service> diff --git a/sca-cpp/trunk/components/queue/server-test.scm b/sca-cpp/trunk/components/queue/server-test.scm new file mode 100644 index 0000000000..77b7fc9c51 --- /dev/null +++ b/sca-cpp/trunk/components/queue/server-test.scm @@ -0,0 +1,3 @@ +; Queue test case + +(define (print x) (display x)) diff --git a/sca-cpp/trunk/configure.ac b/sca-cpp/trunk/configure.ac index 4dacb6e002..26864d80c2 100644 --- a/sca-cpp/trunk/configure.ac +++ b/sca-cpp/trunk/configure.ac @@ -54,19 +54,19 @@ else AM_CONDITIONAL([DARWIN], false) fi -# Configure path to CURL includes and lib. -AC_MSG_CHECKING([for curl]) -AC_ARG_WITH([curl], [AC_HELP_STRING([--with-curl=PATH], [path to installed curl [default=/usr]])], [ - CURL_INCLUDE="${withval}/include" - CURL_LIB="${withval}/lib" +# Configure path to LIBCURL includes and lib. +AC_MSG_CHECKING([for libcurl]) +AC_ARG_WITH([libcurl], [AC_HELP_STRING([--with-libcurl=PATH], [path to installed libcurl [default=/usr]])], [ + LIBCURL_INCLUDE="${withval}/include" + LIBCURL_LIB="${withval}/lib" AC_MSG_RESULT("${withval}") ], [ - CURL_INCLUDE="/usr/include" - CURL_LIB="/usr/lib" + LIBCURL_INCLUDE="/usr/include" + LIBCURL_LIB="/usr/lib" AC_MSG_RESULT(/usr) ]) -AC_SUBST(CURL_INCLUDE) -AC_SUBST(CURL_LIB) +AC_SUBST(LIBCURL_INCLUDE) +AC_SUBST(LIBCURL_LIB) # Configure path to libxml2 includes and lib. AC_MSG_CHECKING([for libxml2]) @@ -103,9 +103,9 @@ AC_ARG_WITH([js-lib], [AC_HELP_STRING([--with-js-lib=PATH], [path to installed S AC_SUBST(JS_INCLUDE) AC_SUBST(JS_LIB) -# Configure path to APR and HTTPD includes and libs. +# Configure path to Apache APR and HTTPD includes and libs. AC_MSG_CHECKING([for apr]) -AC_ARG_WITH([apr], [AC_HELP_STRING([--with-apr=PATH], [path to installed APR [default=/usr/local/apache2]])], [ +AC_ARG_WITH([apr], [AC_HELP_STRING([--with-apr=PATH], [path to installed Apache APR [default=/usr/local/apache2]])], [ APR_INCLUDE="${withval}/include" APR_LIB="${withval}/lib" AC_MSG_RESULT("${withval}") @@ -118,7 +118,7 @@ AC_SUBST(APR_INCLUDE) AC_SUBST(APR_LIB) AC_MSG_CHECKING([for httpd]) -AC_ARG_WITH([httpd], [AC_HELP_STRING([--with-httpd=PATH], [path to installed HTTPD [default=/usr/local/apache2]])], [ +AC_ARG_WITH([httpd], [AC_HELP_STRING([--with-httpd=PATH], [path to installed Apache HTTPD [default=/usr/local/apache2]])], [ HTTPD_INCLUDE="${withval}/include" AC_MSG_RESULT("${withval}") ], [ @@ -140,7 +140,7 @@ ldflags="${LDFLAGS}" defaultlibs="${LIBS}" # Configure default includes. -cxxflags="${cxxflags} ${INCLUDES} -I. -I${TUSCANY_SCACPP}/kernel -I${APR_INCLUDE} -I${LIBXML2_INCLUDE} -I${JS_INCLUDE} -I${CURL_INCLUDE}" +cxxflags="${cxxflags} ${INCLUDES} -I. -I${TUSCANY_SCACPP}/kernel -I${APR_INCLUDE} -I${LIBXML2_INCLUDE} -I${JS_INCLUDE} -I${LIBCURL_INCLUDE}" # Check for libraries required by all modules and add them to LD options. AC_MSG_NOTICE([checking for required libraries]) @@ -149,13 +149,13 @@ AC_CHECK_LIB([apr-1], [apr_pool_initialize], [AC_MSG_NOTICE([found])], [AC_MSG_E ldflags="${ldflags} -L${APR_LIB} -R${APR_LIB} -lapr-1 -laprutil-1" # Check for libraries only required by some modules and add their search path to LD options. -LIBS="-L${CURL_LIB} ${defaultlibs}" -AC_CHECK_LIB([curl], [curl_global_init], [], [AC_MSG_ERROR([couldn't find a suitable libcurl, use --with-curl=PATH])]) +LIBS="-L${LIBCURL_LIB} ${defaultlibs}" +AC_CHECK_LIB([curl], [curl_global_init], [], [AC_MSG_ERROR([couldn't find a suitable libcurl, use --with-libcurl=PATH])]) LIBS="-L${JS_LIB} ${defaultlibs}" AC_CHECK_LIB([mozjs], [JS_NewContext], [], [AC_MSG_ERROR([couldn't find a suitable libmozjs, use --with-js-lib=PATH])]) LIBS="-L${LIBXML2_LIB} ${defaultlibs}" AC_CHECK_LIB([xml2], [xmlInitParser], [], [AC_MSG_ERROR([couldn't find a suitable libxml2, use --with-libxml2=PATH])]) -ldflags="${ldflags} -L${CURL_LIB} -R${CURL_LIB} -L${JS_LIB} -R${JS_LIB} -L${LIBXML2_LIB} -R${LIBXML2_LIB}" +ldflags="${ldflags} -L${LIBCURL_LIB} -R${LIBCURL_LIB} -L${JS_LIB} -R${JS_LIB} -L${LIBXML2_LIB} -R${LIBXML2_LIB}" # Check for required header files. AC_MSG_NOTICE([checking for header files]) @@ -345,9 +345,9 @@ else AM_CONDITIONAL([WANT_JAVA], false) fi -# Configure path to Axis2C includes and lib. +# Configure path to Apache Axis2C includes and lib. AC_MSG_CHECKING([for axis2c]) -AC_ARG_WITH([axis2c], [AC_HELP_STRING([--with-axis2c=PATH], [path to installed Axis2C [default=/usr/local/axis2c]])], [ +AC_ARG_WITH([axis2c], [AC_HELP_STRING([--with-axis2c=PATH], [path to installed Apache Axis2C [default=/usr/local/axis2c]])], [ AXIS2C_INCLUDE="${withval}/include/axis2-1.6.0" AXIS2C_LIB="${withval}/lib" AC_MSG_RESULT("${withval}") @@ -401,6 +401,20 @@ else AM_CONDITIONAL([WANT_STORE], false) fi +# Configure path to Apache Qpid/C++ includes and lib. +AC_MSG_CHECKING([for qpidc]) +AC_ARG_WITH([qpidc], [AC_HELP_STRING([--with-qpidc=PATH], [path to installed Apache Qpid/C++ [default=/usr/local]])], [ + QPIDC_INCLUDE="${withval}/include" + QPIDC_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + QPIDC_INCLUDE="/usr/local/include" + QPIDC_LIB="/usr/local/lib" + AC_MSG_RESULT(/usr/local) +]) +AC_SUBST(QPIDC_INCLUDE) +AC_SUBST(QPIDC_LIB) + # Enable Queue component. AC_MSG_CHECKING([whether to enable the Queue component]) AC_ARG_ENABLE(queue, [AS_HELP_STRING([--enable-queue], [enable Queue component [default=no]])], @@ -415,12 +429,28 @@ AC_ARG_ENABLE(queue, [AS_HELP_STRING([--enable-queue], [enable Queue component [ esac ], [ AC_MSG_RESULT(no)]) if test "${want_queue}" = "true"; then + LIBS="-L${QPIDC_LIB} ${default_LIBS}" + #AC_CHECK_LIB([qpidclient], [], [], [AC_MSG_ERROR([couldn't find a suitable libqpidclient, use --with-qpidc=PATH])]) AM_CONDITIONAL([WANT_QUEUE], true) AC_DEFINE([WANT_QUEUE], 1, [enable Queue component]) else AM_CONDITIONAL([WANT_QUEUE], false) fi +# Configure path to Libstrophe includes and lib. +AC_MSG_CHECKING([for libstrophe]) +AC_ARG_WITH([libstrophe], [AC_HELP_STRING([--with-libstrophe=PATH], [path to libstrophe source build [default=${HOME}/libstrophe]])], [ + LIBSTROPHE_INCLUDE="${withval}" + LIBSTROPHE_LIB="${withval}" + AC_MSG_RESULT("${withval}") +], [ + LIBSTROPHE_INCLUDE="${HOME}/libstrophe" + LIBSTROPHE_LIB="${HOME}/libstrophe" + AC_MSG_RESULT(${HOME}/libstrophe) +]) +AC_SUBST(LIBSTROPHE_INCLUDE) +AC_SUBST(LIBSTROPHE_LIB) + # Enable Chat component. AC_MSG_CHECKING([whether to enable the Chat component]) AC_ARG_ENABLE(chat, [AS_HELP_STRING([--enable-chat], [enable Chat component [default=no]])], @@ -435,6 +465,8 @@ AC_ARG_ENABLE(chat, [AS_HELP_STRING([--enable-chat], [enable Chat component [def esac ], [ AC_MSG_RESULT(no)]) if test "${want_chat}" = "true"; then + LIBS="-L${LIBSTROPHE_LIB} ${default_LIBS}" + AC_CHECK_LIB([strophe], [xmpp_initialize], [], [AC_MSG_ERROR([couldn't find a suitable libstrophe, use --with-libstrophe=PATH])], [-lexpat -lssl -lresolv]) AM_CONDITIONAL([WANT_CHAT], true) AC_DEFINE([WANT_CHAT], 1, [enable Chat component]) else