This post will describe the state of Native Client in general, based on
week 2 of my
original four week plan. In the next post, I'll
link to my work so far, and compare the Native Client and the Android
efforts. Recapping, the end goal of these explorations is a platform for the next generation of the
Sugar learning environment.
To begin, the Native Client (NaCl) plugin is fairly mature in a number of
areas. Version
0.2 of the NaCl SDK was recently released (a
version number which substantiates the "fairly" in my previous
sentence), and the NativeClient plugin is currently shipping in Chrome
(versions 10 and 11), although you have to manually turn on a
preference in the about:flags dialog to enable it. The
NaCl toolchain is much more standard than the Android NDK toolchain
I
discussed previously, and the robust
naclports tree shows
that the patches required for NaCl ports of common packages
tend not
to be too evil. The
Tcl
interpreter and
Qt tookit port demos show that fairly complex pieces of code can be deployed today on NaCl.
On the other hand, there are three main difficulties:
- The default NaCl toolchain uses newlib as its standard C library.
This is consistent with Google's preference for BSD-licensed code in
SDKs they provide to the public (see the discussion of Bionic in the
Android SDK). However, there also exists a branch of the SDK which
uses glibc. The glibc branch supports several additional
features, like shared library support. However, it is unclear
whether this will ever be a "supported" part of the SDK. If glibc does
become supported, it is unlikely ever to be the only supported libc;
the BSD-licensed newlib will need to remain available as an option.
(Yes, the LGPL license of glibc shouldn't inspire such paranoia, but
Google has elected not to undertake the education of all prospective
third-party developers.)
- The naclports project, although fairly robust, is driven between the
Scylla and Charybdis of compatibility. The goal is that all
the code in naclports be buildable at all times on all three major
platforms: Windows, Mac, and Linux. Further, it should support both
x86_32 and x86_64 backends, and ideally ARM and pNaCl as well.
It's auto-built against the latest SDK sources, but should also work
on the latest released SDK. And with the addition of the
glibc/newlib split discussed above, the possible build targets are
multiplied further. Needless to say, keeping the tree building
against such a large number of variants is not an easy task, and
naclports is usually broken in some way. In practice, most developers
seem to pay attention to some subset (say, x86_32/newlib/Linux host),
but it's hard to push patches upstream without worrying about breaking
some obscure target. It might be best to base future work on a
proper package technology, like (say) dpkg-cross.
- In general, a lot of interesting NaCl development has occurred on
branches that are not easily integrated. I've already mentioned glibc
support, which is a toolchain branch; shared library support is on
another branch that requires a new chromium plugin as well. At
various times different means have been implemented to run NaCl
binaries "natively" outside the sandbox (for example, in order to test
some feature at build time, or auto-generate some piece of code via
introspection). These efforts live on abandoned branches, while the
"official" means to do this is incomplete. Similarly, a lot of
interesting NaCl work used the now-abandoned legacy "NPAPI" plugin
interface to interact with the browser. It was followed by the
"Pepper" plugin interface, which was itself abandoned. Current
work uses the Pepper2 browser plugin APIs, which
(unfortunately) have not yet been implemented in non-Chrome browsers
and continue to flux about. Many interesting browser interactions
exist only in deprecated Pepper APIs, not having yet been built into
Pepper2. ARM and pNaCl work also appears to be on unintegrated
branches. There are a number of different gdb support
strategies.
None of these difficulties is insurmountable-and in fact, some
are side-effects of the desirable active development and
productization of Native Client. To date I've done my work on the
(more compatible) SDK v0.1 and the (more upstreamable) newlib library.
So far newlib has not been a huge obstacle, and this basis allows my
patches and ports to be more broadly useful. This might change in the
future-certainly at some point we need to move to ARM and/or
pNaCl for XO-3, which will probably require building chrome and the NaCl
toolchain from scratch. At that point, it may be worth further
exploring the non-mainstream branches.