From 408153aea03873a84d1a720107cf5ea1cc725913 Mon Sep 17 00:00:00 2001 From: Maximilian Downey Twiss Date: Tue, 16 Sep 2025 23:49:59 +1000 Subject: [PATCH] Prioritise runtime dependencies over build dependencies in tools/getrealdeps.rb (#12801) --- tests/tools/getrealdeps.rb | 47 ++++++++++++++++++++++++++++++++++++++ tools/getrealdeps.rb | 4 +++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tests/tools/getrealdeps.rb b/tests/tools/getrealdeps.rb index 26ae49cd04..582af7685e 100644 --- a/tests/tools/getrealdeps.rb +++ b/tests/tools/getrealdeps.rb @@ -102,6 +102,30 @@ class GetRealDepsTest < Minitest::Test test_wrapper(input_file, expected_pkg_file, deps) end + def test_replace_build_dependency + deps = ['json_c'] + input_file = <<~EOF + class Example < Package + binary_sha256({}) + + depends_on 'a2png' + depends_on 'json_c' => :build + depends_on 'lzlib' + end + EOF + expected_pkg_file = <<~EOF + class Example < Package + binary_sha256({}) + + depends_on 'a2png' + depends_on 'json_c' # R + depends_on 'lzlib' + end + EOF + + test_wrapper(input_file, expected_pkg_file, deps) + end + def test_add_special_dependency_to_empty deps = [] input_file = <<~EOF @@ -271,4 +295,27 @@ class GetRealDepsTest < Minitest::Test test_wrapper(input_file, expected_pkg_file, deps) end + + def test_does_not_remove_build_dependency + deps = ['libspng'] + input_file = <<~EOF + class Example < Package + binary_sha256({}) + + depends_on 'libmatroska' + depends_on 'ninja' => :build + end + EOF + expected_pkg_file = <<~EOF + class Example < Package + binary_sha256({}) + + depends_on 'libmatroska' + depends_on 'libspng' # R + depends_on 'ninja' => :build + end + EOF + + test_wrapper(input_file, expected_pkg_file, deps) + end end diff --git a/tools/getrealdeps.rb b/tools/getrealdeps.rb index 7d52711be0..e7bcb25775 100755 --- a/tools/getrealdeps.rb +++ b/tools/getrealdeps.rb @@ -84,7 +84,6 @@ def write_deps(pkg_file, pkgdeps, pkg) end # Look for runtime dependencies that aren't already provided by the package. - # We do not convert build dependencies into runtime dependencies, because they are probably build dependencies for a good reason. missingpkgdeps = pkgdeps.reject { File.read(pkg_file).include?("depends_on '#{it}'") unless File.read(pkg_file).include?("depends_on '#{it}' => :build") } unless missingpkgdeps.empty? @@ -108,6 +107,9 @@ def write_deps(pkg_file, pkgdeps, pkg) # Its unsafe to do this with other dependencies, because the packager might know something we don't. pkgdepsblock.delete_if { |line| line.match(/ depends_on '(.*)' # R/) { |matchdata| pkgdeps.none?(matchdata[1]) && !privileged_deps.include?(matchdata[1]) } } + # If a dependency is both a build and a runtime dependency, we remove the build dependency. + pkgdepsblock.delete_if { |line| line.match(/ depends_on '(.*)' => :build/) { |matchdata| missingpkgdeps.include?(matchdata[1]) } } + # Remove any duplicate dependencies from the block. pkgdepsblock.uniq!