Windowsの/usr/bin/perlにCPANモジュールをインストールする方法

Windowsの/usr/bin/perlにCPANモジュールをインストールする方法

Posted at April 10,2014 1:55 AM
Tag:[CPAN, Perl]

Windowsの/usr/bin/perlにCPANモジュールをインストールする方法を紹介します。

このエントリーは「Windowsで/usr/bin/perlを実現する方法」の続きです。

1.問題点

記事「Windowsで/usr/bin/perlを実現する方法」の内容にしたがってperlを/usr/bin/perlというパスでインストールしたのですが、MySQLが必要なMovable Typeなどを起動すると「DB関連のモジュール(DBI/DBD-MySQL)がありません」という風なエラーメッセージが表示されてしまいました(/usr/bin/perlにインストールしたからという訳ではありません)。

で、Strawberry Perlに同梱されているdmakeを利用してCPANモジュールをインストールしてみたのですが、以下の手順でモジュールをインストールすると、当然C:\usr配下ではなく、C:\strawberry\perl配下にインストールされてしまいます。

  1. CPANモジュールのアーカイブをダウンロード
  2. アーカイブを展開
  3. cd アーカイブパス
  4. perl Makefile.pl
  5. dmake
  6. dmake test
  7. dmake install

ということで、正規の手順ではありませんが、 Strawberry Perlに同梱されているdmakeを利用して、C:\usr配下にCPANモジュールをインストールする方法を紹介します。

2.CPANモジュールをC:\usr配下にインストールする

1項に示した以下の手順までは変更ありません。

  1. CPANモジュールのアーカイブをダウンロード
  2. アーカイブを展開
  3. cd アーカイブパス
  4. perl Makefile.pl

ここまでの作業でアーカイブパス配下にMakefileが出力されるので、ファイルを任意のエディタで開き、

C:\strawberry\perl

の部分を

C:\usr

に書き換えます。

ただし書き換えるのは

# --- MakeMaker constants section:

以降の部分です。その前に出現する、

# --- MakeMaker const_config section:
…中略…
# --- MakeMaker constants section:

の部分は書き換えません。

具体的には、以下の部分にある「C:\strawberry\perlなど」はコンパイルに必要な資材のパスを指しているので修正不要です。

# --- MakeMaker const_config section:
 
# These definitions are from config.sh (via C:/strawberry/perl/lib/Config.pm).
# They may have been overridden via Makefile.PL or on the command line.
AR = ar
CC = gcc
CCCDLFLAGS =  
CCDLFLAGS =  
DLEXT = dll
DLSRC = dl_win32.xs
EXE_EXT = .exe
FULL_AR = 
LD = g++
LDDLFLAGS = -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib"
LDFLAGS = -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib"
LIBC = 
LIB_EXT = .a
OBJ_EXT = .o
OSNAME = MSWin32
OSVERS = 4.0
RANLIB = rem
SITELIBEXP = C:\strawberry\perl\site\lib
SITEARCHEXP = C:\strawberry\perl\site\lib
SO = dll
VENDORARCHEXP = C:\strawberry\perl\vendor\lib
VENDORLIBEXP = C:\strawberry\perl\vendor\lib

書き換えるのは、以下のようなインストール先を示す部分のパスです。「C:\strawberry\perl」が大量にあるのでエディタの一括変換機能などで置換します。

# --- MakeMaker constants section:
 
# Get dmake to read long commands like PM_TO_BLIB
MAXLINELENGTH = 800000
…中略…
PERLPREFIX = C:\strawberry\perl
SITEPREFIX = C:\strawberry\perl\site
VENDORPREFIX = C:\strawberry\perl\vendor
INSTALLPRIVLIB = C:\strawberry\perl\lib
DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
INSTALLSITELIB = C:\strawberry\perl\site\lib
DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
INSTALLVENDORLIB = C:\strawberry\perl\vendor\lib
DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
INSTALLARCHLIB = C:\strawberry\perl\lib
DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
INSTALLSITEARCH = C:\strawberry\perl\site\lib
DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
INSTALLVENDORARCH = C:\strawberry\perl\vendor\lib
DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
INSTALLBIN = C:\strawberry\perl\bin
DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
INSTALLSITEBIN = C:\strawberry\perl\site\bin
DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
INSTALLVENDORBIN = C:\strawberry\perl\bin
DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
INSTALLSCRIPT = C:\strawberry\perl\bin
DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
INSTALLSITESCRIPT = C:\strawberry\perl\site\bin
DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT)
INSTALLVENDORSCRIPT = C:\strawberry\perl\bin
DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT)
INSTALLMAN1DIR = none
DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
INSTALLSITEMAN1DIR = $(INSTALLMAN1DIR)
DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
INSTALLVENDORMAN1DIR = $(INSTALLMAN1DIR)
DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
INSTALLMAN3DIR = none
DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
INSTALLSITEMAN3DIR = $(INSTALLMAN3DIR)
DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
INSTALLVENDORMAN3DIR = $(INSTALLMAN3DIR)
DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
PERL_LIB = C:\strawberry\perl\lib
PERL_ARCHLIB = C:\strawberry\perl\lib
LIBPERL_A = libperl.a
FIRST_MAKEFILE = Makefile
MAKEFILE_OLD = Makefile.old
MAKE_APERL_FILE = Makefile.aperl
PERLMAINCC = $(CC)
PERL_INC = C:\strawberry\perl\lib\CORE
PERL = C:\strawberry\perl\bin\perl.exe
FULLPERL = C:\strawberry\perl\bin\perl.exe
…後略…

書き換えたあとは、コマンドプロンプトから以下のコマンドを順次実行します。

  1. dmake
  2. dmake test
  3. dmake install

以下、DBIとDBD-MySQLのインストール結果です。

3.DBIのインストール

DBIは上記の手順で問題なくインストールできました。

執筆時点のバージョンは1.631です。

DBI - search.cpan.org

4.DBD-MySQLのインストール

続いてDBD-MySQLです。執筆時点のバージョンは4.026です。

DBD-mysql-4.026 - search.cpan.org

こちらは各実行コマンドの出力結果もあわせて掲載します。

まず、DBD-MySQLのインストールではMakefile作成時に以下のようなエラーになりました。

C:\tmp\DBD-mysql-4.026>perl Makefile.PL
mysqladmin.exe was not found in your PATH.
Please either add the directory containing mysqladmin.exe
to your PATH environment variable, or rerun this script
with the --with-mysql=C:\Path\to\Mysql option, giving the
root directory of your MySQL installation.

ここではエラーメッセージに記載されているとおり、「--with-mysql=MySQLのルートフォルダ」を指定したところ、うまくいきました。

下がコマンド実行時の詳細です。

C:\tmp\DBD-mysql-4.026>perl Makefile.PL --with-mysql=C:\mysql
 
mysql_config.pl, and an associated bat file, has been
successfully created under
   C:\mysql\bin
 
 
Cannot find the file 'mysql_config'! Your execution PATH doesn't seem
not contain the path to mysql_config. Resorting to guessed values!
 
  
PLEASE NOTE:
 
For 'make test' to run properly, you must ensure that the
database user '' can connect to your MySQL server
and has the proper privileges that these tests require such
as 'drop table', 'create table', 'drop procedure', 'create procedure'
as well as others.
 
mysql> grant all privileges on test.* to ''@'localhost' identified by 's3kr1t';
 
You can also optionally set the user to run 'make test' with:
 
perl Makefile.PL --testuser=username
 
I will use the following settings for compiling and testing:
 
  cflags        (mysql_config) = -IC:\strawberry\c\bin\..\include\mysql_5
  embedded      (guessed     ) =
  ldflags       (mysql_config) =
  libs          (mysql_config) = -LC:\strawberry\c\bin\..\lib -lmysql
  mysql_config  (guessed     ) = mysql_config
  nocatchstderr (default     ) = 0
  nofoundrows   (default     ) = 0
  ssl           (guessed     ) = 0
  testdb        (default     ) = test
  testhost      (default     ) =
  testpassword  (default     ) =
  testport      (default     ) =
  testsocket    (default     ) =
  testuser      (guessed     ) =
Use of uninitialized value in printf at Makefile.PL line 174, <PIPE> line 2.
  with-mysql    (            ) = C:\mysql
 
To change these settings, see 'perl Makefile.PL --help' and
'perldoc DBD::mysql::INSTALL'.
 
Checking if your kit is complete...
Warning: the following files are missing in your kit:
        META.json
Please inform the author.
Multiple copies of Driver.xst found in: C:/strawberry/perl/site/lib/auto/DBI/ C:
/strawberry/perl/vendor/lib/auto/DBI/ at Makefile.PL line 936.
Using DBI 1.631 (for perl 5.018001 on MSWin32-x86-multi-thread-64int) installed
in C:/strawberry/perl/site/lib/auto/DBI/
Writing Makefile for DBD::mysql
Writing MYMETA.yml and MYMETA.json

あとはdmakeを実行します。下はコマンド実行時の詳細です。

C:\tmp\DBD-mysql-4.026>dmake
cp lib/DBD/mysql/GetInfo.pm blib\lib\DBD\mysql\GetInfo.pm
cp lib/DBD/mysql.pm blib\lib\DBD\mysql.pm
cp README.pod blib\lib\DBD\README.pod
cp lib/Bundle/DBD/mysql.pm blib\lib\Bundle\DBD\mysql.pm
cp lib/DBD/mysql/INSTALL.pod blib\lib\DBD\mysql\INSTALL.pod
gcc -c  -IC:\usr\site\lib\auto\DBI -IC:\strawberry\c\bin\..\include\mysql_5 -DDBD_MYSQL_INSERT_ID_IS_GOOD -g    -s -O2 -DWIN32 -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -s -O2        -DVERSION=\"4.026\"   -DXS_VERSION=\"4.026\"  "-IC:\usr\lib\CORE"   dbdimp.c
dbdimp.c: In function 'mysql_st_internal_execute':
dbdimp.c:3165:7: warning: '_errno' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]
C:\usr\bin\perl.exe -p -e "s/~DRIVER~/mysql/g" C:\usr\site\lib\auto\DBI\Driver.xst > mysql.xsi
C:\usr\bin\perl.exe C:\usr\lib\ExtUtils\xsubpp  -typemap C:\usr\lib\ExtUtils\typemap  mysql.xs > mysql.xsc && C:\usr\bin\perl.exe -MExtUtils::Command -e mv -- mysql.xsc mysql.c
Warning: duplicate function definition 'do' detected in mysql.xs, line 242
Warning: duplicate function definition 'rows' detected in mysql.xs, line 754
gcc -c  -IC:\usr\site\lib\auto\DBI -IC:\strawberry\c\bin\..\include\mysql_5 -DDBD_MYSQL_INSERT_ID_IS_GOOD -g    -s -O2 -DWIN32 -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -s -O2        -DVERSION=\"4.026\"   -DXS_VERSION=\"4.026\"  "-IC:\usr\lib\CORE"   mysql.c
Running Mkbootstrap for DBD::mysql ()
C:\usr\bin\perl.exe -MExtUtils::Command -e chmod -- 644 mysql.bs
C:\usr\bin\perl.exe -MExtUtils::Mksymlists \
     -e "Mksymlists('NAME'=>\"DBD::mysql\", 'DLBASE' => 'mysql', 'DL_FUNCS' => {
  }, 'FUNCLIST' => [], 'IMPORTS' => {  }, 'DL_VARS' => []);"
dlltool --def mysql.def --output-exp dll.exp
C:\usr\bin\perl.exe myld g++ -o blib\arch\auto\DBD\mysql\mysql.dll -Wl,--base-file -Wl,dll.base -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" dbdimp.o       mysql.o   C:\usr\lib\CORE\libperl518.a C:\strawberry\c\bin\..\lib\libmysql.a C:\strawberry\c\i686-w64-mingw32\lib\libmoldname.a C:\strawberry\c\i686-w64-mingw32\lib\libkernel32.a C:\strawberry\c\i686-w64-mingw32\lib\libuser32.a C:\strawberry\c\i686-w64-mingw32\lib\libgdi32.a C:\strawberry\c\i686-w64-mingw32\lib\libwinspool.a C:\strawberry\c\i686-w64-mingw32\lib\libcomdlg32.a C:\strawberry\c\i686-w64-mingw32\lib\libadvapi32.a C:\strawberry\c\i686-w64-mingw32\lib\libshell32.a C:\strawberry\c\i686-w64-mingw32\lib\libole32.a C:\strawberry\c\i686-w64-mingw32\lib\liboleaut32.a C:\strawberry\c\i686-w64-mingw32\lib\libnetapi32.a C:\strawberry\c\i686-w64-mingw32\lib\libuuid.a C:\strawberry\c\i686-w64-mingw32\lib\libws2_32.a C:\strawberry\c\i686-w64-mingw32\lib\libmpr.a C:\strawberry\c\i686-w64-mingw32\lib\libwinmm.a C:\strawberry\c\i686-w64-mingw32\lib\libversion.a C:\strawberry\c\i686-w64-mingw32\lib\libodbc32.a C:\strawberry\c\i686-w64-mingw32\lib\libodbccp32.a C:\strawberry\c\i686-w64-mingw32\lib\libcomctl32.a dll.
exp
dlltool --def mysql.def --base-file dll.base --output-exp dll.exp
C:\usr\bin\perl.exe myld g++ -o blib\arch\auto\DBD\mysql\mysql.dll -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" dbdimp.o    mysql.o   C:\usr\lib\CORE\libperl518.a C:\strawberry\c\bin\..\lib\libmysql.a C:\strawberry\c\i686-w64-mingw32\lib\libmoldname.a C:\strawberry\c\i686-w64-mingw32\lib\libkernel32.a C:\strawberry\c\i686-w64-mingw32\lib\libuser32.a C:\strawberry\c\i686-w64-mingw32\lib\libgdi32.a C:\strawberry\c\i686-w64-mingw32\lib\libwinspool.a C:\strawberry\c\i686-w64-mingw32\lib\libcomdlg32.a C:\strawberry\c\i686-w64-mingw32\lib\libadvapi32.a C:\strawberry\c\i686-w64-mingw32\lib\libshell32.a C:\strawberry\c\i686-w64-mingw32\lib\libole32.a C:\strawberry\c\i686-w64-mingw32\lib\liboleaut32.a C:\strawberry\c\i686-w64-mingw32\lib\libnetapi32.a C:\strawberry\c\i686-w64-mingw32\lib\libuuid.a C:\strawberry\c\i686-w64-mingw32\lib\libws2_32.a C:\strawberry\c\i686-w64-mingw32\lib\libmpr.a C:\strawberry\c\i686-w64-mingw32\lib\libwinmm.a C:\strawberry\c\i686-w64-mingw32\lib\libversion.a C:\strawberry\c\i686-w64-mingw32\lib\libodbc32.a C:\strawberry\c\i686-w64-mingw32\lib\libodbccp32.a C:\strawberry\c\i686-w64-mingw32\lib\libcomctl32.a dll.exp
C:\usr\bin\perl.exe -MExtUtils::Command -e chmod -- 755 blib\arch\auto\DBD\mysql\mysql.dll
C:\usr\bin\perl.exe -MExtUtils::Command -e cp -- mysql.bs blib\arch\auto\DBD\mysql\mysql.bs
C:\usr\bin\perl.exe -MExtUtils::Command -e chmod -- 644 blib\arch\auto\DBD\mysql\mysql.bs

dmake testの実行ログです。下はコマンド実行時の詳細です。

C:\tmp\DBD-mysql-4.026>dmake test
C:\usr\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib','blib\arch')" t/*.t
t/00base.t ........................... ok
t/10connect.t ........................ ok
t/15reconnect.t ...................... ok
t/20createdrop.t ..................... ok
t/25lockunlock.t ..................... ok
t/29warnings.t ....................... ok
t/30insertfetch.t .................... ok
t/31insertid.t ....................... ok
t/32insert_error.t ................... ok
t/35limit.t .......................... ok
t/35prepare.t ........................ ok
t/40bindparam.t ...................... ok
t/40bindparam2.t ..................... ok
t/40blobs.t .......................... ok
t/40catalog.t ........................ ok
t/40keyinfo.t ........................ ok
t/40listfields.t ..................... ok
t/40nulls.t .......................... ok
t/40nulls_prepare.t .................. ok
t/40numrows.t ........................ ok
t/40server_prepare.t ................. ok
t/40server_prepare_error.t ........... ok
t/40types.t .......................... ok
t/41bindparam.t ...................... ok
t/41blobs_prepare.t .................. ok
t/42bindparam.t ...................... ok
t/43count_params.t ................... ok
t/50chopblanks.t ..................... ok
t/50commit.t ......................... ok
t/51bind_type_guessing.t ............. ok
t/52comment.t ........................ ok
t/53comment.t ........................ ok
t/55utf8.t ........................... ok
t/60leaks.t .......................... skipped: Skip $ENV{EXTENDED_TESTING} is n
ot set
t/65segfault.t ....................... ok
t/65types.t .......................... ok
t/70takeimp.t ........................ ok
t/71impdata.t ........................ ok
t/75supported_sql.t .................. ok
t/76multi_statement.t ................ 1/25 # Testing multicall against SQL_DBMS_VER: 5.6.15
t/76multi_statement.t ................ ok
t/80procs.t .......................... skipped: Your test user does not have ALTER_ROUTINE privileges.
t/81procs.t .......................... skipped: Your test user does not have ALTER_ROUTINE privileges.
t/85init_command.t ................... ok
t/86_bug_36972.t ..................... ok
t/87async.t .......................... Can't locate Test/Deep.pm in @INC (you may need to install the Test::Deep module) (@INC contains: C:\tmp\DBD-mysql-4.026\blib\lib C:\tmp\DBD-mysql-4.026\blib\arch C:/usr/site/lib C:/usr/lib .) at t/87a
sync.t line 6.
BEGIN failed--compilation aborted at t/87async.t line 6.
t/87async.t .......................... Dubious, test returned 2 (wstat 512, 0x200)
No subtests run
t/88async-multi-stmts.t .............. skipped: Async support wasn't built into this version of DBD::mysql (mode is 0, 10021)
t/89async-method-check.t ............. skipped: Async support wasn't built into this version of DBD::mysql
t/90no-async.t ....................... ok
t/91errcheck.t ....................... ok
t/99_bug_server_prepare_blob_null.t .. ok
t/manifest.t ......................... skipped: these tests are for release testing
t/pod.t .............................. skipped: Test::Pod 1.00 required for testing POD
t/rt25389-bin-case.t ................. ok
t/rt50304-column_info_parentheses.t .. ok
t/rt83494-quotes-comments.t .......... ok
t/rt85919-fetch-lost-connection.t .... ok
t/rt86153-reconnect-fail-memory.t .... skipped: Skip $ENV{EXTENDED_TESTING} is not set
t/rt91715.t .......................... ok
 
Test Summary Report
-------------------
t/87async.t                        (Wstat: 512 Tests: 0 Failed: 0)
  Non-zero exit status: 2
  Parse errors: No plan found in TAP output
Files=58, Tests=940, 180 wallclock secs ( 0.41 usr +  0.25 sys =  0.65 CPU)
Result: FAIL
Failed 1/58 test programs. 0/940 subtests failed.
dmake:  Error code 255, while making 'test_dynamic'

途中でエラーになりましたが、無視してdmake installを実行します。下はコマンド実行時の詳細です。

C:\tmp\DBD-mysql-4.026>dmake install
Files found in blib\arch: installing files in blib\lib into architecture depende
nt library tree
Installing C:\usr\site\lib\auto\DBD\mysql\mysql.bs
Installing C:\usr\site\lib\auto\DBD\mysql\mysql.dll
Installing C:\usr\site\lib\Bundle\DBD\mysql.pm
Installing C:\usr\site\lib\DBD\mysql.pm
Installing C:\usr\site\lib\DBD\README.pod
Installing C:\usr\site\lib\DBD\mysql\GetInfo.pm
Installing C:\usr\site\lib\DBD\mysql\INSTALL.pod
Appending installation info to C:\usr\lib/perllocal.pod

これでDBD-MySQLもインストールできました。

Movable Typeも正常に起動したので大丈夫と思います。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)