为官方iPhone SDK交叉编译基于Autotools的库

Mic*_*yan 5 iphone autotools cross-compiling gcc4

背景

我正在编写一个针对几种不同手机的程序,包括iPhone.该计划取决于几个第三方图书馆.我很难为iPhone和iPhone模拟器交叉编译这些第三方库.这些库包括Apache Portable Runtime和GNUTLS,以及它们的依赖项.我希望构建的库最后以前缀"/opt/iphone-3.1","/ opt/iphone-3.0","/ opt/iphone-2.2.1","/ opt /iphone-modules3.1 "和"/opt/iphone-simulator-3.0"分别.

为了使交叉编译过程易于重复,我正在创建脚本来为每个目标平台调用"configure"脚本("iphone3.1-configure","iphone3.0-configure","iphone2.2.1" -configure","iphonesim3.1-configure"和"iphonesim3.0-configure").这是我遇到麻烦的地方.

我正在使用Mac OS X 10.6 Snow Leopard计算机和官方Xcode 3.2 + iPhone SDK 3.1.

状态

我目前有以下"iphone3.1-configure"脚本:

#! /bin/bash

#
# Program  : iphone3.1-configure
# Author   : Michael Aaron Safyan
# Synopsis :
#            This program runs the "configure" script generated by the
#            GNU Autotools in order to cross-compile thirdparty libraries
#            for the iPhone 3.1 SDK. Run this script while in a directory
#            containing an autotools "configure" script. Once run, this
#            you can use "make" and "sudo make install" to build the library.
#            An install prefix of "/opt/iphone-3.1/" is used.
#

unset CPATH
unset C_INCLUDE_PATH
unset CPLUS_INCLUDE_PATH
unset OBJC_INCLUDE_PATH
unset LIBS
unset DYLD_FALLBACK_LIBRARY_PATH
unset DYLD_FALLBACK_FRAMEWORK_PATH

export BUILD_DARWIN_VER=`uname -r`
export SDKVER="3.1"
export DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer"
export SDKROOT="$DEVROOT/SDKs/iPhoneOS$SDKVER.sdk"
export PKG_CONFIG_PATH=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$SDKVER.sdk/usr/lib/pkgconfig:/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/pkgconfig:/opt/iphone-$SDKVER/lib/pkgconfig:/usr/local/iphone-$SDKVER/lib/pkgconfig
export PREFIX="/opt/iphone-$SDKVER"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export RANLIB="$DEVROOT/usr/bin/ranlib"
export CPPFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export CFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export CXXFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export LDFLAGS="-arch armv6 --sysroot='$SDKROOT' -L$SDKROOT/usr/lib -L$DEVROOT/usr/lib -L/opt/iphone-$SDKVER/lib -L/usr/local/iphone-$SDKVER/lib"
export CPP="$DEVROOT/usr/bin/cpp-4.2"
export CC="$DEVROOT/usr/bin/gcc-4.2"
export CXX="$DEVROOT/usr/bin/g++-4.2"
export LD="$DEVROOT/usr/bin/ld"

if [ ! \( -d "$DEVROOT" \) ] ; then
   echo "The iPhone SDK could not be found. Folder \"$DEVROOT\" does not exist."
   exit 1
fi

if [ ! \( -d "$SDKROOT" \) ] ; then
   echo "The iPhone SDK could not be found. Folder \"$SDKROOT\" does not exist."
   exit 1
fi

./configure --prefix="$PREFIX" --build="i386-apple-darwin$BUILD_DARWIN_VER" --host="arm-apple-darwin9" --enable-static --disable-shared $@

在"apr-1.3.8"文件夹中,我正在运行"iphone3.1-configure --disable-dso",我得到:

checking build system type... i386-apple-darwin10.0.0
checking host system type... arm-apple-darwin9
checking target system type... arm-apple-darwin9
Configuring APR library
Platform: arm-apple-darwin9
checking for working mkdir -p... yes
APR Version: 1.3.8
checking for chosen layout... apr
checking for arm-apple-darwin9-gcc... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 accepts -g... yes
checking for /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 option to accept ISO C89... unsupported
Applying APR hints file rules for arm-apple-darwin9
  adding "-DDARWIN" to CPPFLAGS
  adding "-DSIGPROCMASK_SETS_THREAD_MASK" to CPPFLAGS
  setting apr_posixsem_is_global to "yes"
  setting ac_cv_func_kqueue to "no"
  setting ac_cv_func_poll to "no"
(Default will be unix)
checking whether make sets $(MAKE)... yes
checking how to run the C preprocessor... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2
configure: error: in `/Users/michaelsafyan/Downloads/apr-1.3.8':
configure: error: C preprocessor "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2" fails sanity check
See `config.log' for more details.

"config.log"的相关部分是:

configure:7710: checking how to run the C preprocessor
configure:7828: result: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2
configure:7857: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c
cpp-4.2: error trying to exec 'cc1': execvp: No such file or directory
configure:7864: $? = 1
configure: failed program was:
| /* confdefs.h.  */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| /* end confdefs.h.  */
| #ifdef __STDC__
| # include 
| #else
| # include 
| #endif
|            Syntax error
configure:7857: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c
cpp-4.2: error trying to exec 'cc1': execvp: No such file or directory
configure:7864: $? = 1
configure: failed program was:
| /* confdefs.h.  */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| /* end confdefs.h.  */
| #ifdef __STDC__
| # include 
| #else
| # include 
| #endif
|            Syntax error
configure:7926: error: in `/Users/michaelsafyan/Downloads/apr-1.3.8':
configure:7929: error: C preprocessor "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2" fails sanity check
See `config.log' for more details.

如何修复"iphone3.1-configure"脚本?谢谢.

Mic*_*yan 3

好的。这仍然没有建立,但它会更进一步......

  1. C 预处理器无法采用架构。
  2. C 预处理器不接受 --sysroot 或 -isystem(仅使用“-I”)。
  3. 使用“cpp”而不是“cpp-4.2”(4.2 版本有缺陷,而且由于它是预处理器,因此使用哪个版本并不重要,所以您最好使用有效的版本。)

iphone3.1-configure脚本的更新版本为:

#!/bin/bash

#
# 程序:iphone3.1-configure
# 作者:Michael Aaron Safyan (michaelsafyan@gmail.com)
# 概要:
# 该程序运行由
# GNU Autotools 用于交叉编译第三方库
# 适用于 iPhone 3.1 SDK。在目录中运行此脚本
# 包含一个自动工具“配置”脚本。一旦你运行这个,
# 您可以使用“make”和“sudo make install”来构建库。
# 使用安装前缀“/opt/iphone-3.1/”。
#

取消设置CPATH
取消设置 C_INCLUDE_PATH
取消设置 CPLUS_INCLUDE_PATH
取消设置 OBJC_INCLUDE_PATH
未设置 LIBS
取消设置 DYLD_FALLBACK_LIBRARY_PATH
取消设置 DYLD_FALLBACK_FRAMEWORK_PATH

导出 BUILD_DARWIN_VER=`uname -r`
导出 SDKVER=“3.1”
导出 DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer"
导出 SDKROOT="$DEVROOT/SDKs/iPhoneOS$SDKVER.sdk"
导出 PKG_CONFIG_PATH=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$SDKVER.sdk/usr/lib/pkgconfig:/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/pkgconfig:/opt/iphone- $SDKVER/lib/pkgconfig:/usr/local/iphone-$SDKVER/lib/pkgconfig
导出 PREFIX="/opt/iphone-$SDKVER"
导出 AS="$DEVROOT/usr/bin/as"
导出 ASCPP="$DEVROOT/usr/bin/as"
导出 AR="$DEVROOT/usr/bin/ar"
导出 RANLIB="$DEVROOT/usr/bin/ranlib"
导出 CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -I$SDKROOT/usr/include -I$DEVROOT/usr/包括 -I/opt/iphone-$SDKVER/include -I/usr/local/iphone-$SDKVER/include"
导出 CFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
导出 CXXFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
导出 LDFLAGS="-arch armv6 --sysroot='$SDKROOT' -L$SDKROOT/usr/lib -L$DEVROOT/usr/lib -L/opt/iphone-$SDKVER/lib -L/usr/local/iphone -$SDKVER/lib"
导出 CPP="$DEVROOT/usr/bin/cpp"
导出 CXXCPP="$DEVROOT/usr/bin/cpp"
导出 CC="$DEVROOT/usr/bin/gcc-4.2"
导出 CXX="$DEVROOT/usr/bin/g++-4.2"
导出 LD="$DEVROOT/usr/bin/ld"
导出STRIP =“$ DEVROOT / usr / bin / strip”

如果 [ !\(-d“$DEVROOT”\)]; 然后
   echo "无法找到 iPhone SDK。文件夹 \"$DEVROOT\" 不存在。"
   1号出口
菲

如果 [ !\(-d“$SDKROOT”\)]; 然后
   echo "找不到 iPhone SDK。文件夹 \"$SDKROOT\" 不存在。"
   1号出口
菲

./configure --prefix="$PREFIX" --build="i386-apple-darwin$BUILD_DARWIN_VER" --host="arm-apple-darwin9" --enable-static --disable-shared ac_cv_file__dev_zero=no ac_cv_func_setpgrp_void=是的$@

另外,我使用“--enable-threads --disable-dso”调用,而不仅仅是“--disable-dso”。这仍然不起作用......它失败了:

检查 pthread.h 中的 PTHREAD_PROCESS_SHARED...是
检查 pthread_mutexattr_setpshared...是的
检查工作 PROCESS_SHARED 锁...配置:错误:在“/Users/michaelsafyan/Downloads/apr-1.3.8”中:
配置:错误:交叉编译时无法运行测试程序
有关更多详细信息,请参阅“config.log”。

不过,这可能是APR具体测试的问题。我在链接中发布了后续问题。

编辑

我在Cross-compiling the Apache Portable Runtime for the iPhone中提供了更完整的解决方案。