OLD | NEW |
1 {{+bindTo:partials.standard_nacl_article}} | 1 {{+bindTo:partials.standard_nacl_article}} |
2 | 2 |
3 <section id="building"> | 3 <section id="building"> |
4 <span id="devcycle-building"></span><h1 id="building"><span id="devcycle-buildin
g"></span>Building</h1> | 4 <span id="devcycle-building"></span><h1 id="building"><span id="devcycle-buildin
g"></span>Building</h1> |
5 <div class="contents local" id="table-of-contents" style="display: none"> | 5 <div class="contents local" id="table-of-contents" style="display: none"> |
6 <p class="topic-title first">Table Of Contents</p> | 6 <p class="topic-title first">Table Of Contents</p> |
7 <ul class="small-gap"> | 7 <ul class="small-gap"> |
8 <li><p class="first"><a class="reference internal" href="#introduction" id="id4"
>Introduction</a></p> | 8 <li><p class="first"><a class="reference internal" href="#introduction" id="id4"
>Introduction</a></p> |
9 <ul class="small-gap"> | 9 <ul class="small-gap"> |
10 <li><a class="reference internal" href="#target-architectures" id="id5">Target a
rchitectures</a></li> | 10 <li><a class="reference internal" href="#target-architectures" id="id5">Target a
rchitectures</a></li> |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 <a class="reference internal" href="/native-client/overview.html#application-fil
es"><em>manifest file</em></a> will then specify which version | 65 <a class="reference internal" href="/native-client/overview.html#application-fil
es"><em>manifest file</em></a> will then specify which version |
66 of the module to load based on the end-user’s architecture. The SDK | 66 of the module to load based on the end-user’s architecture. The SDK |
67 includes a script for generating manifest files called <code>create_nmf.py</code
>. This | 67 includes a script for generating manifest files called <code>create_nmf.py</code
>. This |
68 script is located in the <code>pepper_<version>/tools/</code> directory, m
eaning under | 68 script is located in the <code>pepper_<version>/tools/</code> directory, m
eaning under |
69 your installed pepper bundle. For examples of how to compile modules for | 69 your installed pepper bundle. For examples of how to compile modules for |
70 multiple target architectures and how to generate manifest files, see the | 70 multiple target architectures and how to generate manifest files, see the |
71 Makefiles included with the SDK examples.</p> | 71 Makefiles included with the SDK examples.</p> |
72 <p>This section will mostly cover PNaCl, but also describes how to build | 72 <p>This section will mostly cover PNaCl, but also describes how to build |
73 <strong>nexe</strong> applications.</p> | 73 <strong>nexe</strong> applications.</p> |
74 <h3 id="c-libraries">C libraries</h3> | 74 <h3 id="c-libraries">C libraries</h3> |
75 <p>The PNaCl SDK has a single choice of C library: <a class="reference external"
href="http://sourceware.org/newlib/">newlib</a>.</p> | 75 <p>The PNaCl SDK uses the <a class="reference external" href="http://sourceware.
org/newlib/">newlib</a> C library. The Native Client SDK also has a |
76 <p>The Native Client SDK also has a GCC-based toolchain for building | 76 GCC-based toolchain for building <strong>nexes</strong> using the <a class="refe
rence external" href="http://www.gnu.org/software/libc/">glibc</a> C library. S
ee |
77 <strong>nexes</strong>. The GCC-based toolchain has support for two C libraries: | 77 <a class="reference internal" href="/native-client/devguide/devcycle/dynamic-loa
ding.html"><em>Dynamic Linking & Loading with glibc</em></a> for information |
78 <a class="reference external" href="http://sourceware.org/newlib/">newlib</a> an
d <a class="reference external" href="http://www.gnu.org/software/libc/">glibc</
a>. See <a class="reference internal" href="/native-client/devguide/devcycle/dy
namic-loading.html"><em>Dynamic Linking & Loading with glibc</em></a> for in
formation about these libraries, including factors to | 78 about these libraries, including factors to help you decide which to use.</p> |
79 help you decide which to use.</p> | |
80 <h3 id="c-standard-libraries"><span id="building-cpp-libraries"></span>C++ stand
ard libraries</h3> | 79 <h3 id="c-standard-libraries"><span id="building-cpp-libraries"></span>C++ stand
ard libraries</h3> |
81 <p>The PNaCl SDK can use either LLVM’s <a class="reference external" href=
"http://libcxx.llvm.org/">libc++</a> | 80 <p>The PNaCl SDK can use either LLVM’s <a class="reference external" href=
"http://libcxx.llvm.org/">libc++</a> |
82 (the current default) or GCC’s <a class="reference external" href="http://
gcc.gnu.org/libstdc++">libstdc++</a> (deprecated). The | 81 (the current default) or GCC’s <a class="reference external" href="http://
gcc.gnu.org/libstdc++">libstdc++</a> (deprecated). The |
83 <code>-stdlib=[libc++|libstdc++]</code> command line argument can be used to | 82 <code>-stdlib=[libc++|libstdc++]</code> command line argument can be used to |
84 choose which standard library to use.</p> | 83 choose which standard library to use.</p> |
85 <p>The GCC-based Native Client SDK only has support for GCC’s <a class="re
ference external" href="http://gcc.gnu.org/libstdc++">libstdc++</a>.</p> | 84 <p>The GCC-based toolchain only has support for GCC’s <a class="reference
external" href="http://gcc.gnu.org/libstdc++">libstdc++</a>.</p> |
86 <p>C++11 library support is only complete in libc++ but other non-library langua
ge | 85 <p>C++11 library support is only complete in libc++ but other non-library langua
ge |
87 features should work regardless of which standard library is used. The | 86 features should work regardless of which standard library is used. The |
88 <code>-std=gnu++11</code> command line argument can be used to indicate which C+
+ | 87 <code>-std=gnu++11</code> command line argument can be used to indicate which C+
+ |
89 language standard to use (<code>-std=c++11</code> often doesn’t work well
because newlib | 88 language standard to use (<code>-std=c++11</code> often doesn’t work well
because newlib |
90 relies on some GNU extensions).</p> | 89 relies on some GNU extensions).</p> |
91 <h3 id="sdk-toolchains">SDK toolchains</h3> | 90 <h3 id="sdk-toolchains">SDK toolchains</h3> |
92 <p>The Native Client SDK includes multiple toolchains. It has one PNaCl toolchai
n | 91 <p>The Native Client SDK includes multiple toolchains. It has one PNaCl toolchai
n |
93 and it has multiple GCC-based toolchains that are differentiated by target | 92 and it has multiple GCC-based toolchains that are differentiated by target |
94 architectures and C libraries. The single PNaCl toolchain is located | 93 architectures and C libraries. The single PNaCl toolchain is located |
95 in a directory named <code>pepper_<version>/toolchain/<OS_platform>_
pnacl</code>, | 94 in a directory named <code>pepper_<version>/toolchain/<OS_platform>_
pnacl</code>, |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 <li><prefix>readelf</li> | 360 <li><prefix>readelf</li> |
362 <li><prefix>size</li> | 361 <li><prefix>size</li> |
363 <li><prefix>strings</li> | 362 <li><prefix>strings</li> |
364 <li><prefix>strip</li> | 363 <li><prefix>strip</li> |
365 </ul> | 364 </ul> |
366 <h3 id="compiling">Compiling</h3> | 365 <h3 id="compiling">Compiling</h3> |
367 <p>Compiling files with the GNU-based toolchain is similar to compiling | 366 <p>Compiling files with the GNU-based toolchain is similar to compiling |
368 files with the PNaCl-based toolchain, except that the output is | 367 files with the PNaCl-based toolchain, except that the output is |
369 architecture specific.</p> | 368 architecture specific.</p> |
370 <p>For example, assuming you’re developing on a Windows machine, targeting
the x86 | 369 <p>For example, assuming you’re developing on a Windows machine, targeting
the x86 |
371 architecture, and using the newlib library, you can compile a 32-bit <strong>.ne
xe</strong> | 370 architecture you can compile a 32-bit <strong>.nexe</strong> for the hello_world
example with |
372 for the hello_world example with the following command:</p> | 371 the following command:</p> |
373 <pre> | 372 <pre> |
374 nacl_sdk/pepper_<version>/toolchain/win_x86_newlib/bin/i686-nacl-gcc \ | 373 nacl_sdk/pepper_<version>/toolchain/win_x86_glibc/bin/i686-nacl-gcc \ |
375 hello_world.c -Inacl_sdk/pepper_<version>/include \ | 374 hello_world.c -Inacl_sdk/pepper_<version>/include \ |
376 -Lnacl_sdk/pepper_<version>/lib/newlib/Release -o hello_world_x86_32.nex
e \ | 375 -Lnacl_sdk/pepper_<version>/lib/glibc/Release -o hello_world_x86_32.nexe
\ |
377 -m32 -g -O2 -lppapi | 376 -m32 -g -O2 -lppapi |
378 </pre> | 377 </pre> |
379 <p>To compile a 64-bit <strong>.nexe</strong>, you can run the same command but
use -m64 instead | 378 <p>To compile a 64-bit <strong>.nexe</strong>, you can run the same command but
use -m64 instead |
380 of -m32. Alternatively, you could also use the version of the compiler that | 379 of -m32. Alternatively, you could also use the version of the compiler that |
381 targets the x86-64 architecture, i.e., <code>x86_64-nacl-gcc</code>.</p> | 380 targets the x86-64 architecture, i.e., <code>x86_64-nacl-gcc</code>.</p> |
382 <p>You should name executable modules with a <strong>.nexe</strong> filename ext
ension, | 381 <p>You should name executable modules with a <strong>.nexe</strong> filename ext
ension, |
383 regardless of what platform you’re using.</p> | 382 regardless of what platform you’re using.</p> |
384 <h3 id="creating-libraries-and-linking">Creating libraries and Linking</h3> | 383 <h3 id="creating-libraries-and-linking">Creating libraries and Linking</h3> |
385 <p>Creating libraries and linking with the GNU-based toolchain is similar | 384 <p>Creating libraries and linking with the GNU-based toolchain is similar |
386 to doing the same with the PNaCl toolchain. The relevant tools | 385 to doing the same with the PNaCl toolchain. The relevant tools |
387 for creating <strong>static</strong> libraries are <code><prefix>ar</code>
and <code><prefix>ranlib</code>. | 386 for creating <strong>static</strong> libraries are <code><prefix>ar</code>
and <code><prefix>ranlib</code>. |
388 Linking can be done with <code><prefix>g++</code>. See the | 387 Linking can be done with <code><prefix>g++</code>. See the |
389 <a class="reference internal" href="/native-client/devguide/devcycle/dynamic-loa
ding.html"><em>Dynamic Linking & Loading with glibc</em></a> | 388 <a class="reference internal" href="/native-client/devguide/devcycle/dynamic-loa
ding.html"><em>Dynamic Linking & Loading with glibc</em></a> |
390 section on how to create <strong>shared</strong> libraries.</p> | 389 section on how to create <strong>shared</strong> libraries.</p> |
391 <h3 id="finalizing-a-nexe-for-deployment">Finalizing a <strong>nexe</strong> for
deployment</h3> | 390 <h3 id="finalizing-a-nexe-for-deployment">Finalizing a <strong>nexe</strong> for
deployment</h3> |
392 <p>Unlike the PNaCl toolchain, no separate finalization step is required | 391 <p>Unlike the PNaCl toolchain, no separate finalization step is required |
393 for <strong>nexe</strong> files. The <strong>nexe</strong> files are always in a
<strong>stable</strong> format. | 392 for <strong>nexe</strong> files. The <strong>nexe</strong> files are always in a
<strong>stable</strong> format. |
394 However, the <strong>nexe</strong> file may contain debug information and symbol
information | 393 However, the <strong>nexe</strong> file may contain debug information and symbol
information |
395 which may make the <strong>nexe</strong> file larger than needed for distributio
n. | 394 which may make the <strong>nexe</strong> file larger than needed for distributio
n. |
396 To minimize the size of the distributed file, you can run the | 395 To minimize the size of the distributed file, you can run the |
397 <code><prefix>strip</code> tool to strip out debug information.</p> | 396 <code><prefix>strip</code> tool to strip out debug information.</p> |
398 <h2 id="using-make">Using make</h2> | 397 <h2 id="using-make">Using make</h2> |
399 <p>This document doesn’t cover how to use <code>make</code>, but if you wa
nt to use | 398 <p>This document doesn’t cover how to use <code>make</code>, but if you wa
nt to use |
400 <code>make</code> to build your Native Client module, you can base your Makefile
on the | 399 <code>make</code> to build your Native Client module, you can base your Makefile
on the |
401 ones in the SDK examples.</p> | 400 ones in the SDK examples.</p> |
402 <p>The Makefiles for the SDK examples build most of the examples in multiple | 401 <p>The Makefiles for the SDK examples build most of the examples in multiple |
403 configurations (using PNaCl vs NaCl, using different C libraries, | 402 configurations (using PNaCl vs NaCl, using different C libraries, |
404 targeting different architectures, and using different levels of optimization). | 403 targeting different architectures, and using different levels of optimization). |
405 To select a specific toolchain, set the <strong>environment variable</strong> | 404 To select a specific toolchain, set the <strong>environment variable</strong> |
406 <code>TOOLCHAIN</code> to either <code>pnacl</code>, <code>newlib</code>, <code>
glibc</code>, or <code>host</code>. | 405 <code>TOOLCHAIN</code> to either <code>pnacl</code>, <code>clang-newlib</code>,
<code>glibc</code>, or <code>host</code>. |
407 To select a specific level of optimization set the <strong>environment | 406 To select a specific level of optimization set the <strong>environment |
408 variable</strong> <code>CONFIG</code> to either <code>Debug</code>, or <code>Rel
ease</code>. Running | 407 variable</strong> <code>CONFIG</code> to either <code>Debug</code>, or <code>Rel
ease</code>. Running |
409 <code>make</code> in each example’s directory does <strong>one</strong> of
the following, | 408 <code>make</code> in each example’s directory does <strong>one</strong> of
the following, |
410 depending on the setting of the environment variables.</p> | 409 depending on the setting of the environment variables.</p> |
411 <ul class="small-gap"> | 410 <ul class="small-gap"> |
412 <li><p class="first">If <code>TOOLCHAIN=pnacl</code> creates a subdirectory call
ed <code>pnacl</code>;</p> | 411 <li><p class="first">If <code>TOOLCHAIN=pnacl</code> creates a subdirectory call
ed <code>pnacl</code>;</p> |
413 <ul class="small-gap"> | 412 <ul class="small-gap"> |
414 <li>builds a <strong>.pexe</strong> (architecture-independent Native Client exec
utable) using | 413 <li>builds a <strong>.pexe</strong> (architecture-independent Native Client exec
utable) using |
415 the newlib library</li> | 414 the newlib library</li> |
416 <li>generates a Native Client manifest (.nmf) file for the pnacl version of the | 415 <li>generates a Native Client manifest (.nmf) file for the pnacl version of the |
417 example</li> | 416 example</li> |
418 </ul> | 417 </ul> |
419 </li> | 418 </li> |
420 <li><p class="first">If <code>TOOLCHAIN=newlib</code> creates a subdirectory cal
led <code>newlib</code>;</p> | 419 <li><p class="first">If <code>TOOLCHAIN=clang-newlib</code> creates a subdirecto
ry called <code>clang-newlib</code>;</p> |
421 <ul class="small-gap"> | 420 <ul class="small-gap"> |
422 <li>builds <strong>.nexes</strong> for the x86-32, x86-64, and ARM architectures
using the | 421 <li>builds <strong>.nexes</strong> for the x86-32, x86-64, and ARM architectures
using the |
423 newlib library</li> | 422 nacl-clang toolchain and the newlib C library</li> |
424 <li>generates a Native Client manifest (.nmf) file for the newlib version of | 423 <li>generates a Native Client manifest (.nmf) file for the clang-newlib version |
425 the example</li> | 424 of the example</li> |
426 </ul> | 425 </ul> |
427 </li> | 426 </li> |
428 <li><p class="first">If <code>TOOLCHAIN=glibc</code> creates a subdirectory call
ed <code>glibc</code>;</p> | 427 <li><p class="first">If <code>TOOLCHAIN=glibc</code> creates a subdirectory call
ed <code>glibc</code>;</p> |
429 <ul class="small-gap"> | 428 <ul class="small-gap"> |
430 <li>builds <strong>.nexes</strong> for the x86-32 and x86-64 architectures using
the glibc | 429 <li>builds <strong>.nexes</strong> for the x86-32, x86-64 and ARM architectures
using the |
431 library</li> | 430 glibc library</li> |
432 <li>generates a Native Client manifest (.nmf) file for the glibc version of the | 431 <li>generates a Native Client manifest (.nmf) file for the glibc version of the |
433 example</li> | 432 example</li> |
434 </ul> | 433 </ul> |
435 </li> | 434 </li> |
436 <li><p class="first">If <code>TOOLCHAIN=host</code> creates a subdirectory calle
d <code>windows</code>, <code>linux</code>, | 435 <li><p class="first">If <code>TOOLCHAIN=host</code> creates a subdirectory calle
d <code>windows</code>, <code>linux</code>, |
437 or <code>mac</code> (depending on your development machine);</p> | 436 or <code>mac</code> (depending on your development machine);</p> |
438 <ul class="small-gap"> | 437 <ul class="small-gap"> |
439 <li>builds a Pepper plugin (.dll for Windows, .so for Linux/Mac) using the | 438 <li>builds a Pepper plugin (.dll for Windows, .so for Linux/Mac) using the |
440 hosted toolchain on your development machine</li> | 439 hosted toolchain on your development machine</li> |
441 <li>generates a Native Client manifest (.nmf) file for the host Pepper plugin | 440 <li>generates a Native Client manifest (.nmf) file for the host Pepper plugin |
(...skipping 24 matching lines...) Expand all Loading... |
466 libraries, such as libpthread and libc, plus the relevant header files. | 465 libraries, such as libpthread and libc, plus the relevant header files. |
467 The standard libraries are located under the <code>/pepper_<version></code
> directory | 466 The standard libraries are located under the <code>/pepper_<version></code
> directory |
468 in the following locations:</p> | 467 in the following locations:</p> |
469 <ul class="small-gap"> | 468 <ul class="small-gap"> |
470 <li>PNaCl toolchain: <code>toolchain/<platform>_pnacl/usr/lib</code></li> | 469 <li>PNaCl toolchain: <code>toolchain/<platform>_pnacl/usr/lib</code></li> |
471 <li>x86 toolchains: <code>toolchain/<platform>_x86_<c_library>/x86_6
4-nacl/lib32</code> and | 470 <li>x86 toolchains: <code>toolchain/<platform>_x86_<c_library>/x86_6
4-nacl/lib32</code> and |
472 <code>/lib64</code> (for the 32-bit and 64-bit target architectures, respectivel
y)</li> | 471 <code>/lib64</code> (for the 32-bit and 64-bit target architectures, respectivel
y)</li> |
473 <li>ARM toolchain: <code>toolchain/<platform>_arm_<c_library>/arm-na
cl/lib</code></li> | 472 <li>ARM toolchain: <code>toolchain/<platform>_arm_<c_library>/arm-na
cl/lib</code></li> |
474 </ul> | 473 </ul> |
475 <p>For example, on Windows, the libraries for the x86-64 architecture in the | 474 <p>For example, on Windows, the libraries for the x86-64 architecture in the |
476 newlib toolchain are in <code>toolchain/win_x86_newlib/x86_64-nacl/lib64</code>.
</p> | 475 glibc toolchain are in <code>toolchain/win_x86_glibc/x86_64-nacl/lib64</code>.</
p> |
477 <p>The header files are in:</p> | 476 <p>The header files are in:</p> |
478 <ul class="small-gap"> | 477 <ul class="small-gap"> |
479 <li>PNaCl toolchain: <code>toolchain/<platform>_pnacl/usr/include</code></
li> | 478 <li>PNaCl toolchain: <code>toolchain/<platform>_pnacl/le32-nacl/include</c
ode></li> |
480 <li>x86 toolchains: <code>toolchain/<platform>_x86_<c_library>/x86_6
4-nacl/include</code></li> | 479 <li>clang newlib toolchains: <code>toolchain/<platform>_pnacl/<arch>
-nacl/include</code></li> |
481 <li>ARM toolchain: <code>toolchain/<platform>_arm_<c_library>/arm-na
cl/include</code></li> | 480 <li>x86 glibc toolchain: <code>toolchain/<platform>_x86_glibc/x86_64-nacl/
include</code></li> |
| 481 <li>ARM glibc toolchain: <code>toolchain/<platform>_arm_glibc/arm-nacl/inc
lude</code></li> |
482 </ul> | 482 </ul> |
483 <p>Many other libraries have been ported for use with Native Client; for more | 483 <p>Many other libraries have been ported for use with Native Client; for more |
484 information, see the <a class="reference external" href="https://chromium.google
source.com/webports">webports</a> | 484 information, see the <a class="reference external" href="https://chromium.google
source.com/webports">webports</a> |
485 project. If you port an open-source library for your own use, we recommend | 485 project. If you port an open-source library for your own use, we recommend |
486 adding it to webports.</p> | 486 adding it to webports.</p> |
487 <p>Besides the standard libraries, the SDK includes Pepper libraries. | 487 <p>Besides the standard libraries, the SDK includes Pepper libraries. |
488 The PNaCl Pepper libraries are located in the the | 488 The PNaCl Pepper libraries are located in the the |
489 <code>nacl_sdk/pepper_<version>/lib/pnacl/<Release or Debug></code>
directory. | 489 <code>nacl_sdk/pepper_<version>/lib/pnacl/<Release or Debug></code>
directory. |
490 The GNU-based toolchain has Pepper libraries in | 490 The GNU-based toolchain has Pepper libraries in |
491 <code>nacl_sdk/pepper_<version>/lib/newlib_<arch>/<Release or Deb
ug></code> | 491 <code>nacl_sdk/pepper_<version>/lib/glibc_<arch>/<Release or Debu
g></code> |
492 and <code>nacl_sdk/pepper_<version>/lib/glibc_<arch>/<Release or
Debug></code>. | 492 and <code>nacl_sdk/pepper_<version>/lib/clang-newlib_<arch>/<Rele
ase or Debug></code>. |
493 The libraries provided by the SDK allow the application to use Pepper, | 493 The libraries provided by the SDK allow the application to use Pepper, |
494 as well as convenience libraries to simplify porting an application that | 494 as well as convenience libraries to simplify porting an application that |
495 uses POSIX functions. Here are descriptions of the Pepper libraries provided | 495 uses POSIX functions. Here are descriptions of the Pepper libraries provided |
496 in the SDK.</p> | 496 in the SDK.</p> |
497 <dl class="docutils" id="devcycle-building-nacl-io"> | 497 <dl class="docutils" id="devcycle-building-nacl-io"> |
498 <dt>libppapi.a</dt> | 498 <dt>libppapi.a</dt> |
499 <dd>Implements the Pepper (PPAPI) C interface. Needed for all applications that | 499 <dd>Implements the Pepper (PPAPI) C interface. Needed for all applications that |
500 use Pepper (even C++ applications).</dd> | 500 use Pepper (even C++ applications).</dd> |
501 <dt>libppapi_cpp.a</dt> | 501 <dt>libppapi_cpp.a</dt> |
502 <dd>Implements the Pepper (PPAPI) C++ interface. Needed by C++ applications that | 502 <dd>Implements the Pepper (PPAPI) C++ interface. Needed by C++ applications that |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 Function foo has disallowed type: i128 (i128) | 585 Function foo has disallowed type: i128 (i128) |
586 LLVM ERROR: PNaCl ABI verification failed | 586 LLVM ERROR: PNaCl ABI verification failed |
587 </pre> | 587 </pre> |
588 <p>When faced with a PNaCl ABI verification error, check the list of features | 588 <p>When faced with a PNaCl ABI verification error, check the list of features |
589 that are <a class="reference internal" href="/native-client/nacl-and-pnacl.html#
when-to-use-nacl"><em>not supported by PNaCl</em></a>. | 589 that are <a class="reference internal" href="/native-client/nacl-and-pnacl.html#
when-to-use-nacl"><em>not supported by PNaCl</em></a>. |
590 If the problem you face is not listed as restricted, | 590 If the problem you face is not listed as restricted, |
591 <a class="reference internal" href="/native-client/help.html#help"><em>let us kn
ow</em></a>!</p> | 591 <a class="reference internal" href="/native-client/help.html#help"><em>let us kn
ow</em></a>!</p> |
592 </section> | 592 </section> |
593 | 593 |
594 {{/partials.standard_nacl_article}} | 594 {{/partials.standard_nacl_article}} |
OLD | NEW |