Solaris10(SPARC版)でperl-5.9.3をインストールしようとしているのですが、

makeで下記エラーになります。

make: Fatal error: Command failed for target `miniperlmain.o'

エラーの状況をhttp://d.hatena.ne.jp/meichi/20070123にのせました。

すみませんが、解決のご教示をお願いします。

gccは下記を使っています。
root@ns[/usr/local/src]% gcc -v
Using built-in specs.
Target: sparc-sun-solaris2.10
Configured with: ../configure
Thread model: posix
gcc version 4.0.2

miniperlmain.oがトリガーかと思いましたが、私の感覚
ですいませんが、違うみたいです。

よろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2007/01/23 16:25:27
  • 終了:2007/01/28 09:08:51

ベストアンサー

id:a_b_y No.2

a_b_y回答回数16ベストアンサー獲得回数62007/01/27 21:09:34

ポイント300pt

あらかじめお断わりしておくと、私も職場にSolaris10の入ったマシンはあるのですが、meichiさんとは環境がだいぶ異なるようで再現しないので、以下の内容の一部は憶測の域を出ません。(/usr/local以下の状況に依存してしまうと、当該環境が手元にない限り限界があります。手元にあればどうとでもなるのですが…)そのため、ここではヒントになることを期待して、いくつか考えられることを書き記します。不明な部分は改めて聞いて頂ければと思います。原因などについても冗長に言及するので長くなることはご了承下さい。


最初に、もし README.solaris に目を通していないなら、きちんと読むべきです。(特に 135〜257行目あたり。)


コンパイルが通らない原因は、コメントにも書いたように、いくつかの設定についてConfigureが失敗しているからです。myconfigの結果で ptrsize= とか lseeksize= とかなっている部分で、本来はここがptrsize=4 などとなっていなくてはいけません。結果として、例えば config.h の 3363 行目が本来

#define PTRSIZE 4 /**/

などとなるべきなのに

#define PTRSIZE /**/

となってしまっているはずで、そのせいで perl.h の 1527 行目

#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)

において「== の right operand がないよ」と言われています。そういうのがいくつか積み重なって最終的に op.h でsyntax error になっています。


対処法について、方針は二つ。一つは、アドホックに、Configureが失敗した部分を手動で訂正する方法です。エラーを見れば「PTRSIZEが定義されていないんだろうな。どうせ config.h だろうな。…」ということは想像できるので、もし自分で正しい値を設定できるのであれば、一つずつ自分で修正していけば最終的にコンパイルできるだろうと思います。

ただし、これは強引な手なので勧められたものではないです。(私はたまにソースをいじって強引にコンパイルを通したりもしますが、褒められる方法ではないので。)


次に、Configureに正しく設定してもらう、という方針をとる場合。前提として、Configure実行時の質問には正しく回答した(Return連打でデフォルト値にするとか)と仮定します。そうでないなら、改めてデフォルト値で設定し直してみて下さい。なお、再度設定する際は

% make distclean

した後で改めて最初からやり直すのが安全です。


まず、何故Configureが設定に失敗したのか、原因について書きます。Configureの中身で、ptrsizeを設定している部分を読んでみると、6285行目から

if eval $compile_ok; then

ptrsize=`$run ./try`

echo "Your pointers are $ptrsize bytes long."

else

dflt='4'

echo "(I can't seem to compile the test program. Guessing...)" >&4

rp="What is the size of a pointer (in bytes)?"

. ./myread

ptrsize="$ans"

fi

となっています。ここでは、ポインタのサイズをチェックするためのテストプログラムをコンパイルできたなら(if $compile_ok)その出力に設定し(ptrsize=`$run ./try`)、そうでないならユーザに質問するという処理を行っています。おそらくですが、テストプログラムのコンパイルには成功したものの、実行時エラーが発生したため、ptrsizeが空になってしまったものと思われます。精査したわけではありませんが、ざっと読んだところでは、デフォルトで答えている限りそれ以外の可能性は考えられません。(これはある意味ではConfigureのバグとも言えます。他のバージョンのperlでも同じ処理をしているので、単にバージョンを変えただけでは解決にならず問題が他の部分にあることはソースを見れば一目瞭然です。)こんなことが起こるのは、リンカまわりの設定がうまく行っていないせいだと思います。(それを確認したいがためのコメントのテストだったのですが、結果が予想と違うのが悩み所です。テストの2からを、

% /bin/sh

とした後そのシェルの中でやっても同じ結果になるでしょうか?今手元にSolarisがないので適当なんですが。)


対処法はいくつか考えられるでしょうが、gcc ver.4 に特別こだわりがないのであれば(1)が妥当だろうと思います。

(0) Configureを修正する。上で書いたConfigureの処理はある意味バグです。本来

if eval $compile_ok; then

ではなくて

if eval $compile_ok && $run ./try > /dev/null; then

とでもするべき所です。Configureを読んでみると、正しい処理をしている部分とそうでない部分があって、何でこんな凡ミスをしているのか謎です。(きちんとセットアップされたシステムであれば問題にならないので、あまり気にしていないのかもしれません。)不適切な部分を全て修正すればうまく行くでしょう。

(1) 自分で入れた gcc を使わない。「gccでもいけるはず」ですが、私は /usr/local 以下に入っている gcc ver.4 の設定に関して微妙にうまく行っていない可能性を疑っています。(個人的にそうでないと納得できない部分があるのでそう思っているだけですが。)一旦PATHから/usr/local/binを外して、システムのデフォルト環境でやってみてはどうでしょうか。

(2) /usr/local/bin/gcc を使う場合。可能性としてはリンカまわりの処理がうまく行っていないと思われるので、その辺をもう一度確認です。今のところとりあえずは、 README.solaris に書いてあるオプションなどを試してみて下さい、としか言いようがないです。


最後に、話の腰を折りますが、元から入ってるperlじゃいけませんか?

http://www.fukuoka-edu.ac.jp/~kanamitu/install/sol10/

id:meichi

ありがとうございます。親切な回答をありがとうございます。それにしてもa_b_yさんは大変詳しいんですね。(脱帽)

>コンパイルが通らない原因は、コメントにも書いたように、いくつかの設定についてConfigureが失敗しているからです

私も失敗しているだろうなあ。と素人の感覚で思ってました。

>自分で入れた gcc を使わない

この方法でやってみようと思います。CompanionCDもインストールしているのでデフォルトのgccがあると思うので、使ってみます。

>元から入ってるperlじゃいけませんか?

でもいいのですが、どうしてもできないときはパッケージのperlをいれてみます。

大変詳しく、親切な説明をありがとうございました。

これで終わります。

2007/01/28 09:07:00

その他の回答(1件)

id:hamster009 No.1

hamster009回答回数3431ベストアンサー獲得回数502007/01/25 08:10:53

ポイント10pt

syntax errorということなので、perlの他のバージョンを試してみたら?

solaris10でのコンパイル例が紹介されているものだと確実でしょう。

http://end

id:meichi

>solaris10でのコンパイル例が紹介されているものだと確実でしょう。

すいませんが、紹介されているのでもだめでした。

2007/01/27 07:58:05
id:a_b_y No.2

a_b_y回答回数16ベストアンサー獲得回数62007/01/27 21:09:34ここでベストアンサー

ポイント300pt

あらかじめお断わりしておくと、私も職場にSolaris10の入ったマシンはあるのですが、meichiさんとは環境がだいぶ異なるようで再現しないので、以下の内容の一部は憶測の域を出ません。(/usr/local以下の状況に依存してしまうと、当該環境が手元にない限り限界があります。手元にあればどうとでもなるのですが…)そのため、ここではヒントになることを期待して、いくつか考えられることを書き記します。不明な部分は改めて聞いて頂ければと思います。原因などについても冗長に言及するので長くなることはご了承下さい。


最初に、もし README.solaris に目を通していないなら、きちんと読むべきです。(特に 135〜257行目あたり。)


コンパイルが通らない原因は、コメントにも書いたように、いくつかの設定についてConfigureが失敗しているからです。myconfigの結果で ptrsize= とか lseeksize= とかなっている部分で、本来はここがptrsize=4 などとなっていなくてはいけません。結果として、例えば config.h の 3363 行目が本来

#define PTRSIZE 4 /**/

などとなるべきなのに

#define PTRSIZE /**/

となってしまっているはずで、そのせいで perl.h の 1527 行目

#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)

において「== の right operand がないよ」と言われています。そういうのがいくつか積み重なって最終的に op.h でsyntax error になっています。


対処法について、方針は二つ。一つは、アドホックに、Configureが失敗した部分を手動で訂正する方法です。エラーを見れば「PTRSIZEが定義されていないんだろうな。どうせ config.h だろうな。…」ということは想像できるので、もし自分で正しい値を設定できるのであれば、一つずつ自分で修正していけば最終的にコンパイルできるだろうと思います。

ただし、これは強引な手なので勧められたものではないです。(私はたまにソースをいじって強引にコンパイルを通したりもしますが、褒められる方法ではないので。)


次に、Configureに正しく設定してもらう、という方針をとる場合。前提として、Configure実行時の質問には正しく回答した(Return連打でデフォルト値にするとか)と仮定します。そうでないなら、改めてデフォルト値で設定し直してみて下さい。なお、再度設定する際は

% make distclean

した後で改めて最初からやり直すのが安全です。


まず、何故Configureが設定に失敗したのか、原因について書きます。Configureの中身で、ptrsizeを設定している部分を読んでみると、6285行目から

if eval $compile_ok; then

ptrsize=`$run ./try`

echo "Your pointers are $ptrsize bytes long."

else

dflt='4'

echo "(I can't seem to compile the test program. Guessing...)" >&4

rp="What is the size of a pointer (in bytes)?"

. ./myread

ptrsize="$ans"

fi

となっています。ここでは、ポインタのサイズをチェックするためのテストプログラムをコンパイルできたなら(if $compile_ok)その出力に設定し(ptrsize=`$run ./try`)、そうでないならユーザに質問するという処理を行っています。おそらくですが、テストプログラムのコンパイルには成功したものの、実行時エラーが発生したため、ptrsizeが空になってしまったものと思われます。精査したわけではありませんが、ざっと読んだところでは、デフォルトで答えている限りそれ以外の可能性は考えられません。(これはある意味ではConfigureのバグとも言えます。他のバージョンのperlでも同じ処理をしているので、単にバージョンを変えただけでは解決にならず問題が他の部分にあることはソースを見れば一目瞭然です。)こんなことが起こるのは、リンカまわりの設定がうまく行っていないせいだと思います。(それを確認したいがためのコメントのテストだったのですが、結果が予想と違うのが悩み所です。テストの2からを、

% /bin/sh

とした後そのシェルの中でやっても同じ結果になるでしょうか?今手元にSolarisがないので適当なんですが。)


対処法はいくつか考えられるでしょうが、gcc ver.4 に特別こだわりがないのであれば(1)が妥当だろうと思います。

(0) Configureを修正する。上で書いたConfigureの処理はある意味バグです。本来

if eval $compile_ok; then

ではなくて

if eval $compile_ok && $run ./try > /dev/null; then

とでもするべき所です。Configureを読んでみると、正しい処理をしている部分とそうでない部分があって、何でこんな凡ミスをしているのか謎です。(きちんとセットアップされたシステムであれば問題にならないので、あまり気にしていないのかもしれません。)不適切な部分を全て修正すればうまく行くでしょう。

(1) 自分で入れた gcc を使わない。「gccでもいけるはず」ですが、私は /usr/local 以下に入っている gcc ver.4 の設定に関して微妙にうまく行っていない可能性を疑っています。(個人的にそうでないと納得できない部分があるのでそう思っているだけですが。)一旦PATHから/usr/local/binを外して、システムのデフォルト環境でやってみてはどうでしょうか。

(2) /usr/local/bin/gcc を使う場合。可能性としてはリンカまわりの処理がうまく行っていないと思われるので、その辺をもう一度確認です。今のところとりあえずは、 README.solaris に書いてあるオプションなどを試してみて下さい、としか言いようがないです。


最後に、話の腰を折りますが、元から入ってるperlじゃいけませんか?

http://www.fukuoka-edu.ac.jp/~kanamitu/install/sol10/

id:meichi

ありがとうございます。親切な回答をありがとうございます。それにしてもa_b_yさんは大変詳しいんですね。(脱帽)

>コンパイルが通らない原因は、コメントにも書いたように、いくつかの設定についてConfigureが失敗しているからです

私も失敗しているだろうなあ。と素人の感覚で思ってました。

>自分で入れた gcc を使わない

この方法でやってみようと思います。CompanionCDもインストールしているのでデフォルトのgccがあると思うので、使ってみます。

>元から入ってるperlじゃいけませんか?

でもいいのですが、どうしてもできないときはパッケージのperlをいれてみます。

大変詳しく、親切な説明をありがとうございました。

これで終わります。

2007/01/28 09:07:00
  • id:a_b_y
    何となく予想はつきますけど、確証は持てないので、とりあえず
    % ./myconfig
    の出力を見たいですね。後
    % echo $PATH
    % echo $LD_LIBRARY_PATH
    の出力も。
  • id:meichi
    すいません、下記の出力であってますでしょうか。% echo $LD_LIBRARY_PATHについては何も表示されませんでした。

    root@ns[/usr/local/src/perl-5.9.3]% cat myconfig.SH
    case $PERL_CONFIG_SH in
    '')
    if test -f config.sh; then TOP=.;
    elif test -f ../config.sh; then TOP=..;
    elif test -f ../../config.sh; then TOP=../..;
    elif test -f ../../../config.sh; then TOP=../../..;
    elif test -f ../../../../config.sh; then TOP=../../../..;
    else
    echo "Can't find the perl config.sh file produced by Configure";
    exit 1
    fi
    . $TOP/config.sh
    ;;
    esac
    : This forces SH files to create target in same directory as SH file.
    : This is so that make depend always knows where to find SH derivatives.
    case "$0" in
    */*) cd `expr X$0 : 'X\(.*\)/'` ;;
    esac
    echo "Extracting myconfig (with variable substitutions)"
    $spitshell >myconfig <<!GROK!THIS!
    $startsh

    # This script is designed to provide a handy summary of the configuration
    # information being used to build perl. This is especially useful if you
    # are requesting help from comp.lang.perl.misc on usenet or via mail.

    # Note that the text lines /^Summary of/ .. /^\s*$/ are copied into Config.pm.
    cat <<'!NO!SUBS!'
    Summary of my $package (revision $revision $version_patchlevel_string) configuration:
    Platform:
    osname=$osname, osvers=$osvers, archname=$archname
    uname='$myuname'
    config_args='$config_args'
    hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction
    useithreads=$useithreads, usemultiplicity=$usemultiplicity
    useperlio=$useperlio, d_sfio=$d_sfio, uselargefiles=$uselargefiles, usesocks=$usesocks
    use64bitint=$use64bitint, use64bitall=$use64bitall, uselongdouble=$uselongdouble
    usemymalloc=$usemymalloc, bincompat5005=undef
    Compiler:
    cc='$cc', ccflags ='$ccflags',
    optimize='$optimize',
    cppflags='$cppflags'
    ccversion='$ccversion', gccversion='$gccversion', gccosandvers='$gccosandvers'
    intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize, byteorder=$byteorder
    d_longlong=$d_longlong, longlongsize=$longlongsize, d_longdbl=$d_longdbl, longdblsize=$longdblsize
    ivtype='$ivtype', ivsize=$ivsize, nvtype='$nvtype', nvsize=$nvsize, Off_t='$lseektype', lseeksize=$lseeksize
    alignbytes=$alignbytes, prototype=$prototype
    Linker and Libraries:
    ld='$ld', ldflags ='$ldflags'
    libpth=$libpth
    libs=$libs
    perllibs=$perllibs
    libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl
    gnulibc_version='$gnulibc_version'
    Dynamic Linking:
    dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags'
    cccdlflags='$cccdlflags', lddlflags='$lddlflags'

    !NO!SUBS!
    !GROK!THIS!
    chmod 755 myconfig
    $eunicefix myconfig

    root@ns[~]% echo $PATH
    /usr/local/bin:/usr/bin:/usr/sbin:/usr/ccs/bin:/bin:/usr/openwin/bin:/usr/openwin/demo:/usr/ucb:.

    root@ns[~]% echo $LD_LIBRARY_PATH
    LD_LIBRARY_PATH: Undefined variable.
    root@ns[~]% bash
    # echo $LD_LIBRARY_PATH
  • id:a_b_y
    欲しかったのは'myconfig.SH'の中身ではなくて、'myconfig'というファイルがあると思うので(Configureすることで作成される)、それを実行した結果出力される内容です。
    % ./myconfig
    とするか
    % sh myconfig
    とします。これによってConfigureで設定された内容が表示されるので、それを確認したいのです。何をやりたいかというと、コンパイル・エラーから辿って、Configureが設定すべきいくつかの数値が正しく設定されていないこと、具体的に何がどうこけて設定に失敗しているのか、などある程度は推測できるのですが、実際どうかはやはり見ないとわからないので。

    あと、2つばかり聞きたいことがあります。

    ・ GCC ver.4 を使っていますが、これは何か理由が?特にないのなら GCC ではなく Solaris 標準のSunコンパイラを使ったら問題なく行かないかなと。

    ・ 以下の作業をテストしてみてもらえますか。
    1. 次の内容のファイルを用意する。(仮に'hoge.c'とでもします。)
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    printf("%d\n", (int)sizeof(void *));
    exit(0);
    }
    2. コンパイルは通るか?
    % gcc hoge.c
    3. コンパイルが通ったとして、実行できるか?
    % ./a.out
    「3でこけるのかな」と思っているのですが。
  • id:meichi
    ありがとうございます。myconfigの結果です。

    root@ns[/usr/local/src/perl-5.9.3]% ./myconfig
    Summary of my perl5 (revision 5 version 9 subversion 3) configuration:
    Platform:
    osname=solaris, osvers=2.10, archname=sun4-solaris
    uname='sunos ns 5.10 generic_118833-24 sun4u sparc sunw,sun-blade-100 '
    config_args=''
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
    Compiler:
    cc='gcc', ccflags ='-fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DPERL_USE_SAFE_PUTENV',
    optimize='-O2',
    cppflags='-fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include'
    ccversion='', gccversion='4.0.2', gccosandvers=''
    intsize=4, longsize=4, ptrsize=, doublesize=, byteorder=4321
    d_longlong=define, longlongsize=, d_longdbl=define, longdblsize=
    ivtype='long', ivsize=4, nvtype='double', nvsize=, Off_t='off_t', lseeksize=
    alignbytes=1, prototype=define
    Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib '
    libpth=/usr/local/lib /usr/lib /usr/ccs/lib
    libs=-lsocket -lnsl -ldl -lm -lc
    perllibs=-lsocket -lnsl -ldl -lm -lc
    libc=/lib/libc.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version=''
    Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' '
    cccdlflags='-fPIC', lddlflags='-G -L/usr/local/lib'

    >・ GCC ver.4 を使っていますが、これは何か理由が?特にないのなら GCC ではなく Solaris 標準のSunコンパイラを使ったら問題なく行かないかなと。

    Sunのコンパイラですが、すいません。私はgccでいけると思ってるのですが。。。

    あとテストファイルはたぶん正常に実行できたと思います。
    下記です。

    # ./a.out
    4

    よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません