我正在尝试为一个非常不完整的libc的不寻常的嵌入式系统交叉构建一个支持autotools的软件包。 (如果相关:该软件包是CPython 3.4.2,"嵌入式系统"是Android 4.4上的命令行shell。
AFAIK 在我的构建计算机上运行的configure
无法确定主机上的哪些功能已损坏。 (configure
可以并且确实在构建计算机上编译和链接测试程序,但它无权在主机上运行该程序。 因此,例如,wcsftime()
函数在主机的 <wchar.h>
标头中声明并在主机的 libc 中定义,但实现不正确。
对于这个包,configure
构建了一个带有 C 宏HAS_WCSFTIME
的config.h
文件,如果configure
认为主机有一个工作wcsftime()
并且没有定义,则定义该文件。 并且软件包的源代码是正确的,因此如果缺少wcsftime()
,则改用strftime()
,并在 7 位 ascii 和 UCS-4 之间来回进行适当的转换。
我不能只用以下方法运行configure
:
CPPFLAGS=-UHAS_WCSFTIME configure --build=... --host=... ...
因为无论如何,config.h 文件只是重新定义了它。
到目前为止,我想出的选项是:
- 将
ac_cv_broken_host_wcsftime
变量添加到 configure.ac 文件 - 将
HAS_BROKEN_WCSFTIME
宏的ifdef
s 添加到源 - 修复主机的 libc 为
- config.h 创建一个补丁,将HAS_WCSFTIME从已定义翻转为未定义,并记住每次运行
patch
后都要运行configure
我已经实现了选项 (4(,它是...不满意。 我可以做 (1( 或 (2( 并将其贡献给包开发人员,但随后需要几个月的时间才能合并更改。 我正在研究选项 (3(,但这需要数年时间才能部署到我用户的大多数手机和平板电脑上。
处理这个问题的正确方法是什么? (我希望它会出现很多,因为我有很多不同的包想要工作,而且libc中有几十个损坏的函数。
是否有一些命令行选项可以configure
,让我控制哪些 CPP 宏被定义和不被定义?
是否有一些命令行选项可以配置,让我控制哪些 CPP 宏被定义和不被定义?
不。
最好的办法是与软件包维护者交谈。 他们可以帮助您为他们的软件包放置一个可接受的补丁。 然后,您可以应用此修补程序,直到使用以下方法推送它。
作为 4( 的替代方法,您还可以修补configure
本身,特别是如果调用引导脚本来创建configure
。 在引导脚本中执行操作以修复configure
或libtool
等是我过去解决此问题的方法之一。
如果在 3( 中你的意思是仿生是 libc,我认为"从不"可能比"需要数年"才能获得广泛的字符功能更准确的时间表。
AFAIK 在我的构建计算机上运行的配置无法确定主机上的哪些功能已损坏。(配置可以并且确实在生成计算机上编译和链接测试程序,但它无权在主机上运行该程序。
大部分是真的。 Scratchbox2将允许您在主机上进行运行时configure
测试,但不幸的是,它不支持Android。