blob: ec083a895ea2971dbf04e7cb791659e8d0c80c0a [file] [log] [blame]
.. _io2014:
###################
Building a NaCl App
###################
In the browser!
---------------
Follow along with Brad Nelson's Google I/O 2014 talk.
Explore our new in-browser development environment and debugger.
Learn how easy it is to edit, build, and debug NaCl application
all in your desktop web browser or on a Chromebook.
Work either on-line or off-line!
.. raw:: html
<iframe class="video" width="500" height="281"
src="//www.youtube.com/embed/OzNuzBDEWzk?rel=0" frameborder="0"></iframe>
.. include:: nacldev/web_tools_note.inc
Installation
============
The setup process currently requires several steps.
We're working to reduce the number of steps in future releases.
As the process gets easier, we'll update this page.
To install the development environment:
* Install the `NaCl Development Environment <https://chrome.google.com/webstore/detail/nacl-development-environm/aljpgkjeipgnmdpikaajmnepbcfkglfa>`_.
* Navigate to: chrome://flags and:
* Enable **Native Client**.
* Restart your browser by clicking **Relaunch Now**.
* First run is slow (as it downloads and installs packages). Launch and allow
initial install to complete before first use.
When initially experimenting with the development environment,
at this time, we recommend you run it without the debugger activated.
Once you're ready to apply the debugger, follow these steps:
* Install a usable version of
`Chrome Linux (M36+, Dev or Beta channel) <http://www.chromium.org/getting-involved/dev-channel>`_.
* Install the `Native Client Debugger Extension <https://chrome.google.com/webstore/detail/nacl-debugger/ncpkkhabohglmhjibnloicgdfjmojkfd>`_.
* Install `Native Client GDB <https://chrome.google.com/webstore/detail/gdb/gkjoooooiaohiceibmdleokniplmbahe>`_.
* Navigate to: chrome://flags and:
* Enable **Native Client GDB-based debugging**.
* Restart your browser by clicking **Relaunch Now**.
* NOTE: If you experience unexplained hangs, disable GDB-based debugging
temporarily and try again.
.. include:: nacldev/editing.inc
.. include:: nacldev/git.inc
Tour (follow the video)
=======================
Create a working directory and go into it::
$ mkdir work
$ cd work
Download a zip file containing our sample::
$ curl http://nacltools.storage.googleapis.com/io2014/voronoi.zip -O
$ ls -l
Unzip the sample::
$ unzip voronoi.zip
Go into the sample and take a look at the files inside::
$ cd voronoi
$ ls
Our project combines voronoi.cc with several C++ libraries to produce a NEXE
(or Native Client Executable).
.. image:: /images/voronoi1.png
The resulting application combines the NEXE with some Javascript to load
the NaCl module, producing the complete application.
.. image:: /images/voronoi2.png
Let's use git (a revision control program) to track our changes.
First, create a new repository::
$ git init
Add everything here::
$ git add .
Then commit our starting state::
$ git commit -m "imported voronoi demo"
Now, likes run **make** to compile our program (NOTE: Changed since video,
we've got Makefiles!)::
$ make
Oops, we get this error::
voronoi.cc: In member function 'void Voronoi::Update()':
voronoi.cc:506: error: 'struct PSContext2D_t' has no member named 'hieght'
We'll need to start an editor to fix this.
You'll want to change *hieght* to *height* on line 506.
Then rebuild::
$ make -j10
Lets look at the diff::
$ git diff
And commit our fix::
$ git commit -am "fixed build error"
To test our application, we run a local web server, written in python.
Run the server with this command (NOTE: Running through a Makefile
now)::
$ make serve
Then, navigate to http://localhost:5103/ to test the demo.
If you follow along with the demo video, you will discover the sample crashes
when you change the thread count.
Debugging
=========
If you haven't installed the debugger at this point, skip to the next section.
At this point, if you have the debugger installed, you should be able to open
the developer console and view the resulting crash.
You can see a backtrace with::
bt
You can see active threads with::
info threads
Currently, symbol information is limited for GLibC executables.
We have improvements coming that will improve the experience further.
For newlib and PNaCl executables you can retrieve full symbols information
with::
remote get irt irt
add-symbol-file irt
remote get nexe nexe
add-symbol-file nexe
Fix it up
=========
Return to the development environment and stop the test server,
by pressing Ctrl-C.
Open your editor again, navigate to line 485 and change *valu* to *value*.
Then rebuild::
$ make -j10
Check the diff and commit our fix::
$ git diff
$ git commit -am "fixed thread ui bug"
Now look at your commit history::
$ git log
Run the demo again. And everything now works::
$ make serve
Thanks
======
Thanks for checking out our environment.
Things are rapidly changing and in the coming months you can expect to see
further improvements and filling out of our platform and library support.
Follow the status of the NaCl Dev Environment at :doc:`this page <nacldev>`.