2014-11-04 45 views
3

我正尝试为一个非常不完整的libc为一个不常见的嵌入式系统交叉构建一个启用autotools的软件包。 (如果是相关的:软件包是CPython 3.4.2,而“嵌入式系统”是Android 4.4上的命令行shell)。如何告诉autoconf有关断开的交叉HOST功能?

AFAIK没有办法在构建机器上运行configure可以确定哪些函数主机坏了。 (configure可以编译并链接编译机器上的测试程序,但它无法在主机上运行该程序。)因此,例如,wcsftime()函数在主机的<wchar.h>标题中声明,并在主机的libc,但实现不正确。

对于此软件包configure建立一个config.h文件与C宏HAS_WCSFTIME,其被定义如果configure认为主机具有一个工作wcsftime()并且否则undef'd。如果缺少wcsftime(),则使用strftime(),而在7位ascii和UCS-4之间来回转换时,包的源代码是正确的。

我不能只是运行configure有:

CPPFLAGS=-UHAS_WCSFTIME configure --build=... --host=... ... 

因为在config.h文件只是重新定义了也无妨。

我想出迄今的选项有:

  1. 一个ac_cv_broken_host_wcsftime变量添加到configure.ac文件
  2. 添加ifdef S代表宏HAS_BROKEN_WCSFTIME该人士透露
  3. 修复主机的libc
  4. 为config.h创建一个补丁,将HAS_WCSFTIME从定义翻转为undefined,并记得在我运行后每次运行patchconfigure

我已经实现了选项(4),这是...令人不满意的。我可以做(1)或(2)并将其提供给软件包开发人员,但是这些修改需要几个月才能完成。我正在处理选项(3),但这需要几年才能部署到我的用户的大部分手机和平板电脑上。

什么是解决这个问题的正确方法? (由于我有很多不同的包,我希望它能工作,并且在libc中有几十个中断函数,所以我期望它会出现很多。)

是否有一些命令行选项可用于configure会让我控制哪些CPP宏会执行并且不会被定义?

+0

您好! A)您是使用Google NDK还是使用CrystaX NDK? B)为什么你想在Android上运行CPython?干杯! – unforgettableid 2015-06-22 15:25:59

+0

@unforgettableid(a)Google NDK。我以前没有听说过CrystaX。 (b)我试图让iPython和numpy/scipy栈工作,这样我可以在我的平板电脑上创建一个交互式数学环境。受(现已停止使用)http://computableapp.com/ for iPad的启发。对于Android上的许多简单的Python应用程序,Jython比CPython更有意义,但Jython不足以支持CPython的C API,并且大量的numpy/scipy被写入CPython C API。 – 2015-06-22 19:38:38

+0

使用CrystaX NDK无需花费时间。 (尽管我承认时间是世界上最珍贵的商品。)CPython是否可以使用NDK编译好? – unforgettableid 2015-06-22 20:45:00

回答

2

是否有一些命令行选项来配置,这将允许我控制哪些CPP宏执行并且没有被定义?

最好的办法是用包维护者交谈。他们可以帮助你为他们的包裹提供可接受的贴片。然后,您可以应用此修补程序,直到按以下方法推送它。

作为4)的替代方案,您也可以修补configure本身,特别是在调用了创建configure的引导脚本时。在引导脚本中执行操作来修复configurelibtool等是我过去解决此问题的方法之一。

如果在3)你的意思是仿生的libc,我认为“永不”可能比“花费几年”更准确的时间表来获得宽字符功能。

AFAIK在我的生成机器上运行的配置无法确定主机上的哪些功能已损坏。 (配置可以编译并链接编译机器上的测试程序,但它无法在主机上运行程序。)

大部分是正确的。 Scratchbox2将允许您在主机上执行运行时测试configure,但不幸的是它不支持Android。