From 2fb5ead38a7632ff6f941909474767883a9e0252 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Wed, 13 Nov 2013 10:38:14 -0600 Subject: [PATCH] Prevent deps of build-time deps from leaking into the build environment When decided what dependencies should be part of the build environment (and have appropriate entries added to variables like PKG_CONFIG_PATH), we select the entire dependency tree except for (1) inactive optional and recommended deps (2) indirect build-time deps (i.e., build-time deps of other deps) There is a third category that sould be excluded: dependencies of direct build-time deps. These are irrelevant to the build, and including them can cause unexpected linkages. --- Library/Homebrew/build.rb | 2 ++ Library/Homebrew/dependency.rb | 7 +++++++ Library/Homebrew/test/test_dependency_expansion.rb | 13 +++++++++++++ 3 files changed, 22 insertions(+) diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index 8a4267bac1..e75a6841ef 100755 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -100,6 +100,8 @@ class Build Dependency.prune elsif dep.build? && dependent != f Dependency.prune + elsif dep.build? + Dependency.keep_but_prune_recursive_deps end end end diff --git a/Library/Homebrew/dependency.rb b/Library/Homebrew/dependency.rb index df22eed902..fda491b991 100644 --- a/Library/Homebrew/dependency.rb +++ b/Library/Homebrew/dependency.rb @@ -82,6 +82,8 @@ class Dependency next [] when :skip expand(dep.to_formula, &block) + when :keep_but_prune_recursive_deps + [dep] else expand(dep.to_formula, &block) << dep end @@ -110,6 +112,11 @@ class Dependency throw(:action, :skip) end + # Keep a dependency, but prune its dependencies + def keep_but_prune_recursive_deps + throw(:action, :keep_but_prune_recursive_deps) + end + def merge_repeats(deps) grouped = deps.group_by(&:name) diff --git a/Library/Homebrew/test/test_dependency_expansion.rb b/Library/Homebrew/test/test_dependency_expansion.rb index 90d4dcc363..cf22b61709 100644 --- a/Library/Homebrew/test/test_dependency_expansion.rb +++ b/Library/Homebrew/test/test_dependency_expansion.rb @@ -95,4 +95,17 @@ class DependencyExpansionTests < Test::Unit::TestCase assert_equal [@bar, @baz], deps end + + def test_keep_dep_but_prune_recursive_deps + f = stub(:deps => [ + build_dep(:foo, [:build], [@bar]), + build_dep(:baz, [:build]), + ]) + + deps = Dependency.expand(f) do |dependent, dep| + Dependency.keep_but_prune_recursive_deps if dep.build? + end + + assert_equal [@foo, @baz], deps + end end