(Barely) avoid gcc formula
summary:
I found a way to disable gcc formula dependency and force system gcc in current Homebrew (Linuxbrew). See below for the patch.
However this is unsupported and can behave weird in updating Homebrew further...
シリーズ:さくらサーバーで遊ぶ | |
---|---|
設定等のメモ | http://qiita.com/cielavenir/items/67a7c631713b4c816b6d |
SSL化 | http://qiita.com/cielavenir/items/aad29b2348fc4d3f9155 |
(さくらサーバー導入の主目的) メールをフックする |
http://qiita.com/cielavenir/items/5ce4568fc405329d421a |
Linuxbrewを導入する(旧) | http://qiita.com/cielavenir/items/741921fcecb281555f77 |
Homebrewを導入する | https://qiita.com/cielavenir/items/67ce0ec9cd8d43ed00f1 |
さくらサーバーでgccへの依存が発生しない理由 (HOMEBREW_BUILD_FROM_SOURCE=1は不要) |
https://qiita.com/cielavenir/items/410ded536d9b520989c4 |
ある時から、Linuxbrewで何らかのパッケージを入れるとgccがdependencyとしてインストールされるようになりました。システムのgccを使ってほしいので正直不要なんですが、ここで疑問が。なぜさくらサーバーではこのようなことにならないのでしょうか?
https://github.com/Homebrew/brew/commit/605e61095a047f51cb84a9eb7c8a3fdc61f929e0 のコミットにより、「何らかのbottleがインストールされた場合、 Linuxbrew標準よりlibgccのバージョンが低いなら、 gccがdependencyとしてインストールされる」ことになったようです。なるほどわかりました。https://rcmdnk.com/blog/2019/05/08/computer-linux-homebrew/ にかかれている通り、brew install gcc --without-glibc
するしかないでしょう。しかしbottleのインストールはもともと求めていません。これは、以前はHOMEBREW_BUILD_FROM_SOURCE環境変数を設定することで実現できました。しかし、https://github.com/Homebrew/brew/commit/eed1444d61ee6e61c3b683e45effcd3cbaafed94 のコミットにより、これは削除されてしまったようです。しかしこれではさくらサーバーの説明が付きません。
Linuxbrewでは(utils/bottles.rbによると)bottleタグは${HOMEBREW_PROCESSOR}_${HOMEBREW_SYSTEM}
を小文字化したものです。これはbrew.shでは$(uname -p)_$(uname -s)
として取得されます。通常のインストールではこれはx86_64_linux
となりますが、さくらサーバー上ではamd64_freebsd
となります。結果、(HOMEBREW_BUILD_FROM_SOURCEにかかわらず)bottleが見つからずビルドすることになっていたようです。
# しかしまあ、前はHOMEBREW_BUILD_FROM_SOURCEがないとbottleを見に行こうとしてエラーになるはずだったんですが、今はまずbottleを見に行ってなければ自動でソースからビルドするように変わったんですかね…。
で、回避策ですが、先の削除をrevertすればよいですので、以下のようにすればよいです。
diff --git a/Library/Homebrew/build_environment.rb b/Library/Homebrew/build_environment.rb
index ad0508d22..b7d1eb1d7 100644
--- a/Library/Homebrew/build_environment.rb
+++ b/Library/Homebrew/build_environment.rb
@@ -43,7 +43,7 @@ module Homebrew
MACOSX_DEPLOYMENT_TARGET PKG_CONFIG_PATH PKG_CONFIG_LIBDIR
HOMEBREW_DEBUG HOMEBREW_MAKE_JOBS HOMEBREW_VERBOSE
HOMEBREW_SVN HOMEBREW_GIT
- HOMEBREW_SDKROOT
+ HOMEBREW_SDKROOT HOMEBREW_BUILD_FROM_SOURCE
MAKE GIT CPP
ACLOCAL_PATH PATH CPATH
LD_LIBRARY_PATH LD_RUN_PATH LD_PRELOAD LIBRARY_PATH
diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb
index b312579b4..e897694fc 100644
--- a/Library/Homebrew/extend/ARGV.rb
+++ b/Library/Homebrew/extend/ARGV.rb
@@ -162,9 +162,14 @@ module HomebrewArgvExtension
switch?("s") || include?("--build-from-source")
end
+ def build_all_from_source?
+ !ENV["HOMEBREW_BUILD_FROM_SOURCE"].nil?
+ end
+
# Whether a given formula should be built from source during the current
# installation run.
def build_formula_from_source?(f)
+ return true if build_all_from_source?
return false if !build_from_source? && !build_bottle?
formulae.any? { |argv_f| argv_f.full_name == f.full_name }
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index f8c745f9c..659a71a16 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -49,7 +49,7 @@ class FormulaInstaller
@show_header = false
@ignore_deps = false
@only_deps = false
- @build_from_source = ARGV.build_from_source?
+ @build_from_source = ARGV.build_from_source? || ARGV.build_all_from_source?
@build_bottle = false
@force_bottle = ARGV.force_bottle?
@include_test = ARGV.include?("--include-test")
まあ、Homebrew自体の更新の妨げになってしまうので、実用上は諦めるしかなさそうですね…。CentOS6とCentOS7の計算ノードがある環境で古い環境でも動くバイナリを吐かせたかったのですが、CentOS7だけで我慢しますorz