diff --git a/srcpkgs/mongodb/files/mongodb.conf b/srcpkgs/mongodb/files/mongodb.conf
new file mode 100644
index 0000000000..f8d829a5fe
--- /dev/null
+++ b/srcpkgs/mongodb/files/mongodb.conf
@@ -0,0 +1,539 @@
+
+
+
+
+
+
+
+
+
+
+ PKGBUILDs/community/mongodb/mongodb.conf at master · archlinuxarm/PKGBUILDs · GitHub
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Something went wrong with that request. Please try again.
+
+
+
+
+
diff --git a/srcpkgs/mongodb/files/mongodb.service b/srcpkgs/mongodb/files/mongodb.service
new file mode 100644
index 0000000000..8042ecd5d4
--- /dev/null
+++ b/srcpkgs/mongodb/files/mongodb.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=high-performance, schema-free document-oriented database
+After=syslog.target network.target
+
+[Service]
+PrivateTmp=true
+User=mongodb
+ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb/mongodb.conf
+KillSignal=SIGINT
+
+[Install]
+WantedBy=multi-user.target
diff --git a/srcpkgs/mongodb/patches/0005-ARM-support-for-ASM-operations-in-MongoDB.patch b/srcpkgs/mongodb/patches/0005-ARM-support-for-ASM-operations-in-MongoDB.patch
new file mode 100644
index 0000000000..8314bda031
--- /dev/null
+++ b/srcpkgs/mongodb/patches/0005-ARM-support-for-ASM-operations-in-MongoDB.patch
@@ -0,0 +1,181 @@
+From: Robie Basak
+Date: Sat, 20 Apr 2013 22:05:50 -0300
+Subject: ARM support for ASM operations in MongoDB
+
+This is a modified version of Jon Masters' ARM patch. I have replaced some of
+the calls whose return value semantics didn't quite match the existing x86
+assembler.
+
+Original-Author: Jon Masters
+Origin: http://lists.fedoraproject.org/pipermail/arm/2013-February/005388.html
+Last-Update: 2013-03-15
+---
+ src/mongo/platform/atomic_intrinsics_gcc.h | 69 +++++++++++++++++++++++++++++-
+ src/mongo/platform/bits.h | 2 +-
+ 2 files changed, 68 insertions(+), 3 deletions(-)
+
+diff --git src/mongo/platform/atomic_intrinsics_gcc.h src/mongo/platform/atomic_intrinsics_gcc.h
+index f8f96f0..da36685 100644
+--- src/mongo/platform/atomic_intrinsics_gcc.h
++++ src/mongo/platform/atomic_intrinsics_gcc.h
+@@ -14,14 +14,19 @@
+ */
+
+ /**
+- * Implementation of the AtomicIntrinsics::* operations for IA-32 and AMD64 systems using a
+- * GCC-compatible compiler toolchain.
++ * Implementation of the AtomicIntrinsics::* operations for IA-32, AMD64, and 32-bit ARM
++ * systems using a GCC-compatible compiler toolchain.
+ */
+
+ #pragma once
+
+ #include
+
++#if defined(__arm__)
++typedef int (__kuser_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
++#define __kuser_cmpxchg (*(__kuser_cmpxchg_t *)0xffff0fc0)
++#endif
++
+ namespace mongo {
+
+ /**
+@@ -37,31 +42,58 @@ namespace mongo {
+ static T compareAndSwap(volatile T* dest, T expected, T newValue) {
+
+ T result;
++
++#if defined(__i386__) || defined(__x86_64__)
+ asm volatile ("lock cmpxchg %[src], %[dest]"
+ : [dest] "+m" (*dest),
+ "=a" (result)
+ : [src] "r" (newValue),
+ "a" (expected)
+ : "memory", "cc");
++#endif
++
++#if defined(__arm__)
++ result = __sync_val_compare_and_swap(dest, expected, newValue);
++#endif
++
+ return result;
+ }
+
+ static T swap(volatile T* dest, T newValue) {
+
+ T result = newValue;
++
++#if defined(__i386__) || defined(__x86_64__)
+ // No need for "lock" prefix on "xchg".
+ asm volatile ("xchg %[r], %[dest]"
+ : [dest] "+m" (*dest),
+ [r] "+r" (result)
+ :
+ : "memory");
++#endif
++
++#if defined(__arm__)
++ __sync_synchronize();
++ result = __sync_lock_test_and_set(dest, newValue);
++#endif
++
+ return result;
+ }
+
+ static T load(volatile const T* value) {
++
++#if defined(__i386__) || defined(__x86_64__)
+ asm volatile ("mfence" ::: "memory");
+ T result = *value;
+ asm volatile ("mfence" ::: "memory");
++#endif
++
++#if defined(__arm__)
++ asm volatile("mcr p15, 0, r0, c7, c10, 5");
++ T result = *value;
++ asm volatile("mcr p15, 0, r0, c7, c10, 5");
++#endif
++
+ return result;
+ }
+
+@@ -70,19 +102,44 @@ namespace mongo {
+ }
+
+ static void store(volatile T* dest, T newValue) {
++
++#if defined(__i386__) || defined(__x86_64__)
+ asm volatile ("mfence" ::: "memory");
+ *dest = newValue;
+ asm volatile ("mfence" ::: "memory");
++#endif
++
++#if defined(__arm__)
++ asm volatile("mcr p15, 0, r0, c7, c10, 5");
++ *dest = newValue;
++ asm volatile("mcr p15, 0, r0, c7, c10, 5");
++#endif
++
+ }
+
+ static T fetchAndAdd(volatile T* dest, T increment) {
+
+ T result = increment;
++
++#if defined(__i386__) || defined(__x86_64__)
+ asm volatile ("lock xadd %[src], %[dest]"
+ : [dest] "+m" (*dest),
+ [src] "+r" (result)
+ :
+ : "memory", "cc");
++#endif
++
++#if defined(__arm__)
++ int old;
++
++ do {
++ old = (int)(*dest);
++ } while(__kuser_cmpxchg((int)old, (int)(old+increment),
++ (volatile int *)dest));
++
++ result = old;
++#endif
++
+ return result;
+ }
+
+@@ -105,6 +162,8 @@ namespace mongo {
+ public:
+ static T compareAndSwap(volatile T* dest, T expected, T newValue) {
+ T result = expected;
++
++#if defined(__i386__) || defined(__x86_64__)
+ asm volatile ("push %%eax\n"
+ "push %%ebx\n"
+ "push %%ecx\n"
+@@ -125,6 +184,12 @@ namespace mongo {
+ "D" (&result),
+ "d" (&newValue)
+ : "memory", "cc");
++#endif
++
++#if defined(__arm__)
++ result = __sync_val_compare_and_swap(dest, expected, newValue);
++#endif
++
+ return result;
+ }
+
+diff --git src/mongo/platform/bits.h src/mongo/platform/bits.h
+index 7afc428..75343dd 100644
+--- src/mongo/platform/bits.h
++++ src/mongo/platform/bits.h
+@@ -21,7 +21,7 @@
+
+ #if defined(__x86_64__) || defined(__amd64__) || defined(_WIN64)
+ #define MONGO_PLATFORM_64
+-#elif defined(__i386__) || defined(_WIN32)
++#elif defined(__i386__) || defined(_WIN32) || defined(__arm__)
+ #define MONGO_PLATFORM_32
+ #else
+ #error "unknown platform"
diff --git a/srcpkgs/mongodb/patches/0006-Fix-ARM-alignment-problems.patch b/srcpkgs/mongodb/patches/0006-Fix-ARM-alignment-problems.patch
new file mode 100644
index 0000000000..d03ba2739f
--- /dev/null
+++ b/srcpkgs/mongodb/patches/0006-Fix-ARM-alignment-problems.patch
@@ -0,0 +1,67 @@
+From: Robie Basak
+Date: Sat, 20 Apr 2013 22:05:50 -0300
+Subject: Fix ARM alignment problems
+
+This is a temporary workaround. We avoid double alignment issues by using
+memcpy to make sure that all doubles are aligned before accessing them.
+
+Last-Update: 2013-03-15
+---
+ src/mongo/bson/bsonelement.h | 16 +++++++++++++++-
+ src/mongo/db/key.cpp | 2 +-
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+diff --git src/mongo/bson/bsonelement.h src/mongo/bson/bsonelement.h
+index f094ab9..1ecb47f 100644
+--- src/mongo/bson/bsonelement.h
++++ src/mongo/bson/bsonelement.h
+@@ -17,7 +17,7 @@
+
+ #pragma once
+
+-#include // strlen
++#include // strlen, memcpy
+ #include
+ #include
+
+@@ -529,13 +529,27 @@ namespace mongo {
+ }
+
+ inline double BSONElement::numberDouble() const {
++#if defined(__arm__)
++ int int_result;
++ long long long_long_result;
++#endif
+ switch( type() ) {
+ case NumberDouble:
+ return _numberDouble();
+ case NumberInt:
++#if defined(__arm__)
++ memcpy(&int_result, value(), sizeof(int_result));
++ return int_result;
++#else
+ return *reinterpret_cast< const int* >( value() );
++#endif
+ case NumberLong:
++#if defined(__arm__)
++ memcpy(&long_long_result, value(), sizeof(long_long_result));
++ return (double)long_long_result;
++#else
+ return (double) *reinterpret_cast< const long long* >( value() );
++#endif
+ default:
+ return 0;
+ }
+diff --git src/mongo/db/key.cpp src/mongo/db/key.cpp
+index 3d9eaa7..95959d8 100644
+--- src/mongo/db/key.cpp
++++ src/mongo/db/key.cpp
+@@ -406,7 +406,7 @@ namespace mongo {
+ p += 8;
+ break;
+ case cdouble:
+- b.append("", (double&) *p);
++ b.append("", (reinterpret_cast< const PackedDouble& >(*p)).d);
+ p += sizeof(double);
+ break;
+ case cint:
diff --git a/srcpkgs/mongodb/template b/srcpkgs/mongodb/template
new file mode 100644
index 0000000000..d5e9496006
--- /dev/null
+++ b/srcpkgs/mongodb/template
@@ -0,0 +1,57 @@
+# Template file for 'mongodb'
+pkgname=mongodb
+version=2.4.9
+revision=1
+hostmakedepends="scons"
+makedepends="boost-devel pcre-devel snappy-devel openssl-devel libpcap-devel gperftools-devel v8-3.16-devel"
+depends=""
+conf_files="/etc/mongodb/mongodb.conf"
+systemd_services="mongodb.service on"
+system_accounts="mongodb"
+mongodb_homedir="/var/lib/mongodb"
+short_desc="high-performance, schema-free document-oriented database"
+maintainer="Enno Boland "
+homepage="http://www.mongodb.org"
+license="AGPL-3"
+distfiles="http://downloads.mongodb.org/src/mongodb-src-r${version}.tar.gz"
+checksum=40755d66419a5c9f0d9909a079b092195825773ded188ded3faf07025d02600f
+make_dirs="
+ /var/lib/mongodb 0700 mongodb mongodb
+ /var/log/mongodb 0750 mongodb mongodb"
+wrksrc="mongodb-src-r${version}"
+_scons_args=" --use-system-boost \
+ --use-system-pcre \
+ --use-system-snappy \
+ --use-system-tcmalloc \
+ --use-system-v8 \
+ --ssl \
+ --sharedclient"
+
+do_configure() {
+ find . -name SConstruct -print0 | xargs -0 sed -i "s/-Werror/-Wno-error/g"
+}
+
+do_build() {
+ scons all -j ${makejobs} \
+ --cc=$CC \
+ --cxx=$CXX \
+ --ld=$LD \
+ --libpath="${XBPS_CROSS_BASE}/usr/lib" \
+ --cpppath="${XBPS_CROSS_BASE}/usr/include" \
+ --prefix="/usr" \
+ $_scons_args
+}
+
+do_install() {
+ scons install -j ${makejobs} \
+ --cc=$CC \
+ --cxx=$CXX \
+ --ld=$LD \
+ --libpath=${XBPS_CROSS_BASE}/usr/lib \
+ --cpppath=${XBPS_CROSS_BASE}/usr/include \
+ --prefix="${DESTDIR}/usr" \
+ $_scons_args
+
+ vinstall "${FILESDIR}/mongodb.conf" 644 "etc/mongodb"
+ vinstall "${FILESDIR}/mongodb.service" 644 "usr/lib/systemd/system"
+}