Windowsの/usr/bin/perlにCPANモジュールをインストールする方法
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配下にインストールされてしまいます。
- CPANモジュールのアーカイブをダウンロード
- アーカイブを展開
- cd アーカイブパス
- perl Makefile.pl
- dmake
- dmake test
- dmake install
ということで、正規の手順ではありませんが、 Strawberry Perlに同梱されているdmakeを利用して、C:\usr配下にCPANモジュールをインストールする方法を紹介します。
2.CPANモジュールをC:\usr配下にインストールする
1項に示した以下の手順までは変更ありません。
- CPANモジュールのアーカイブをダウンロード
- アーカイブを展開
- cd アーカイブパス
- 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
…後略…
書き換えたあとは、コマンドプロンプトから以下のコマンドを順次実行します。
- dmake
- dmake test
- dmake install
以下、DBIとDBD-MySQLのインストール結果です。
3.DBIのインストール
DBIは上記の手順で問題なくインストールできました。
執筆時点のバージョンは1.631です。
4.DBD-MySQLのインストール
続いてDBD-MySQLです。執筆時点のバージョンは4.026です。
こちらは各実行コマンドの出力結果もあわせて掲載します。
まず、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も正常に起動したので大丈夫と思います。
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて