1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

辛うじてgcc formulaを回避する

Last updated at Posted at 2019-08-07

(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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?