Python C Extension package version 設定

不論是 setuptools 或是 distutils 都無法直接設定 C Extension package 的 version,必須採用紆迴的方式進行。

總而言之,Python 3.6 的年代,我們直接使用 setuptools。

0. 預期結果

1.原始狀況

原始 Init function:

原始 setup.py

只有這樣是不夠的,Extension 的 define_macros 是在編譯時會加上 -DPACKAGE_VERSION=1.0 這樣的 flag,可是不會幫你轉換成為 package 的 version。

2.改用 PyModule_AddStringConstant

參考資料:PyModule_AddStringConstant

如果用 Python 官方教學的方式初始化模組,就沒有辦法加上 __version__ 的部份,必須要分解步驟:

如此一來,透過編譯器設定好的 PACKAGE_VERSION,應該就能夠設定成功。

3. 紆迴將 Macro 的變成字串

前面 define_macros 的部份將 PACKAGE_VERSION 設定為 ‘2.0’,在編譯器上會變成 -DPACKAGE_VERSION=2.0,當這個 macro 在 C 裏面被解析的時候,型態會變成 double。而 PyModule_AddStringConstant() 的第3個參數需要 const char *,會造成型態不符合的情況。

我們可以透過再定義兩個 macro 解決這個問題:

在 gcc Stringification 的地方有提到這個作法:

因此在程式中改變為:

就能夠把 PACKAGE_VERSION 改為字串。

4. 柳暗花明又一村,Macro 加上雙引號

回頭一想 f9-kernel 裏面也有字串的用法,為什麼沒有 XSTR 出現呢?翻 code 才發現可以這樣設定:

也就是說,先加上雙引號,在 C 裏面使用就會是 string。

打包收工。




如果你覺得這篇文章不錯,歡迎打賞

BTH: 35QooNA82isrmQLmpEnqXpJoxeZmaPubPf

ETH:0x4cf61fea5EA842D202B85158d8b5e239C872De46

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料