From 763f84a6dace6af3d8637d12dd9cd2f6f69b46ab Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Sun, 4 Sep 2011 06:02:25 +0000 Subject: Build with Clang/LLVM when available. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1164964 13f79535-47bb-0310-9956-ffa450edef68 --- sca-cpp/trunk/INSTALL | 87 ++++++++++++---------------- sca-cpp/trunk/configure.ac | 39 +++++++++---- sca-cpp/trunk/kernel/config.hpp | 37 +++++++++--- sca-cpp/trunk/kernel/fstream.hpp | 2 +- sca-cpp/trunk/kernel/gc.hpp | 37 ++++++------ sca-cpp/trunk/kernel/hash.hpp | 2 +- sca-cpp/trunk/kernel/lambda-test.cpp | 6 +- sca-cpp/trunk/macos/macos-install | 8 +-- sca-cpp/trunk/modules/http/httpd.hpp | 10 +--- sca-cpp/trunk/modules/http/mod-ssltunnel.cpp | 12 ++++ 10 files changed, 131 insertions(+), 109 deletions(-) (limited to 'sca-cpp') diff --git a/sca-cpp/trunk/INSTALL b/sca-cpp/trunk/INSTALL index 9c8a9bdbe6..01a72273ae 100644 --- a/sca-cpp/trunk/INSTALL +++ b/sca-cpp/trunk/INSTALL @@ -1,11 +1,11 @@ Apache Tuscany SCA Runtime ========================== -Automated installation on Ubuntu Server 10.10 -============================================= +Automated installation on Ubuntu Server 10.10 and 11.04 +======================================================= -Tuscany provides two automated install scripts for Ubuntu Server 10.10. You can -start with a fresh Ubuntu Server 10.10 system and these scripts will take care +Tuscany provides automated install scripts for Ubuntu Server 10.10 and 11.04. +You can start with a fresh Ubuntu Server system and these scripts will take care of all the download, build and installation steps for you. ubuntu/ubuntu-install: @@ -29,35 +29,19 @@ chmod +x ./ubuntu-install The installation script will display each command as it's executed. That's all you need to do to build and install the Tuscany SCA runtime on -Ubuntu Server 10.10. +Ubuntu Server. Automated installation on Max OS X 10.6.7 ========================================= -Tuscany provides an automated install script for Mac OS X 10.6.7. You can start -with a fresh Mac OS X 10.6.7 system and the script will take care of all the -download, build and installation steps for you. +Tuscany provides an automated install script for Mac OS X 10.6.7 and Xcode 4.1. +You can start with a fresh Mac OS X 10.6.7 + Xcode 4.1 system and the script +will take care of all the download, build and installation steps for you. macos/macos-install: Build and installation of the most commonly used Tuscany features with all dependencies built from source. -The only required system dependency is the GCC C++ compiler 4.4.5+. All other -dependencies are downloaded and built from source in the current directory. - -Before running the automated installation install GCC 4.6 from the HPC for Mac -OS X project (http://hpc.sourceforge.net/) like this: -curl -OL http://prdownloads.sourceforge.net/hpc/gcc-snwleo-intel-bin.tar.gz -sudo tar -xf $build/gcc-snwleo-intel-bin.tar.gz -C / - -or if you prefer to use GCC from Macports (http://www.macports.org/), install -GCC 4.4.5+ like this: -sudo port install gcc44 - -then adjust the following line in macos/macos-install: -./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++ ... -to point to the GCC binaries you've installed. - To run the automated installation: mkdir tuscany cd tuscany @@ -67,15 +51,18 @@ chmod +x ./macos-install The installation script will display each command as it's executed. +The dependencies will be built using the GCC compiler. The Tuscany SCA runtime +will be built using the Apple Clang/LLVM compiler. + That's all you need to do to build and install the Tuscany SCA runtime on Mac -OS X 10.6.7. +OS X. Step by step build and installation =================================== -For manual build and install steps on systems other than Ubuntu 10.10 and -Mac OS X 10.6.7, or if you need to customize your installation, read on... +For manual build and install steps on other systems than Ubuntu Server and Mac +OS X, or if you need to customize your installation, read on... The Tuscany SCA Linux build uses the GNU Autotools tool chain. @@ -221,35 +208,35 @@ in the configure help: ./configure --help -Here's an example configuration tested on Ubuntu 10.10, with the system +Here's an example configuration tested on Ubuntu Server, 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/apr-1.4.x-bin --with-httpd=$HOME/httpd-2.3.10-bin \ ---with-memcached=$HOME/memcached-1.4.7-bin \ ---with-tinycdb=$HOME/tinycdb-0.77-bin \ ---with-curl=$HOME/curl-7.19.5-bin --with-libxml2=/usr \ ---with-js-include=$HOME/js-1.8.5-bin/include \ ---with-js-lib=$HOME/js-1.8.5-bin/lib \ +dependencies installed under $build: + +./configure --prefix=$build/tuscany-sca-cpp-bin \ +--with-apr=$build/apr-1.4.x-bin --with-httpd=$build/httpd-2.3.10-bin \ +--with-memcached=$build/memcached-1.4.7-bin \ +--with-tinycdb=$build/tinycdb-0.77-bin \ +--with-curl=$build/curl-7.19.5-bin --with-libxml2=/usr \ +--with-js-include=$build/js-1.8.5-bin/include \ +--with-js-lib=$build/js-1.8.5-bin/lib \ --enable-libcloud \ ---with-libcloud=$HOME/libcloud-0.3.1-bin \ +--with-libcloud=$build/libcloud-0.3.1-bin \ --enable-threads \ --enable-python --with-python=/usr \ --enable-opencl --with-opencl-include=/usr/include --with-opencl-lib=/usr/lib \ ---enable-gae --with-gae=$HOME/google_appengine \ +--enable-gae --with-gae=$build/google_appengine \ --enable-java --with-java=/usr/lib/jvm/default-java \ ---enable-webservice --with-axis2c=$HOME/axis2c-1.6.0-bin \ ---with-libxml2=$HOME/libxml2-2.7.7-bin \ ---enable-queue --with-qpidc=$HOME/qpidc-0.6-bin \ ---enable-chat --with-libstrophe=$HOME/libstrophe-bin \ ---with-vysper=$HOME/vysper-0.5 \ ---enable-sqldb --with-pgsql=$HOME/postgresql-9.0.3-bin \ ---enable-log --with-thrift=$HOME/thrift-0.2.0-bin \ ---with-scribe=$HOME/scribe-2.2-bin \ ---enable-openid --with-mod-auth-openid=$HOME/mod-auth-openid-bin \ ---enable-oauth --with-liboauth=$HOME/liboauth-0.9.1-bin \ ---enable-mod-security --with-mod-security=$HOME/modsecurity-apache-2.6.0-bin \ +--enable-webservice --with-axis2c=$build/axis2c-1.6.0-bin \ +--with-libxml2=$build/libxml2-2.7.7-bin \ +--enable-queue --with-qpidc=$build/qpidc-0.6-bin \ +--enable-chat --with-libstrophe=$build/libstrophe-bin \ +--with-vysper=$build/vysper-0.5 \ +--enable-sqldb --with-pgsql=$build/postgresql-9.0.3-bin \ +--enable-log --with-thrift=$build/thrift-0.2.0-bin \ +--with-scribe=$build/scribe-2.2-bin \ +--enable-openid --with-mod-auth-openid=$build/mod-auth-openid-bin \ +--enable-oauth --with-liboauth=$build/liboauth-0.9.1-bin \ +--enable-mod-security --with-mod-security=$build/modsecurity-apache-2.6.0-bin \ --enable-maintainer-mode diff --git a/sca-cpp/trunk/configure.ac b/sca-cpp/trunk/configure.ac index eeba8178b1..d0f5a29a9e 100644 --- a/sca-cpp/trunk/configure.ac +++ b/sca-cpp/trunk/configure.ac @@ -27,17 +27,18 @@ AC_PREFIX_DEFAULT(/usr/local/tuscany/sca) # Check for required programs. AC_MSG_NOTICE([checking for programs]) -AC_MSG_CHECKING([for gcc-4.5]) -if test -x "/usr/bin/g++-4.5"; then - # Use GCC 4.5 if available - CXX=/usr/bin/g++-4.5 - CPP=/usr/bin/cpp-4.5 - CC=/usr/bin/gcc-4.5 - AC_MSG_RESULT(/usr/bin/gcc-4.5) - AM_CONDITIONAL([WANT_GCC45], true) - AC_DEFINE([WANT_GCC45], 1, [compile with gcc-4.5]) -else - AM_CONDITIONAL([WANT_GCC45], false) +if test "${CXX}" = ""; then + AC_MSG_CHECKING([for clang++]) + if test -x "/usr/bin/clang++"; then + # Use CLang++/LLVM if available + CXX=/usr/bin/clang++ + CC=/usr/bin/clang + AC_MSG_RESULT(/usr/bin/clang++) + AM_CONDITIONAL([WANT_LLVM], true) + AC_DEFINE([WANT_LLVM], 1, [compile with clang++/llvm]) + else + AM_CONDITIONAL([WANT_LLVM], false) + fi fi AC_PROG_CXX AC_PROG_AWK @@ -49,6 +50,12 @@ AC_PROG_MAKE_SET AC_PROG_LIBTOOL # Initialize default GCC C++ and LD options. +cxxname=`basename ${CXX}` +if test "${cxxname}" = "clang++"; then + cxxtype="clang" +else + cxxtype="gcc" +fi cxxflags="${CXXFLAGS}" ldflags="${LDFLAGS}" defaultlibs="${LIBS}" @@ -107,12 +114,20 @@ AC_ARG_ENABLE(maintainer-mode, [AS_HELP_STRING([--enable-maintainer-mode], [comp esac ], [ AC_MSG_RESULT(no)]) if test "${want_maintainer_mode}" = "true"; then - cxxflags="${cxxflags} -D_DEBUG -O2 -ggdb -g3 -Werror -Wall -Wextra -Wno-ignored-qualifiers -Wno-strict-aliasing -Winit-self -Wmissing-include-dirs -Wcast-qual -Wcast-align -Wwrite-strings -Wpointer-arith -Wconversion -Waddress -Wlogical-op -Wredundant-decls -std=c++0x -fmessage-length=0" + cxxflags="${cxxflags} -D_DEBUG -O2 -ggdb -g3 -Werror -Wall -Wextra -Wno-ignored-qualifiers -Wno-strict-aliasing -Winit-self -Wmissing-include-dirs -Wcast-qual -Wcast-align -Wwrite-strings -Wpointer-arith -Waddress -Wredundant-decls -std=c++0x -fmessage-length=0" + if test "${cxxtype}" = "clang"; then + cxxflags="${cxxflags} -stdlib=libc++" + else + cxxflags="${cxxflags} -Wlogical-op -Wconversion" + fi ldflags="${ldflags} -pg" AM_CONDITIONAL([WANT_MAINTAINER_MODE], true) AC_DEFINE([WANT_MAINTAINER_MODE], 1, [compile with debugging and compile-time warnings]) else cxxflags="${cxxflags} -g -O2 -std=c++0x -fmessage-length=0" + if test "${cxxtype}" = "clang"; then + cxxflags="${cxxflags} -stdlib=libc++" + fi AM_CONDITIONAL([WANT_MAINTAINER_MODE], false) fi diff --git a/sca-cpp/trunk/kernel/config.hpp b/sca-cpp/trunk/kernel/config.hpp index f700829fa5..5b447e116b 100644 --- a/sca-cpp/trunk/kernel/config.hpp +++ b/sca-cpp/trunk/kernel/config.hpp @@ -34,10 +34,36 @@ /** * Platform configuration and debug functions. */ - namespace tuscany { +/** + * Attribute used to mark unused parameters. + */ +#ifndef unused +#define unused __attribute__ ((unused)) +#endif + +/** + * Compiler feature detection. + */ +#ifdef __clang__ + +#if __has_feature(cxx_lambdas) +#define HAS_CXX0X_LAMBDAS 1 +#endif + +#else + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4) +#define HAS_CXX0X_LAMBDAS 1 +#endif + +#endif + +/** + * Debug utilities. + */ #ifdef WANT_MAINTAINER_MODE /** @@ -46,7 +72,7 @@ namespace tuscany //#define WANT_MAINTAINER_WATCH /** - * Increment / decrement a debug counter. + * Increment/decrement a debug counter. */ bool debug_inc(long int& c) { c++; @@ -65,12 +91,5 @@ bool debug_dec(long int& c) { #endif -/** - * Attribute used to mark unused parameters. - */ -#ifndef unused -#define unused __attribute__ ((unused)) -#endif - } #endif /* tuscany_config_hpp */ diff --git a/sca-cpp/trunk/kernel/fstream.hpp b/sca-cpp/trunk/kernel/fstream.hpp index d57de2d76a..6888e7d14d 100644 --- a/sca-cpp/trunk/kernel/fstream.hpp +++ b/sca-cpp/trunk/kernel/fstream.hpp @@ -164,7 +164,7 @@ public: logfstream(FILE* file, const string& type) : file(file), type(type), owner(false), head(false) { } - logfstream(const logfstream& os) : file(os.file), type(type), owner(false), head(os.head) { + logfstream(const logfstream& os) : file(os.file), type(os.type), owner(false), head(os.head) { } ~logfstream() { diff --git a/sca-cpp/trunk/kernel/gc.hpp b/sca-cpp/trunk/kernel/gc.hpp index 30cc637388..28ca80edc9 100644 --- a/sca-cpp/trunk/kernel/gc.hpp +++ b/sca-cpp/trunk/kernel/gc.hpp @@ -47,7 +47,7 @@ namespace tuscany */ bool assertOrFail(const bool expr) { if (!expr) - *(char*)NULL = '\0'; + abort(); return true; } @@ -183,7 +183,8 @@ public: class gc_pool_stack_t { public: gc_pool_stack_t() { - pthread_key_create(&key, NULL); + int rc = pthread_key_create(&key, NULL); + assertOrFail(rc == 0); } operator apr_pool_t*() const { @@ -203,21 +204,6 @@ private: apr_pool_t* gc_pool_stack = NULL; #endif -/** - * Return the current memory pool. - */ -apr_pool_t* gc_current_pool() { - apr_pool_t* apr_pool = gc_pool_stack; - if (apr_pool != NULL) - return apr_pool; - - // Create a parent pool for the current thread - apr_pool_create(&apr_pool, NULL); - assertOrFail(apr_pool != NULL); - gc_pool_stack = apr_pool; - return apr_pool; -} - /** * Push a pool onto the stack. */ @@ -236,6 +222,21 @@ apr_pool_t* gc_pop_pool(apr_pool_t* pool) { return p; } +/** + * Return the current memory pool. + */ +apr_pool_t* gc_current_pool() { + apr_pool_t* p = gc_pool_stack; + if (p != NULL) + return p; + + // Create a parent pool for the current thread + apr_pool_create(&p, NULL); + assertOrFail(p != NULL); + gc_push_pool(p); + return p; +} + /** * A memory pool scope, used to setup a scope in which a particular pool * will be used for all allocations. @@ -302,7 +303,7 @@ template apr_status_t gc_pool_acleanup(void* v) { } template T* gc_anew(apr_pool_t* p, size_t n) { - size_t* gc_anew_ptr = static_cast(apr_palloc(p, sizeof(size_t) + sizeof(T[n]))); + size_t* gc_anew_ptr = static_cast(apr_palloc(p, sizeof(size_t) + sizeof(T) * n)); assertOrFail(gc_anew_ptr != NULL); *gc_anew_ptr = n; apr_pool_cleanup_register(p, gc_anew_ptr, gc_pool_acleanup, apr_pool_cleanup_null) ; diff --git a/sca-cpp/trunk/kernel/hash.hpp b/sca-cpp/trunk/kernel/hash.hpp index 9de13dd690..993511e3c2 100644 --- a/sca-cpp/trunk/kernel/hash.hpp +++ b/sca-cpp/trunk/kernel/hash.hpp @@ -122,7 +122,7 @@ const unsigned int murmurhash(const char* key, const size_t klen) { // Mix 4 bytes at a time into the hash const unsigned char* data = (const unsigned char*)key; while(len >= 4) { - unsigned int k = *(unsigned int*)data; + unsigned int k = *(unsigned int*)(void*)data; k *= m; k ^= k >> r; k *= m; diff --git a/sca-cpp/trunk/kernel/lambda-test.cpp b/sca-cpp/trunk/kernel/lambda-test.cpp index a72f01fb43..e17cf57e67 100644 --- a/sca-cpp/trunk/kernel/lambda-test.cpp +++ b/sca-cpp/trunk/kernel/lambda-test.cpp @@ -31,7 +31,7 @@ namespace tuscany { -#ifdef WANT_GCC45 +#ifdef HAS_CXX0X_LAMBDAS const lambda inc(const int i) { return [=](const int x)->const int { @@ -89,11 +89,11 @@ bool testCppPerf() { int main() { tuscany::cout << "Testing..." << tuscany::endl; -#ifdef WANT_GCC45 +#ifdef HAS_CXX0X_LAMBDAS tuscany::testLambda(); tuscany::testCppPerf(); #else - tuscany::cout << "Skipped GCC 4.5 tests" << tuscany::endl; + tuscany::cout << "Skipped C++0x lambda tests" << tuscany::endl; #endif tuscany::cout << "OK" << tuscany::endl; diff --git a/sca-cpp/trunk/macos/macos-install b/sca-cpp/trunk/macos/macos-install index 14804e39e8..9e981d0884 100755 --- a/sca-cpp/trunk/macos/macos-install +++ b/sca-cpp/trunk/macos/macos-install @@ -25,12 +25,6 @@ set -x # Build and install in the current directory build=`pwd` -# Install core dev tools missing on MacOS - -# Install and use GCC 4.6, required for c++0x -#curl -OL http://prdownloads.sourceforge.net/hpc/gcc-snwleo-intel-bin.tar.gz -#sudo tar -xf $build/gcc-snwleo-intel-bin.tar.gz -C / - # Install pkg-config curl -OL http://pkgconfig.freedesktop.org/releases/pkg-config-0.25.tar.gz tar xzf pkg-config-0.25.tar.gz @@ -285,7 +279,7 @@ cd $build git clone git://git.apache.org/tuscany-sca-cpp.git cd tuscany-sca-cpp ./bootstrap -./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++ --prefix=$build/tuscany-sca-cpp-bin --with-curl=$build/curl-7.19.5-bin --with-apr=$build/apr-1.4.x-bin --with-httpd=$build/httpd-2.3.10-bin --with-memcached=$build/memcached-1.4.7-bin --with-tinycdb=$build/tinycdb-bin --with-js-include=$build/js-1.8.5-bin/include/js --with-js-lib=$build/js-1.8.5-bin/lib --with-libcloud=$build/libcloud-0.4.2-bin --enable-threads --enable-python --enable-opencl --with-libxml2=$build/libxml2-2.7.7-bin --enable-chat --with-libstrophe=$build/libstrophe-bin --enable-openid --with-mod-auth-openid=$build/mod-auth-openid-bin --enable-oauth --with-liboauth=$build/liboauth-0.9.1-bin --enable-mod-security --with-mod-security=$build/modsecurity-apache-2.6.0-bin +./configure --prefix=$build/tuscany-sca-cpp-bin --with-curl=$build/curl-7.19.5-bin --with-apr=$build/apr-1.4.x-bin --with-httpd=$build/httpd-2.3.10-bin --with-memcached=$build/memcached-1.4.7-bin --with-tinycdb=$build/tinycdb-bin --with-js-include=$build/js-1.8.5-bin/include/js --with-js-lib=$build/js-1.8.5-bin/lib --with-libcloud=$build/libcloud-0.4.2-bin --enable-threads --enable-python --enable-opencl --with-libxml2=$build/libxml2-2.7.7-bin --enable-chat --with-libstrophe=$build/libstrophe-bin --enable-openid --with-mod-auth-openid=$build/mod-auth-openid-bin --enable-oauth --with-liboauth=$build/liboauth-0.9.1-bin --enable-mod-security --with-mod-security=$build/modsecurity-apache-2.6.0-bin make make install if [ "$?" != "0" ]; then diff --git a/sca-cpp/trunk/modules/http/httpd.hpp b/sca-cpp/trunk/modules/http/httpd.hpp index 9440fe343e..3a651fa496 100644 --- a/sca-cpp/trunk/modules/http/httpd.hpp +++ b/sca-cpp/trunk/modules/http/httpd.hpp @@ -34,6 +34,8 @@ #include #include +// Hack to workaround compile error with CLang/LLVM +#undef strtoul // Hack to workaround compile error with HTTPD 2.3.8 #define new new_ #include @@ -427,10 +429,6 @@ const bool redirectFilters(ap_filter_t* f, request_rec* from, request_rec* to) { * Create an HTTPD internal redirect request. * Similar to httpd/modules/http/http_request.c::internal_internal_redirect. */ -extern "C" { - AP_DECLARE(ap_conf_vector_t*) ap_create_request_config(apr_pool_t *p); -} - const failable internalRedirectRequest(const string& nr_uri, request_rec* r) { if (ap_is_recursion_limit_exceeded(r)) return mkfailure(HTTP_INTERNAL_SERVER_ERROR); @@ -498,10 +496,6 @@ const failable internalRedirectRequest(const string& nr_uri, * Process an HTTPD internal redirect request. * Similar to httpd/modules/http/http_request.c::ap_internal_redirect. */ -extern "C" { - AP_DECLARE(int) ap_invoke_handler(request_rec *r); -} - const int internalRedirect(request_rec* nr) { int status = ap_run_quick_handler(nr, 0); if (status == DECLINED) { diff --git a/sca-cpp/trunk/modules/http/mod-ssltunnel.cpp b/sca-cpp/trunk/modules/http/mod-ssltunnel.cpp index 0fd347c469..521b86626d 100644 --- a/sca-cpp/trunk/modules/http/mod-ssltunnel.cpp +++ b/sca-cpp/trunk/modules/http/mod-ssltunnel.cpp @@ -34,6 +34,11 @@ #include "httpd.hpp" #include "http.hpp" +// Ignore cast align warnings in APR macros +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wcast-align" +#endif + extern "C" { extern module AP_MODULE_DECLARE_DATA mod_tuscany_ssltunnel; } @@ -212,6 +217,7 @@ int tunnel(conn_rec* conn, const string& ca, const string& cert, const string& k if (rl == 0) return close(conn, csock); + // Send bucket to client debug(string(data, rl), "modssltunnel::tunnel::sendToClient"); APR_BRIGADE_INSERT_TAIL(ob, apr_bucket_transient_create(data, rl, conn->bucket_alloc)); @@ -364,3 +370,9 @@ module AP_MODULE_DECLARE_DATA mod_tuscany_ssltunnel = { }; } + +// Reenable cast align warnings +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic warning "-Wcast-align" +#endif + -- cgit v1.2.3