setup.py
にいくつかのカスタムインストールコマンドが含まれているpython2パッケージに取り組んでいます。これらのコマンドは実際にいくつかのRustコードを作成し、pythonパッケージに移動されるいくつかの.dylib
ファイルを出力します。
重要な点は、Rustコードがpythonパッケージの外にあるということです。
setuptools
は、pythonパッケージが純粋なpythonまたはプラットフォーム固有(たとえば、いくつかのC拡張機能が含まれている場合))であるかどうかを自動的に検出することになっています。私の場合、python setup.py bdist_wheel
を実行すると、生成されたホイールは純粋なpython Wheel:<package_name>-<version>-py2-none-any.whl
としてタグ付けされます。このコードを実行する必要があるため、これは問題があります。プラットフォームが異なるため、プラットフォームごとに1つのホイールを生成する必要があります。
ホイールをビルドするときに、ビルドをプラットフォーム固有にする方法はありますか?
これが私が通常見ているコードです wsgi
基本的なアプローチは次のとおりです。
# ...
try:
from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
class bdist_wheel(_bdist_wheel):
def finalize_options(self):
_bdist_wheel.finalize_options(self)
self.root_is_pure = False
except ImportError:
bdist_wheel = None
setup(
# ...
cmdclass={'bdist_wheel': bdist_wheel},
)
root_is_pure
ビットはホイール機械に非purelibを構築するように指示します(pyX-none-any
)ホイール。 binaryプラットフォーム固有のコンポーネントはあるが、はないと言うことで、 fancier を取得することもできます。 cpython abi固有のコンポーネント。
モジュールsetuptools
、distutils
、およびwheel
は、ext_modules
があるかどうかをチェックすることにより、pythonディストリビューションが純粋であるかどうかを判断します。
独自に外部モジュールを構築する場合でも、それをext_modules
にリストして、構築ツールがそれが存在することを認識できるようにすることができます。秘訣は、ソースの空のリストを提供して、setuptools
とdistutils
がそれを構築しようとしないようにすることです。例えば、
setup(
...,
ext_modules=[
setuptools.Extension(
name='your.external.module',
sources=[]
)
]
)
このソリューションは、bdist_wheel
コマンドにパッチを適用するよりもうまく機能しました。その理由は、bdist_wheel
が内部でinstall
コマンドを呼び出し、そのコマンドがext_modules
の存在を再度チェックして、purelib
またはplatlib
インストールのどちらかを決定するためです。 。外部モジュールをリストしないと、ホイール内のpurelib
サブフォルダーにlibがインストールされてしまいます。これは、auditwheel repair
を使用するときに問題を引き起こします。これは、拡張機能がpurelib
フォルダーにインストールされていることを訴えます。