cross compile
arm gcc
又一次要进行 cross compile. 记录一下问题.
这一次是直接使用的 friendlyarm 的 gcc.
git clone https://github.com/friendlyarm/prebuilts.git sudo mkdir -p /opt/FriendlyARM/toolchain sudo tar xf prebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C /opt/FriendlyARM/toolchain/
glibc
出现的问题在于 libc 的版本问题. 这个包里的工具链是依赖于 libc-2.14 的, 但是 centos 6.7 的系统里的
只有 2.12 libc.
所以第一步是安装一个 libc
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz tar zxvf glibc-2.14.tar.gz cd glibc-2.14 mkdir build cd build ../configure --prefix=/opt/glibc-2.14 make -j4 sudo make install export LD_LIBRARY_PATH=/opt/glibc-2.14/lib
nginx
nginx 正常的情况下要进行一些分析探测当前的机器是不是支持一些功能, 如 epoll, int 大小之类的.
但是在 cross compile 的情况下, 进行探测的结果并不是最后运行的机器的环境. 所以这些探测可能都会失败.
所以要做一些调整, 以及手动开启一些功能.
- 修改 auto/cc/name@21 的 exit 1, 注释掉.
- 修改 auto/types/sizeof@48 直接设置 ngx_size 为 4.
- 修改 auto/modules@43 开启 epoll 模块
增加如下的 flags.
FLAGS='-D NGX_HAVE_GCC_ATOMIC -DNGX_SYS_NERR=132 -DNGX_PTR_SIZE=4 -DNGX_HAVE_SYSVSHM=1 \ -DNGX_HAVE_EPOLL -DNGX_HAVE_EPOLLRDHUP=1 -DNGX_TEST_BUILD_EPOLL=0 -DNGX_HAVE_EPOLLEXCLUSIVE=0'
一些环境变量的分析会出现问题:
- NGX_HAVE_GCC_ATOMIC: 使用 gcc 的 atomic, nginx 支持几个 atomic 没有 arm.
- NGX_PTR_SIZE: arm 的机器是 32 位的.
- NGX_HAVE_SYSVSHM: 对于 shm 的探测好像也出现了问题.
- NGX_HAVE_EPOLL: 使用 epoll
- NGX_HAVE_EPOLLRDHUP: 使用 epoll rdhup 事件
- NGX_TEST_BUILD_EPOLL: 关闭 epoll 测试代码
- NGX_HAVE_EPOLLEXCLUSIVE: 关闭 EPOLLEXCLUSIVE 功能
configure:
./configure --prefix=/opt/root/ \ --with-cc=/opt/Friendly_ARMv7/4.9.3/bin/arm-linux-gcc \ --without-http_rewrite_module \ --without-http_gzip_module \ --with-cc-opt="'$FLAGS'" make make install
这样可以正常生成最后的 nginx.
其实如果有一个 arm 的系统, 直接编译 nginx 也是非常简单的, 一般情况下也不用
去交叉编译这些上层的程序.