#!/bin/bash set -e set -u BUNDLE_VERSION=0.2.3 UNAME=$(uname) ARCH=$(uname -m) if [ "$UNAME" == "Linux" ] ; then if [ "$ARCH" != "i686" -a "$ARCH" != "x86_64" ] ; then echo "Unsupported architecture: $ARCH" echo "Meteor only supports i686 and x86_64 for now." exit 1 fi MONGO_NAME="mongodb-linux-${ARCH}-2.2.0" MONGO_URL="http://fastdl.mongodb.org/linux/${MONGO_NAME}.tgz" elif [ "$UNAME" == "Darwin" ] ; then SYSCTL_64BIT=$(sysctl -n hw.cpu64bit_capable 2>/dev/null || echo 0) if [ "$ARCH" == "i386" -a "1" != "$SYSCTL_64BIT" ] ; then # some older macos returns i386 but can run 64 bit binaries. # Probably should distribute binaries built on these machines, # but it should be OK for users to run. ARCH="x86_64" fi if [ "$ARCH" != "x86_64" ] ; then echo "Unsupported architecture: $ARCH" echo "Meteor only supports x86_64 for now." exit 1 fi MONGO_NAME="mongodb-osx-${ARCH}-2.2.0" MONGO_URL="http://fastdl.mongodb.org/osx/${MONGO_NAME}.tgz" else echo "This OS not yet supported" exit 1 fi # save off meteor checkout dir as final target cd `dirname $0`/.. TARGET_DIR=`pwd` DIR=`mktemp -d -t generate-dev-bundle-XXXXXXXX` trap 'rm -rf "$DIR" >/dev/null 2>&1' 0 echo BUILDING IN "$DIR" cd "$DIR" chmod 755 . umask 022 mkdir build cd build git clone git://github.com/joyent/node.git cd node git checkout v0.8.8 # Patch node to allow unsetting O_NONBLOCK on TTYs. This is a gross hack # to work around node setting process.stdin to be non-blocking. # # This is needed to allow spawning a mongo command-line process to the # user's terminal (eg 'meteor mongo'). It also fixes behavior in # emacs-shell mode. # # Related github issue: # https://github.com/joyent/node/issues/3584 # Discussion of implementing process.stdout.setBlocking(bool): # http://piscisaureus.no.de/libuv/2012-06-29#00:40:38.256 # Emacs bug this works around: # http://debbugs.gnu.org/cgi/bugreport.cgi?bug=2602 # # NOTE: there is now an unreleased fix in libuv that fixes this issue: # https://github.com/joyent/node/issues/3994 # Once this is released, we can remove this hack. This will fix the # mongo shell issue, though we may still need to do something like # "spawn('true', [], {stdio: 'inherit'})" to fix the emacs shell issue. patch -p1 < target) { NODE_SET_PROTOTYPE_METHOD(t, "getWindowSize", TTYWrap::GetWindowSize); NODE_SET_PROTOTYPE_METHOD(t, "setRawMode", SetRawMode); + // meteor + NODE_SET_PROTOTYPE_METHOD(t, "setBlocking", TTYWrap::SetBlocking); NODE_SET_METHOD(target, "isTTY", IsTTY); NODE_SET_METHOD(target, "guessHandleType", GuessHandleType); @@ -158,6 +162,39 @@ Handle TTYWrap::SetRawMode(const Arguments& args) { } +// meteor +Handle TTYWrap::SetBlocking(const Arguments& args) { + HandleScope scope; + + UNWRAP(TTYWrap) + + int fd = wrap->handle_.fd; + int set = args[0]->IsTrue(); + int r = 0; + + // implementation copied from uv__nonblock. + int flags; + + if ((flags = fcntl(fd, F_GETFL)) == -1) { + r = -1; + } else { + + // reverse of uv__nonblock. setBlocking vs setNonBlocking. + if (set) { + flags &= ~O_NONBLOCK; + } else { + flags |= O_NONBLOCK; + } + + if (fcntl(fd, F_SETFL, flags) == -1) { + r = -1; + } + } + + return scope.Close(Integer::New(r)); +} + + Handle TTYWrap::New(const Arguments& args) { HandleScope scope; diff --git a/src/tty_wrap.h b/src/tty_wrap.h index 4a3341a..01aa119 100644 --- a/src/tty_wrap.h +++ b/src/tty_wrap.h @@ -48,6 +48,7 @@ class TTYWrap : StreamWrap { static Handle IsTTY(const Arguments& args); static Handle GetWindowSize(const Arguments& args); static Handle SetRawMode(const Arguments& args); + static Handle SetBlocking(const Arguments& args); // meteor static Handle New(const Arguments& args); uv_tty_t handle_; EOF ./configure --prefix="$DIR" make -j4 make install PORTABLE=1 # PORTABLE=1 is a node hack to make npm look relative to itself instead # of hard coding the PREFIX. # export path so we use our new node for later builds export PATH="$DIR/bin:$PATH" which node which npm cd "$DIR/lib/node_modules" npm install connect@1.9.2 # not 2.x yet. sockjs doesn't work w/ new connect npm install gzippo@0.1.7 npm install optimist@0.3.4 npm install coffee-script@1.3.3 npm install less@1.3.0 npm install sass@0.5.0 npm install stylus@0.29.0 npm install nib@0.8.2 npm install mime@1.2.7 npm install semver@1.0.14 npm install handlebars@1.0.6-2 npm install mongodb@1.1.5 npm install uglify-js@1.3.3 npm install clean-css@0.6.0 npm install progress@0.0.5 npm install useragent@1.1.0 npm install request@2.11.0 npm install http-proxy@0.8.2 npm install simplesmtp@0.1.20 npm install stream-buffers@0.2.3 npm install keypress@0.1.0 # pinned at older version. 0.1.16+ uses mimelib, not mimelib-noiconv # which make the dev bundle much bigger. We need a better solution. npm install mailcomposer@0.1.15 # When adding new node modules (or any software) to the dev bundle, remember to # update LICENSE.txt! # Sockjs has a broken optional dependancy, and npm optional dependancies # don't seem to quite work. Fake it out with a checkout. git clone http://github.com/akdubya/rbytes.git npm install sockjs@0.3.1 rm -rf rbytes npm install fibers@0.6.9 # Fibers ships with compiled versions of its C code for a dozen platforms. This # bloats our dev bundle, and confuses dpkg-buildpackage and rpmbuild into # thinking that the packages need to depend on both 32- and 64-bit versions of # libstd++. Remove all the ones other than our architecture. (Expression based # on build.js in fibers source.) FIBERS_ARCH=$(node -p -e 'process.platform + "-" + process.arch + "-v8-" + /[0-9]+\.[0-9]+/.exec(process.versions.v8)[0]') cd fibers/bin mv $FIBERS_ARCH .. rm -rf * mv ../$FIBERS_ARCH . cd ../.. cd "$DIR" curl "$MONGO_URL" | tar -xz mv "$MONGO_NAME" mongodb # don't ship a number of mongo binaries. they are big and unused. these # could be deleted from git dev_bundle but not sure which we'll end up # needing. cd mongodb/bin rm bsondump mongodump mongoexport mongofiles mongoimport mongorestore mongos mongosniff mongostat mongotop mongooplog mongoperf cd ../.. echo BUNDLING cd "$DIR" echo "${BUNDLE_VERSION}" > .bundle_version.txt rm -rf build tar czf "${TARGET_DIR}/dev_bundle_${UNAME}_${ARCH}_${BUNDLE_VERSION}.tar.gz" . echo DONE