2014-11-04 67 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。