nodejs: new package

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

[Peter: fix Config.in whitespace]
Signed-off-by: Daniel Price <daniel.price@gmail.com>
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
Daniel Price 2013-03-07 15:31:16 +00:00 committed by Peter Korsgaard
parent a42e10c61b
commit b31bc7d438
5 changed files with 250 additions and 0 deletions

View File

@ -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
package/nodejs/Config.in Normal file
View File

@ -0,0 +1,79 @@
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

View File

@ -0,0 +1,27 @@
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)

View File

@ -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]);

114
package/nodejs/nodejs.mk Normal file
View File

@ -0,0 +1,114 @@
#############################################################
#
# 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))