Patchwork [2/2,V5] nodejs: new package

login
register
mail settings
Submitter Daniel Price
Date March 1, 2013, 1:56 a.m.
Message ID <1362102967-10236-1-git-send-email-daniel.price@gmail.com>
Download mbox | patch
Permalink /patch/224221/
State Superseded
Headers show

Comments

Daniel Price - March 1, 2013, 1:56 a.m.
Based off of patches posted by (and Signed-off-by:) Jonathan Liu <net147@gmail.com>

Signed-off-by: Daniel Price <daniel.price@gmail.com>
---
 package/Config.in                        |    1 +
 package/nodejs/Config.in                 |   78 +++++++++++++++++++++
 package/nodejs/nodejs-v8-gregs-fix.patch |   29 ++++++++
 package/nodejs/nodejs.mk                 |  109 ++++++++++++++++++++++++++++++
 4 files changed, 217 insertions(+), 0 deletions(-)
 create mode 100644 package/nodejs/Config.in
 create mode 100644 package/nodejs/nodejs-v8-gregs-fix.patch
 create mode 100644 package/nodejs/nodejs.mk
Thomas Petazzoni - March 4, 2013, 9:19 p.m.
Dear Daniel Price,

On Thu, 28 Feb 2013 17:56:07 -0800, Daniel Price wrote:

> diff --git a/package/nodejs/Config.in b/package/nodejs/Config.in
> new file mode 100644
> index 0000000..22daade
> --- /dev/null
> +++ b/package/nodejs/Config.in
> @@ -0,0 +1,78 @@
> +config BR2_PACKAGE_NODEJS
> +	bool "nodejs"
> +	depends on BR2_INET_IPV6
> +	depends on BR2_LARGEFILE
> +	depends on BR2_TOOLCHAIN_HAS_THREADS
> +	depends on BR2_INSTALL_LIBSTDCPP
> +	depends on BR2_arm || BR2_i386 || BR2_x86_64
> +	# uses fork()
> +	depends on BR2_USE_MMU
> +	help
> +	  Event-driven I/O server-side JavaScript environment based on V8.
> +
> +	  http://nodejs.org/
> +
> +comment "nodejs requires a toolchain with C++, IPv6, large files, and threading"
> +	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_LARGEFILE || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INET_IPV6

We generally want lines like this to be split on two lines:

comment "nodejs requires a toolchain with C++, IPv6, large files, and threading"
	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_LARGEFILE || \
		!BR2_TOOLCHAIN_HAS_THREADS || !BR2_INET_IPV6


> diff --git a/package/nodejs/nodejs.mk b/package/nodejs/nodejs.mk
> new file mode 100644
> index 0000000..b30fcd4
> --- /dev/null
> +++ b/package/nodejs/nodejs.mk
> @@ -0,0 +1,109 @@
> +#############################################################
> +#
> +# nodejs
> +#
> +#############################################################
> +
> +NODEJS_VERSION = 0.8.21
> +NODEJS_SOURCE = node-v$(NODEJS_VERSION).tar.gz
> +NODEJS_SITE = http://nodejs.org/dist/v$(NODEJS_VERSION)
> +NODEJS_DEPENDENCIES = host-python host-nodejs \
> +    $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS))
> +HOST_NODEJS_DEPENDENCIES = host-python
> +NODEJS_LICENSE = MIT

Please add:

NODEJS_LICENSE_FILES = LICENSE

That said, as the LICENSE file explains, nodejs source code includes
some code from various other projects, under other licenses. Maybe the
licensing experts should tell us what value NODEJS_LICENSE should have
here. Yann? Luca? See
https://github.com/joyent/node/blob/master/LICENSE if you don't want to
download the whole nodejs source code.

> +define HOST_NODEJS_INSTALL_CMDS
> +	$(HOST_MAKE_ENV) $(MAKE) -C $(@D) install
> +endef
> +
> +ifeq ($(BR2_i386),y)
> +NODEJS_CPU=ia32
> +else ifeq ($(BR2_x86_64),y)
> +NODEJS_CPU=x64
> +else ifeq ($(BR2_arm),y)
> +NODEJS_CPU=arm
> +# V8 needs to know what floating point ABI the target is using.  There's also
> +# a 'hard' option which we're not exposing here at the moment, because
> +# buildroot itself doesn't really support it at present.
> +ifeq ($(BR2_SOFT_FLOAT),y)
> +NODEJS_ARM_FP=soft
> +else
> +NODEJS_ARM_FP=softfp
> +endif
> +endif

In fact, using BR2_SOFT_FLOAT doesn't work very well: on ARM, with an
external toolchain, BR2_SOFT_FLOAT will always be 'y', and therefore,
when NodeJS is built with a hard-float toolchain like Linaro ARM
toolchains, it doesn't work at runtime.

But that's not your fault, it's the Buildroot infrastructure that
doesn't handle this very well. So keep this as it is for now.

> +#
> +# Build the list of modules to install based on the booleans for
> +# popular modules, as well as the "additional modules" list.
> +# qstrip the whole thing to remove whitespace.
> +#
> +NODEJS_MODULES_LIST= $(call qstrip, \
> +	$(if $(BR2_PACKAGE_NODEJS_MODULES_EXPRESS),express,) \
> +	$(if $(BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT),coffee-script,) \
> +	$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))

When reviewing the previous version, I did suggest to use qstrip only
where needed, and to remove useless commas:

NODEJS_MODULES_LIST = \
	$(if $(BR2_PACKAGE_NODEJS_MODULES_EXPRESS),express) \
	$(if $(BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT),coffee-script) \
	$(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))

> +define NODEJS_INSTALL_TARGET_CMDS
> +	$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) DESTDIR=$(TARGET_DIR) install
> +
> +	# If you're having trouble with module installation, adding -d to the
> +	# npm install call below and setting npm_config_rollback=false can both
> +	# help in diagnosing the problem.
> +	if [[ -n "$(NODEJS_MODULES_LIST)" ]]; then \
> +		echo "Installing modules: $(NODEJS_MODULES_LIST)"; \
> +		(cd $(TARGET_DIR)/usr/lib; \
> +			$(TARGET_CONFIGURE_OPTS) \
> +			LD="$(TARGET_CXX)" \
> +			npm_config_arch=$(NODEJS_CPU) \
> +			npm_config_nodedir=$(BUILD_DIR)/nodejs-$(NODEJS_VERSION) \
> +			$(HOST_DIR)/usr/bin/npm install \
> +			$(NODEJS_MODULES_LIST) \
> +		) \
> +	fi
> +endef

Here as well, I already suggested doing this in a different way, when
reviewing the v4 of your patch. I don't like the shell based testing of
NODEJS_MODULES_LIST. It's much more common in Buildroot to do something
like:

ifneq ($(NODEJS_MODULES_LIST),)
define NODEJS_INSTALL_MODULES
	(cd $(TARGET_DIR)/usr/lib;
	   ...
endef
endif

define NODEJS_INSTALL_TARGET_CMDS
	$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) DESTDIR=$(TARGET_DIR) install
	$(NODEJS_INSTALL_MODULES)
endef

Also, get rid of the 'echo' when installing modules.

Once those things are fixed, then I think the patch will be good to go!

Thanks a lot for your work!

Thomas
Yann E. MORIN - March 4, 2013, 9:57 p.m.
Daniel, Thomas, Luca, All,

On Monday 04 March 2013 Thomas Petazzoni wrote:
> On Thu, 28 Feb 2013 17:56:07 -0800, Daniel Price wrote:
[--SNIP--]
> > diff --git a/package/nodejs/nodejs.mk b/package/nodejs/nodejs.mk
> > new file mode 100644
> > index 0000000..b30fcd4
> > --- /dev/null
> > +++ b/package/nodejs/nodejs.mk
> > @@ -0,0 +1,109 @@
> > +#############################################################
> > +#
> > +# nodejs
> > +#
> > +#############################################################
> > +
> > +NODEJS_VERSION = 0.8.21
> > +NODEJS_SOURCE = node-v$(NODEJS_VERSION).tar.gz
> > +NODEJS_SITE = http://nodejs.org/dist/v$(NODEJS_VERSION)
> > +NODEJS_DEPENDENCIES = host-python host-nodejs \
> > +    $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS))
> > +HOST_NODEJS_DEPENDENCIES = host-python
> > +NODEJS_LICENSE = MIT
> 
> Please add:
> 
> NODEJS_LICENSE_FILES = LICENSE
> 
> That said, as the LICENSE file explains, nodejs source code includes
> some code from various other projects, under other licenses. Maybe the
> licensing experts should tell us what value NODEJS_LICENSE should have
> here. Yann? Luca? See
> https://github.com/joyent/node/blob/master/LICENSE if you don't want to
> download the whole nodejs source code.

First: I am not an authoritative licensing expert.

What I would state would be something like:

NODEJS_LICENSE = MIT (core code); non-copyleft BSD-like (bundled libraries)

In any case, I'd leave it to the user (or his/her legal department) to sort
out the exact licensing terms by looking at the LICENSE file, which as Thomas
mentionned, shall be referenced by the NODEJS_LICENSE_FILES variable.

IIRC, the licensing infrastrucutre in Buildroot is not meant to be
authoritative, and should be regarded by the user only as a guide.

Regards,
Yann E. MORIN.
Luca Ceresoli - March 4, 2013, 10:08 p.m.
Yann E. MORIN wrote:
> Daniel, Thomas, Luca, All,
>
> On Monday 04 March 2013 Thomas Petazzoni wrote:
>> On Thu, 28 Feb 2013 17:56:07 -0800, Daniel Price wrote:
> [--SNIP--]
>>> diff --git a/package/nodejs/nodejs.mk b/package/nodejs/nodejs.mk
>>> new file mode 100644
>>> index 0000000..b30fcd4
>>> --- /dev/null
>>> +++ b/package/nodejs/nodejs.mk
>>> @@ -0,0 +1,109 @@
>>> +#############################################################
>>> +#
>>> +# nodejs
>>> +#
>>> +#############################################################
>>> +
>>> +NODEJS_VERSION = 0.8.21
>>> +NODEJS_SOURCE = node-v$(NODEJS_VERSION).tar.gz
>>> +NODEJS_SITE = http://nodejs.org/dist/v$(NODEJS_VERSION)
>>> +NODEJS_DEPENDENCIES = host-python host-nodejs \
>>> +    $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS))
>>> +HOST_NODEJS_DEPENDENCIES = host-python
>>> +NODEJS_LICENSE = MIT
>> Please add:
>>
>> NODEJS_LICENSE_FILES = LICENSE
>>
>> That said, as the LICENSE file explains, nodejs source code includes
>> some code from various other projects, under other licenses. Maybe the
>> licensing experts should tell us what value NODEJS_LICENSE should have
>> here. Yann? Luca? See
>> https://github.com/joyent/node/blob/master/LICENSE if you don't want to
>> download the whole nodejs source code.
> First: I am not an authoritative licensing expert.

Neither me...

> What I would state would be something like:
>
> NODEJS_LICENSE = MIT (core code); non-copyleft BSD-like (bundled libraries)
>
> In any case, I'd leave it to the user (or his/her legal department) to sort
> out the exact licensing terms by looking at the LICENSE file, which as Thomas
> mentionned, shall be referenced by the NODEJS_LICENSE_FILES variable.
>
> IIRC, the licensing infrastrucutre in Buildroot is not meant to be
> authoritative, and should be regarded by the user only as a guide.

I fully agree with Yann.

It is very important that Buildroot does not present the license in a
simplified way. The user should not think the license is MIT when it is 
instead
MIT and something else.

The ideal license description should be correct, concise and complete. 
When it is
not possible (such as in this case), it should be correct and concise, 
although
unavoidably incomplete.

So, I would to the least write:

NODEJS_LICENSE = MIT and others
but Yann's proposal is much more informative.


Luca
Daniel Price - March 5, 2013, 12:49 a.m.
On Mon, Mar 4, 2013 at 1:19 PM, Thomas Petazzoni
<thomas.petazzoni@free-electrons.com> wrote:
>> +comment "nodejs requires a toolchain with C++, IPv6, large files, and threading"
>> +     depends on !BR2_INSTALL_LIBSTDCPP || !BR2_LARGEFILE || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INET_IPV6
>
> We generally want lines like this to be split on two lines:

Will fix.

>> +NODEJS_LICENSE = MIT
>
> Please add:
>
> NODEJS_LICENSE_FILES = LICENSE
>
> That said, as the LICENSE file explains, nodejs source code includes
> some code from various other projects, under other licenses. Maybe the
> licensing experts should tell us what value NODEJS_LICENSE should have
> here. Yann? Luca? See
> https://github.com/joyent/node/blob/master/LICENSE if you don't want to
> download the whole nodejs source code.

I'll fix as per the subsequent suggestions.  Thanks for flagging this.

> In fact, using BR2_SOFT_FLOAT doesn't work very well: on ARM, with an
> external toolchain, BR2_SOFT_FLOAT will always be 'y', and therefore,
> when NodeJS is built with a hard-float toolchain like Linaro ARM
> toolchains, it doesn't work at runtime.
>
> But that's not your fault, it's the Buildroot infrastructure that
> doesn't handle this very well. So keep this as it is for now.

I will eventually be using an external toolchain (I think) for an
Armada XP board... so I assume I'll want hard float there?  I'm happy
to solve this some other way if there are any suggestions?

The other idea I had is to have a menuconfig item which just tells the
user to specify what they want.  I thought that seemed bad, because I
had a hard time understanding this setting, but maybe it's better
since it would actually work?

>> +#
>> +# Build the list of modules to install based on the booleans for
>> +# popular modules, as well as the "additional modules" list.
>> +# qstrip the whole thing to remove whitespace.
>> +#
>> +NODEJS_MODULES_LIST= $(call qstrip, \
>> +     $(if $(BR2_PACKAGE_NODEJS_MODULES_EXPRESS),express,) \
>> +     $(if $(BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT),coffee-script,) \
>> +     $(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))
>
> When reviewing the previous version, I did suggest to use qstrip only
> where needed, and to remove useless commas:
>
> NODEJS_MODULES_LIST = \
>         $(if $(BR2_PACKAGE_NODEJS_MODULES_EXPRESS),express) \
>         $(if $(BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT),coffee-script) \
>         $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))

I tried to clarify with the comment I added: the qstrip of everything
is important when you mix in the shell.  Otherwise you wind up with
something like:  if [[ -n "   " ]], and the -n test fails.  At least,
that's what I saw.  That said, your other suggestion about using
makefile defines should eliminate this problem, so I can switch over.
The useless commas were an oversight, sorry.

> Here as well, I already suggested doing this in a different way, when
> reviewing the v4 of your patch. I don't like the shell based testing of
> NODEJS_MODULES_LIST. It's much more common in Buildroot to do something
> like:

Ok-- I took as a suggestion, and didn't know this was so much against
the project's style.  Will fix as per your direction.

> Also, get rid of the 'echo' when installing modules.

Ok.

> Once those things are fixed, then I think the patch will be good to go!
>
> Thanks a lot for your work!

Thanks for your hard work in reviewing it, and making it easy for a
new contributor.

        -dp

--
Daniel.Price@gmail.com; Twitter: @danielbprice
Daniel Price - March 5, 2013, 12:52 a.m.
On Mon, Mar 4, 2013 at 2:08 PM, Luca Ceresoli <luca@lucaceresoli.net> wrote:
> Yann E. MORIN wrote:
>> What I would state would be something like:
>>
>> NODEJS_LICENSE = MIT (core code); non-copyleft BSD-like (bundled
>> libraries)
>>
<snip>
>
> So, I would to the least write:
>
> NODEJS_LICENSE = MIT and others
> but Yann's proposal is much more informative.

Thank you for the suggestions.  I will catalog all of the licenses and
summarize as you suggested for the next version of the patch.

       -dp

--
Daniel.Price@gmail.com; Twitter: @danielbprice
Thomas Petazzoni - March 5, 2013, 4:37 a.m.
Dear Luca Ceresoli,

On Mon, 04 Mar 2013 23:08:06 +0100, Luca Ceresoli wrote:

> unavoidably incomplete.
> 
> So, I would to the least write:
> 
> NODEJS_LICENSE = MIT and others
> but Yann's proposal is much more informative.

I agree that Yann's proposal is much more informative. "others" is very
vague. Knowing that the "other" licenses are BSD-like tells the user
that the entire nodejs stuff is under a non-copyleft license, which is
quite important.

Thomas
Thomas Petazzoni - March 5, 2013, 4:42 a.m.
Dear Daniel Price,

On Mon, 4 Mar 2013 16:49:58 -0800, Daniel Price wrote:

> > In fact, using BR2_SOFT_FLOAT doesn't work very well: on ARM, with an
> > external toolchain, BR2_SOFT_FLOAT will always be 'y', and therefore,
> > when NodeJS is built with a hard-float toolchain like Linaro ARM
> > toolchains, it doesn't work at runtime.
> >
> > But that's not your fault, it's the Buildroot infrastructure that
> > doesn't handle this very well. So keep this as it is for now.
> 
> I will eventually be using an external toolchain (I think) for an
> Armada XP board... so I assume I'll want hard float there?  I'm happy
> to solve this some other way if there are any suggestions?
> 
> The other idea I had is to have a menuconfig item which just tells the
> user to specify what they want.  I thought that seemed bad, because I
> had a hard time understanding this setting, but maybe it's better
> since it would actually work?

I don't -yet- have a precise view on how to solve this. As you can see
in http://elinux.org/Buildroot:DeveloperDaysELCE2012, the topic of
floating point support has already been discussed in the past: 

  """
  FP stuff: we now have a single SOFT_FLOAT option, but actually
  there's a lot more variation: neon, vfpv3, softfp, .... To support
  this well, we can add a lot of extra config options to
  semi-automatically select the correct float options based on the
  subarchitecture. There is some cross-dependency with the external
  toolchains, but it's doable. There should still be an option to
  manually override the float options for exotic cases. ARM thumb adds
  another layer of complexity. Someone should take the lead on making
  this easier.
  """

So some work is needed to figure out the right way to handle this,
taking into account both the needs of internal/Crosstool-NG backends,
and the needs of the external backend.

> > When reviewing the previous version, I did suggest to use qstrip only
> > where needed, and to remove useless commas:
> >
> > NODEJS_MODULES_LIST = \
> >         $(if $(BR2_PACKAGE_NODEJS_MODULES_EXPRESS),express) \
> >         $(if $(BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT),coffee-script) \
> >         $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))
> 
> I tried to clarify with the comment I added: the qstrip of everything
> is important when you mix in the shell.  Otherwise you wind up with
> something like:  if [[ -n "   " ]], and the -n test fails.  At least,
> that's what I saw.  That said, your other suggestion about using
> makefile defines should eliminate this problem, so I can switch over.

Aah, I see, ok. If it works with the make-based test on
NODEJS_MODULES_LIST rather than the shell-based test, then it would be
better.

> Thanks for your hard work in reviewing it, and making it easy for a
> new contributor.

Thanks to you! It's not common to see a new contributor going through 5
versions of a patch set and still being responsive and willing to fix
issues! :-)

Best regards,

Thomas

Patch

diff --git a/package/Config.in b/package/Config.in
index 0afcd7d..cc08713 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -314,6 +314,7 @@  source "package/cpanminus/Config.in"
 endmenu
 endif
 source "package/microperl/Config.in"
+source "package/nodejs/Config.in"
 source "package/php/Config.in"
 source "package/python/Config.in"
 source "package/python3/Config.in"
diff --git a/package/nodejs/Config.in b/package/nodejs/Config.in
new file mode 100644
index 0000000..22daade
--- /dev/null
+++ b/package/nodejs/Config.in
@@ -0,0 +1,78 @@ 
+config BR2_PACKAGE_NODEJS
+	bool "nodejs"
+	depends on BR2_INET_IPV6
+	depends on BR2_LARGEFILE
+	depends on BR2_TOOLCHAIN_HAS_THREADS
+	depends on BR2_INSTALL_LIBSTDCPP
+	depends on BR2_arm || BR2_i386 || BR2_x86_64
+	# uses fork()
+	depends on BR2_USE_MMU
+	help
+	  Event-driven I/O server-side JavaScript environment based on V8.
+
+	  http://nodejs.org/
+
+comment "nodejs requires a toolchain with C++, IPv6, large files, and threading"
+	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_LARGEFILE || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INET_IPV6
+
+if BR2_PACKAGE_NODEJS
+
+menu "Module Selection"
+
+config BR2_PACKAGE_NODEJS_NPM
+	bool "NPM for the target"
+	select BR2_PACKAGE_OPENSSL
+	help
+	  NPM is the package manager for the Node JavaScript platform.
+	  Note that enabling NPM on the target also selects OpenSSL for the
+	  target.
+
+	  http://www.npmjs.org
+
+	  Note that NPM is always built for the buildroot host.
+
+config BR2_PACKAGE_NODEJS_MODULES_EXPRESS
+	bool "Express web application framework"
+	help
+	  Express is a minimal and flexible node.js web application
+	  framework, providing a robust set of features for building
+	  single and multi-page, and hybrid web applications. 
+
+	  http://www.expressjs.com
+	  https://github.com/visionmedia/express
+
+config BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT
+	bool "CoffeeScript"
+	help
+	  CoffeeScript is a little language that compiles into JavaScript.
+
+	  http://www.coffeescript.org
+
+config BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL
+	string "Additional modules"
+	help
+	  List of space-separated nodejs modules to install via npm.
+	  See https://npmjs.org/ to find modules and 'npm help install'
+	  for available installation methods.  For repeatable builds,
+	  download and save tgz files or clone git repos for the
+	  components you care about.
+
+	  Example: serialport uglify-js@1.3.4 /my/module/mymodule.tgz git://github.com/someuser/somemodule.git#v1.2
+
+	  This would install the serialport module (at the newest version),
+	  the uglify-js module at 1.3.4, a module from a filesystem path,
+	  and a module from a git repository.
+
+config BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS
+	string "Additional module dependencies"
+	help
+	  List of space-separated buildroot recipes which must be built before
+	  your npms can be installed.  For example, if in 'Additional modules'
+	  you specified 'node-curl' (see:
+	  https://github.com/jiangmiao/node-curl), you could then specify
+	  'libcurl' here, to ensure that buildroot builds the libcurl package,
+	  and does so before building your node modules.
+
+endmenu
+
+endif
diff --git a/package/nodejs/nodejs-v8-gregs-fix.patch b/package/nodejs/nodejs-v8-gregs-fix.patch
new file mode 100644
index 0000000..4af33bc
--- /dev/null
+++ b/package/nodejs/nodejs-v8-gregs-fix.patch
@@ -0,0 +1,29 @@ 
+Fix compilation for ARM/uClibc
+Patch from Remi Duraffort <remi.duraffort@st.com>, taken from
+https://code.google.com/p/v8/source/detail?r=12094
+
+Signed-off-by: Daniel Price <daniel.price@gmail.com>
+
+--- a/deps/v8/src/platform-linux.cc
++++ b/deps/v8/src/platform-linux.cc
+@@ -1025,7 +1025,8 @@ static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) {
+   sample->fp = reinterpret_cast<Address>(mcontext.gregs[REG_RBP]);
+ #elif V8_HOST_ARCH_ARM
+ // An undefined macro evaluates to 0, so this applies to Android's Bionic also.
+-#if (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
++#if (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3) && \
++     !defined(__UCLIBC__))
+   sample->pc = reinterpret_cast<Address>(mcontext.gregs[R15]);
+   sample->sp = reinterpret_cast<Address>(mcontext.gregs[R13]);
+   sample->fp = reinterpret_cast<Address>(mcontext.gregs[R11]);
+@@ -1033,7 +1034,8 @@ static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) {
+   sample->pc = reinterpret_cast<Address>(mcontext.arm_pc);
+   sample->sp = reinterpret_cast<Address>(mcontext.arm_sp);
+   sample->fp = reinterpret_cast<Address>(mcontext.arm_fp);
+-#endif  // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
++#endif  // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3) &&
++        //  !defined(__UCLIBC__))
+ #elif V8_HOST_ARCH_MIPS
+   sample->pc = reinterpret_cast<Address>(mcontext.pc);
+   sample->sp = reinterpret_cast<Address>(mcontext.gregs[29]);
+
diff --git a/package/nodejs/nodejs.mk b/package/nodejs/nodejs.mk
new file mode 100644
index 0000000..b30fcd4
--- /dev/null
+++ b/package/nodejs/nodejs.mk
@@ -0,0 +1,109 @@ 
+#############################################################
+#
+# nodejs
+#
+#############################################################
+
+NODEJS_VERSION = 0.8.21
+NODEJS_SOURCE = node-v$(NODEJS_VERSION).tar.gz
+NODEJS_SITE = http://nodejs.org/dist/v$(NODEJS_VERSION)
+NODEJS_DEPENDENCIES = host-python host-nodejs \
+    $(call qstrip,$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL_DEPS))
+HOST_NODEJS_DEPENDENCIES = host-python
+NODEJS_LICENSE = MIT
+
+ifeq ($(BR2_PACKAGE_OPENSSL),y)
+	NODEJS_DEPENDENCIES += openssl
+endif
+
+define HOST_NODEJS_CONFIGURE_CMDS
+	# Build with the static, built-in OpenSSL which is supplied as part of
+	# the nodejs source distribution.  This is needed on the host because
+	# NPM is non-functional without it, and host-openssl isn't part of
+	# buildroot.
+	(cd $(@D); \
+                ./configure \
+		--prefix=$(HOST_DIR)/usr \
+		--without-snapshot \
+		--without-dtrace \
+		--without-etw \
+	)
+endef
+
+define HOST_NODEJS_BUILD_CMDS
+	$(HOST_MAKE_ENV) $(MAKE) -C $(@D)
+endef
+
+define HOST_NODEJS_INSTALL_CMDS
+	$(HOST_MAKE_ENV) $(MAKE) -C $(@D) install
+endef
+
+ifeq ($(BR2_i386),y)
+NODEJS_CPU=ia32
+else ifeq ($(BR2_x86_64),y)
+NODEJS_CPU=x64
+else ifeq ($(BR2_arm),y)
+NODEJS_CPU=arm
+# V8 needs to know what floating point ABI the target is using.  There's also
+# a 'hard' option which we're not exposing here at the moment, because
+# buildroot itself doesn't really support it at present.
+ifeq ($(BR2_SOFT_FLOAT),y)
+NODEJS_ARM_FP=soft
+else
+NODEJS_ARM_FP=softfp
+endif
+endif
+
+define NODEJS_CONFIGURE_CMDS
+	(cd $(@D); \
+		$(TARGET_CONFIGURE_OPTS) \
+		LD="$(TARGET_CXX)" \
+		./configure \
+		--prefix=/usr \
+		--without-snapshot \
+		$(if $(BR2_PACKAGE_OPENSSL),--shared-openssl,--without-ssl) \
+		$(if $(BR2_PACKAGE_NODEJS_NPM),,--without-npm) \
+		--without-dtrace \
+		--without-etw \
+		--dest-cpu=$(NODEJS_CPU) \
+		$(if $(NODEJS_ARM_FP),--with-arm-float-abi=$(NODEJS_ARM_FP)) \
+		--dest-os=linux \
+	)
+endef
+
+define NODEJS_BUILD_CMDS
+	$(TARGET_MAKE_ENV) $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
+endef
+
+#
+# Build the list of modules to install based on the booleans for
+# popular modules, as well as the "additional modules" list.
+# qstrip the whole thing to remove whitespace.
+#
+NODEJS_MODULES_LIST= $(call qstrip, \
+	$(if $(BR2_PACKAGE_NODEJS_MODULES_EXPRESS),express,) \
+	$(if $(BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT),coffee-script,) \
+	$(BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL))
+
+define NODEJS_INSTALL_TARGET_CMDS
+	$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) DESTDIR=$(TARGET_DIR) install
+
+	# If you're having trouble with module installation, adding -d to the
+	# npm install call below and setting npm_config_rollback=false can both
+	# help in diagnosing the problem.
+	if [[ -n "$(NODEJS_MODULES_LIST)" ]]; then \
+		echo "Installing modules: $(NODEJS_MODULES_LIST)"; \
+		(cd $(TARGET_DIR)/usr/lib; \
+			$(TARGET_CONFIGURE_OPTS) \
+			LD="$(TARGET_CXX)" \
+			npm_config_arch=$(NODEJS_CPU) \
+			npm_config_nodedir=$(BUILD_DIR)/nodejs-$(NODEJS_VERSION) \
+			$(HOST_DIR)/usr/bin/npm install \
+			$(NODEJS_MODULES_LIST) \
+		) \
+	fi
+endef
+
+# node.js configure is a Python script and does not use autotools
+$(eval $(generic-package))
+$(eval $(host-generic-package))