この記事では、C拡張のあるRubyのgemを(インストール等で)ビルドする際、次のようなエラーが出る問題への対処方法を紹介します。想定するオペレーティングシステムはOpenBSDですが、パッケージマネージャによりインストールされたRubyを使っている場合は他のオペレーティングシステムでも同様の対処が通るかもしれません。
エラーの文言:
/usr/bin/install -c -o root -g bin -m 0755 escape.so ../../../../../lib/4.0.2/x86_64-openbsd/cgi
install: ../../../../../lib/4.0.2/x86_64-openbsd/cgi/INS@C2Zl2QOmzz: chown/chgrp: Operation not permitted
※この例ではcgi gemのインストールをしています。
バージョン情報:
uname -a
# OpenBSD obsd.local 7.9 GENERIC.MP#449 amd64
ruby -v
# ruby 4.0.2 (2026-03-17 revision d3da9fec82) +PRISM [x86_64-openbsd]
対処法を簡単に
以下の環境変数を設定してもう一度トライ:
export INSTALL="/usr/bin/install -c"
export MAKEFLAGS=e
エラー詳細
エラーの全体は次の通りです。
(cd tmp/x86_64-openbsd/cgi/escape/4.0.2 && /usr/local/bin/gmake install sitearchdir=../../../../../lib/4.0.2/x86_64-openbsd/cgi sitelibdir=../../../../../lib/4.0.2/x86_64-openbsd/cgi target_prefix=)
/usr/bin/install -c -o root -g bin -m 0755 escape.so ../../../../../lib/4.0.2/x86_64-openbsd/cgi
install: ../../../../../lib/4.0.2/x86_64-openbsd/cgi/INS@C2Zl2QOmzz: chown/chgrp: Operation not permitted
gmake: *** [Makefile:196: install-so] Error 1
rake aborted!
Command failed with status (2): [/usr/local/bin/gmake install sitearchdir=../../../../../lib/4.0.2/x86_64-openbsd/cgi sitelibdir=../../../../../lib/4.0.2/x86_64-openbsd/cgi target_prefix=]
/home/gemmaro/src/Ruby-CGI/.direnv/ruby/gems/rake-compiler-1.3.1/lib/rake/extensiontask.rb:174:in 'block in Rake::ExtensionTask#define_compile_tasks'
/home/gemmaro/src/Ruby-CGI/.direnv/ruby/gems/rake-13.4.2/exe/rake:27:in '<top (required)>'
Tasks: TOP => test => compile => compile:x86_64-openbsd => compile:cgi/escape:x86_64-openbsd => copy:cgi/escape:x86_64-openbsd:4.0.2
(See full trace by running task with --trace)
問題の行はここです:
/usr/bin/install -c -o root -g bin -m 0755 escape.so [/path/to]/cgi
# ^^^^^^^^^^^^^^
install(1) によれば、-o (owner) は所有者を表します。数値のUIDも許容されますが、ここではrootユーザーが指定されています。また-g (group) はグループを表します。こちらも同じく数値のUIDも許容されますが、ここではbinグループが指定されています。binグループは/bin以下の実行可能プログラムのグループだったりします(参照:ls -l /bin)。
しかし通常のユーザーがBundler等でgemをインストールするときは、これが権限エラーを引き起こす原因になりえます。
解決編
つまるところ前述の対処法は、installコマンドのオプションを上書きして-o root -g binのないinstallの実行をするためのものだったわけです。この節ではその対処法にいたるまでの背景を紹介します。
ここで絡んでくるのはmkmfとrbconfigとmake(1)です。
まずINSTALL環境変数から(INSTALL="/usr/bin/install -c")。
Rubyはそれ自身をビルドするとき、rbconfig.rbを生成します。このファイルにはRbConfig::MAKEFILE_CONFIGというHashの定数が定義されており、require 'rbconfig'で使えます。rbconfig.rbを生成するスクリプトはRubyのソースのtool/mkconfig.rbです。INSTALLについて見てみると……
次の箇所で"INSTALL"キーをCONFIGに設定:
when /^(?:ac_given_)?INSTALL=(.*)/
v_fast << " CONFIG[\"INSTALL\"] = " + $1 + "\n"
次の箇所でMAKEFILE_CONFIGに設定:
MAKEFILE_CONFIG = {}
CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
……していることがわかります。ここから、RubyがAutoconf(ac_given_から推測)で構成されるときにINSTALLにオプションが設定されたことがわかります。実際、次のような値になっていました:
ruby -rrbconfig -e 'p RbConfig::CONFIG["INSTALL"]'
# "/usr/bin/install -c -o root -g bin"
次に、この情報をmkmfが使います。mkmfはC拡張ありのgemをビルドするときによく使われるgemで、Rubyのソースのlib/mkmf.rbが実装です。INSTALL設定値がどう使われているのかというと……
まず、CONFIG定数をRbConfigのMakefile用の構成値で初期化:
CONFIG = RbConfig::MAKEFILE_CONFIG
補助関数としてこの値を参照するメソッドを定義:
def config_string(key, config = CONFIG)
s = config[key] and !s.empty? and block_given? ? yield(s) : s
end
module_function :config_string
最終的に書き出されるMakefileではこの構成値からINSTALLキーの値を取得:
INSTALL = #{config_string('INSTALL', &possible_command) || '@$(RUBY) -run -e install -- -vp'}
……というわけで、mkmfでもRubyがビルドされたときの情報がinstallコマンドに使われることが判明しました。
次にMAKEFLAGSについて(MAKEFLAGS=e)。これはmake(1)を参照します。
MAKEFLAGSは.MAKEFLAGSの項にあるように特殊変数であって、makeのコマンドラインに指定できるものなら何でも指定してかまいません。
ここではeを指定していますので、標準オプションにある-eフラグ、つまりmakefile内のマクロ代入を環境変数(今回はINSTALL)がオーバーライドするようにしているわけです。
やったね
以上により対処法にいたる道のりがわかりました。うまくいけば以下のようにオプションが調整され、無事gemをインストールできるはずです!
(cd tmp/x86_64-openbsd/cgi/escape/4.0.2 && /usr/local/bin/gmake install sitearchdir=../../../../../lib/4.0.2/x86_64-openbsd/cgi sitelibdir=../../../../../lib/4.0.2/x86_64-openbsd/cgi target_prefix=)
/usr/bin/install -c -m 0755 escape.so ../../../../../lib/4.0.2/x86_64-openbsd/cgi
cp tmp/x86_64-openbsd/cgi/escape/4.0.2/cgi/escape.so tmp/x86_64-openbsd/stage/lib/4.0.2/x86_64-openbsd/cgi/escape.so
おまけ
RubyGemのインストールには(よほどのことがなければ)Bundlerを使うはずです。
そんなBundlerにまつわるクイズがこちら:
どしどしご応募ください!
使用許諾
Copyright (C) 2026 gemmaro
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.