为 Native Client 构建系统
没有任何版本的 Native Client SDK 要求特定的构建系统;任何时候都可以使用 SCons、GNU Make、CMake,甚至只是 shell 脚本。换句话说,基于 gcc 和 GNU 工具链的编译器和工具独立于开发人员决定使用的构建系统。
但是,在 Native Client SDK 的 Pepper 版本 17 之前(包括在内),SDK 中的示例附带了 SCons 的构建文件,并且 SCons 包含在 SDK 中。从 Pepper 18 起,情况不再如此。相反,为示例提供的构建文件是用于 GNU Make 的 Makefile。
另请参阅 release notes 了解 SDK 的 Pepper 18 版本。
交叉编译
SDK 中提供的工具目前支持 32 位 x86 和 64 位 x86 架构。 Web 服务器的平台并不重要,因为 Native Client 模块运行在客户端(即在浏览器中)。这意味着需要考虑两个系统:用户系统和开发者系统。
在用户的系统上,当 Chrome 在页面中遇到 Native Client 模块时,它会获取适用于该客户端上的浏览器的可执行文件(.nexe 文件)。因此,如果 64 位 Windows 上的用户访问该页面,则将获取 64 位二进制文件;如果用户使用的是 32 位 Mac,则获取 32 位二进制文件。有例外,我将在下面单独处理。 Chrome 从清单文件中确定 32 位和 64 位 .nex 的名称。请参阅 Native Client SDK 站点 (www.GoNaCl.com) 获取 a description and an example of a manifest file
开发人员可以并且应该生成 32 位和 64 位可执行文件,而不管用于开发的操作系统和体系结构如何。在 Pepper 18 的示例/目录中运行“make”并查看发出的命令是了解如何执行此操作的便捷方式。例如,“make hello_world_glibc”输出的一部分内容如下:
i686-nacl-gcc -o hello_world_x86_32.nexe hello_world.c -m32 -O0 -g -pthread -O0 -g -Wno-long-long -Wall -lppapi
和
i686-nacl-gcc -o hello_world_x86_64.nexe hello_world.c -m64 -O0 -g -pthread -O0 -g -Wno-long-long -Wall -lppapi
第一行生成 32 位 .nexe;第二行生成 64 位 .nexe。重要的标志是 -m32/-m64,它指定架构 - 始终构建两者,以便客户端在 32 位和 64 位机器上都可以使用该应用程序。
从长远来看,只需要一种部署格式,并将添加 ARM 作为直接支持的架构。有关详细信息,请参阅Portable Native Client 项目。
这里是浏览器和客户端架构对32/64位的具体匹配:
- Mac OS(32 位和 64 位)-> 32 位 .nexe(Chrome 是 32 位)
- Windows(32 位)-> 32 位 .nexe
- Windows(64 位)-> 64 位 .nexe(Chrome 是 32 位,但会启动 64 位代理进程)
- Linux(32 位)-> 32 位 .nexe
- Linux(64 位)-> 32 位 Chrome 获取 32 位 .nexe; 64 位 Chrome 获取 64 位 .nexe
因此,作为一般规则,Chrome 会获取与其自己的位时代相匹配的 .nexe - 除了在 64 位 Windows 上,Chrome 会获取 64 位 .nexe,尽管它本身是 32 位。