Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / native_client_sdk / src / doc / reference / nacl-manifest-format.rst
blob2df2de1d162cff6b4d39aa12be0afd43d108f6ed
1 ###################################
2 Native Client Manifest (nmf) Format
3 ###################################
5 .. contents::
6   :local:
7   :backlinks: none
8   :depth: 2
10 Overview
11 ========
13 Every Native Client application has a `JSON-formatted <http://www.json.org/>`_
14 NaCl Manifest File (``nmf``). The ``nmf`` tells the browser where to
15 download and load your Native Client application files and libraries.
16 The file can also contain configuration options.
19 Field summary
20 =============
22 The following shows the supported top-level manifest fields. There is one
23 section that discusses each field in detail.  The only field that is required
24 is the ``program`` field.
26 .. naclcode::
28   {
29     // Required
30     "program": { ... }
32     // Only required for glibc
33     "files": { ... }
34   }
36 Field details
37 =============
39 program
40 -------
42 The ``program`` field specifies the main program that will be loaded
43 in the Native Client runtime environment. For a Portable Native Client
44 application, this is a URL for the statically linked bitcode ``pexe`` file.
45 For architecture-specific Native Client applications, this is a list
46 of URLs, one URL for each supported architecture (currently the choices
47 are "arm", "x86-32", and "x86-64"). For a dynamically linked executable,
48 ``program`` is the dynamic loader used to load the dynamic executable
49 and its dynamic libraries.  See the :ref:`semantics <nmf_url_resolution>`
50 section for the rules on URL resolution.
52 Example of a ``program`` for Portable Native Client:
53 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
55 .. naclcode::
57   {
58     "program": {
59       "portable": {
60         // Required
61         "pnacl-translate": {
62           // url is required
63           "url": "url_to_my_pexe",
65           // optlevel is optional
66           "optlevel": 2
67         },
68         // pnacl-debug is optional
69         "pnacl-debug": {
70           // url is required
71           "url": "url_to_my_bitcode_bc",
73           // optlevel is optional
74           "optlevel": 0
75         }
76       }
77     }
78   }
80 .. _pnacl_nmf_optlevels:
82 Portable Native Client applications can also specify an ``optlevel`` field.
83 The ``optlevel`` field is an optimization level *hint*, which is a number
84 (zero and higher). Higher numbers indicate more optimization effort.
85 Setting a higher optimization level will improve the application's
86 performance, but it will also slow down the first load experience.
87 The default is ``optlevel`` is currently ``2``, and values higher
88 than 2 are no different than 2. If compute speed is not as important
89 as first load speed, an application could specify an ``optlevel``
90 of ``0``. Note that ``optlevel`` is only a *hint*. In the future, the
91 Portable Native Client translator and runtime may *automatically* choose
92 an ``optlevel`` to best balance load time and application performance.
94 A ``pnacl-debug`` section can specify an unfinalized pnacl llvm bitcode file
95 for debugging. The ``url`` provided in this section will be used when Native
96 Client debugging is enabled with either the ``--enable-nacl-debug`` Chrome
97 command line switch, or via ``about://flags``.
100 Example of a ``program`` for statically linked Native Client executables
101 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
103 .. naclcode::
105   {
106     "program": {
107       // Required: at least one entry
108       // Add one of these for each architecture supported by the application.
109       "arm": { "url": "url_to_arm_nexe" },
110       "x86-32": { "url": "url_to_x86_32_nexe" },
111       "x86-64": { "url": "url_to_x86_64_nexe" }
112     }
113   }
115 Example of a ``program`` for dynamically linked Native Client executables
116 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
118 .. naclcode::
120   {
121     "program": {
122       // Required: at least one entry
123       // Add one of these for each architecture supported by the application.
124       "x86-32": { "url": "lib32/runnable-ld.so" },
125       "x86-64": { "url": "lib64/runnable-ld.so" }
126     },
127     // discussed in next section
128     "files": {
129       "main.nexe": {
130         "x86-32": { "url": "url_to_x86_32_nexe" },
131         "x86-64": { "url": "url_to_x86_64_nexe" }
132       },
133       // ...
134     }
135   }
138 files
139 -----
141 The ``files`` field specifies a dictionary of file resources to be used by a
142 Native Client application. This is not supported and not needed by Portable
143 Native Client applications (use the PPAPI `URL Loader interfaces
144 </native-client/pepper_stable/cpp/classpp_1_1_u_r_l_loader>`_ to load resources
145 instead). However, the ``files`` manifest field is important for dynamically
146 linked executables, which must load files before PPAPI is initialized. The
147 ``files`` dictionary should include the main dynamic program and its dynamic
148 libraries.  There should be one file entry that corresponds to each a dynamic
149 library. Each file entry is a dictionary of supported architectures and the
150 URLs where the appropriate Native Client shared object (``.so``) for that
151 architecture may be found.
153 Since ``program`` is used to refer to the dynamic linker that comes
154 with the NaCl port of glibc, the main program is specified in the
155 ``files`` dictionary. The main program is specified under the
156 ``"main.nexe"`` field of the ``files`` dictionary.
159 .. naclcode::
161   {
162     "program": {
163       "x86-64": {"url": "lib64/runnable-ld.so"},
164       "x86-32": {"url": "lib32/runnable-ld.so"}
165     },
166     "files": {
167       "main.nexe" : {
168         "x86-64": {"url": "pi_generator_x86_64.nexe"},
169         "x86-32": {"url": "pi_generator_x86_32.nexe"}
170       },
171       "libpthread.so.5055067a" : {
172         "x86-64": {"url": "lib64/libpthread.so.5055067a"},
173         "x86-32": {"url": "lib32/libpthread.so.5055067a"}
174       },
175       "libppapi_cpp.so" : {
176         "x86-64": {"url": "lib64/libppapi_cpp.so"},
177         "x86-32": {"url": "lib32/libppapi_cpp.so"}
178       },
179       "libstdc++.so.6" : {
180         "x86-64": {"url": "lib64/libstdc++.so.6"},
181         "x86-32": {"url": "lib32/libstdc++.so.6"}
182       },
183       "libm.so.5055067a" : {  
184         "x86-64": {"url": "lib64/libm.so.5055067a"},
185         "x86-32": {"url": "lib32/libm.so.5055067a"}
186       },
187       "libgcc_s.so.1" : {
188         "x86-64": {"url": "lib64/libgcc_s.so.1"},
189         "x86-32": {"url": "lib32/libgcc_s.so.1"}
190       },
191       "libc.so.5055067a" : {  
192         "x86-64": {"url": "lib64/libc.so.5055067a"},
193         "x86-32": {"url": "lib32/libc.so.5055067a"}
194       }
195     }
196   }
199 Dynamic libraries that the dynamic program depends upon and links in at program
200 startup must be listed in the ``files`` dictionary. Library files that are
201 loaded after startup using ``dlopen()`` should either be listed in the ``files``
202 dictionary, or should be made accessible by the ``nacl_io`` library.  The
203 ``nacl_io`` library provides various file system *mounts* such as HTTP-based
204 file systems and memory-based file systems. The Native Client SDK includes
205 helpful tools for determining library dependencies and generating NaCl manifest
206 files for programs that that use dynamic linking. See
207 :ref:`dynamic_loading_manifest`.
209 Semantics
210 =========
212 Schema validation
213 -----------------
215 Manifests are validated before the program files are downloaded.
216 Schema validation checks the following properties:
218 * The schema must be valid JSON.
219 * The schema must conform to the grammar given above.
220 * If the program is not a PNaCl program, then the manifest
221   must contain at least one applicable match for the current ISA
222   in "program" and in every entry within "files".
224 If the manifest contains a field that is not in the official
225 set of supported fields, it is ignored. This allows the grammar to be
226 extended without breaking compatibility with older browsers.
229 Nexe matching
230 -------------
232 For Portable Native Client, there are no architecture variations, so
233 matching is simple.
235 For Native Client, the main nexe for the application is determined by
236 looking up the browser's current architecture in the ``"program"``
237 dictionary. Failure to provide an entry for the browser's architecture
238 will result in a load error.
241 File matching
242 -------------
244 All files (shared objects and other assets, typically) are looked up
245 by a UTF8 string that is the file name. To load a library with a certain
246 file name, the browser searches the ``"files"`` dictionary for an entry
247 corresponding to that file name. Failure to find that name in the
248 ``"files"`` dictionary is a run-time error. The architecture matching
249 rule for all files is from most to least specific. That is, if there
250 is an exact match for the current architecture (e.g., "x86-32") it is
251 used in preference to more general "portable". This is useful for
252 non-architecture-specific asset files. Note that ``"files"`` is only
253 useful for files that must be loaded early in application startup
254 (before PPAPI interfaces are initialized to provide the standard
255 file loading mechanisms).
258 URL of the nmf file, from ``<embed>`` src, and data URI
259 -------------------------------------------------------
261 The URL for the manifest file should be specified by the ``src`` attribute
262 of the ``<embed>`` tag for a Native Client module instance. The URL for
263 a manifest file can refer to an actual file, or it can be a 
264 `data URI <http://en.wikipedia.org/wiki/Data_URI_scheme>`_
265 representing the contents of the file. Specifying the ``nmf`` contents
266 inline with a data URI can help reduce the amount of network traffic
267 required to load the Native Client application.
269 .. _nmf_url_resolution:
271 URL resolution
272 --------------
274 All URLs contained in a manifest are resolved relative to the URL of
275 the manifest. If the manifest was specified as a data URI, the URLs must
276 all be absolute.