【保存版】NumPyパッケージングの基礎知識 - add_installed_library()の使い方から代替方法まで


add_installed_library() 関数は、以下の引数を受け取ります。

  • link_args: ライブラリをリンクする際に必要な追加の引数
  • include_dirs: ライブラリのヘッダーファイルが格納されているディレクトリ
  • libs: ライブラリに含まれる個々のライブラリファイルの名前
  • name: リンクするライブラリの名前

具体的な使用方法

以下の例は、add_installed_library() 関数の使用方法を示しています。

from numpy.distutils.core import setup

setup(
    # ... 省略 ...

    ext_modules=[
        {
            'name': 'my_extension',
            'sources': ['my_extension.c'],
            'libraries': ['m'],
            'include_dirs': ['/usr/include'],
            'link_args': ['-Wl,-rpath=/usr/lib'],
        },
    ],

    build_requires=[
        'numpy',
    ],

    install_requires=[
        'numpy',
    ],
)

この例では、my_extension という名前の拡張モジュールを作成しています。このモジュールは my_extension.c ファイルからビルドされ、m ライブラリとリンクされます。ヘッダーファイルは /usr/include ディレクトリから検索され、ライブラリは /usr/lib ディレクトリからリンクされます。

利点

add_installed_library() 関数は、以下の利点を提供します。

  • ビルド時間の短縮: 既にインストール済みのライブラリを再ビルドする必要がないため、ビルド時間を短縮できます。
  • クロスプラットフォームなビルド: 異なるプラットフォーム間で一貫したビルドを可能にするため、プラットフォームごとに異なる設定を行う必要がありません。
  • 依存関係の管理: ビルドシステムにインストール済みのライブラリを自動的に検出してリンクするため、依存関係を手動で管理する必要がありません。

注意点

add_installed_library() 関数は、以下の点に注意する必要があります。

  • ライブラリをリンクする際に必要な追加の引数を指定する必要があります。
  • ライブラリのヘッダーファイルとライブラリファイルの場所が正しいことを確認する必要があります。
  • ライブラリがインストールされていることを確認する必要があります。


単一のライブラリをリンクする

from numpy.distutils.core import setup

setup(
    # ... 省略 ...

    ext_modules=[
        {
            'name': 'my_extension',
            'sources': ['my_extension.c'],
            'libraries': ['m'],
            'include_dirs': ['/usr/include'],
            'link_args': ['-Wl,-rpath=/usr/lib'],
        },
    ],

    build_requires=[
        'numpy',
    ],

    install_requires=[
        'numpy',
    ],
)

複数のライブラリをリンクする

from numpy.distutils.core import setup

setup(
    # ... 省略 ...

    ext_modules=[
        {
            'name': 'my_extension',
            'sources': ['my_extension.c'],
            'libraries': ['m', 'pthread'],
            'include_dirs': ['/usr/include'],
            'link_args': ['-Wl,-rpath=/usr/lib'],
        },
    ],

    build_requires=[
        'numpy',
    ],

    install_requires=[
        'numpy',
    ],
)

ライブラリのヘッダーファイルの場所を指定する

from numpy.distutils.core import setup

setup(
    # ... 省略 ...

    ext_modules=[
        {
            'name': 'my_extension',
            'sources': ['my_extension.c'],
            'libraries': ['m'],
            'include_dirs': ['/usr/local/include'],
            'link_args': ['-Wl,-rpath=/usr/local/lib'],
        },
    ],

    build_requires=[
        'numpy',
    ],

    install_requires=[
        'numpy',
    ],
)
from numpy.distutils.core import setup

setup(
    # ... 省略 ...

    ext_modules=[
        {
            'name': 'my_extension',
            'sources': ['my_extension.c'],
            'libraries': ['m'],
            'include_dirs': ['/usr/include'],
            'link_args': ['-Wl,-rpath=/usr/lib', '-Wl,--dynamic-linker=/usr/local/lib/ld-linux.so.2'],
        },
    ],

    build_requires=[
        'numpy',
    ],

    install_requires=[
        'numpy',
    ],
)


手動でライブラリをリンクする

add_installed_library() 関数を使用せずに、手動でライブラリをリンクすることも可能です。これには、以下の手順が必要です。

  • ライブラリをリンクする際に必要なフラグをビルドシステムに指示する。
  • ライブラリのヘッダーファイルとライブラリファイルをビルドシステムに指示する。

この方法は、以下の利点を提供します。

  • 特定の状況に合わせた設定が可能。
  • より柔軟な制御が可能。

一方、以下の欠点もあります。

  • エラーが発生しやすい。
  • 複雑な場合がある。

Cmake を使用する

Cmake は、クロスプラットフォームなビルドシステムであり、NumPy パッケージングにおいても使用できます。Cmake を使用すると、add_installed_library() 関数を使用するよりも簡潔で、より記述しやすいコードを作成することができます。

Cmake を使用する利点は以下の通りです。

  • クロスプラットフォームなビルドが可能。
  • コードが簡潔で記述しやすい。
  • NumPy のビルドシステムとの互換性に関する問題が発生する可能性がある。
  • Cmake を習得する必要がある。

pkg-config を使用する

pkg-config は、Linux システムでインストール済みのライブラリに関する情報を提供するツールです。pkg-config を使用すると、add_installed_library() 関数を使用するよりも簡潔にライブラリをリンクすることができます。

pkg-config を使用する利点は以下の通りです。

  • Linux システムで広く使用されている。
  • コードが簡潔で記述しやすい。
  • Windows システムでは使用できない。
  • pkg-config がインストールされていないシステムでは使用できない。

add_installed_library() 関数は、NumPy パッケージングにおいて便利な機能を提供しますが、状況によっては代替方法の方が適切な場合があります。上記に示した代替方法はそれぞれ利点と欠点があるため、プロジェクトの要件に合わせて最適な方法を選択することが重要です。

  • 開発者の経験: 開発者の Cmake や pkg-config の経験によって、最適な方法が異なります。
  • ライブラリの依存関係: ライブラリの依存関係が複雑な場合は、add_installed_library() 関数を使用する方が簡単になる場合があります。
  • ビルドシステム: 使用しているビルドシステムによって、利用可能な代替方法が異なる場合があります。