Commit b31bc7d4 authored by Daniel Price's avatar Daniel Price Committed by Peter Korsgaard
Browse files

nodejs: new package



Based off of patches posted by (and Signed-off-by: default avatar) Jonathan Liu <net147@gmail.com>

[Peter: fix Config.in whitespace]
Signed-off-by: default avatarDaniel Price <daniel.price@gmail.com>
Acked-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: default avatarPeter Korsgaard <jacmet@sunsite.dk>
parent a42e10c6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ source "package/wsapi/Config.in"
source "package/xavante/Config.in"
endmenu
endif
source "package/nodejs/Config.in"
source "package/perl/Config.in"
if BR2_PACKAGE_PERL
menu "Perl libraries/modules"
+79 −0
Original line number Diff line number Diff line
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
+27 −0
Original line number Diff line number Diff line
Remove dependency on Python bz2 module

The Python bz2 module is only needed in certain cases, so only import
it when needed. In the normal nodejs build, this allows to remove the
dependency on this module.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Index: b/deps/v8/tools/js2c.py
===================================================================
--- a/deps/v8/tools/js2c.py
+++ b/deps/v8/tools/js2c.py
@@ -33,7 +33,6 @@
 
 import os, re, sys, string
 import jsmin
-import bz2
 
 
 def ToCAsciiArray(lines):
@@ -344,6 +343,7 @@
   else:
     raw_sources_declaration = RAW_SOURCES_COMPRESSION_DECLARATION
     if env['COMPRESSION'] == 'bz2':
+      import bz2
       all_sources = bz2.compress("".join(all_sources))
     total_length = len(all_sources)
     sources_data = ToCArray(all_sources)
+29 −0
Original line number Diff line number Diff line
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]);
+114 −0
Original line number Diff line number Diff line
#############################################################
#
# nodejs
#
#############################################################

NODEJS_VERSION = 0.8.22
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 (core code); MIT, Apache and BSD family licenses (Bundled components)
NODEJS_LICENSE_FILES = LICENSE

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.
#
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))

#
# We can only call NPM if there's something to install.
#
ifneq ($(NODEJS_MODULES_LIST),)
define NODEJS_INSTALL_MODULES
	# 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.
	(cd $(TARGET_DIR)/usr/lib && mkdir -p node_modules && \
		$(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) \
	)
endef
endif

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

# node.js configure is a Python script and does not use autotools
$(eval $(generic-package))
$(eval $(host-generic-package))