Symfoware

Symfowareについての考察blog

MinGWのmingw32-makeを使って、PythonのC言語拡張をビルドする

MinGWでPythonのC言語拡張がビルド出来るようになりました。

MinGWでPythonのC言語拡張モジュールをビルドする

毎回、二回もコマンドを実行するのが面倒なので、Makefileを作成することにします。
Makefile、いつも書き方を覚えようとするのですがなかなか・・・




MinGWのmake



MinGWでのmakeは「make」ではなく「mingw32-make」となります。
理由はここに記載されていました。
なぜ make には mingw32-make.exe という名前が付けられているのですか?





Makefile



見よう見まねで、こんなMakefileを作成しました。


ext_sample.pyd : ext_sample.o
    gcc -shared ext_sample.o -o ext_sample.pyd -L"C:\python25\libs" -lpython25

ext_sample.o : ext_sample.c
    gcc -c ext_sample.c -I"C:\python25\include"





mingw32-makeしてみると、

>mingw32-make
mingw32-make: *** No rule to make target `-lpython25', needed by `ext_sample.o'.
Stop.





-lpython25を外して、再度実行。


ext_sample.pyd : ext_sample.o
    gcc -shared ext_sample.o -o ext_sample.pyd -L"C:\python25\libs"

ext_sample.o : ext_sample.c
    gcc -c ext_sample.c -I"C:\python25\include"




今度はこんなエラーが。


>mingw32-make
cc    -c -o ext_sample.o ext_sample.c
process_begin: CreateProcess(NULL, cc -c -o ext_sample.o ext_sample.c, ...) fail
ed.
make (e=2): wウスt@CェゥツゥワケB
mingw32-make: *** [ext_sample.o] Error 2





ここで、「gcc」を指定しているのに、「cc」を実行しているので怪しいと思ったら、
Makefile とは何ですか? また、それを作成するにはどうすればよいですか?

Makefile 中の全てのインデント付けはスペースではなく、
タブで行われるべきです。




インデントをスペース4つで入れていたので、動作がおかしくなっていました。
インデントをタブに変更したら、

>mingw32-make
gcc -c ext_sample.c -I"C:\python25\include"
gcc -shared ext_sample.o -o ext_sample.pyd -L"C:\python25\libs" -lpython25



こんな感じで、ビルドに成功しました。






マクロを使用する



変更する可能性がある個所は、マクロで定義しておくと便利かつかっこいいです。
上記のMakefileをマクロを使用してちょっと変更してみました。
※内容は同等


CC = gcc
INCLUDES = -I"C:\python25\include"
LIBS = -L"C:\python25\libs" -lpython25

ext_sample.pyd : ext_sample.o
    $(CC) -shared ext_sample.o -o ext_sample.pyd $(LIBS)

ext_sample.o : ext_sample.c
    $(CC) -c ext_sample.c $(INCLUDES)



それっぽいです。






サフィックスルール



このMakefileでは、拡張子「c」は必ず拡張子「o」の同名ファイルに変換されます。
拡張子に依存するルールを「サフィックスルール」と呼ぶようです。

このルールを使ったMakefileは以下のようになりました。


CC = gcc
INCLUDES = -I"C:\python25\include"
LIBS = -L"C:\python25\libs" -lpython25

ext_sample.pyd : ext_sample.o
    $(CC) -shared ext_sample.o -o ext_sample.pyd $(LIBS)

#ext_sample.o : ext_sample.c
#    $(CC) -c ext_sample.c $(INCLUDES)

.c.o:
    $(CC) -c $< $(INCLUDES)




以下の指定

$<


は、実行に使用されるファイル名(この場合は、ext_sample.c)に展開されます。
例だと有用性が見えませんが、複数のソースファイルが存在する場合は
いちいちルールを書いていれられないので便利です。






さらにマクロ



生成するファイル名にもマクロを使ってみました。


CC = gcc
INCLUDES = -I"C:\python25\include"
LIBS = -L"C:\python25\libs" -lpython25

TARGET = ext_sample.pyd
OBJS = ext_sample.o

$(TARGET) : $(OBJS)
    $(CC) -shared $(OBJS) -o $(TARGET) $(LIBS)

.c.o:
    $(CC) -c $< $(INCLUDES)



ここまですると、逆にわかりにくいのかもしれません。






Pythonのサンプル実行も同時に行う



ビルドした後、sample.pyを実行するようにしてみました。



CC = gcc
INCLUDES = -I"C:\python25\include"
LIBS = -L"C:\python25\libs" -lpython25

TARGET = ext_sample.pyd
OBJS = ext_sample.o

run : $(TARGET)
    python sample.py

$(TARGET) : $(OBJS)
    $(CC) -shared $(OBJS) -o $(TARGET) $(LIBS)

.c.o:
    $(CC) -c $< $(INCLUDES)




実行すると、狙い通りの動作になりました。


>mingw32-make
gcc -c ext_sample.c -I"C:\python25\include"
gcc -shared ext_sample.o -o ext_sample.pyd -L"C:\python25\libs" -lpython25
python sample.py
日本語テスト







【参考URL】
gccの使い方
Make と Makefile の説明
MinGW FAQ



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/08/30(火) 20:46:18|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ