477 :
名無しさん@お腹いっぱい。:
ぬぬ。bcc32でなんとかXSモジュールをビルド出来ないものかと
二時間ほど粘ってみたがダメだった。無念じゃ…。
478 :
:02/01/02 10:03 ID:XJ6nVU2M
>>477 どのモジュール?
mingw32とかはだめ?
あと、bcc32付属のmake使わずに、gnu makeつかえば、bcc32でもいけるかもね
makeは付属のmakeだと明らかにダメなのでMake.pm(pmake)使ってます。
問題はperl.hとperlvars.hがコンパイルエラー。
エラー E2257 C:\perl5.6.1\lib\CORE\perl.h 1755: , が必要
エラー E2257 C:\perl5.6.1\lib\CORE\perl.h 1756: , が必要
エラー E2257 C:\perl5.6.1\lib\CORE\perl.h 1757: , が必要
エラー E2257 C:\perl5.6.1\lib\CORE\perl.h 1758: , が必要
エラー E2141 C:\perl5.6.1\lib\CORE\perlvars.h 22: 宣言の構文エラー
エラー E2141 C:\perl5.6.1\lib\CORE\perlvars.h 39: 宣言の構文エラー
エラー E2141 C:\perl5.6.1\lib\CORE\perlvars.h 22: 宣言の構文エラー
エラー E2141 C:\perl5.6.1\lib\CORE\perlvars.h 39: 宣言の構文エラー
因みに
#line 1755 perl.h
typedef pthread_t perl_os_thread;
です。
他のtypedefは引っかからないのに…お手上げです。
mingw32はよくわかりません。
477,479です。
mingwはヘッダファイルのコンパイルは通りますが、
Makefileが全然ダメですね。
Config.pmのcc/ld/cppを分かる範囲で書き換えてもまだダメです。
mingwでコンパイルしたPerlがあればいいのかも…。
ふと思ったんだがPerl6の"is"演算子ってPerl5の":"演算子みたいなものなんだろうか?
>>480 bcc32は独自拡張、独自縮小が甚だしいから(GCCもだけど ^^ )
素直にCygwin入れてgcc使った方が良いような。。。。
「,」引っ掛かりなんていかにもbccが原因っぽい
>>477, 479-480
うちの(久しぶりに立ち上げた)Windows環境の場合、
Borland C++ Compiler D:/bcc55
ActivePerl5.6.1 D:/Perl
なんだけど、
1. cp, mv, rm, mkdir等の基本的なコマンドが揃っていること確認。
2. d:/bcc55/bin/coff2omf で D:/Perl/lib/CORE にある perl56.libを
perl56-omf.lib(仮称) に変換。(元のファイルは変更されない)
$ coff2omf perl56.lib perl56-omf.lib
3. D:/Perl/lib/Config.pmを以下のように修正する。(必ずバックアップをとる)
34,35c34,35
< cc='cl'
< ccflags='-nologo -O1 -MD -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DPERL_MSVCRT_READFIX'
---
> cc='bcc32'
> ccflags='-O2 -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS '
43c43
< libs=' oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib msvcrt.lib'
---
> libs='import32.lib cw32i.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib version.lib odbc32.lib'
593,595c593,595
< ld='link'
< lddlflags='-dll -nologo -nodefaultlib -release -libpath:"D:\Perl\lib\CORE" -machine:x86'
< ldflags='-nologo -nodefaultlib -release -libpath:"D:\Perl\lib\CORE" -machine:x86'
---
> ld='ilink32'
> lddlflags='-L"D:\Perl\lib\CORE" -c -x -Gn -ap -Tpd -machine:x86'
> ldflags='-L"D:\Perl\lib\CORE" -c -x -Gn -ap -Tpd -machine:x86'
601c601
< libperl='perl56.lib'
---
> libperl='perl56-omf.lib'
668c668
< optimize='-O1 -MD -DNDEBUG'
---
> optimize='-O1 -DNDEBUG'
4. テスト用のXSを書いてみる。
$ h2xs -A -n MyTest
$ cd MyTest
---- MyTest.xs ----
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
MODULE = MyTest PACKAGE = MyTest
void
hello()
CODE:
printf("Hello XS World!\n");
-------------------
$ perl Makefile.PL
# "コマンドが見つからない"云々と文句を言われるかもしれないが、何の問題も無い
出来たMakefileを少し修正する。
774行目からのpm_to_blibの辺りで何故かエラーになるので (なぜだぁ)
pm_to_blib: $(TO_INST_PM)
echo "ahyahya"
-- 以降、ファイル終端まで削除 --
とでもしておく。(取りあえず重要な個所ではないので)
408 行目辺りの(見つからなかったら"subst"で検索)
$(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) $(LDFROM),$@,,$(subst /,\,$(PERL_ARCHIVE)) $(subs 408 t /,\,$(LDLOADLIBS)) $(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST)),$(RESFILES)
の部分を
$(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) $(LDFROM),$@,,$(PERL_ARCHIVE) $(LDLOADLIBS) $(MYEXTLIB),$(EXPORT_LIST),$(RESFILES)
と変更。(substってなんだべさ)
$ make
makeはBorland C++に付属のものを利用する。
Mksymlists.pmでuse strictが原因で失敗した場合、strictをコメントアウト(おい)
....これで正常にビルドできるはず。(うちでは出来た)
make後は、test.plに MyTest::hello(); を追加して
$ make test
1..1
Hello XS World!
ok
....でめでたしめでたし。内部APIの利用も問題無かった。
普段Windowsを使っていないせいもあって、かなりいい加減な説明なのはお許しを。
何かの参考になれば、ということで。
#書き込める時と書けない時があるなぁ
ヤター!
簡単なテストは成功しました。
substはWindowsのコマンドみたいです。
Makefileは特に変更なしでもオッケーでした(何故?)
_gunzipさんありがとうございます!
…が!試しにCPANからWant-0.5を取って来てビルドしようとしたんですが…
リンクが失敗してしまいます。ガクッ。
> Error: 外部シンボル '_Perl_pop_return' が未解決(D:\PERLARC\WANT-0.05\WANT.OBJ
が参照)
ちなみにWindows ME・ActivePerl5.6.1-630です。(Win9xだからかな…)
助けて_gunzipさん!
488 :
:02/01/03 16:02 ID:???
gudでperlのデバッグができると聞いてさっそく M-x perldb とやってみて、なるほど
動いているのですが、C-x SPとかで ブレークポイントが設定できなかったり、
スタックさかのぼれなかったりしているんですがそんなもんなんですか?
>>487 むむ..ActivePerlの perl56.lib には Perl_pop_return()が無いのか...。
(他にも無いAPIがあるのかなぁ...。cygwinのlibperl5_6_1.dllにはあるのだが)
代替策としては、Perl_pop_return()の役割から考えて、
Want.xsの564行目の pop_return();を
if (PL_retstack_ix > 0)
--PL_retstack_ix;
と変更すればよい。
Linux, cygwinでは、これで全てうまく行った。("make test"も全て ok)
(もっとも、修正無しでも正常にビルド、テストを通るのだが)
....ただ、ActivePerl5.6.1-629 + Windows98 + bcc32では、
make test段階で「不正な処理」で強制終了になるみたい。
んー取りあえず試してみて欲しいです。
>Makefileは特に変更なしでもオッケーでした(何故?)
pmakeってMakeモジュールに付いてくるコマンドだったのか。
これを使えば>485の修正は不要ですね。
やったーー!
Want.pmは成功です!
make testも問題なく通り無事インストールできました。
他、Storable・NKFも成功。(他にも色々インストールしてみたかったはずだがイザとなると思い出せず…)
ありがとうございましたっ!
いや〜、WinでXSなんてVC++がなければ出来ないものと正直諦めていました。
_gunzipさんホントに感謝します。