[ruby-trunk - Bug #8524][Open] r40755以降 No rule to make target `.ext/include/sparc64-solaris2.10/rub

Issue #8524 has been reported by ngoto (Naohisa G.).


Bug #8524: r40755以降 No rule to make target
`.ext/include/sparc64-solaris2.10/ruby/config.h でビルドできない

Author: ngoto (Naohisa G.)
Status: Open
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: build
Target version:
ruby -v: -
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

r40755以降、Solarisでは、以下のように .ext/include/アーキテクチャ/ruby/config.h が作成されません。

原因は、r40755にて以下の行が./tool/ifchange に追加されたためです。

@@ -30,6 +37,7 @@
rm -f “$temp”
else
echo “$target updated”

  • ${keepsuffix:+ mv -f “$target” “${target}${keepsuffix}” }
    mv -f “$temp” “$target”
    fi

この tool/ifchangeは #!/bin/sh
なのに、基本的な/bin/shでは解釈できない(bash依存?)記述が追加されたため、Solarisのようにピュアな/bin/shを持つOSでは、そこで処理がストップし、しかしconfigureではエラーを検知できないらしく、そのままconfig.hが作成されないままconfigureが正常終了してしまうのが原因のようです。

$ ./configure --prefix=/hoge/hoge/hoge
(中略)
checking for nroff… /usr/bin/nroff
.ext/include/sparc64-solaris2.10/ruby/config.h updated
./tool/ifchange: bad substitution
verconf.h updated
./tool/ifchange: bad substitution
ruby library version = 2.1.0
configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating Makefile
config.status: creating ruby-2.1.pc
$ make V=1
CC = cc
LD = /usr/ccs/bin/ld
LDSHARED = cc -G
CFLAGS = -xO1 -xtarget=sparc64viiplus -m64
XCFLAGS = -DRUBY_EXPORT
CPPFLAGS = -I/usr/local/64/lib/libffi-3.0.10/include
-I/usr/local/64/include -I. -I.ext/include/sparc64-solaris2.10
-I./include -I.
DLDFLAGS = -m64 -L/usr/local/64/lib -R/usr/local/64/lib -m64
SOLIBS =
cc: Sun C 5.12 SunOS_sparc 2011/11/16
make: *** No rule to make target
.ext/include/sparc64-solaris2.10/ruby/config.h', needed by main.o’.
Stop.

Issue #8524 has been updated by knu (Akinori MUSHA).

${var:+val} がサポートされていないってのはちょっとした驚きでした。少なくともSUSv2/UNIX98では定義されているので。
OpenIndianaだと/bin/shはksh93になっているようで、エラーは出ませんでした。

後学のために教えていただきたいのですが、 ${var+val} だとOKでしょうか。
あと、 ${var:-val} / ${var-val} もよく使うので気になります…。

Bug #8524: r40755以降 No rule to make target
`.ext/include/sparc64-solaris2.10/ruby/config.h でビルドできない

Author: ngoto (Naohisa G.)
Status: Closed
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: build
Target version:
ruby -v: -
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

r40755以降、Solarisでは、以下のように .ext/include/アーキテクチャ/ruby/config.h が作成されません。

原因は、r40755にて以下の行が./tool/ifchange に追加されたためです。

@@ -30,6 +37,7 @@
rm -f “$temp”
else
echo “$target updated”

  • ${keepsuffix:+ mv -f “$target” “${target}${keepsuffix}” }
    mv -f “$temp” “$target”
    fi

この tool/ifchangeは #!/bin/sh
なのに、基本的な/bin/shでは解釈できない(bash依存?)記述が追加されたため、Solarisのようにピュアな/bin/shを持つOSでは、そこで処理がストップし、しかしconfigureではエラーを検知できないらしく、そのままconfig.hが作成されないままconfigureが正常終了してしまうのが原因のようです。

$ ./configure --prefix=/hoge/hoge/hoge
(中略)
checking for nroff… /usr/bin/nroff
.ext/include/sparc64-solaris2.10/ruby/config.h updated
./tool/ifchange: bad substitution
verconf.h updated
./tool/ifchange: bad substitution
ruby library version = 2.1.0
configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating Makefile
config.status: creating ruby-2.1.pc
$ make V=1
CC = cc
LD = /usr/ccs/bin/ld
LDSHARED = cc -G
CFLAGS = -xO1 -xtarget=sparc64viiplus -m64
XCFLAGS = -DRUBY_EXPORT
CPPFLAGS = -I/usr/local/64/lib/libffi-3.0.10/include
-I/usr/local/64/include -I. -I.ext/include/sparc64-solaris2.10
-I./include -I.
DLDFLAGS = -m64 -L/usr/local/64/lib -R/usr/local/64/lib -m64
SOLIBS =
cc: Sun C 5.12 SunOS_sparc 2011/11/16
make: *** No rule to make target
.ext/include/sparc64-solaris2.10/ruby/config.h', needed by main.o’.
Stop.

さとうふみやす @ OSSTech です。

At Fri, 14 Jun 2013 21:36:17 +0900,
knu (Akinori MUSHA) wrote:

${var:+val} がサポートされていないってのはちょっとした驚きでした。少なくともSUSv2/UNIX98では定義されているので。

Solaris 10 (それより古いのも含む) の /bin/sh は ${var:+val} は
サポートしています。ただし、val 部分に空白文字を含めることができません。
空白等を含めるにはクォートする必要があります。

$ /bin/sh -c ‘var=foo; echo ${var:+val val}’
/bin/sh: 置換が正しくありません。

$ /bin/sh -c ‘unset var; echo ${var:+val val}’
/bin/sh: 置換が正しくありません。

$ /bin/sh -c ‘var=foo; echo ${var:+“val val”}’
val val

$ /bin/sh -c ‘var=foo; echo ${var:+“val” “val val”}’
/bin/sh: 置換が正しくありません。

fi
これは、

    if [ -n "$keepsuffix" ]; then
        mv -f "$target" "${target}${keepsuffix}"
    fi

とするか、

${keepsuffix:+mv} ${keepsuffix:+-f} ${keepsuffix:+"$target"} 

${keepsuffix:+"${target}${keepsuffix}"}

とする必要があります。

Issue #8524 has been updated by knu (Akinori MUSHA).

なるほど、ありがとうございます。
場合によっては sh -c “${var:+“command arg”}” という手もあるのかな。


Bug #8524: r40755以降 No rule to make target
`.ext/include/sparc64-solaris2.10/ruby/config.h でビルドできない

Author: ngoto (Naohisa G.)
Status: Closed
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: build
Target version:
ruby -v: -
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

r40755以降、Solarisでは、以下のように .ext/include/アーキテクチャ/ruby/config.h が作成されません。

原因は、r40755にて以下の行が./tool/ifchange に追加されたためです。

@@ -30,6 +37,7 @@
rm -f “$temp”
else
echo “$target updated”

  • ${keepsuffix:+ mv -f “$target” “${target}${keepsuffix}” }
    mv -f “$temp” “$target”
    fi

この tool/ifchangeは #!/bin/sh
なのに、基本的な/bin/shでは解釈できない(bash依存?)記述が追加されたため、Solarisのようにピュアな/bin/shを持つOSでは、そこで処理がストップし、しかしconfigureではエラーを検知できないらしく、そのままconfig.hが作成されないままconfigureが正常終了してしまうのが原因のようです。

$ ./configure --prefix=/hoge/hoge/hoge
(中略)
checking for nroff… /usr/bin/nroff
.ext/include/sparc64-solaris2.10/ruby/config.h updated
./tool/ifchange: bad substitution
verconf.h updated
./tool/ifchange: bad substitution
ruby library version = 2.1.0
configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating Makefile
config.status: creating ruby-2.1.pc
$ make V=1
CC = cc
LD = /usr/ccs/bin/ld
LDSHARED = cc -G
CFLAGS = -xO1 -xtarget=sparc64viiplus -m64
XCFLAGS = -DRUBY_EXPORT
CPPFLAGS = -I/usr/local/64/lib/libffi-3.0.10/include
-I/usr/local/64/include -I. -I.ext/include/sparc64-solaris2.10
-I./include -I.
DLDFLAGS = -m64 -L/usr/local/64/lib -R/usr/local/64/lib -m64
SOLIBS =
cc: Sun C 5.12 SunOS_sparc 2011/11/16
make: *** No rule to make target
.ext/include/sparc64-solaris2.10/ruby/config.h', needed by main.o’.
Stop.