Skip to content

Commit 4604c78

Browse files
committed
Dynamically detect libgeos version instead of hardcoding
- Add detect_libgeos_name() method that inspects library dependencies: - macOS: uses otool -L to read dylib dependencies from source file - Linux: uses patchelf --print-needed to read .so dependencies after install - Remove all hardcoded version checks (23.2.0, 25.4.0) and version-specific libgeos library names (3.8.1, 3.11.2, 3.13.1) - Works with both versioned (libgeos.so.3.11.2) and unversioned (libgeos.so) library names on Linux - Regenerate all cockroach formulas with the updated template
1 parent 63033e7 commit 4604c78

File tree

9 files changed

+305
-144
lines changed

9 files changed

+305
-144
lines changed

.bazelrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
common --noenable_bzlmod

Formula/cockroach.rb

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,42 @@ def libgeos_supported?
2727
!(OS.mac? && Hardware::CPU.arm?)
2828
end
2929

30+
# Extract the libgeos library name from libgeos_c dependencies
31+
def detect_libgeos_name(libgeos_c_path)
32+
if OS.mac?
33+
# Use otool to inspect the dylib dependencies
34+
output = `otool -L "#{libgeos_c_path}"`.lines
35+
# Find the line with @rpath/libgeos.*.dylib
36+
geos_line = output.find { |line| line.include?("@rpath/libgeos.") && !line.include?("libgeos_c") }
37+
if geos_line
38+
# Extract just the library name (e.g., "@rpath/libgeos.3.13.1.dylib")
39+
geos_line.strip.split[0]
40+
else
41+
raise "Could not detect libgeos dependency in #{libgeos_c_path}"
42+
end
43+
else
44+
# Use patchelf to inspect the shared library dependencies
45+
output = `patchelf --print-needed "#{libgeos_c_path}" 2>&1`
46+
# Find the line with libgeos.so* (but not libgeos_c)
47+
geos_line = output.lines.find { |line| line.strip.start_with?("libgeos.so") && !line.include?("libgeos_c") }
48+
if geos_line
49+
# Extract just the library name (e.g., "libgeos.so" or "libgeos.so.3.11.2")
50+
geos_line.strip
51+
else
52+
raise "Could not detect libgeos dependency in #{libgeos_c_path}. Output: #{output}"
53+
end
54+
end
55+
end
56+
3057
def install
3158
bin.install "cockroach"
3259
prefix.install "LICENSE" if File.exist?("LICENSE")
3360
prefix.install "LICENSE.txt" if File.exist?("LICENSE.txt")
3461
prefix.install "THIRD-PARTY-NOTICES.txt"
3562
if OS.mac? && libgeos_supported?
63+
# Detect the libgeos version dynamically before modifying the library
64+
libgeos_name = detect_libgeos_name("lib/libgeos_c.dylib")
65+
3666
lib.mkpath
3767
mkdir "#{lib}/cockroach"
3868
lib.install "lib/libgeos.dylib" => "cockroach/libgeos.dylib"
@@ -45,34 +75,24 @@ def install
4575
"#{lib}/cockroach/libgeos.dylib", "#{lib}/cockroach/libgeos.dylib"
4676
system "install_name_tool", "-id",
4777
"#{lib}/cockroach/libgeos_c.1.dylib", "#{lib}/cockroach/libgeos_c.dylib"
48-
if version < Version.new("23.2.0")
49-
system "install_name_tool", "-change",
50-
"@rpath/libgeos.3.8.1.dylib", "#{lib}/cockroach/libgeos.dylib",
51-
"#{lib}/cockroach/libgeos_c.dylib"
52-
elsif version < Version.new("25.4.0")
53-
system "install_name_tool", "-change",
54-
"@rpath/libgeos.3.11.2.dylib", "#{lib}/cockroach/libgeos.dylib",
55-
"#{lib}/cockroach/libgeos_c.dylib"
56-
else
57-
system "install_name_tool", "-change",
58-
"@rpath/libgeos.3.13.1.dylib", "#{lib}/cockroach/libgeos.dylib",
59-
"#{lib}/cockroach/libgeos_c.dylib"
60-
end
78+
system "install_name_tool", "-change",
79+
libgeos_name, "#{lib}/cockroach/libgeos.dylib",
80+
"#{lib}/cockroach/libgeos_c.dylib"
6181
end
6282

6383
if OS.linux?
6484
lib.mkpath
6585
mkdir "#{lib}/cockroach"
6686
lib.install "lib/libgeos.so" => "cockroach/libgeos.so"
6787
lib.install "lib/libgeos_c.so" => "cockroach/libgeos_c.so"
88+
89+
# Detect the libgeos version dynamically before modifying the library
90+
libgeos_name = detect_libgeos_name("#{lib}/cockroach/libgeos_c.so")
91+
6892
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos.so"
6993
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos_c.so"
7094
system "patchelf", "--set-soname", "libgeos.so", "#{lib}/cockroach/libgeos.so"
71-
if version < Version.new("23.2.0")
72-
system "patchelf", "--replace-needed", "libgeos.so.3.8.1", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
73-
else
74-
system "patchelf", "--replace-needed", "libgeos.so.3.11.2", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
75-
end
95+
system "patchelf", "--replace-needed", libgeos_name, "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
7696
end
7797

7898
system bin/"cockroach", "gen", "man", "--path=#{man1}"

Formula/cockroach@24.1.rb

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,42 @@ def libgeos_supported?
2727
!(OS.mac? && Hardware::CPU.arm?)
2828
end
2929

30+
# Extract the libgeos library name from libgeos_c dependencies
31+
def detect_libgeos_name(libgeos_c_path)
32+
if OS.mac?
33+
# Use otool to inspect the dylib dependencies
34+
output = `otool -L "#{libgeos_c_path}"`.lines
35+
# Find the line with @rpath/libgeos.*.dylib
36+
geos_line = output.find { |line| line.include?("@rpath/libgeos.") && !line.include?("libgeos_c") }
37+
if geos_line
38+
# Extract just the library name (e.g., "@rpath/libgeos.3.13.1.dylib")
39+
geos_line.strip.split[0]
40+
else
41+
raise "Could not detect libgeos dependency in #{libgeos_c_path}"
42+
end
43+
else
44+
# Use patchelf to inspect the shared library dependencies
45+
output = `patchelf --print-needed "#{libgeos_c_path}" 2>&1`
46+
# Find the line with libgeos.so* (but not libgeos_c)
47+
geos_line = output.lines.find { |line| line.strip.start_with?("libgeos.so") && !line.include?("libgeos_c") }
48+
if geos_line
49+
# Extract just the library name (e.g., "libgeos.so" or "libgeos.so.3.11.2")
50+
geos_line.strip
51+
else
52+
raise "Could not detect libgeos dependency in #{libgeos_c_path}. Output: #{output}"
53+
end
54+
end
55+
end
56+
3057
def install
3158
bin.install "cockroach"
3259
prefix.install "LICENSE" if File.exist?("LICENSE")
3360
prefix.install "LICENSE.txt" if File.exist?("LICENSE.txt")
3461
prefix.install "THIRD-PARTY-NOTICES.txt"
3562
if OS.mac? && libgeos_supported?
63+
# Detect the libgeos version dynamically before modifying the library
64+
libgeos_name = detect_libgeos_name("lib/libgeos_c.dylib")
65+
3666
lib.mkpath
3767
mkdir "#{lib}/cockroach"
3868
lib.install "lib/libgeos.dylib" => "cockroach/libgeos.dylib"
@@ -45,34 +75,24 @@ def install
4575
"#{lib}/cockroach/libgeos.dylib", "#{lib}/cockroach/libgeos.dylib"
4676
system "install_name_tool", "-id",
4777
"#{lib}/cockroach/libgeos_c.1.dylib", "#{lib}/cockroach/libgeos_c.dylib"
48-
if version < Version.new("23.2.0")
49-
system "install_name_tool", "-change",
50-
"@rpath/libgeos.3.8.1.dylib", "#{lib}/cockroach/libgeos.dylib",
51-
"#{lib}/cockroach/libgeos_c.dylib"
52-
elsif version < Version.new("25.4.0")
53-
system "install_name_tool", "-change",
54-
"@rpath/libgeos.3.11.2.dylib", "#{lib}/cockroach/libgeos.dylib",
55-
"#{lib}/cockroach/libgeos_c.dylib"
56-
else
57-
system "install_name_tool", "-change",
58-
"@rpath/libgeos.3.13.1.dylib", "#{lib}/cockroach/libgeos.dylib",
59-
"#{lib}/cockroach/libgeos_c.dylib"
60-
end
78+
system "install_name_tool", "-change",
79+
libgeos_name, "#{lib}/cockroach/libgeos.dylib",
80+
"#{lib}/cockroach/libgeos_c.dylib"
6181
end
6282

6383
if OS.linux?
6484
lib.mkpath
6585
mkdir "#{lib}/cockroach"
6686
lib.install "lib/libgeos.so" => "cockroach/libgeos.so"
6787
lib.install "lib/libgeos_c.so" => "cockroach/libgeos_c.so"
88+
89+
# Detect the libgeos version dynamically before modifying the library
90+
libgeos_name = detect_libgeos_name("#{lib}/cockroach/libgeos_c.so")
91+
6892
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos.so"
6993
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos_c.so"
7094
system "patchelf", "--set-soname", "libgeos.so", "#{lib}/cockroach/libgeos.so"
71-
if version < Version.new("23.2.0")
72-
system "patchelf", "--replace-needed", "libgeos.so.3.8.1", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
73-
else
74-
system "patchelf", "--replace-needed", "libgeos.so.3.11.2", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
75-
end
95+
system "patchelf", "--replace-needed", libgeos_name, "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
7696
end
7797

7898
system bin/"cockroach", "gen", "man", "--path=#{man1}"

Formula/cockroach@24.3.rb

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,42 @@ def libgeos_supported?
2727
!(OS.mac? && Hardware::CPU.arm?)
2828
end
2929

30+
# Extract the libgeos library name from libgeos_c dependencies
31+
def detect_libgeos_name(libgeos_c_path)
32+
if OS.mac?
33+
# Use otool to inspect the dylib dependencies
34+
output = `otool -L "#{libgeos_c_path}"`.lines
35+
# Find the line with @rpath/libgeos.*.dylib
36+
geos_line = output.find { |line| line.include?("@rpath/libgeos.") && !line.include?("libgeos_c") }
37+
if geos_line
38+
# Extract just the library name (e.g., "@rpath/libgeos.3.13.1.dylib")
39+
geos_line.strip.split[0]
40+
else
41+
raise "Could not detect libgeos dependency in #{libgeos_c_path}"
42+
end
43+
else
44+
# Use patchelf to inspect the shared library dependencies
45+
output = `patchelf --print-needed "#{libgeos_c_path}" 2>&1`
46+
# Find the line with libgeos.so* (but not libgeos_c)
47+
geos_line = output.lines.find { |line| line.strip.start_with?("libgeos.so") && !line.include?("libgeos_c") }
48+
if geos_line
49+
# Extract just the library name (e.g., "libgeos.so" or "libgeos.so.3.11.2")
50+
geos_line.strip
51+
else
52+
raise "Could not detect libgeos dependency in #{libgeos_c_path}. Output: #{output}"
53+
end
54+
end
55+
end
56+
3057
def install
3158
bin.install "cockroach"
3259
prefix.install "LICENSE" if File.exist?("LICENSE")
3360
prefix.install "LICENSE.txt" if File.exist?("LICENSE.txt")
3461
prefix.install "THIRD-PARTY-NOTICES.txt"
3562
if OS.mac? && libgeos_supported?
63+
# Detect the libgeos version dynamically before modifying the library
64+
libgeos_name = detect_libgeos_name("lib/libgeos_c.dylib")
65+
3666
lib.mkpath
3767
mkdir "#{lib}/cockroach"
3868
lib.install "lib/libgeos.dylib" => "cockroach/libgeos.dylib"
@@ -45,34 +75,24 @@ def install
4575
"#{lib}/cockroach/libgeos.dylib", "#{lib}/cockroach/libgeos.dylib"
4676
system "install_name_tool", "-id",
4777
"#{lib}/cockroach/libgeos_c.1.dylib", "#{lib}/cockroach/libgeos_c.dylib"
48-
if version < Version.new("23.2.0")
49-
system "install_name_tool", "-change",
50-
"@rpath/libgeos.3.8.1.dylib", "#{lib}/cockroach/libgeos.dylib",
51-
"#{lib}/cockroach/libgeos_c.dylib"
52-
elsif version < Version.new("25.4.0")
53-
system "install_name_tool", "-change",
54-
"@rpath/libgeos.3.11.2.dylib", "#{lib}/cockroach/libgeos.dylib",
55-
"#{lib}/cockroach/libgeos_c.dylib"
56-
else
57-
system "install_name_tool", "-change",
58-
"@rpath/libgeos.3.13.1.dylib", "#{lib}/cockroach/libgeos.dylib",
59-
"#{lib}/cockroach/libgeos_c.dylib"
60-
end
78+
system "install_name_tool", "-change",
79+
libgeos_name, "#{lib}/cockroach/libgeos.dylib",
80+
"#{lib}/cockroach/libgeos_c.dylib"
6181
end
6282

6383
if OS.linux?
6484
lib.mkpath
6585
mkdir "#{lib}/cockroach"
6686
lib.install "lib/libgeos.so" => "cockroach/libgeos.so"
6787
lib.install "lib/libgeos_c.so" => "cockroach/libgeos_c.so"
88+
89+
# Detect the libgeos version dynamically before modifying the library
90+
libgeos_name = detect_libgeos_name("#{lib}/cockroach/libgeos_c.so")
91+
6892
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos.so"
6993
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos_c.so"
7094
system "patchelf", "--set-soname", "libgeos.so", "#{lib}/cockroach/libgeos.so"
71-
if version < Version.new("23.2.0")
72-
system "patchelf", "--replace-needed", "libgeos.so.3.8.1", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
73-
else
74-
system "patchelf", "--replace-needed", "libgeos.so.3.11.2", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
75-
end
95+
system "patchelf", "--replace-needed", libgeos_name, "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
7696
end
7797

7898
system bin/"cockroach", "gen", "man", "--path=#{man1}"

Formula/cockroach@25.1.rb

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,42 @@ def libgeos_supported?
2727
!(OS.mac? && Hardware::CPU.arm?)
2828
end
2929

30+
# Extract the libgeos library name from libgeos_c dependencies
31+
def detect_libgeos_name(libgeos_c_path)
32+
if OS.mac?
33+
# Use otool to inspect the dylib dependencies
34+
output = `otool -L "#{libgeos_c_path}"`.lines
35+
# Find the line with @rpath/libgeos.*.dylib
36+
geos_line = output.find { |line| line.include?("@rpath/libgeos.") && !line.include?("libgeos_c") }
37+
if geos_line
38+
# Extract just the library name (e.g., "@rpath/libgeos.3.13.1.dylib")
39+
geos_line.strip.split[0]
40+
else
41+
raise "Could not detect libgeos dependency in #{libgeos_c_path}"
42+
end
43+
else
44+
# Use patchelf to inspect the shared library dependencies
45+
output = `patchelf --print-needed "#{libgeos_c_path}" 2>&1`
46+
# Find the line with libgeos.so* (but not libgeos_c)
47+
geos_line = output.lines.find { |line| line.strip.start_with?("libgeos.so") && !line.include?("libgeos_c") }
48+
if geos_line
49+
# Extract just the library name (e.g., "libgeos.so" or "libgeos.so.3.11.2")
50+
geos_line.strip
51+
else
52+
raise "Could not detect libgeos dependency in #{libgeos_c_path}. Output: #{output}"
53+
end
54+
end
55+
end
56+
3057
def install
3158
bin.install "cockroach"
3259
prefix.install "LICENSE" if File.exist?("LICENSE")
3360
prefix.install "LICENSE.txt" if File.exist?("LICENSE.txt")
3461
prefix.install "THIRD-PARTY-NOTICES.txt"
3562
if OS.mac? && libgeos_supported?
63+
# Detect the libgeos version dynamically before modifying the library
64+
libgeos_name = detect_libgeos_name("lib/libgeos_c.dylib")
65+
3666
lib.mkpath
3767
mkdir "#{lib}/cockroach"
3868
lib.install "lib/libgeos.dylib" => "cockroach/libgeos.dylib"
@@ -45,34 +75,24 @@ def install
4575
"#{lib}/cockroach/libgeos.dylib", "#{lib}/cockroach/libgeos.dylib"
4676
system "install_name_tool", "-id",
4777
"#{lib}/cockroach/libgeos_c.1.dylib", "#{lib}/cockroach/libgeos_c.dylib"
48-
if version < Version.new("23.2.0")
49-
system "install_name_tool", "-change",
50-
"@rpath/libgeos.3.8.1.dylib", "#{lib}/cockroach/libgeos.dylib",
51-
"#{lib}/cockroach/libgeos_c.dylib"
52-
elsif version < Version.new("25.4.0")
53-
system "install_name_tool", "-change",
54-
"@rpath/libgeos.3.11.2.dylib", "#{lib}/cockroach/libgeos.dylib",
55-
"#{lib}/cockroach/libgeos_c.dylib"
56-
else
57-
system "install_name_tool", "-change",
58-
"@rpath/libgeos.3.13.1.dylib", "#{lib}/cockroach/libgeos.dylib",
59-
"#{lib}/cockroach/libgeos_c.dylib"
60-
end
78+
system "install_name_tool", "-change",
79+
libgeos_name, "#{lib}/cockroach/libgeos.dylib",
80+
"#{lib}/cockroach/libgeos_c.dylib"
6181
end
6282

6383
if OS.linux?
6484
lib.mkpath
6585
mkdir "#{lib}/cockroach"
6686
lib.install "lib/libgeos.so" => "cockroach/libgeos.so"
6787
lib.install "lib/libgeos_c.so" => "cockroach/libgeos_c.so"
88+
89+
# Detect the libgeos version dynamically before modifying the library
90+
libgeos_name = detect_libgeos_name("#{lib}/cockroach/libgeos_c.so")
91+
6892
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos.so"
6993
system "patchelf", "--set-rpath", "#{lib}/cockroach/", "#{lib}/cockroach/libgeos_c.so"
7094
system "patchelf", "--set-soname", "libgeos.so", "#{lib}/cockroach/libgeos.so"
71-
if version < Version.new("23.2.0")
72-
system "patchelf", "--replace-needed", "libgeos.so.3.8.1", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
73-
else
74-
system "patchelf", "--replace-needed", "libgeos.so.3.11.2", "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
75-
end
95+
system "patchelf", "--replace-needed", libgeos_name, "libgeos.so", "#{lib}/cockroach/libgeos_c.so"
7696
end
7797

7898
system bin/"cockroach", "gen", "man", "--path=#{man1}"

0 commit comments

Comments
 (0)