
For most formulae, the bottles need a minimum libstdc++ rather than a minimum GCC version. This is particularly important when building on Ubuntu where the default compiler version is older than libstdc++. So, checking the host libstdc++ version is a more accurate way to determine whether brew GCC is needed at runtime. This can be improved in the future to check symbol versions (e.g. GLIBCXX, CXXABI, GLIBC) which can allow some bottles to be installed even with older glibc/libstdc++.
59 lines
2.0 KiB
Ruby
59 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "os/linux/libstdcxx"
|
|
|
|
RSpec.describe OS::Linux::Libstdcxx do
|
|
describe "::below_ci_version?" do
|
|
it "returns false when system version matches CI version" do
|
|
allow(described_class).to receive(:system_version).and_return(Version.new(OS::LINUX_LIBSTDCXX_CI_VERSION))
|
|
expect(described_class.below_ci_version?).to be false
|
|
end
|
|
|
|
it "returns true when system version cannot be detected" do
|
|
allow(described_class).to receive(:system_version).and_return(Version::NULL)
|
|
expect(described_class.below_ci_version?).to be true
|
|
end
|
|
end
|
|
|
|
describe "::system_version" do
|
|
let(:tmpdir) { mktmpdir }
|
|
let(:libstdcxx) { tmpdir/described_class::SONAME }
|
|
let(:soversion) { Version.new(described_class::SOVERSION.to_s) }
|
|
|
|
before do
|
|
tmpdir.mkpath
|
|
described_class.instance_variable_set(:@system_version, nil)
|
|
allow(described_class).to receive(:system_path).and_return(libstdcxx)
|
|
end
|
|
|
|
after do
|
|
FileUtils.rm_rf(tmpdir)
|
|
end
|
|
|
|
it "returns NULL when unable to find system path" do
|
|
allow(described_class).to receive(:system_path).and_return(nil)
|
|
expect(described_class.system_version).to be Version::NULL
|
|
end
|
|
|
|
it "returns full version from filename" do
|
|
full_version = Version.new("#{soversion}.0.999")
|
|
libstdcxx_real = libstdcxx.sub_ext(".#{full_version}")
|
|
FileUtils.touch libstdcxx_real
|
|
FileUtils.ln_s libstdcxx_real, libstdcxx
|
|
expect(described_class.system_version).to eq full_version
|
|
end
|
|
|
|
it "returns major version when non-standard libstdc++ filename without full version" do
|
|
FileUtils.touch libstdcxx
|
|
expect(described_class.system_version).to eq soversion
|
|
end
|
|
|
|
it "returns major version when non-standard libstdc++ filename with unexpected realpath" do
|
|
libstdcxx_real = tmpdir/"libstdc++.so.real"
|
|
FileUtils.touch libstdcxx_real
|
|
FileUtils.ln_s libstdcxx_real, libstdcxx
|
|
expect(described_class.system_version).to eq soversion
|
|
end
|
|
end
|
|
end
|