diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb index 3e9f8a9cc5a6f..31f84d57b9040 100644 --- a/Library/Homebrew/rubocops/lines.rb +++ b/Library/Homebrew/rubocops/lines.rb @@ -157,6 +157,24 @@ def unless_modifier?(node) end end + class MpiCheck < FormulaCop + def audit_formula(_node, _class_node, _parent_class_node, body_node) + # Enforce use of OpenMPI for MPI dependency in core + return unless formula_tap == "homebrew-core" + + find_method_with_args(body_node, :depends_on, "mpich") do + problem "Use 'depends_on \"open-mpi\"' instead of '#{@offensive_node.source}'." + end + end + + def autocorrect(node) + # The dependency nodes may need to be re-sorted because of this + lambda do |corrector| + corrector.replace(node.source_range, "depends_on \"open-mpi\"") + end + end + end + class Miscellaneous < FormulaCop def audit_formula(_node, _class_node, _parent_class_node, body_node) # FileUtils is included in Formula diff --git a/Library/Homebrew/rubocops/text.rb b/Library/Homebrew/rubocops/text.rb index e328e63585d47..ec8130abb7e2a 100644 --- a/Library/Homebrew/rubocops/text.rb +++ b/Library/Homebrew/rubocops/text.rb @@ -16,7 +16,7 @@ def audit_formula(_node, _class_node, _parent_class_node, body_node) problem "Formulae should not depend on both OpenSSL and LibreSSL (even optionally)." end - if depends_on?("veclibfort") || depends_on?("lapack") + if formula_tap == "homebrew-core" && (depends_on?("veclibfort") || depends_on?("lapack")) problem "Formulae should use OpenBLAS as the default serial linear algebra library." end diff --git a/Library/Homebrew/test/rubocops/lines_spec.rb b/Library/Homebrew/test/rubocops/lines_spec.rb index 2ad2497185559..7f11573288ff0 100644 --- a/Library/Homebrew/test/rubocops/lines_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_spec.rb @@ -279,6 +279,31 @@ def options end end +describe RuboCop::Cop::FormulaAudit::MpiCheck do + subject(:cop) { described_class.new } + + context "When auditing formula" do + it "reports an offense when using depends_on \"mpich\"" do + expect_offense(<<~RUBY, "/homebrew-core/") + class Foo < Formula + desc "foo" + url 'https://brew.sh/foo-1.0.tgz' + depends_on "mpich" + ^^^^^^^^^^^^^^^^^^ Use 'depends_on "open-mpi"' instead of 'depends_on "mpich"'. + end + RUBY + + expect_correction(<<~RUBY) + class Foo < Formula + desc "foo" + url 'https://brew.sh/foo-1.0.tgz' + depends_on "open-mpi" + end + RUBY + end + end +end + describe RuboCop::Cop::FormulaAudit::Miscellaneous do subject(:cop) { described_class.new } diff --git a/Library/Homebrew/test/rubocops/text_spec.rb b/Library/Homebrew/test/rubocops/text_spec.rb index 8485c5c4fec1c..f185fcbc9a8a1 100644 --- a/Library/Homebrew/test/rubocops/text_spec.rb +++ b/Library/Homebrew/test/rubocops/text_spec.rb @@ -32,6 +32,28 @@ class Foo < Formula RUBY end + it "when veclibfort is used instead of OpenBLAS" do + expect_offense(<<~RUBY, "/homebrew-core/") + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + homepage "https://brew.sh" + depends_on "veclibfort" + ^^^^^^^^^^^^^^^^^^^^^^^ Formulae should use OpenBLAS as the default serial linear algebra library. + end + RUBY + end + + it "when lapack is used instead of OpenBLAS" do + expect_offense(<<~RUBY, "/homebrew-core/") + class Foo < Formula + url "https://brew.sh/foo-1.0.tgz" + homepage "https://brew.sh" + depends_on "lapack" + ^^^^^^^^^^^^^^^^^^^ Formulae should use OpenBLAS as the default serial linear algebra library. + end + RUBY + end + it "When xcodebuild is called without SYMROOT" do expect_offense(<<~RUBY) class Foo < Formula