Files
chromebrew/packages/glibc.rb
2025-07-30 12:31:51 +00:00

226 lines
8.9 KiB
Ruby

require 'package'
# This is needed so the installer finds this glibc version first when it is used in the newer installs.
# rubocop:disable Style/UnlessElse
unless CREW_PRE_GLIBC_STANDALONE
# rubocop:enable Style/UnlessElse
class Glibc < Package
description 'The GNU C Library project provides the core libraries for GNU/Linux systems.'
homepage 'https://www.gnu.org/software/libc/'
version '2.41-5'
license 'LGPL-2.1+, BSD, HPND, ISC, inner-net, rc, and PCRE'
compatibility 'all'
source_url 'https://sourceware.org/git/glibc.git'
git_hashtag '515d4166f4dbcf43b1568e3f63a19d9a92b2d50e' # Build from latest commit in the stable branch.
# source_url "https://ftpmirror.gnu.org/glibc/glibc-#{version.partition('-')[0]}.tar.xz"
# source_sha256 'a5a26b22f545d6b7d7b3dd828e11e428f24f4fac43c934fb071b6a7d0828e901'
binary_compression 'tar.zst'
binary_sha256({
aarch64: '8d092cdeeaf3b321b64b31cb76aa3813adf8e73416f4db557d41f0c0811e0131',
armv7l: '8d092cdeeaf3b321b64b31cb76aa3813adf8e73416f4db557d41f0c0811e0131',
i686: '8c2430f690f468f33dc849cd0b2163dfadf187ff1cc3e33f1d20cbfb06572ec3',
x86_64: '50729b68b70aceb95f467812950fc58ec29e3e8b184f95d7c7b4ce7cb2d53946'
})
depends_on 'crew_preload' # L
depends_on 'gawk' => :build
depends_on 'libidn2' => :build
depends_on 'make' => :build
depends_on 'patchelf' => :build
depends_on 'texinfo' => :build
depends_on 'libxcrypt' # Latest glibc removed libcrypt.so, add this for backward compatibility
conflicts_ok
no_env_options
no_shrink
print_source_bashrc
def self.patch
system 'git config --global advice.detachedHead false'
system "git clone --depth=1 https://github.com/chromebrew/crew-package-glibc -b #{version}"
Dir.glob('crew-package-glibc/patches/*.patch') do |patch|
puts "Applying #{patch}...".yellow
system 'patch', '-p1', '-i', patch
end
system 'filefix'
# These are the only locales we want.
@locales = %w[C cs_CZ de_DE en es_MX fa_IR fr_FR it_IT ja_JP ru_RU tr_TR zh].to_set
puts 'Paring locales to a minimal set before build.'.lightblue
localetypes = `awk -F '/' '{print $2}' localedata/SUPPORTED | sort -u | awk '{print $1}'`.split.flat_map(&:split)
localetypes_sed = localetypes.join('|')
Dir['localedata/{*.in,locales/*}'].compact.each do |f|
g = File.basename(f).gsub(/.UTF-8.*.in/, '').gsub(/.ISO-8859-.*.in/, '')
h = g.gsub(/_.*/, '')
locale_test = [g, h].uniq
# Just check to see if the set difference is smaller than the
# original set of locales.
if (@locales - locale_test).length < @locales.length
puts "Saving locale: #{f}"
else
system "sed -i -r '/^[[:space:]]#{g}.*(#{localetypes_sed}).*\\\\/d' localedata/Makefile", exception: false
system "sed -i -r '/^#{g}.*(#{localetypes_sed}).*\\\\/d' localedata/SUPPORTED", exception: false
end
end
@workdir = `pwd`.chomp
Dir.chdir('crew-package-glibc/archlinux') do
system "sed -i 's,/etc/,#{`pwd`.chomp}/,g' *"
system "sed -i 's,/usr/lib,#{CREW_DEST_LIB_PREFIX},g' *"
system "sed -i 's,/usr/share,#{CREW_DEST_PREFIX}/share,g' *"
# Use our locally built localedef during install.
system "sed -i 's,localedef,#{@workdir}/builddir/locale/localedef --prefix=#{CREW_DEST_DIR},' locale-gen"
end
system "sed -e '1,3d' -e 's|/| |g' -e 's|\\\\| |g' -e 's|^|#|g' localedata/SUPPORTED >> crew-package-glibc/archlinux/locale.gen"
end
def self.build
cc_macro_list = %W[
-DCREW_PREFIX=\\"#{CREW_PREFIX}\\"
-DCREW_GLIBC_PREFIX=\\"#{CREW_GLIBC_PREFIX}\\"
-DCREW_GLIBC_INTERPRETER=\\"#{CREW_GLIBC_INTERPRETER}\\"
]
build_env = {
CFLAGS: "-O3 -pipe -fPIC -fno-lto #{cc_macro_list.join(' ')}",
CXXFLAGS: "-O3 -pipe -fPIC -fno-lto #{cc_macro_list.join(' ')}",
LDFLAGS: '-fno-lto',
LD_PRELOAD: ''
}
config_opts = %W[
--prefix=#{CREW_PREFIX}
--libdir=#{CREW_LIB_PREFIX}
--mandir=#{CREW_MAN_PREFIX}
--with-headers=#{CREW_PREFIX}/include
--with-bugurl=https://github.com/chromebrew/chromebrew/issues/new
--enable-bind-now
--enable-fortify-source
--enable-kernel=3.2
--enable-shared
--disable-nscd
--disable-multilib
--disable-profile
--disable-sanity-checks
--disable-werror
--without-cvs
--without-selinux
]
config_opts << '--enable-cet' unless ARCH == 'i686'
FileUtils.mkdir_p %w[builddir]
Dir.chdir('builddir') do
File.write 'configparms', <<~EOF
slibdir=#{CREW_GLIBC_PREFIX}
rtlddir=#{CREW_GLIBC_PREFIX}
sbindir=#{CREW_PREFIX}/bin
rootsbindir=#{CREW_PREFIX}/bin
EOF
system build_env.transform_keys(&:to_s), '../configure', *config_opts, no_preload_hacks: true
system "make PARALLELMFLAGS='-j #{CREW_NPROC}'", no_preload_hacks: true
end
end
def self.install
FileUtils.mkdir_p %W[#{CREW_DEST_PREFIX}/etc/env.d #{CREW_DEST_PREFIX}/etc/ld.so.conf.d #{CREW_DEST_PREFIX}/share #{CREW_DEST_LIB_PREFIX} #{CREW_DEST_LIB_PREFIX}/locale]
system "make DESTDIR=#{CREW_DEST_DIR} install", chdir: 'builddir'
# Avoid conflicts with the zoneinfo tzdata package:
%w[tzselect zdump zic].each { |f| FileUtils.rm_rf "#{CREW_DEST_PREFIX}/bin/#{f}" }
interpreter = case ARCH
when 'aarch64', 'armv7l'
"#{CREW_DEST_PREFIX}/opt/glibc-libs/ld-linux-armhf.so.3"
when 'i686'
"#{CREW_DEST_PREFIX}/opt/glibc-libs/ld-linux.so.2"
when 'x86_64'
"#{CREW_DEST_PREFIX}/opt/glibc-libs/ld-linux-x86-64.so.2"
end
# We need to set make and localedef to work with this newly built
# glibc.
FileUtils.cp "#{CREW_PREFIX}/bin/make", 'builddir/make'
system(<<~INSTALL_LOCALES_EOF, chdir: 'builddir')
patchelf --set-interpreter #{interpreter} make
patchelf --replace-needed libdl.so.2 #{CREW_DEST_PREFIX}/opt/glibc-libs/libdl.so.2 make
patchelf --replace-needed libc.so.6 #{CREW_DEST_PREFIX}/opt/glibc-libs/libc.so.6 make
patchelf --set-interpreter #{interpreter} locale/localedef
patchelf --add-needed #{CREW_DEST_PREFIX}/opt/glibc-libs/libdl.so.2 locale/localedef
patchelf --replace-needed libc.so.6 #{CREW_DEST_PREFIX}/opt/glibc-libs/libc.so.6 locale/localedef
./make -j1 DESTDIR=#{CREW_DEST_DIR} localedata/install-locales
./make -j1 DESTDIR=#{CREW_DEST_DIR} localedata/install-locale-files
INSTALL_LOCALES_EOF
system "sed -e '1,3d' -e 's|/| |g' -e 's| \\\\||g' localedata/SUPPORTED > #{CREW_DEST_PREFIX}/share/i18n/SUPPORTED"
system 'crew-package-glibc/archlinux/locale-gen'
File.write "#{CREW_DEST_PREFIX}/etc/ld.so.conf", <<~EOF
# ld.so.conf autogenerated by Chromebrew
# DO NOT put your changes here. Instead, put them in
# #{CREW_PREFIX}/etc/ld.so.conf.d/ instead.
include #{CREW_PREFIX}/etc/ld.so.conf.d/*.conf
#{CREW_GLIBC_PREFIX}
#{CREW_LIB_PREFIX}
include /etc/ld.so.conf
EOF
end
def self.postinstall
# update search cache for ld.so
system "#{CREW_PREFIX}/bin/ldconfig", %i[out err] => File::NULL
puts "Please run 'crew update' immediately to finish the install.".lightblue
end
end
else
Package.load_package("#{__dir__}/glibc_build223.rb")
Package.load_package("#{__dir__}/glibc_build227.rb")
Package.load_package("#{__dir__}/glibc_build232.rb")
Package.load_package("#{__dir__}/glibc_build233.rb")
Package.load_package("#{__dir__}/glibc_build235.rb")
Package.load_package("#{__dir__}/glibc_build237.rb")
class Glibc < Package
description 'The GNU C Library project provides the core libraries for GNU/Linux systems.'
homepage Glibc_build237.homepage
license Glibc_build237.license
is_fake
case LIBC_VERSION
when '2.23'
version Glibc_build223.version
compatibility Glibc_build223.compatibility
depends_on 'glibc_build223'
when '2.27'
version Glibc_build227.version
compatibility Glibc_build227.compatibility
depends_on 'glibc_build227'
when '2.32'
version Glibc_build232.version
compatibility Glibc_build232.compatibility
depends_on 'glibc_build232'
when '2.33'
version Glibc_build233.version
compatibility Glibc_build233.compatibility
depends_on 'glibc_build233'
when '2.35'
version Glibc_build235.version
compatibility Glibc_build235.compatibility
depends_on 'glibc_lib235'
when '2.37'
version Glibc_build237.version
compatibility Glibc_build237.compatibility
depends_on 'glibc_lib237'
else
version LIBC_VERSION
compatibility 'aarch64 armv7l x86_64'
depends_on 'glibc_fallthrough'
end
end
end