diff options
author | Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> | 2013-03-14 18:47:39 +0100 |
---|---|---|
committer | Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> | 2013-03-14 18:49:18 +0100 |
commit | f12e88a590985ef253745f68238f0d0d1bc73f6a (patch) | |
tree | a66da7826fea80049ab4c7ac308126c03a35c3a4 /meta-linaro/recipes-extra | |
parent | 6cf4b09ea9cee9e5e964f190f3c2bf004387d098 (diff) |
move our extra recipes from meta-aarch64 to meta-linaro
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
Diffstat (limited to 'meta-linaro/recipes-extra')
28 files changed, 1428 insertions, 0 deletions
diff --git a/meta-linaro/recipes-extra/dwarfutils/dwarf.inc b/meta-linaro/recipes-extra/dwarfutils/dwarf.inc new file mode 100644 index 00000000..526f096b --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/dwarf.inc @@ -0,0 +1,12 @@ +DEPENDS = "elfutils" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=db2a565b9d860834e0f2c9cf569fb4e5" + +SRC_URI = "http://reality.sgiweb.org/davea/libdwarf-${PV}.tar.gz" + +SRC_URI[md5sum] = "83ab49c58439254729f543be6977692b" +SRC_URI[sha256sum] = "c0aede3a7368c27572ae1cc403c4cbdbf6eeb91a05adbb6f41c40ed78b75cdd9" + +S = "${WORKDIR}/dwarf-${PV}/${BPN}" + +inherit autotools diff --git a/meta-linaro/recipes-extra/dwarfutils/dwarfdump/fix-dump.patch b/meta-linaro/recipes-extra/dwarfutils/dwarfdump/fix-dump.patch new file mode 100644 index 00000000..45ca7a83 --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/dwarfdump/fix-dump.patch @@ -0,0 +1,25 @@ +--- + Makefile.in | 4 ++++ + 1 file changed, 4 insertions(+) + +--- dwarfdump.orig/Makefile.in ++++ dwarfdump/Makefile.in +@@ -104,14 +104,18 @@ naming.o: $(srcdir)/naming.c $(srcdir)/ + # in the tree builds. + trivial_naming.o: $(srcdir)/naming.c + $(CC) $(CFLAGS) -DTRIVIAL_NAMING -c $(srcdir)/naming.c -o trivial_naming.o + + tag_tree_build: $(srcdir)/tag_tree.c $(DIRINC)/dwarf.h $(HEADERS) tag_common.o makename.o common.o trivial_naming.o ++ifeq ($(NATIVE),1) + $(CC) $(CFLAGS) $(srcdir)/tag_tree.c tag_common.o common.o makename.o trivial_naming.o $(LDFLAGS) -o tag_tree_build ++endif + + tag_attr_build: $(srcdir)/tag_attr.c $(DIRINC)/dwarf.h $(HEADERS) tag_common.o makename.o common.o trivial_naming.o ++ifeq ($(NATIVE),1) + $(CC) $(CFLAGS) $(srcdir)/tag_attr.c tag_common.o common.o makename.o trivial_naming.o $(LDFLAGS) -o tag_attr_build ++endif + + tmp-tt-table.c tmp-tt-ext-table.c: $(srcdir)/tag_tree_ext.list $(srcdir)/tag_tree.list tag_tree_build + # gcc -E tag_tree.list does not work, so use a .c name + -rm -f tmp-t1.c + cp $(srcdir)/tag_tree.list tmp-t1.c diff --git a/meta-linaro/recipes-extra/dwarfutils/dwarfdump2/fix-dump.patch b/meta-linaro/recipes-extra/dwarfutils/dwarfdump2/fix-dump.patch new file mode 100644 index 00000000..18ffe812 --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/dwarfdump2/fix-dump.patch @@ -0,0 +1,27 @@ +--- + Makefile.in | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +--- dwarfdump2.orig/Makefile.in ++++ dwarfdump2/Makefile.in +@@ -100,14 +100,17 @@ common.o: $(srcdir)/common.cc $(srcdir) + # in the tree builds. + trivial_naming.o: $(srcdir)/naming.cc + $(CXX) $(CXXFLAGS) -DTRIVIAL_NAMING -c $(srcdir)/naming.cc -o trivial_naming.o + + tag_tree_build: $(srcdir)/tag_tree.cc $(DIRINC)/dwarf.h $(HEADERS) tag_common.o trivial_naming.o common.o +- $(CXX) $(CXXFLAGS) $(srcdir)/tag_tree.cc trivial_naming.o tag_common.o common.o $(LDFLAGS) -o tag_tree_build +- ++ifeq ($(NATIVE),1) ++ $(CXX) $(CXXFLAGS) $(srcdir)/tag_tree.cc trivial_naming.o tag_common.o common.o $(LDFLAGS) -o tag_tree_build ++endif + tag_attr_build: $(srcdir)/tag_attr.cc $(DIRINC)/dwarf.h $(HEADERS) trivial_naming.o tag_common.o naming.o common.o +- $(CXX) $(CXXFLAGS) $(srcdir)/tag_attr.cc trivial_naming.o tag_common.o common.o $(LDFLAGS) -o tag_attr_build ++ifeq ($(NATIVE),1) ++ $(CXX) $(CXXFLAGS) $(srcdir)/tag_attr.cc trivial_naming.o tag_common.o common.o $(LDFLAGS) -o tag_attr_build ++endif + + tmp-tt-table.cc tmp-tt-ext-table.cc: $(srcdir)/tag_tree_ext.list $(srcdir)/tag_tree.list tag_tree_build + # gcc -E tag_tree.list does not work, so use a .cc name + -rm -f tmp-t1.cc + cp $(srcdir)/tag_tree.list tmp-t1.cc diff --git a/meta-linaro/recipes-extra/dwarfutils/dwarfdump2_20121130.bb b/meta-linaro/recipes-extra/dwarfutils/dwarfdump2_20121130.bb new file mode 100644 index 00000000..10999d61 --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/dwarfdump2_20121130.bb @@ -0,0 +1,22 @@ +require dwarf.inc + +DEPENDS = "libdwarf libdwarf-native" + +LIC_FILES_CHKSUM = "file://GPL.txt;md5=751419260aa954499f7abaabaa882bbe" + +SRC_URI += "file://fix-dump.patch" + +do_compile_prepend() { + oe_runmake CXX="${BUILD_CXX}" \ + CXXFLAGS="${BUILD_CXXFLAGS} -I${S}/../libdwarf/ -I." \ + LDFLAGS="${BUILD_LDFLAGS} -ldwarf -lelf" NATIVE=1 + rm *.o dwarfdump +} + +do_install() { + install -d ${D}${bindir} ${D}${mandir}/man1 + install -m 0755 dwarfdump ${D}${bindir} + install -m 0644 dwarfdump.1 ${D}${mandir}/man1 +} + +PARALLEL_MAKE = "" diff --git a/meta-linaro/recipes-extra/dwarfutils/dwarfdump_20121130.bb b/meta-linaro/recipes-extra/dwarfutils/dwarfdump_20121130.bb new file mode 100644 index 00000000..1befb314 --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/dwarfdump_20121130.bb @@ -0,0 +1,22 @@ +require dwarf.inc + +DEPENDS = "libdwarf libdwarf-native" + +LIC_FILES_CHKSUM = "file://GPL.txt;md5=751419260aa954499f7abaabaa882bbe" + +SRC_URI += "file://fix-dump.patch" + +do_compile_prepend() { + oe_runmake CC="${BUILD_CC}" \ + CFLAGS="${BUILD_CFLAGS} -I${S}/../libdwarf/ -I." \ + LDFLAGS="${BUILD_LDFLAGS} -ldwarf -lelf" NATIVE=1 + rm *.o dwarfdump +} + +do_install() { + install -d ${D}${bindir} ${D}${mandir}/man1 + install -m 0755 dwarfdump ${D}${bindir} + install -m 0644 dwarfdump.1 ${D}${mandir}/man1 +} + +PARALLEL_MAKE = "" diff --git a/meta-linaro/recipes-extra/dwarfutils/dwarfgen_20121130.bb b/meta-linaro/recipes-extra/dwarfutils/dwarfgen_20121130.bb new file mode 100644 index 00000000..97d3b2fe --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/dwarfgen_20121130.bb @@ -0,0 +1,13 @@ +require dwarf.inc + +DEPENDS = "libdwarf libdwarf-native" + +LIC_FILES_CHKSUM = "file://GPL.txt;md5=751419260aa954499f7abaabaa882bbe" + +do_install() { + install -d ${D}${bindir} ${D}${mandir}/man1 + install -m 0755 ${BPN} ${D}${bindir} + install -m 0644 ${BPN}.1 ${D}${mandir}/man1 +} + +PARALLEL_MAKE = "" diff --git a/meta-linaro/recipes-extra/dwarfutils/libdwarf/fix-gennames.patch b/meta-linaro/recipes-extra/dwarfutils/libdwarf/fix-gennames.patch new file mode 100644 index 00000000..901409d8 --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/libdwarf/fix-gennames.patch @@ -0,0 +1,22 @@ +--- + Makefile.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- libdwarf.orig/Makefile.in ++++ libdwarf/Makefile.in +@@ -135,13 +135,13 @@ libdwarf.so: dwarf_names.h dwarf_names.c + $(CC) $(CFLAGS) -shared $(OBJS) dwarf_names.o -o $@ + + none: + echo "do nothing" + common.o: $(srcdir)/common.c $(srcdir)/common.h +- $(CC) $(CFLAGS) -c $(srcdir)/common.c ++ $(BUILD_CC) $(BUILD_CFLAGS) -c $(srcdir)/common.c + gennames: $(srcdir)/gennames.c $(srcdir)/dwarf.h common.o +- $(CC) $(CFLAGS) $(srcdir)/gennames.c common.o $(LDFLAGS) -o gennames ++ $(BUILD_CC) $(BUILD_CFLAGS) $(srcdir)/gennames.c common.o $(BUILD_LDFLAGS) -o gennames + dwarf_names.c dwarf_names.h: gennames $(srcdir)/dwarf.h + rm -f dwarf_names.h dwarf_names.c + ./gennames @dwarf_namestable@ -i $(srcdir) -o . + + diff --git a/meta-linaro/recipes-extra/dwarfutils/libdwarf_20121130.bb b/meta-linaro/recipes-extra/dwarfutils/libdwarf_20121130.bb new file mode 100644 index 00000000..4b59b381 --- /dev/null +++ b/meta-linaro/recipes-extra/dwarfutils/libdwarf_20121130.bb @@ -0,0 +1,13 @@ +require dwarf.inc + +SRC_URI += "file://fix-gennames.patch" + +do_install() { + install -d ${D}${libdir} ${D}${includedir}/libdwarf + install -m 0755 libdwarf.a ${D}${libdir} + install -m 0644 dwarf.h libdwarf.h ${D}${includedir}/libdwarf +} + +ALLOW_EMPTY_${PN} = "1" + +BBCLASSEXTEND = "native" diff --git a/meta-linaro/recipes-extra/google-glog/google-glog_svn.bb b/meta-linaro/recipes-extra/google-glog/google-glog_svn.bb new file mode 100644 index 00000000..b70aa82e --- /dev/null +++ b/meta-linaro/recipes-extra/google-glog/google-glog_svn.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "The glog library implements application-level logging. This \ +library provides logging APIs based on C++-style streams and various helper \ +macros." +HOMEPAGE = "https://code.google.com/p/google-glog/" + +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://COPYING;md5=dc9db360e0bbd4e46672f3fd91dd6c4b" + +SRC_URI = "svn://google-glog.googlecode.com/svn/;module=trunk;protocol=http" + +SRCREV = "${AUTOREV}" + +PV = "0.3.2+svn${SRCPV}" + +S = "${WORKDIR}/trunk" + +inherit autotools pkgconfig diff --git a/meta-linaro/recipes-extra/google-perftools/gperftools_2.0.bb b/meta-linaro/recipes-extra/google-perftools/gperftools_2.0.bb new file mode 100644 index 00000000..17177529 --- /dev/null +++ b/meta-linaro/recipes-extra/google-perftools/gperftools_2.0.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "Fast, multi-threaded malloc() and nifty performance analysis tools" +HOMEPAGE = "http://code.google.com/p/gperftools/" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://COPYING;md5=762732742c73dc6c7fbe8632f06c059a" + +SRC_URI = "${DEBIAN_MIRROR}/main/g/google-perftools/google-perftools_${PV}.orig.tar.gz" + +SRC_URI[md5sum] = "13f6e8961bc6a26749783137995786b6" +SRC_URI[sha256sum] = "7de3dd91f018825b1e7d332af1edace15c6211f430186febede1835069861080" + +inherit autotools diff --git a/meta-linaro/recipes-extra/hiphopvm/files/disable-not-available-for-aarch64.patch b/meta-linaro/recipes-extra/hiphopvm/files/disable-not-available-for-aarch64.patch new file mode 100644 index 00000000..3fde2f86 --- /dev/null +++ b/meta-linaro/recipes-extra/hiphopvm/files/disable-not-available-for-aarch64.patch @@ -0,0 +1,21 @@ +--- + CMake/HPHPFindLibs.cmake | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +--- git.orig/CMake/HPHPFindLibs.cmake ++++ git/CMake/HPHPFindLibs.cmake +@@ -43,12 +43,12 @@ find_package(Libinotify) + if (LIBINOTIFY_INCLUDE_DIR) + include_directories(${LIBINOTIFY_INCLUDE_DIR}) + endif() + + # unwind checks +-find_package(Libunwind REQUIRED) +-include_directories(${LIBUNWIND_INCLUDE_DIR}) ++# find_package(Libunwind REQUIRED) ++# include_directories(${LIBUNWIND_INCLUDE_DIR}) + + # iconv checks + find_package(Libiconv REQUIRED) + include_directories(${LIBICONV_INCLUDE_DIR}) + if (LIBICONV_CONST) diff --git a/meta-linaro/recipes-extra/hiphopvm/hiphopvm_git.bb b/meta-linaro/recipes-extra/hiphopvm/hiphopvm_git.bb new file mode 100644 index 00000000..d837dcbd --- /dev/null +++ b/meta-linaro/recipes-extra/hiphopvm/hiphopvm_git.bb @@ -0,0 +1,61 @@ +DEPENDS = " \ +binutils \ +bison-native \ +boost \ +bzip2 \ +cmake \ +elfutils \ +expat \ +flex-native \ +gd \ +google-glog \ +icu \ +libcap \ +libc-client \ +libdwarf \ +libevent-fb \ +libmcrypt \ +libmemcached \ +libxml2 \ +mysql5 \ +ncurses \ +onig \ +openldap \ +openssl \ +libpam \ +pcre \ +readline \ +zlib \ +tbb \ +" + +# optional (for now) dependencies: +#DEPENDS += "libunwind google-perftools" + +LICENSE = "PHP Zend" + +LIC_FILES_CHKSUM = " \ + file://LICENSE.PHP;md5=cb564efdf78cce8ea6e4b5a4f7c05d97 \ + file://LICENSE.ZEND;md5=69e7a9c51846dd6692f1b946f95f6c60" + +SRC_URI = "git://github.com/facebook/hiphop-php.git \ + file://disable-not-available-for-aarch64.patch" + +SRCREV = "${AUTOREV}" + +S = "${WORKDIR}/git" + +PV = "0.0+git${SRCPV}" +PR = "r1" + +do_configure_prepend() { + export HPHP_HOME="${B}" + export HPHP_LIB="${B}"/bin + export USE_HHVM=1 + export BOOST_INCLUDEDIR=${STAGING_INCDIR} + export BOOST_LIBRARYDIR=${STAGING_LIBDIR} + export LIBGLOG_INCLUDE_DIR=${STAGING_INCDIR} + export LIBGLOG_LIBRARY=${STAGING_LIBDIR} +} + +inherit cmake diff --git a/meta-linaro/recipes-extra/libevent/files/LICENSE.txt b/meta-linaro/recipes-extra/libevent/files/LICENSE.txt new file mode 100644 index 00000000..5a315e47 --- /dev/null +++ b/meta-linaro/recipes-extra/libevent/files/LICENSE.txt @@ -0,0 +1,74 @@ +Libevent is available for use under the following license, commonly known +as the 3-clause (or "modified") BSD license: + +============================== +Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu> +Copyright (c) 2007-2010 Niels Provos and Nick Mathewson + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +============================== + +Portions of Libevent are based on works by others, also made available by +them under the three-clause BSD license above. The copyright notices are +available in the corresponding source files; the license is as above. Here's +a list: + +log.c: + Copyright (c) 2000 Dug Song <dugsong@monkey.org> + Copyright (c) 1993 The Regents of the University of California. + +strlcpy.c: + Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> + +win32select.c: + Copyright (c) 2003 Michael A. Davis <mike@datanerds.net> + +evport.c: + Copyright (c) 2007 Sun Microsystems + +ht-internal.h: + Copyright (c) 2002 Christopher Clark + +minheap-internal.h: + Copyright (c) 2006 Maxim Yegorushkin <maxim.yegorushkin@gmail.com> + +============================== + +The arc4module is available under the following, sometimes called the +"OpenBSD" license: + + Copyright (c) 1996, David Mazieres <dm@uun.org> + Copyright (c) 2008, Damien Miller <djm@openbsd.org> + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/meta-linaro/recipes-extra/libevent/files/libevent-1.4.14.fb-changes.diff b/meta-linaro/recipes-extra/libevent/files/libevent-1.4.14.fb-changes.diff new file mode 100644 index 00000000..0f29aac2 --- /dev/null +++ b/meta-linaro/recipes-extra/libevent/files/libevent-1.4.14.fb-changes.diff @@ -0,0 +1,611 @@ +diff --git a/event.c b/event.c +index 74ba5c4..06984b8 100644 +--- a/event.c ++++ b/event.c +@@ -138,10 +138,12 @@ detect_monotonic(void) + static int + gettime(struct event_base *base, struct timeval *tp) + { ++/* + if (base->tv_cache.tv_sec) { + *tp = base->tv_cache; + return (0); + } ++*/ + + #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + if (use_monotonic) { +@@ -481,7 +483,7 @@ event_base_loop(struct event_base *base, int flags) + int res, done; + + /* clear time cache */ +- base->tv_cache.tv_sec = 0; ++ /* base->tv_cache.tv_sec = 0; */ + + if (base->sig.ev_signal_added) + evsignal_base = base; +@@ -533,13 +535,13 @@ event_base_loop(struct event_base *base, int flags) + gettime(base, &base->event_tv); + + /* clear time cache */ +- base->tv_cache.tv_sec = 0; ++ /* base->tv_cache.tv_sec = 0; */ + + res = evsel->dispatch(base, evbase, tv_p); + + if (res == -1) + return (-1); +- gettime(base, &base->tv_cache); ++ /* gettime(base, &base->tv_cache); */ + + timeout_process(base); + +@@ -552,7 +554,7 @@ event_base_loop(struct event_base *base, int flags) + } + + /* clear time cache */ +- base->tv_cache.tv_sec = 0; ++ /* base->tv_cache.tv_sec = 0; */ + + event_debug(("%s: asked to terminate loop.", __func__)); + return (0); +diff --git a/evhttp.h b/evhttp.h +index 7ddf720..13c8b79 100644 +--- a/evhttp.h ++++ b/evhttp.h +@@ -81,12 +81,50 @@ struct evhttp *evhttp_new(struct event_base *base); + * @param http a pointer to an evhttp object + * @param address a string containing the IP address to listen(2) on + * @param port the port number to listen on +- * @return a newly allocated evhttp struct ++ * @return 0 on success, -1 on error + * @see evhttp_free() + */ + int evhttp_bind_socket(struct evhttp *http, const char *address, u_short port); + + /** ++ * Binds an HTTP server on the specified address and port, using backlog. ++ * ++ * Can be called multiple times to bind the same http server ++ * to multiple different ports. ++ * ++ * @param http a pointer to an evhttp object ++ * @param address a string containing the IP address to listen(2) on ++ * @param port the port number to listen on ++ * @param backlog the backlog value for listen(2) ++ * @return 0 on success, -1 on error ++ * @see evhttp_free() ++ */ ++int evhttp_bind_socket_backlog(struct evhttp *http, const char *address, u_short port, int backlog); ++ ++/** ++ * Like evhttp_bind_socket(), but returns the socket file descriptor. ++ * ++ * @param http a pointer to an evhttp object ++ * @param address a string containing the IP address to listen(2) on ++ * @param port the port number to listen on ++ * @return Socket file descriptor on success, -1 on failure ++ * @see evhttp_bind_socket() ++ */ ++int evhttp_bind_socket_with_fd(struct evhttp *http, const char *address, u_short port); ++ ++/** ++ * Like evhttp_bind_socket(), but returns the socket file descriptor. ++ * ++ * @param http a pointer to an evhttp object ++ * @param address a string containing the IP address to listen(2) on ++ * @param port the port number to listen on ++ * @param backlog the backlog value for listen(2) ++ * @return Socket file descriptor on success, -1 on failure ++ * @see evhttp_bind_socket() ++ */ ++int evhttp_bind_socket_backlog_fd(struct evhttp *http, const char *address, u_short port, int backlog); ++ ++/** + * Makes an HTTP server accept connections on the specified socket + * + * This may be useful to create a socket and then fork multiple instances +@@ -105,6 +143,21 @@ int evhttp_bind_socket(struct evhttp *http, const char *address, u_short port); + int evhttp_accept_socket(struct evhttp *http, int fd); + + /** ++ * Makes an HTTP server stop accepting connections on the specified socket ++ * ++ * This may be useful when a socket has been sent via file descriptor passing ++ * and is no longer needed by the current process. ++ * ++ * This function does not close the socket. ++ * ++ * @param http a pointer to an evhttp object ++ * @param fd a socket fd that is currently accepting connections ++ * @return 0 on success, -1 on failure. ++ * @see evhttp_accept_socket() ++ */ ++int evhttp_del_accept_socket(struct evhttp *http, int fd); ++ ++/** + * Free the previously created HTTP server. + * + * Works only if no requests are currently being served. +@@ -134,6 +187,28 @@ void evhttp_set_gencb(struct evhttp *, + */ + void evhttp_set_timeout(struct evhttp *, int timeout_in_secs); + ++/** ++ * Limit the number of simultaneous connections via this http instance. ++ * ++ * @param http an evhttp object ++ * @param nlimit the maximum number of connections, zero is unlimited ++ */ ++int evhttp_set_connection_limit(struct evhttp *http, int nlimit); ++ ++/** ++ * Return the maximum number of connections allowed for this instance. ++ * ++ * @param http an evhttp object ++ */ ++int evhttp_get_connection_limit(struct evhttp *http); ++ ++/** ++ * Return the number of connections in this instance. ++ * ++ * @param http an evhttp object ++ */ ++int evhttp_get_connection_count(struct evhttp *http); ++ + /* Request/Response functionality */ + + /** +@@ -157,6 +232,19 @@ void evhttp_send_error(struct evhttp_request *req, int error, + void evhttp_send_reply(struct evhttp_request *req, int code, + const char *reason, struct evbuffer *databuf); + ++/** ++ * Send an HTML reply synchronously as much as possible by calling _begin(). ++ * Great for a worker thread to send the reply immediately without queuing up ++ * events back to the loop. Call _end() to send the rest of the packet from ++ * event loop. ++ * ++ * When _begin() returns needs to be fed into _end() as the 1st parameter ++ * "nwritten". ++ */ ++int evhttp_send_reply_sync_begin(struct evhttp_request *req, int code, ++ const char *reason, struct evbuffer *databuf); ++void evhttp_send_reply_sync_end(int nwritten, struct evhttp_request *req); ++ + /* Low-level response interface, for streaming/chunked replies */ + void evhttp_send_reply_start(struct evhttp_request *, int, const char *); + void evhttp_send_reply_chunk(struct evhttp_request *, struct evbuffer *); +@@ -210,6 +298,7 @@ struct { + + enum evhttp_request_kind kind; + enum evhttp_cmd_type type; ++ char *ext_method; /* webdav methods, for example */ + + char *uri; /* uri after HTTP request was parsed */ + +@@ -224,6 +313,8 @@ struct { + int chunked:1, /* a chunked request */ + userdone:1; /* the user has sent all data */ + ++ int referenced; ++ + struct evbuffer *output_buffer; /* outgoing post or data */ + + /* Callback */ +diff --git a/http-internal.h b/http-internal.h +index 9cd03cd..3f60f54 100644 +--- a/http-internal.h ++++ b/http-internal.h +@@ -116,6 +116,9 @@ struct evhttp { + TAILQ_HEAD(httpcbq, evhttp_cb) callbacks; + struct evconq connections; + ++ int connection_count; ++ int connection_limit; ++ + int timeout; + + void (*gencb)(struct evhttp_request *req, void *); +diff --git a/http.c b/http.c +index efcec40..e10d114 100644 +--- a/http.c ++++ b/http.c +@@ -219,6 +219,13 @@ static int evhttp_decode_uri_internal(const char *uri, size_t length, + void evhttp_read(int, short, void *); + void evhttp_write(int, short, void *); + ++ ++void evhttp_server_drop_connection(struct evhttp_connection *evcon); ++void evhttp_server_add_connection(struct evhttp *http, ++ struct evhttp_connection *evcon); ++void evhttp_pause(struct evhttp *http); ++void evhttp_resume(struct evhttp *http); ++ + #ifndef HAVE_STRSEP + /* strsep replacement for platforms that lack it. Only works if + * del is one character long. */ +@@ -478,7 +485,6 @@ evhttp_make_header_response(struct evhttp_connection *evcon, + evhttp_add_header(req->output_headers, + "Connection", "keep-alive"); + +- if (req->minor == 1 || is_keepalive) { + /* + * we need to add the content length if the + * user did not give it, this is required for +@@ -488,7 +494,6 @@ evhttp_make_header_response(struct evhttp_connection *evcon, + req->output_headers, + (long)EVBUFFER_LENGTH(req->output_buffer)); + } +- } + + /* Potentially add headers for unidentified content. */ + if (EVBUFFER_LENGTH(req->output_buffer)) { +@@ -687,14 +692,14 @@ void + evhttp_write(int fd, short what, void *arg) + { + struct evhttp_connection *evcon = arg; +- int n; + + if (what == EV_TIMEOUT) { + evhttp_connection_fail(evcon, EVCON_HTTP_TIMEOUT); + return; + } + +- n = evbuffer_write(evcon->output_buffer, fd); ++ if (EVBUFFER_LENGTH(evcon->output_buffer) != 0) { ++ int n = evbuffer_write(evcon->output_buffer, fd); + if (n == -1) { + event_debug(("%s: evbuffer_write", __func__)); + evhttp_connection_fail(evcon, EVCON_HTTP_EOF); +@@ -706,6 +711,7 @@ evhttp_write(int fd, short what, void *arg) + evhttp_connection_fail(evcon, EVCON_HTTP_EOF); + return; + } ++ } + + if (EVBUFFER_LENGTH(evcon->output_buffer) != 0) { + evhttp_add_event(&evcon->ev, +@@ -1012,11 +1018,9 @@ evhttp_connection_free(struct evhttp_connection *evcon) + TAILQ_REMOVE(&evcon->requests, req, next); + evhttp_request_free(req); + } +- +- if (evcon->http_server != NULL) { +- struct evhttp *http = evcon->http_server; +- TAILQ_REMOVE(&http->connections, evcon, next); +- } ++ ++ if (evcon->http_server != NULL) ++ evhttp_server_drop_connection(evcon); + + if (event_initialized(&evcon->close_ev)) + event_del(&evcon->close_ev); +@@ -1101,10 +1105,16 @@ evhttp_connection_reset(struct evhttp_connection *evcon) + } + evcon->state = EVCON_DISCONNECTED; + +- evbuffer_drain(evcon->input_buffer, +- EVBUFFER_LENGTH(evcon->input_buffer)); +- evbuffer_drain(evcon->output_buffer, +- EVBUFFER_LENGTH(evcon->output_buffer)); ++ /* ++ * These can grow quite large if processing a large photo or video ++ * upload/download. Instead of keeping the buffers around, just ++ * free and allocate new. ++ */ ++ evbuffer_free(evcon->input_buffer); ++ evcon->input_buffer = evbuffer_new(); ++ ++ evbuffer_free(evcon->output_buffer); ++ evcon->output_buffer = evbuffer_new(); + } + + static void +@@ -1278,19 +1288,52 @@ evhttp_parse_request_line(struct evhttp_request *req, char *line) + if (line == NULL) + return (-1); + uri = strsep(&line, " "); +- if (line == NULL) +- return (-1); ++ if (line == NULL) { ++ version = "HTTP/1.0"; ++ } else { + version = strsep(&line, " "); + if (line != NULL) + return (-1); ++ } + + /* First line */ ++ req->ext_method = NULL; + if (strcmp(method, "GET") == 0) { + req->type = EVHTTP_REQ_GET; + } else if (strcmp(method, "POST") == 0) { + req->type = EVHTTP_REQ_POST; + } else if (strcmp(method, "HEAD") == 0) { + req->type = EVHTTP_REQ_HEAD; ++ } else if (strcmp(method, "OPTIONS") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "OPTIONS"; ++ } else if (strcmp(method, "REPORT") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "REPORT"; ++ } else if (strcmp(method, "PROPFIND") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "PROPFIND"; ++ } else if (strcmp(method, "PROPPATH") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "PROPPATH"; ++ } else if (strcmp(method, "MKCOL") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "MKCOL"; ++ } else if (strcmp(method, "MKCALENDAR") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "MKCALENDAR"; ++ } else if (strcmp(method, "PUT") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "PUT"; ++ } else if (strcmp(method, "DELETE") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "DELETE"; ++ } else if (strcmp(method, "LOCK") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "LOCK"; ++ } else if (strcmp(method, "UNLOCK") == 0) { ++ req->type = EVHTTP_REQ_POST; ++ req->ext_method = "UNLOCK"; + } else { + event_debug(("%s: bad method %s on request %p from %s", + __func__, method, req, req->remote_host)); +@@ -1963,10 +2006,44 @@ evhttp_send_reply(struct evhttp_request *req, int code, const char *reason, + evhttp_send(req, databuf); + } + ++int ++evhttp_send_reply_sync_begin(struct evhttp_request *req, int code, ++ const char *reason, struct evbuffer *databuf) { ++ evhttp_response_code(req, code, reason); ++ struct evhttp_connection *evcon = req->evcon; ++ ++ assert(TAILQ_FIRST(&evcon->requests) == req); ++ ++ /* xxx: not sure if we really should expose the data buffer this way */ ++ if (databuf != NULL) ++ evbuffer_add_buffer(req->output_buffer, databuf); ++ ++ /* Adds headers to the response */ ++ evhttp_make_header(evcon, req); ++ ++ return evbuffer_write(evcon->output_buffer, evcon->fd); ++} ++ ++void ++evhttp_send_reply_sync_end(int nwritten, struct evhttp_request *req) { ++ struct evhttp_connection *evcon = req->evcon; ++ ++ if (nwritten <= 0) { ++ evhttp_connection_fail(evcon, EVCON_HTTP_EOF); ++ } else if (EVBUFFER_LENGTH(evcon->output_buffer) == 0) { ++ evhttp_send_done(evcon, NULL); ++ } else { ++ evhttp_write_buffer(evcon, evhttp_send_done, NULL); ++ } ++} ++ ++ + void + evhttp_send_reply_start(struct evhttp_request *req, int code, + const char *reason) + { ++ req->referenced = 1; ++ + evhttp_response_code(req, code, reason); + if (req->major == 1 && req->minor == 1) { + /* use chunked encoding for HTTP/1.1 */ +@@ -1986,6 +2063,8 @@ evhttp_send_reply_chunk(struct evhttp_request *req, struct evbuffer *databuf) + if (evcon == NULL) + return; + ++ if (req->referenced < 0) return; ++ + if (req->chunked) { + evbuffer_add_printf(evcon->output_buffer, "%x\r\n", + (unsigned)EVBUFFER_LENGTH(databuf)); +@@ -2007,7 +2086,14 @@ evhttp_send_reply_end(struct evhttp_request *req) + return; + } + +- /* we expect no more calls form the user on this request */ ++ if (req->referenced < 0) { ++ req->referenced = 0; ++ evhttp_request_free(req); ++ return; ++ } ++ req->referenced = 0; ++ ++ /* we expect no more calls form the user on this request */ + req->userdone = 1; + + if (req->chunked) { +@@ -2293,7 +2379,8 @@ accept_socket(int fd, short what, void *arg) + } + + int +-evhttp_bind_socket(struct evhttp *http, const char *address, u_short port) ++evhttp_bind_socket_backlog_fd(struct evhttp *http, const char *address, ++ u_short port, int backlog) + { + int fd; + int res; +@@ -2301,7 +2388,7 @@ evhttp_bind_socket(struct evhttp *http, const char *address, u_short port) + if ((fd = bind_socket(address, port, 1 /*reuse*/)) == -1) + return (-1); + +- if (listen(fd, 128) == -1) { ++ if (listen(fd, backlog) == -1) { + event_warn("%s: listen", __func__); + EVUTIL_CLOSESOCKET(fd); + return (-1); +@@ -2309,13 +2396,42 @@ evhttp_bind_socket(struct evhttp *http, const char *address, u_short port) + + res = evhttp_accept_socket(http, fd); + +- if (res != -1) ++ if (res != -1) { + event_debug(("Bound to port %d - Awaiting connections ... ", + port)); ++ return (fd); ++ } + + return (res); + } + ++static int ++mask_fd(int fd) ++{ ++ return fd > 0 ? 0 : fd; ++} ++ ++int ++evhttp_bind_socket(struct evhttp *http, const char *address, u_short port) ++{ ++ return mask_fd(evhttp_bind_socket_backlog_fd(http, address, port, 128)); ++} ++ ++int ++evhttp_bind_socket_with_fd(struct evhttp *http, const char *address, ++ u_short port) ++{ ++ return evhttp_bind_socket_backlog_fd(http, address, port, 128); ++} ++ ++int ++evhttp_bind_socket_backlog(struct evhttp *http, const char *address, ++ u_short port, int backlog) ++{ ++ return mask_fd( ++ evhttp_bind_socket_backlog_fd(http, address, port, backlog)); ++} ++ + int + evhttp_accept_socket(struct evhttp *http, int fd) + { +@@ -2345,6 +2461,25 @@ evhttp_accept_socket(struct evhttp *http, int fd) + return (0); + } + ++int ++evhttp_del_accept_socket(struct evhttp *http, int fd) ++{ ++ struct evhttp_bound_socket *bound; ++ TAILQ_FOREACH(bound, &http->sockets, next) { ++ if (bound->bind_ev.ev_fd == fd) ++ break; ++ } ++ ++ if (bound == NULL) ++ return (-1); ++ ++ TAILQ_REMOVE(&http->sockets, bound, next); ++ event_del(&bound->bind_ev); ++ free(bound); ++ ++ return (0); ++} ++ + static struct evhttp* + evhttp_new_object(void) + { +@@ -2527,6 +2662,11 @@ evhttp_request_new(void (*cb)(struct evhttp_request *, void *), void *arg) + void + evhttp_request_free(struct evhttp_request *req) + { ++ if (req->referenced) { ++ req->referenced = -1; ++ return; ++ } ++ + if (req->remote_host != NULL) + free(req->remote_host); + if (req->uri != NULL) +@@ -2657,13 +2797,78 @@ evhttp_get_request(struct evhttp *http, int fd, + * if we want to accept more than one request on a connection, + * we need to know which http server it belongs to. + */ +- evcon->http_server = http; +- TAILQ_INSERT_TAIL(&http->connections, evcon, next); ++ ++ evhttp_server_add_connection(http, evcon); + + if (evhttp_associate_new_request_with_connection(evcon) == -1) + evhttp_connection_free(evcon); + } + ++void ++evhttp_pause(struct evhttp *http) ++{ ++ struct evhttp_bound_socket *bound; ++ TAILQ_FOREACH(bound, &http->sockets, next) { ++ event_del(&bound->bind_ev); ++ } ++} ++ ++void ++evhttp_resume(struct evhttp *http) ++{ ++ struct evhttp_bound_socket *bound; ++ TAILQ_FOREACH(bound, &http->sockets, next) { ++ event_add(&bound->bind_ev, 0); ++ } ++} ++ ++int ++evhttp_get_connection_limit(struct evhttp *http) ++{ ++ return http->connection_limit; ++} ++ ++int ++evhttp_set_connection_limit(struct evhttp *http, int nlimit) ++{ ++ int olimit = http->connection_limit; ++ http->connection_limit = nlimit; ++ return olimit; ++} ++ ++int ++evhttp_get_connection_count(struct evhttp *http) ++{ ++ return http != NULL ? http->connection_count : 0; ++} ++ ++void ++evhttp_server_add_connection(struct evhttp *http, ++ struct evhttp_connection *evcon) ++{ ++ evcon->http_server = http; ++ TAILQ_INSERT_TAIL(&http->connections, evcon, next); ++ ++ http->connection_count++; ++ if (http->connection_limit > 0 ++ && http->connection_count >= http->connection_limit) ++ { ++ evhttp_pause(http); ++ } ++} ++ ++void ++evhttp_server_drop_connection(struct evhttp_connection *evcon) ++{ ++ struct evhttp *http = evcon->http_server; ++ TAILQ_REMOVE(&http->connections, evcon, next); ++ http->connection_count--; ++ if (http->connection_limit > 0 ++ && http->connection_count < http->connection_limit) ++ { ++ evhttp_resume(http); ++ } ++} + + /* + * Network helper functions that we do not want to export to the rest of diff --git a/meta-linaro/recipes-extra/libevent/libevent-fb_1.4.14b.bb b/meta-linaro/recipes-extra/libevent/libevent-fb_1.4.14b.bb new file mode 100644 index 00000000..fda03907 --- /dev/null +++ b/meta-linaro/recipes-extra/libevent/libevent-fb_1.4.14b.bb @@ -0,0 +1,20 @@ +require recipes-support/libevent/libevent_2.0.21.bb + +PROVIDES = "libevent" + +INC_PR = "1" + +SRC_URI = "http://github.com/downloads/libevent/libevent/libevent-${PV}-stable.tar.gz;name=archive \ + http://libevent.org/LICENSE.txt;name=license \ + file://libevent-1.4.14.fb-changes.diff" + +SRC_URI[archive.md5sum] = "a00e037e4d3f9e4fe9893e8a2d27918c" +SRC_URI[archive.sha256sum] = "afa61b476a222ba43fc7cca2d24849ab0bbd940124400cb699915d3c60e46301" + +SRC_URI[license.md5sum] = "412e611443304db6a338ab32728ae297" +SRC_URI[license.sha256sum] = "55739d5492273a7058c66b682012330a84c34eaa666f5c7030b0312573235270" + + +S = "${WORKDIR}/libevent-${PV}-stable/" + +LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE.txt;md5=412e611443304db6a338ab32728ae297" diff --git a/meta-linaro/recipes-extra/libmcrypt/libmcrypt_2.5.8.bb b/meta-linaro/recipes-extra/libmcrypt/libmcrypt_2.5.8.bb new file mode 100644 index 00000000..0cbe189f --- /dev/null +++ b/meta-linaro/recipes-extra/libmcrypt/libmcrypt_2.5.8.bb @@ -0,0 +1,22 @@ +DESCRIPTION = "Replacement for the old crypt() package and crypt(1) command, with extensions." +HOMEPAGE = "http://mcrypt.sourceforge.net/" +LICENSE = "LGPLv2.1" +LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=bbb461211a33b134d42ed5ee802b37ff" + +SRC_URI = "${SOURCEFORGE_MIRROR}/project/mcrypt/Libmcrypt/${PV}/libmcrypt-${PV}.tar.gz" + +SRC_URI[md5sum] = "0821830d930a86a5c69110837c55b7da" +SRC_URI[sha256sum] = "e4eb6c074bbab168ac47b947c195ff8cef9d51a211cdd18ca9c9ef34d27a373e" + +inherit autotools gettext binconfig + +do_configure() { + gnu-configize --force +# libtoolize --force --copy + autoconf + oe_runconf +} + +do_install_append() { + rm ${D}${libdir}/libmcrypt -r +} diff --git a/meta-linaro/recipes-extra/libmemcached/libmemcached.inc b/meta-linaro/recipes-extra/libmemcached/libmemcached.inc new file mode 100644 index 00000000..448a15d0 --- /dev/null +++ b/meta-linaro/recipes-extra/libmemcached/libmemcached.inc @@ -0,0 +1,10 @@ +DESCRIPTION = "open source C/C++ client library and tools for the memcached server" +DEPENDS = "libevent util-linux" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://COPYING;md5=865490941c91ba790f0ea78dec93bd60" + +SRC_URI = "http://launchpad.net/libmemcached/1.0/${PV}/+download/libmemcached-${PV}.tar.gz" + +TARGET_LDFLAGS += "-luuid" + +inherit autotools gettext pkgconfig diff --git a/meta-linaro/recipes-extra/libmemcached/libmemcached_1.0.7.bb b/meta-linaro/recipes-extra/libmemcached/libmemcached_1.0.7.bb new file mode 100644 index 00000000..0aa30505 --- /dev/null +++ b/meta-linaro/recipes-extra/libmemcached/libmemcached_1.0.7.bb @@ -0,0 +1,8 @@ +require libmemcached.inc + +SRC_URI[md5sum] = "d59a462a92d296f76bff2d9bc72b2516" +SRC_URI[sha256sum] = "3efa86c9733eaad55d7119cb16769424e2aa6c22b3392e8f973946fce6678d81" + +do_configure_prepend_aarch64() { + export ac_cv_c_endian=little +} diff --git a/meta-linaro/recipes-extra/libunwind/files/aarch64.patch b/meta-linaro/recipes-extra/libunwind/files/aarch64.patch new file mode 100644 index 00000000..9ea8d832 --- /dev/null +++ b/meta-linaro/recipes-extra/libunwind/files/aarch64.patch @@ -0,0 +1,19 @@ +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- libunwind-1.1.orig/configure.ac ++++ libunwind-1.1/configure.ac +@@ -135,11 +135,11 @@ AM_CONDITIONAL(OS_HPUX, expr x$target_os + AM_CONDITIONAL(OS_FREEBSD, expr x$target_os : xfreebsd >/dev/null) + + AC_MSG_CHECKING([for ELF helper width]) + case "${target_arch}" in + (arm|hppa|ppc32|x86|sh) use_elf32=yes; AC_MSG_RESULT([32]);; +-(ia64|ppc64|x86_64) use_elf64=yes; AC_MSG_RESULT([64]);; ++(ia64|ppc64|x86_64|aarch64) use_elf64=yes; AC_MSG_RESULT([64]);; + (mips) use_elfxx=yes; AC_MSG_RESULT([xx]);; + *) AC_MSG_ERROR([Unknown ELF target: ${target_arch}]) + esac + AM_CONDITIONAL(USE_ELF32, [test x$use_elf32 = xyes]) + AM_CONDITIONAL(USE_ELF64, [test x$use_elf64 = xyes]) diff --git a/meta-linaro/recipes-extra/libunwind/libunwind.inc b/meta-linaro/recipes-extra/libunwind/libunwind.inc new file mode 100644 index 00000000..f028766b --- /dev/null +++ b/meta-linaro/recipes-extra/libunwind/libunwind.inc @@ -0,0 +1,12 @@ +DESCRIPTION = "a portable and efficient C programming interface (API) to determine the call-chain of a program" +HOMEPAGE = "http://www.nongnu.org/libunwind" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3fced11d6df719b47505837a51c16ae5" + +SRC_URI = "http://download.savannah.nongnu.org/releases/${BPN}/${BPN}-${PV}.tar.gz" + +inherit autotools + +EXTRA_OECONF_arm = "--enable-debug-frame" + +BBCLASSEXTEND = "native" diff --git a/meta-linaro/recipes-extra/libunwind/libunwind_1.1.bb b/meta-linaro/recipes-extra/libunwind/libunwind_1.1.bb new file mode 100644 index 00000000..2cca1f89 --- /dev/null +++ b/meta-linaro/recipes-extra/libunwind/libunwind_1.1.bb @@ -0,0 +1,8 @@ +require libunwind.inc + +PR = "r1" + +SRC_URI += "file://aarch64.patch" + +SRC_URI[md5sum] = "fb4ea2f6fbbe45bf032cd36e586883ce" +SRC_URI[sha256sum] = "9dfe0fcae2a866de9d3942c66995e4b460230446887dbdab302d41a8aee8d09a" diff --git a/meta-linaro/recipes-extra/memcached/memcached_1.4.15.bb b/meta-linaro/recipes-extra/memcached/memcached_1.4.15.bb new file mode 100644 index 00000000..b6d436e2 --- /dev/null +++ b/meta-linaro/recipes-extra/memcached/memcached_1.4.15.bb @@ -0,0 +1,19 @@ +DESCRIPTION = "Free & open source, high-performance, distributed memory object \ +caching system, generic in nature, but intended for use in speeding up dynamic \ +web applications by alleviating database load." +HOMEPAGE = "http://memcached.org/" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://COPYING;md5=7e5ded7363d335e1bb18013ca08046ff" + +SRC_URI = "http://memcached.googlecode.com/files/memcached-${PV}.tar.gz" + +SRC_URI[md5sum] = "36ea966f5a29655be1746bf4949f7f69" +SRC_URI[sha256sum] = "169721ab7a7531add6ae9f6b14b6b5641725fe0b1f0bdf5c3a4327725901e2b4" + +DEPENDS = "libevent" + +inherit autotools + +do_configure_prepend_aarch64() { + export ac_cv_c_endian=little +} diff --git a/meta-linaro/recipes-extra/meta-toolchain-hhvm/meta-toolchain-hhvm.bb b/meta-linaro/recipes-extra/meta-toolchain-hhvm/meta-toolchain-hhvm.bb new file mode 100644 index 00000000..bcb84a58 --- /dev/null +++ b/meta-linaro/recipes-extra/meta-toolchain-hhvm/meta-toolchain-hhvm.bb @@ -0,0 +1,4 @@ +TOOLCHAIN_TARGET_TASK = "packagegroup-core-standalone-hhvm-sdk-target" +TOOLCHAIN_OUTPUTNAME = "${SDK_NAME}-toolchain-hhvm-${DISTRO_VERSION}" +PROVIDES = "meta-toolchain-sdk" +require recipes-core/meta/meta-toolchain.bb diff --git a/meta-linaro/recipes-extra/meta-toolchain-hhvm/packagegroup-core-standalone-hhvm-sdk-target.bb b/meta-linaro/recipes-extra/meta-toolchain-hhvm/packagegroup-core-standalone-hhvm-sdk-target.bb new file mode 100644 index 00000000..0c36439b --- /dev/null +++ b/meta-linaro/recipes-extra/meta-toolchain-hhvm/packagegroup-core-standalone-hhvm-sdk-target.bb @@ -0,0 +1,55 @@ +SUMMARY = "HipHop VM porting SDK (target tools)" +LICENSE = "MIT" + +inherit packagegroup + +RDEPENDS_${PN} = "\ + packagegroup-core-standalone-sdk-target \ + binutils-dev \ + binutils-staticdev \ + bison \ + boost-dev \ + boost-staticdev \ + boost \ + bzip2-dev \ + cmake \ + curl-dev \ + elfutils-dev \ + elfutils-staticdev \ + expat \ + flex \ + gd-dev \ + gd-staticdev \ + google-glog-dev \ + icu-dev \ + libcap-dev \ + libcap-staticdev \ + libc-client-dev \ + libc-client-staticdev \ + libdwarf-dev \ + libdwarf-staticdev \ + libevent-fb-dev \ + libevent-fb-staticdev \ + libglade-dev \ + libmcrypt-dev \ + libmemcached-dev \ + libmemcached-staticdev \ + libmysqlclient-dev \ + libmysqlclient-staticdev \ + libmysqlclient-r-dev \ + libmysqlclient-r-staticdev \ + libpam-dev \ + libpcre-dev \ + libpcre-staticdev \ + libxml2-dev \ + libxml2-staticdev \ + ncurses-dev \ + ncurses-staticdev \ + onig-dev \ + openldap-dev \ + openssl-dev \ + openssl-staticdev \ + readline-dev \ + tbb-dev \ + zlib-dev \ + " diff --git a/meta-linaro/recipes-extra/tbb/tbb/cross-compile.patch b/meta-linaro/recipes-extra/tbb/tbb/cross-compile.patch new file mode 100644 index 00000000..b970a374 --- /dev/null +++ b/meta-linaro/recipes-extra/tbb/tbb/cross-compile.patch @@ -0,0 +1,25 @@ +Author: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> + +Upstream-Status: unsuitable +--- + build/linux.gcc.inc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- tbb41_20121003oss.orig/build/linux.gcc.inc ++++ tbb41_20121003oss/build/linux.gcc.inc +@@ -40,12 +40,13 @@ DYLIB_KEY = -shared + EXPORT_KEY = -Wl,--version-script, + LIBDL = -ldl + + TBB_NOSTRICT = 1 + +-CPLUS = g++ +-CONLY = gcc ++CPLUS = $(CXX) ++CONLY = $(CC) ++CPLUS_FLAGS = $(CXXFLAGS) + LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY) + LIBS += -lpthread -lrt + LINK_FLAGS = -Wl,-rpath-link=. + C_FLAGS = $(CPLUS_FLAGS) + # gcc 4.4 and higher support -std=c++0x diff --git a/meta-linaro/recipes-extra/tbb/tbb/tbb.pc b/meta-linaro/recipes-extra/tbb/tbb/tbb.pc new file mode 100644 index 00000000..644b64fb --- /dev/null +++ b/meta-linaro/recipes-extra/tbb/tbb/tbb.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Threading Building Blocks +Description: Intel's parallelism library for C++ +URL: http://www.threadingbuildingblocks.org/ +Version: 3.0+r018 +Libs: -L${libdir} -ltbb +Cflags: -I${includedir} diff --git a/meta-linaro/recipes-extra/tbb/tbb/tbb41-aarch64.patch b/meta-linaro/recipes-extra/tbb/tbb/tbb41-aarch64.patch new file mode 100644 index 00000000..3366f874 --- /dev/null +++ b/meta-linaro/recipes-extra/tbb/tbb/tbb41-aarch64.patch @@ -0,0 +1,233 @@ +Author: Leif Lindholm <leif.lindholm@linaro.org> + +Upstream-Status: not there yet + +https://bugs.launchpad.net/linaro-aarch64/+bug/1091353 + +diff --git a/build/linux.inc b/build/linux.inc +index bdad142..7db323c 100644 +--- a/build/linux.inc ++++ b/build/linux.inc +@@ -104,6 +104,9 @@ endif + ifeq ($(arch),sparc) + def_prefix = lin64 + endif ++ifeq ($(arch),aarch64) ++ def_prefix = lin64 ++endif + ifeq (,$(def_prefix)) + ifeq (64,$(findstring 64,$(arch))) + def_prefix = lin64 +diff --git a/include/tbb/machine/linux_aarch64.h b/include/tbb/machine/linux_aarch64.h +new file mode 100644 +index 0000000..e3ebc36 +--- /dev/null ++++ b/include/tbb/machine/linux_aarch64.h +@@ -0,0 +1,153 @@ ++/* ++ Copyright 2013 Linaro All Rights Reserved. ++ ++ This file is part of Threading Building Blocks. ++ ++ Threading Building Blocks is free software; you can redistribute it ++ and/or modify it under the terms of the GNU General Public License ++ version 2 as published by the Free Software Foundation. ++ ++ Threading Building Blocks is distributed in the hope that it will be ++ useful, but WITHOUT ANY WARRANTY; without even the implied warranty ++ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Threading Building Blocks; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++ As a special exception, you may use this file as part of a free software ++ library without restriction. Specifically, if other files instantiate ++ templates or use macros or inline functions from this file, or you compile ++ this file and link it with other files to produce an executable, this ++ file does not by itself cause the resulting executable to be covered by ++ the GNU General Public License. This exception does not however ++ invalidate any other reasons why the executable file might be covered by ++ the GNU General Public License. ++*/ ++ ++/* ++ This is the TBB implementation for the ARM AArch64 architecture. ++*/ ++ ++#ifndef __TBB_machine_H ++#error Do not include this file directly; include tbb_machine.h instead ++#endif ++ ++#if !(__aarch64__) ++#error Threading Building Blocks AArch64 port requires an AArch64 architecture. ++#endif ++ ++#include <sys/param.h> ++#include <unistd.h> ++ ++#define __TBB_WORDSIZE 8 ++ ++#ifndef __BYTE_ORDER__ ++ // Hopefully endianness can be validly determined at runtime. ++ // This may silently fail in some embedded systems with page-specific endianness. ++#elif __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ ++ #define __TBB_BIG_ENDIAN 1 ++#elif __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ ++ #define __TBB_BIG_ENDIAN 0 ++#else ++ #define __TBB_BIG_ENDIAN -1 // not currently supported ++#endif ++ ++ ++#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory") ++#define __TBB_control_consistency_helper() __TBB_compiler_fence() ++ ++#define __TBB_aarch64_inner_shareable_barrier() __asm__ __volatile__("dmb ish": : :"memory") ++#define __TBB_acquire_consistency_helper() __TBB_aarch64_inner_shareable_barrier() ++#define __TBB_release_consistency_helper() __TBB_aarch64_inner_shareable_barrier() ++#define __TBB_full_memory_fence() __TBB_aarch64_inner_shareable_barrier() ++ ++//-------------------------------------------------- ++// Compare and swap ++//-------------------------------------------------- ++ ++/** ++ * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, ++ * returns *ptr ++ * ++ * @param ptr pointer to value in memory to be swapped with value ++ * if *ptr==comparand ++ * @param value value to assign *ptr to if *ptr==comparand ++ * @param comparand value to compare with *ptr ++ * @return value originally in memory at ptr, regardless of success ++*/ ++static inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand ) ++{ ++ int32_t oldval, res; ++ ++ do { ++ __asm__ __volatile__( ++ " ldxr %w1, [%2]\n" ++ " mov %w0, #0\n" ++ " cmp %w1, %w3\n" ++ " b.ne 1f\n" ++ " stxr %w0, %w4, [%2]\n" ++ "1:\n" ++ : "=&r" (res), "=&r" (oldval) ++ : "r" (ptr), "Ir" (value), "r" (comparand) ++ : "cc"); ++ } while (res); ++ ++ return oldval; ++} ++ ++/** ++ * Atomic CAS for 64 bit values, if *ptr==comparand, then *ptr=value, ++ * returns *ptr ++ * ++ * @param ptr pointer to value in memory to be swapped with value ++ * if *ptr==comparand ++ * @param value value to assign *ptr to if *ptr==comparand ++ * @param comparand value to compare with *ptr ++ * @return value originally in memory at ptr, regardless of success ++ */ ++static inline int64_t __TBB_machine_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand ) ++{ ++ int64_t oldval; ++ int64_t res; ++ ++ do { ++ __asm__ __volatile__( ++ " ldxr %1, [%2]\n" ++ " mov %w0, #0\n" ++ " cmp %1, %3\n" ++ " b.ne 1f\n" ++ " stxr %w0, %4, [%2]\n" ++ "1:\n" ++ : "=&r" (res), "=&r" (oldval) ++ : "r" (ptr), "Ir" (value), "r" (comparand) ++ : "cc"); ++ } while (res); ++ ++ return oldval; ++} ++ ++inline void __TBB_machine_pause (int32_t delay ) ++{ ++ while(delay>0) ++ { ++ __TBB_compiler_fence(); ++ delay--; ++ } ++} ++ ++// Machine specific atomic operations ++ ++#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C) ++#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C) ++//#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C) ++#define __TBB_Pause(V) __TBB_machine_pause(V) ++ ++// Use generics for some things ++#define __TBB_USE_GENERIC_PART_WORD_CAS 1 ++#define __TBB_USE_GENERIC_FETCH_ADD 1 ++#define __TBB_USE_GENERIC_FETCH_STORE 1 ++#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1 ++#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1 ++#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1 +diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h +index 752062e..5342877 100644 +--- a/include/tbb/tbb_machine.h ++++ b/include/tbb/tbb_machine.h +@@ -223,6 +223,8 @@ template<> struct atomic_selector<8> { + #include "machine/linux_ia64.h" + #elif __powerpc__ + #include "machine/mac_ppc.h" ++ #elif __aarch64__ ++ #include "machine/linux_aarch64.h" + #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT + #include "machine/gcc_generic.h" + #endif +@@ -391,10 +393,12 @@ void spin_wait_until_eq( const volatile T& location, const U value ) { + // - The operation assumes that the architecture consistently uses either little-endian or big-endian: + // it does not support mixed-endian or page-specific bi-endian architectures. + // This function is the only use of __TBB_BIG_ENDIAN. +-#if (__TBB_BIG_ENDIAN!=-1) ++#if (__TBB_BIG_ENDIAN==-1) + #if ( __TBB_USE_GENERIC_PART_WORD_CAS) + #error generic implementation of part-word CAS was explicitly disabled for this configuration + #endif ++#endif ++ + template<typename T> + inline T __TBB_MaskedCompareAndSwap (volatile T * const ptr, const T value, const T comparand ) { + struct endianness{ static bool is_big_endian(){ +@@ -432,7 +436,6 @@ inline T __TBB_MaskedCompareAndSwap (volatile T * const ptr, const T value, cons + else continue; // CAS failed but the bits of interest left unchanged + } + } +-#endif + template<size_t S, typename T> + inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand ); + +diff --git a/src/tbbmalloc/frontend.cpp b/src/tbbmalloc/frontend.cpp +index 4e81870..ddac9e0 100644 +--- a/src/tbbmalloc/frontend.cpp ++++ b/src/tbbmalloc/frontend.cpp +@@ -653,6 +653,14 @@ static inline unsigned int highestBitPos(unsigned int n) + # error highestBitPos() not implemented for this platform + # endif + ++#elif __aarch64__ ++ __asm__ __volatile__ ++ ( ++ "clz %0, %1\n" ++ "mov %1, %2\n" ++ "sub %0, %1, %0\n" ++ :"=&r" (pos), "=&r" (n) :"I" (31) ++ ); + #else + static unsigned int bsr[16] = {0/*N/A*/,6,7,7,8,8,8,8,9,9,9,9,9,9,9,9}; + pos = bsr[ n>>6 ]; diff --git a/meta-linaro/recipes-extra/tbb/tbb_4.1.bb b/meta-linaro/recipes-extra/tbb/tbb_4.1.bb new file mode 100644 index 00000000..c142721b --- /dev/null +++ b/meta-linaro/recipes-extra/tbb/tbb_4.1.bb @@ -0,0 +1,31 @@ +DESCRIPTION = "Parallelism library for C++ - runtime files \ + TBB is a library that helps you leverage multi-core processor \ + performance without having to be a threading expert. It represents a \ + higher-level, task-based parallelism that abstracts platform details \ + and threading mechanism for performance and scalability." +HOMEPAGE = "http://threadingbuildingblocks.org/" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://COPYING;md5=2c7f2caf277a3933e3acdf7f89d54cc1" +PRDATE = "20130116" +PR = "r${PRDATE}" + +SRC_URI = "http://threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb41_${PRDATE}oss_src.tgz \ + file://cross-compile.patch \ + file://tbb.pc" + +S = "${WORKDIR}/tbb41_${PRDATE}oss/" + +SRC_URI[md5sum] = "3809790e1001a1b32d59c9fee590ee85" +SRC_URI[sha256sum] = "4ae2c10899e3b6ef2f686013ec5901fc658444ca90178efaca6014b0665c34b6" + +do_compile() { + oe_runmake compiler=gcc arch=aarch64 runtime=cc4.7_libc2.17_kernel3.8 tbb tbbmalloc +} + +do_install() { + install -d ${D}${includedir} ${D}${libdir}/pkgconfig + rm ${S}/include/tbb/index.html -f + cp -a ${S}/include/tbb ${D}${includedir} + install -m 0755 ${B}/build/linux_*_release/lib*.so* ${D}${libdir} + install -m 0644 ${WORKDIR}/tbb.pc ${D}${libdir}/pkgconfig +} |