crew: Set dynamic linker path in linker (#11817)

* crew: Set dynamic linker path in linker

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix constant order

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Suggested changes

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Merge CREW_LDFLAGS and CREW_LINKER_FLAGS

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Adjust argument order

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix CREW_GLIBC_PREFIX, add LIBRARY_PATH for gcc

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Add some patches from Chromium OS

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Bump version

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Add install-locales line

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Add comments

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Remove LD_LIBRARY_PATH from CREW_ENV_OPTIONS

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Add `CREW_GLIBC_PREFIX` to linker search path

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Set minimum kernel version to 3.2 for all architectures

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Pass CERW_PREFIX with macro

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix asprintf usage

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix macro usage

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Move all patches into a separate repo

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Add finishing touches :)

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Set compiler search path also

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix installation path

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Rebuilt binaries with same version

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* lint

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* bump version

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Fix already initialized constant error.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Merge changes from #11828

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* crew: Run `upx -d` and `patchelf` on existing/to-be-installed packages

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Fix syntax

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Silence output

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Suggested changes

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Re-add `2> /dev/null` to upx commands

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix `patchelf` usage

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Correct function name

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Fix CI build test

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

Make rubocop happy

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Update search cache for on postinstall

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Add a config file for ld.so

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Suggested changes

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Add built packages for linux/386 to set_dynamic_linker

* Add built packages for linux/amd64 to set_dynamic_linker

* Add built packages for linux/arm/v7 to set_dynamic_linker

* Update install.sh

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

* Fix rubocop

Signed-off-by: SupeChicken666 <me@supechicken666.dev>

---------

Signed-off-by: SupeChicken666 <me@supechicken666.dev>
Signed-off-by: Satadru Pramanik <satadru@gmail.com>
Co-authored-by: Satadru Pramanik <satadru@gmail.com>
Co-authored-by: supechicken <supechicken@users.noreply.github.com>
This commit is contained in:
SupeChicken666
2025-05-02 19:24:00 +08:00
committed by GitHub
parent b3b5ed15d6
commit d62c847b77
20 changed files with 156 additions and 348 deletions

125
bin/crew
View File

@@ -883,71 +883,31 @@ def prepare_package(destdir)
File.write('dlist', "#{directorylist.join("\n")}\n")
strip_dir destdir
# use upx on executables
# shrink_dir destdir
end
end
def patchelf_set_need_paths(dir)
return if @pkg.no_patchelf? || @pkg.no_compile_needed?
def fix_interpreter_path(dir)
# Do not set interpreter for non-musl, as this can break apps if there
# is an issue with the crew glibc.
return if @pkg.is_musl?
puts 'Patchelf is currently disabled during builds due to problems with upx.'.yellow
return
# Disable unreachable code check, as this is a temporary situation
# rubocop:disable Lint/UnreachableCode
Dir.chdir dir do
puts 'Running patchelf'.lightblue
abort('No Patchelf found!').lightred unless File.file?("#{CREW_PREFIX}/bin/patchelf")
puts 'Running patchelf and upx'.lightblue
abort('No Patchelf found!').lightred unless File.file?("#{CREW_PREFIX}/bin/patchelf") && File.file?("#{CREW_PREFIX}/bin/upx")
execfiles = `find . -executable -type f ! \\( -name '*.a' \\) | xargs -P#{CREW_NPROC} -n1 sh -c '[ "$(head -c4 ${1})" = "\x7FELF" ] && echo ${1}' --`.chomp
return if execfiles.empty?
patchelf_lib_prefix = @pkg.is_musl? ? "#{CREW_MUSL_PREFIX}/lib" : CREW_LIB_PREFIX
puts "patchelf_lib_prefix is #{patchelf_lib_prefix}" if CREW_VERBOSE
patchelf_interpreter = @pkg.is_musl? ? "#{CREW_MUSL_PREFIX}/lib/libc.so" : 'CREW_LIB_PREFIX/libc.so.6'
puts "patchelf_interpreter is #{patchelf_interpreter}" if CREW_VERBOSE
puts 'Running patchelf to patch binaries for library paths'.lightblue
puts 'Running patchelf to patch binary interpreter paths'.lightblue
execfiles.each_line(chomp: true) do |execfiletopatch|
execfiletopatch = Dir.pwd + execfiletopatch.delete_prefix('.')
neededlibs = `patchelf --print-needed #{execfiletopatch}`
next if neededlibs.to_s.empty?
neededlibs.each_line(chomp: true) do |neededlibspatch|
next if neededlibspatch.include?(patchelf_lib_prefix.to_s)
# Avoid segfaults from not using system versions of these files.
patchelf_veto_files = %w[
libdl.so
ld-linux.so.2
ld-linux-x86-64.so.2
ld-linux-armhf.so.3
libc.so.6
]
next if !@pkg.is_musl? && patchelf_veto_files.any? { |i| neededlibspatch.include? i }
neededlib_basename = File.basename(neededlibspatch)
neededlibspatchednamepath = "#{patchelf_lib_prefix}/" + neededlib_basename
# The first check here can be changed to just check the dest_dir
# hierarchy for neededlib_basename if the intent is to allow
# using a different CREW_PREFIX during package installs.
if File.file?(neededlibspatchednamepath) || File.file?(Dir.pwd + neededlibspatchednamepath)
puts "patchelf --replace-needed #{neededlibspatch} #{neededlibspatchednamepath} #{execfiletopatch}" if CREW_VERBOSE
system "patchelf --replace-needed #{neededlibspatch} #{neededlibspatchednamepath} #{execfiletopatch}"
else
puts "#{execfiletopatch} needed library #{neededlib_basename} not found in #{patchelf_lib_prefix} or #{Dir.pwd + neededlibspatchednamepath}.".lightred
system "upx -qq -d #{execfiletopatch} 2> /dev/null"
system "patchelf --set-interpreter #{CREW_GLIBC_INTERPRETER} #{execfiletopatch} 2> /dev/null"
system "patchelf --remove-rpath #{execfiletopatch} 2> /dev/null"
end
end
# Do not set interpreter for non-musl, as this can break apps if there
# is an issue with the crew glibc.
next unless @pkg.is_musl?
puts 'Running patchelf to patch binary interpreter paths'.lightblue
system "patchelf --set-interpreter #{patchelf_interpreter} #{execfiletopatch}"
end
end
# rubocop:enable Lint/UnreachableCode
end
def strip_find_files(find_cmd, strip_option = '')
@@ -985,69 +945,6 @@ def shrink_dir(dir)
puts 'Using rdfind to convert duplicate files to hard links.'
system "#{CREW_PREFIX}/bin/rdfind -removeidentinode true -makesymlinks false -makehardlinks true -makeresultsfile false ."
end
# Issues with non-x86_64 in compressing libraries, so just compress
# non-libraries. Also note that one needs to use "upx -d" on a
# compressed file to use ldd.
# sommelier also isn't happy when sommelier and xwayland are compressed
# so don't compress those packages.
if File.executable?("#{CREW_PREFIX}/bin/upx")
# 1. Find executable binaries but also check for hard linked
# files by making sure we have a unique set of
# inodes for the binaries found.
# 2. Copy to a temp file.
# 3. Compress using upx. (Uncompressble files are ignored.)
# 4. Check compression by expanding the compressed file with
# upx.
# 5. If the expansion doesn't error out then it is ok to copy
# over the original. (This also lets us only avoid compressing
# hard linked files multiple times.)
execfiles = `find . -executable -type f ! \\( -name '*.so*' -o -name '*.a' \\) | xargs -P8 -n1 sh -c '[ "$(head -c4 ${1})" = "\x7FELF" ] && echo ${1}' --`.chomp
unless execfiles.empty?
puts 'Using upx to shrink binaries.'
# Copying in the ThreadPoolExecutor loop fails non-deterministically
execfiles.each_line(chomp: true) do |execfilecp|
execfilecp.slice! '.'
next if execfilecp.empty?
execfilecp = File.join(dir, execfilecp)
next unless File.file?(execfilecp)
FileUtils.cp execfilecp, "#{execfilecp}-crewupxtmp"
end
require_gem 'concurrent-ruby'
pool = Concurrent::ThreadPoolExecutor.new(
min_threads: 1,
max_threads: CREW_NPROC,
max_queue: 0, # unbounded work queue
fallback_policy: :caller_runs
)
execfiles.each_line(chomp: true) do |execfile|
pool.post do
execfile.slice! '.'
execfile = File.join(dir, execfile)
puts "Attempting to compress #{execfile} ...".orange
# Make tmp file for compression
unless system "upx --lzma #{execfile}-crewupxtmp"
puts "Compression of #{execfile} failed...".orange if CREW_VERBOSE
FileUtils.rm_f "#{execfile}-crewupxtmp"
end
if File.file?("#{execfile}-crewupxtmp")
puts "Testing compressed #{execfile}...".lightblue if CREW_VERBOSE
if system 'upx', '-t', "#{execfile}-crewupxtmp"
puts "#{execfile} successfully compressed...".lightgreen
FileUtils.cp "#{execfile}-crewupxtmp", execfile
end
end
FileUtils.rm_f "#{execfile}-crewupxtmp"
end
end
pool.shutdown
pool.wait_for_termination
# Make sure temporary compression copies are deleted.
FileUtils.rm Dir['**/*-crewupxtmp']
end
end
end
end
end
@@ -1108,6 +1005,8 @@ def install_package(pkgdir)
end
end
fix_interpreter_path(".#{CREW_PREFIX}")
install_files(".#{CREW_PREFIX}") if Dir.exist?(".#{CREW_PREFIX}")
install_files(".#{HOME}", HOME) if Dir.exist?(".#{HOME}")
end

View File

@@ -58,7 +58,8 @@ class Command
if File.file?(filelist_path)
filelist = File.readlines(filelist_path, chomp: true)
overlap_files = ConvenienceFunctions.determine_conflicts(pkg.name, filelist_path, verbose: verbose)
essential_files = CREW_ESSENTIAL_PACKAGES.flat_map { |f| File.readlines(File.join(CREW_META_PATH, "#{f}.filelist"), chomp: true)}
# essential_files should only contain filelists for packages already installed.
essential_files = CREW_ESSENTIAL_PACKAGES.flat_map { |f| File.readlines(File.join(CREW_META_PATH, "#{f}.filelist"), chomp: true) if File.file?(File.join(CREW_META_PATH, "#{f}.filelist")) }
overlap_essential_files = filelist & essential_files
files_to_remove = filelist - overlap_files.values.flatten - overlap_essential_files

View File

@@ -31,7 +31,8 @@ lsbval() {
}
# Print a message before exit on error
trap "echo_error 'An error occured during the installation :/'" ERR
set_trap() { trap "echo_error 'An error occured during the installation :/'" ERR; }
set_trap
# Check if the script is being run as root.
if [ "${EUID}" == "0" ]; then
@@ -129,9 +130,6 @@ if [[ "$ARCH" == "x86_64" ]]; then
LIB_SUFFIX='64'
fi
# Package version string may include LIBC_VERSION.
LIBC_VERSION=$(/lib"$LIB_SUFFIX"/libc.so.6 2>/dev/null | awk 'match($0, /Gentoo ([^-]+)/) {print substr($0, RSTART+7, RLENGTH-7)}')
# Warn users of the AMD segfault issue and allow them to work around it.
# The easiest way to distinguish StoneyRidge platorms is to check for the FMA4
# instruction, as it was first introduced in Bulldozer and later dropped in Zen.
@@ -193,32 +191,16 @@ echo_out 'Set up the local package repo...'
# Download the chromebrew repository.
curl_wrapper -L --progress-bar https://github.com/"${OWNER}"/"${REPO}"/tarball/"${BRANCH}" | tar -xz --strip-components=1 -C "${CREW_LIB_PATH}"
BOOTSTRAP_PACKAGES='lz4 zlib xzutils zstd zlib_ng crew_mvdir ruby git ca_certificates libyaml openssl'
BOOTSTRAP_PACKAGES='glibc_standalone libxcrypt upx patchelf lz4 zlib xzutils zstd zlib_ng crew_mvdir ruby git ca_certificates libyaml openssl gmp'
# Older i686 systems.
[[ "${ARCH}" == "i686" ]] && BOOTSTRAP_PACKAGES+=' gcc_lib'
if [[ -n "${CHROMEOS_RELEASE_CHROME_MILESTONE}" ]]; then
# shellcheck disable=SC2231
for i in /lib$LIB_SUFFIX/libc.so*
do
sudo cp "$i" "$CREW_PREFIX/lib$LIB_SUFFIX/"
libcname=$(basename "$i")
sudo chown chronos "$CREW_PREFIX/lib$LIB_SUFFIX/${libcname}"
sudo chmod 644 "$CREW_PREFIX/lib$LIB_SUFFIX/${libcname}"
done
if (( "${CHROMEOS_RELEASE_CHROME_MILESTONE}" > "112" )); then
# Recent Arm systems have a cut down system.
[[ "${ARCH}" == "armv7l" ]] && BOOTSTRAP_PACKAGES+=' bzip2 ncurses readline pcre2 gcc_lib'
if (( "${CHROMEOS_RELEASE_CHROME_MILESTONE}" < "123" )); then
# Append the correct packages for systems running M122 and lower.
BOOTSTRAP_PACKAGES+=' glibc_lib235 gmp'
elif (( "${CHROMEOS_RELEASE_CHROME_MILESTONE}" > "122" )); then
# Append the correct packages for systems running M123 onwards.
# X86_64 requires patchelf patching of the system libc.so.6.
[[ "$ARCH" == "x86_64" ]] && BOOTSTRAP_PACKAGES+=' patchelf'
BOOTSTRAP_PACKAGES+=' glibc_lib237 gmp'
fi
fi
fi
@@ -323,8 +305,28 @@ function extract_install () {
fi
fi
echo_intra "Installing ${1} ..."
echo_intra "Installing ${1}..."
tar cpf - ./*/* | (cd /; tar xp --keep-directory-symlink -m -f -)
if [[ "${1}" == 'glibc_standalone' ]]; then
# set LD_AUDIT to ignore libC.so.6 requests
export LD_AUDIT="${CREW_PREFIX}/opt/glibc-libs/crew-audit.so"
# update ld.so cache
ldconfig
else
# decompress and switch to glibc_standalone for existing binaries
if command -v upx &> /dev/null; then
echo_intra "Running upx on ${1}..."
grep "/usr/local/\(bin\|lib\|lib${LIB_SUFFIX}\)" < filelist | xargs -P "$(nproc)" -n1 upx -qq -d 2> /dev/null || true
fi
if command -v patchelf &> /dev/null; then
echo_intra "Running patchelf on ${1}..."
grep '/usr/local/bin' < filelist | xargs -P "$(nproc)" -n1 patchelf --set-interpreter "${CREW_PREFIX}/bin/ld.so" 2> /dev/null || true
fi
fi
mv ./dlist "${CREW_META_PATH}/${1}.directorylist"
mv ./filelist "${CREW_META_PATH}/${1}.filelist"
}
@@ -393,14 +395,6 @@ ln -sfv "../lib/crew/bin/crew" "${CREW_PREFIX}/bin/"
echo "export CREW_PREFIX=${CREW_PREFIX}" >> "${CREW_PREFIX}/etc/env.d/profile"
if (( "${CHROMEOS_RELEASE_CHROME_MILESTONE}" > "122" )) && [[ "$ARCH" == "x86_64" ]]; then
echo_info "This Milestone (M${CHROMEOS_RELEASE_CHROME_MILESTONE}) needs to have libc.so.6 patched for the Chromebrew Glibc."
cp "/lib${LIB_SUFFIX}/libc.so.6" /tmp/libc.so.6.tmp
patchelf --add-needed libC.so.6 /tmp/libc.so.6.tmp
env -u LD_LIBRARY_PATH cp /tmp/libc.so.6.tmp "${CREW_PREFIX}/lib${LIB_SUFFIX}/libc.so.6"
rm /tmp/libc.so.6.tmp
fi
echo_info 'Updating RubyGems...'
gem sources -u
gem update --no-update-sources -N --system
@@ -428,7 +422,7 @@ install_ruby_gem ${BOOTSTRAP_GEMS}
echo_info "Installing crew_profile_base...\n"
yes | crew install crew_profile_base
# shellcheck disable=SC1090
ARCH="$ARCH" source ~/.bashrc
trap - ERR && source ~/.bashrc && set_trap
echo_info "Installing core Chromebrew packages...\n"
yes | crew install core

View File

@@ -3,7 +3,7 @@
require 'etc'
OLD_CREW_VERSION ||= defined?(CREW_VERSION) ? CREW_VERSION : '1.0'
CREW_VERSION ||= '1.59.5' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
CREW_VERSION ||= '1.59.6' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
# Kernel architecture.
KERN_ARCH ||= Etc.uname[:machine]
@@ -44,7 +44,7 @@ end
# These are packages that crew needs to run-- only packages that the bin/crew needs should be required here.
# lz4, for example, is required for zstd to have lz4 support, but this is not required to run bin/crew.
# The LIBC_VERSION ternary is to reflect the change from glibc_build to glibc_lib as the source of essential libraries starting at glibc 2.35.
CREW_ESSENTIAL_PACKAGES ||= %W[gcc_lib #{LIBC_VERSION.to_f > 2.34 ? "glibc_lib#{LIBC_VERSION.delete('.')}" : "glibc_build#{LIBC_VERSION.delete('.')}"} gmp ruby zlib zlib_ng zstd]
CREW_ESSENTIAL_PACKAGES ||= %W[gcc_lib #{LIBC_VERSION.to_f > 2.34 ? "glibc_lib#{LIBC_VERSION.delete('.')}" : "glibc_build#{LIBC_VERSION.delete('.')}"} glibc_standalone gmp ruby zlib zlib_ng zstd]
CREW_IN_CONTAINER ||= File.exist?('/.dockerenv') || ENV.fetch('CREW_IN_CONTAINER', false) unless defined?(CREW_IN_CONTAINER)
@@ -76,17 +76,21 @@ CREW_CONFIG_PATH ||= File.join(CREW_PREFIX, 'etc/crew')
CREW_META_PATH ||= File.join(CREW_CONFIG_PATH, 'meta')
CREW_BREW_DIR ||= File.join(CREW_PREFIX, 'tmp/crew')
CREW_DEST_DIR ||= File.join(CREW_BREW_DIR, 'dest')
CREW_WINE_PREFIX ||= File.join(CREW_LIB_PREFIX, 'wine')
CREW_DEST_PREFIX ||= File.join(CREW_DEST_DIR, CREW_PREFIX)
CREW_DEST_LIB_PREFIX ||= File.join(CREW_DEST_DIR, CREW_LIB_PREFIX)
CREW_DEST_WINE_PREFIX ||= File.join(CREW_DEST_PREFIX, CREW_WINE_PREFIX)
CREW_DEST_MAN_PREFIX ||= File.join(CREW_DEST_DIR, CREW_MAN_PREFIX)
CREW_WINE_PREFIX ||= File.join(CREW_LIB_PREFIX, 'wine')
CREW_DEST_WINE_PREFIX ||= File.join(CREW_DEST_PREFIX, CREW_WINE_PREFIX)
# Local constants for contributors.
CREW_LOCAL_REPO_ROOT ||= `git rev-parse --show-toplevel 2> /dev/null`.chomp
CREW_LOCAL_BUILD_DIR ||= "#{CREW_LOCAL_REPO_ROOT}/release/#{ARCH}"
CREW_GITLAB_PKG_REPO ||= 'https://gitlab.com/api/v4/projects/26210301/packages'
# Glibc related constants
CREW_GLIBC_PREFIX ||= File.join(CREW_PREFIX, 'opt/glibc-libs')
CREW_GLIBC_INTERPRETER ||= File.symlink?("#{CREW_PREFIX}/bin/ld.so") ? File.realpath("#{CREW_PREFIX}/bin/ld.so") : nil unless defined?(CREW_GLIBC_INTERPRETER)
# Put musl build dir under CREW_PREFIX/share/musl to avoid FHS incompatibility
CREW_MUSL_PREFIX ||= File.join(CREW_PREFIX, '/share/musl/')
CREW_DEST_MUSL_PREFIX ||= File.join(CREW_DEST_DIR, CREW_MUSL_PREFIX)
@@ -141,7 +145,7 @@ USER ||= Etc.getlogin unless defined?(USER)
unless defined?(CHROMEOS_RELEASE)
CHROMEOS_RELEASE =
if File.exist?('/etc/lsb-release')
File.read('/etc/lsb-release')[/CHROMEOS_RELEASE_CHROME_MILESTONE||=(.+)/, 1]
File.read('/etc/lsb-release')[/CHROMEOS_RELEASE_CHROME_MILESTONE=(.+)/, 1]
else
# newer version of Chrome OS exports info to env by default
ENV.fetch('CHROMEOS_RELEASE_CHROME_MILESTONE', nil)
@@ -202,15 +206,15 @@ when 'x86_64'
end
CREW_LINKER ||= ENV.fetch('CREW_LINKER', 'mold') unless defined?(CREW_LINKER)
CREW_GLIBC_OVERRIDE_LINKER_FLAGS ||= ARCH == 'x86_64' && LIBC_VERSION.to_f >= 2.35 ? " #{File.join(CREW_LIB_PREFIX, 'libC.so.6')} " : ''
CREW_LINKER_FLAGS ||= ENV.fetch('CREW_LINKER_FLAGS', CREW_GLIBC_OVERRIDE_LINKER_FLAGS) unless defined?(CREW_LINKER_FLAGS)
CREW_LINKER_FLAGS ||= ENV.fetch('CREW_LINKER_FLAGS', '-flto=auto') unless defined?(CREW_LINKER_FLAGS)
CREW_CORE_FLAGS ||= "-O3 -pipe -ffat-lto-objects -fPIC #{CREW_ARCH_FLAGS} -fuse-ld=#{CREW_LINKER} #{CREW_LINKER_FLAGS}"
CREW_COMMON_FLAGS ||= "#{CREW_CORE_FLAGS} -flto=auto"
CREW_COMMON_FNO_LTO_FLAGS ||= "#{CREW_CORE_FLAGS} -fno-lto"
CREW_LDFLAGS ||= "-flto=auto #{CREW_LINKER_FLAGS}"
CREW_COMMON_FLAGS ||= "#{CREW_CORE_FLAGS} -B#{CREW_GLIBC_PREFIX} -flto=auto"
CREW_COMMON_FNO_LTO_FLAGS ||= "#{CREW_CORE_FLAGS} -B#{CREW_GLIBC_PREFIX} -fno-lto"
CREW_FNO_LTO_LDFLAGS ||= '-fno-lto'
CREW_LINKER_FLAGS << " -Wl,--dynamic-linker,#{CREW_GLIBC_INTERPRETER} -B#{CREW_GLIBC_PREFIX} -L#{CREW_GLIBC_PREFIX}" if CREW_GLIBC_INTERPRETER
CREW_ENV_OPTIONS_HASH ||=
if CREW_DISABLE_ENV_OPTIONS
{ 'CREW_DISABLE_ENV_OPTIONS' => '1' }
@@ -220,8 +224,8 @@ CREW_ENV_OPTIONS_HASH ||=
'CXXFLAGS' => CREW_COMMON_FLAGS,
'FCFLAGS' => CREW_COMMON_FLAGS,
'FFLAGS' => CREW_COMMON_FLAGS,
'LD_LIBRARY_PATH' => CREW_LIB_PREFIX,
'LDFLAGS' => CREW_LDFLAGS
'LIBRARY_PATH' => "#{CREW_GLIBC_PREFIX}:#{CREW_LIB_PREFIX}",
'LDFLAGS' => CREW_LINKER_FLAGS
}
end
@@ -258,8 +262,10 @@ CREW_MESON_OPTIONS ||= <<~OPT.chomp
-Db_lto=true \
-Dstrip=true \
-Db_pie=true \
-Dc_args='#{CREW_CORE_FLAGS}' \
-Dc_link_args='#{CREW_LINKER_FLAGS}' \
-Dcpp_args='#{CREW_CORE_FLAGS}' \
-Dc_args='#{CREW_CORE_FLAGS}'
-Dcpp_link_args='#{CREW_LINKER_FLAGS}'
OPT
# Use ninja or samurai
@@ -273,10 +279,10 @@ CREW_CMAKE_OPTIONS ||= <<~OPT.chomp
-DCMAKE_LIBRARY_PATH=#{CREW_LIB_PREFIX} \
-DCMAKE_C_FLAGS='#{CREW_COMMON_FLAGS.gsub(/-fuse-ld=.{2,4}\s/, '')}' \
-DCMAKE_CXX_FLAGS='#{CREW_COMMON_FLAGS.gsub(/-fuse-ld=.{2,4}\s/, '')}' \
-DCMAKE_EXE_LINKER_FLAGS='#{CREW_LDFLAGS}' \
-DCMAKE_EXE_LINKER_FLAGS='#{CREW_LINKER_FLAGS}' \
-DCMAKE_LINKER_TYPE=#{CREW_LINKER.upcase} \
-DCMAKE_SHARED_LINKER_FLAGS='#{CREW_LDFLAGS}' \
-DCMAKE_MODULE_LINKER_FLAGS='#{CREW_LDFLAGS}' \
-DCMAKE_SHARED_LINKER_FLAGS='#{CREW_LINKER_FLAGS}' \
-DCMAKE_MODULE_LINKER_FLAGS='#{CREW_LINKER_FLAGS}' \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE \
-DCMAKE_BUILD_TYPE=Release
OPT

View File

@@ -254,30 +254,18 @@ unless installed_pkgs_to_deprecate.empty?
refresh_crew_json
end
# Handle broken system glibc affecting gcc_lib on newer x86_64 ChromeOS milestones.
if (ARCH == 'x86_64') && (Gem::Version.new(LIBC_VERSION.to_s) >= Gem::Version.new('2.36'))
abort("patchelf is needed. Please run: 'crew update && crew install patchelf && crew update'") unless File.file?(File.join(CREW_PREFIX, 'bin/patchelf'))
# Link the system libc.so.6 to also require our renamed libC.so.6
# which provides the float128 functions strtof128, strfromf128,
# and __strtof128_nan.
# This creates tons of the following warnings when g++ is invoked with
# g++ #{File.join(CREW_LIB_PREFIX, 'libC.so.6')}, but I'm not sure how
# to get around that.
# /usr/local/lib64/libC.so.6: linker input file unused because linking not done errors
libc_patch_libraries = %w[libstdc++.so.6]
libc_patch_libraries.delete_if { |lib| !File.file?(File.join(CREW_LIB_PREFIX, lib)) }
libc_patch_libraries.delete_if { |lib| Kernel.system "patchelf --print-needed #{File.join(CREW_LIB_PREFIX, lib)} | grep -q libC.so.6" }
if File.exist?("#{CREW_PREFIX}/bin/upx") && File.exist?("#{CREW_PREFIX}/bin/patchelf")
# Decompress all upx-compressed libraries
puts 'Decompressing binaries with upx...'.yellow
system "find #{CREW_PREFIX}/bin -type f -executable -print | xargs -P#{CREW_NPROC} -n1 upx -qq -d 2> /dev/null"
system "find #{CREW_LIB_PREFIX} -type f -executable -print | xargs -P#{CREW_NPROC} -n1 upx -qq -d 2> /dev/null"
return if libc_patch_libraries.empty?
if File.file?(File.join(CREW_LIB_PREFIX, 'libC.so.6'))
Dir.chdir(CREW_LIB_PREFIX) do
libc_patch_libraries.each do |lib|
Kernel.system "patchelf --add-needed libC.so.6 #{lib}" and Kernel.system "patchelf --remove-needed libc.so.6 #{lib}"
puts "#{lib} patched for use with Chromebrew's glibc.".lightgreen
end
end
end
# Switch to glibc_standalone if installed
puts 'Switching to glibc_standalone for all installed executables...'.yellow
system "find #{CREW_PREFIX}/bin -type f -executable -print | xargs -P#{CREW_NPROC} -n1 patchelf --set-interpreter #{CREW_GLIBC_INTERPRETER} 2> /dev/null"
system "find #{CREW_PREFIX}/bin -type f -executable -print | xargs -P#{CREW_NPROC} -n1 patchelf --remove-rpath 2> /dev/null"
else
abort 'Please install upx and patchelf first by running \'crew install upx patchelf\'.'.lightred
end
# Reload @device with the appropriate symbolized or nonsymbolized json load before we exit fixup.

View File

@@ -19,7 +19,9 @@
/usr/local/bin/xtrace
/usr/local/bin/zdump
/usr/local/bin/zic
/usr/local/etc/env.d/10-glibc
/usr/local/etc/ld.so.cache
/usr/local/etc/ld.so.conf
/usr/local/etc/rpc
/usr/local/include/a.out.h
/usr/local/include/aio.h
@@ -500,6 +502,7 @@
/usr/local/opt/glibc-libs/Mcrt1.o
/usr/local/opt/glibc-libs/Scrt1.o
/usr/local/opt/glibc-libs/audit/sotruss-lib.so
/usr/local/opt/glibc-libs/crew-audit.so
/usr/local/opt/glibc-libs/crt1.o
/usr/local/opt/glibc-libs/crti.o
/usr/local/opt/glibc-libs/crtn.o

View File

@@ -0,0 +1 @@
/usr/local/bin/hello_chromebrew

View File

@@ -19,7 +19,9 @@
/usr/local/bin/xtrace
/usr/local/bin/zdump
/usr/local/bin/zic
/usr/local/etc/env.d/10-glibc
/usr/local/etc/ld.so.cache
/usr/local/etc/ld.so.conf
/usr/local/etc/rpc
/usr/local/include/a.out.h
/usr/local/include/aio.h
@@ -508,6 +510,7 @@
/usr/local/opt/glibc-libs/Mcrt1.o
/usr/local/opt/glibc-libs/Scrt1.o
/usr/local/opt/glibc-libs/audit/sotruss-lib.so
/usr/local/opt/glibc-libs/crew-audit.so
/usr/local/opt/glibc-libs/crt1.o
/usr/local/opt/glibc-libs/crti.o
/usr/local/opt/glibc-libs/crtn.o

View File

@@ -0,0 +1 @@
/usr/local/bin/hello_chromebrew

View File

@@ -19,7 +19,9 @@
/usr/local/bin/xtrace
/usr/local/bin/zdump
/usr/local/bin/zic
/usr/local/etc/env.d/10-glibc
/usr/local/etc/ld.so.cache
/usr/local/etc/ld.so.conf
/usr/local/etc/rpc
/usr/local/include/a.out.h
/usr/local/include/aio.h
@@ -505,6 +507,7 @@
/usr/local/opt/glibc-libs/Mcrt1.o
/usr/local/opt/glibc-libs/Scrt1.o
/usr/local/opt/glibc-libs/audit/sotruss-lib.so
/usr/local/opt/glibc-libs/crew-audit.so
/usr/local/opt/glibc-libs/crt1.o
/usr/local/opt/glibc-libs/crti.o
/usr/local/opt/glibc-libs/crtn.o

View File

@@ -0,0 +1 @@
/usr/local/bin/hello_chromebrew

View File

@@ -69,7 +69,7 @@ class Bsdgames < Autotools
bsd_games_cfg_ncurses_includes='#{`pkg-config --cflags-only-I ncurses`.chomp}'
bsd_games_cfg_ncurses_lib='#{`pkg-config --libs-only-l ncurses`.chomp}'
bsd_games_cfg_non_interactive=y
bsd_games_cfg_other_ldflags='\"#{CREW_LDFLAGS}\"'
bsd_games_cfg_other_ldflags='\"#{CREW_LINKER_FLAGS}\"'
bsd_games_cfg_pager='#{CREW_PREFIX}/bin/#{ENV.fetch('PAGER', nil)}'
bsd_games_cfg_sbindir='#{CREW_PREFIX}/sbin'
bsd_games_cfg_sharedir='#{CREW_PREFIX}/share/bsdgames'

View File

@@ -74,7 +74,7 @@ class Busybox < Package
CONFIG_CROSS_COMPILER_PREFIX=""
CONFIG_SYSROOT=""
CONFIG_EXTRA_CFLAGS="#{CREW_COMMON_FLAGS}"
CONFIG_EXTRA_LDFLAGS="#{CREW_LDFLAGS}"
CONFIG_EXTRA_LDFLAGS="#{CREW_LINKER_FLAGS}"
CONFIG_EXTRA_LDLIBS="pthread"
# CONFIG_USE_PORTABLE_CODE is not set
# CONFIG_STACK_OPTIMIZATION_386 is not set

View File

@@ -3,7 +3,7 @@ require 'package'
class Core < Package
description 'Core Chromebrew Packages.'
homepage 'https://github.com/chromebrew/chromebrew'
version '3.6'
version '3.7'
license 'GPL-3+'
compatibility 'all'
@@ -31,6 +31,7 @@ class Core < Package
depends_on 'git'
depends_on 'git_mestrelion_tools'
depends_on 'glibc_lib'
depends_on 'glibc_standalone'
depends_on 'gmp'
depends_on 'gnutls'
depends_on 'groff'

View File

@@ -56,7 +56,7 @@ class Docker < Package
CGO_CPPFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_CFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_CXXFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_LDFLAGS='#{CREW_LDFLAGS.gsub('=auto', '')}' \
CGO_LDFLAGS='#{CREW_LINKER_FLAGS.gsub('=auto', '')}' \
LDFLAGS='' \
GOFLAGS='-buildmode=pie -trimpath -mod=readonly -modcacherw -ldflags=-linkmode=external' \
GO111MODULE=off \
@@ -66,7 +66,7 @@ class Docker < Package
CGO_CPPFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_CFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_CXXFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_LDFLAGS='#{CREW_LDFLAGS.gsub('=auto', '')}' \
CGO_LDFLAGS='#{CREW_LINKER_FLAGS.gsub('=auto', '')}' \
LDFLAGS='' \
GOFLAGS='-buildmode=pie -trimpath -mod=readonly -modcacherw -ldflags=-linkmode=external' \
GO111MODULE=off \
@@ -98,7 +98,7 @@ class Docker < Package
CGO_CPPFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_CFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_CXXFLAGS='#{CREW_COMMON_FLAGS.gsub('=auto', '')}' \
CGO_LDFLAGS='#{CREW_LDFLAGS.gsub('=auto', '')}' \
CGO_LDFLAGS='#{CREW_LINKER_FLAGS.gsub('=auto', '')}' \
LDFLAGS='' \
GOFLAGS='-buildmode=pie -trimpath -mod=readonly -modcacherw -ldflags=-linkmode=external' \
GO111MODULE=off \

View File

@@ -3,18 +3,18 @@ require 'package'
class Glibc_standalone < 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-1'
version '2.41-2'
license 'LGPL-2.1+, BSD, HPND, ISC, inner-net, rc, and PCRE'
compatibility 'all'
source_url "https://ftpmirror.gnu.org/glibc/glibc-#{version.split('-').first}.tar.xz"
source_url "https://ftpmirror.gnu.org/glibc/glibc-#{version.partition('-')[0]}.tar.xz"
source_sha256 'a5a26b22f545d6b7d7b3dd828e11e428f24f4fac43c934fb071b6a7d0828e901'
binary_compression 'tar.zst'
binary_sha256({
aarch64: 'e19d852da8d4ead346d62003f9e5f15076ed5fae5bcd12dc9bd8f7f2602bc1b2',
armv7l: 'e19d852da8d4ead346d62003f9e5f15076ed5fae5bcd12dc9bd8f7f2602bc1b2',
i686: '5b3a5e7256520a0435604b53f93a743d58ea07bea950fe3ee5f371c296f640f1',
x86_64: '44220b48699ab3fb677d16c0b5172fac151c47edfa48015f170633a5a1dd18ed'
aarch64: 'd9cd380aa98e25f76771ba117e2cc3a74bdbd45b83b0b3d4952d574ac68fd5bc',
armv7l: 'd9cd380aa98e25f76771ba117e2cc3a74bdbd45b83b0b3d4952d574ac68fd5bc',
i686: '3ff57cdd0ba6a768a4099f35e3087390bf07fda1e80c54a26789c0882de7e455',
x86_64: '0cfe260873f0a53ac7074705b82b2a80b3e03b0916b7ff7cd2b6683b4431efdc'
})
depends_on 'gawk' => :build
@@ -29,162 +29,44 @@ class Glibc_standalone < Package
conflicts_ok
no_env_options
no_shrink
print_source_bashrc
def self.patch
File.write 'hardcode-library-path.patch', <<~EOF
diff -Nur a/elf/dl-support.c b/elf/dl-support.c
--- a/elf/dl-support.c 2025-04-23 01:58:17.265974714 +0800
+++ b/elf/dl-support.c 2025-04-23 14:38:27.373033131 +0800
@@ -296,7 +296,7 @@
/* Initialize the data structures for the search paths for shared
objects. */
- _dl_init_paths (getenv ("LD_LIBRARY_PATH"), "LD_LIBRARY_PATH",
+ _dl_init_paths ("#{CREW_PREFIX}/opt/glibc-libs:#{CREW_LIB_PREFIX}:/#{ARCH_LIB}", "LD_LIBRARY_PATH",
\t\t /* No glibc-hwcaps selection support in statically
\t\t linked binaries. */
\t\t NULL, NULL);
diff -Nur a/elf/rtld.c b/elf/rtld.c
--- a/elf/rtld.c 2025-04-23 04:04:02.230377659 +0800
+++ b/elf/rtld.c 2025-04-23 14:37:52.298031258 +0800
@@ -2647,7 +2647,7 @@
\t /* The library search path. */
\t if (memcmp (envline, "LIBRARY_PATH", 12) == 0)
\t {
-\t state->library_path = &envline[13];
+\t state->library_path = "#{CREW_PREFIX}/opt/glibc-libs:#{CREW_LIB_PREFIX}:/#{ARCH_LIB}";
\t state->library_path_source = "LD_LIBRARY_PATH";
\t break;
\t }
EOF
system "git clone --depth=1 https://github.com/chromebrew/crew-package-glibc -b #{version}"
system 'filefix'
system 'patch', '-p1', '-i', 'hardcode-library-path.patch'
# See https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/refs/heads/release-R136-16238.B/sys-libs/glibc/files/local/glibc-2.39/0009-Revert-Add-GLIBC_ABI_DT_RELR-for-DT_RELR-support.patch?pli=1%2F
File.write '0009-Revert-Add-GLIBC_ABI_DT_RELR-for-DT_RELR-support.patch', <<~GLIBC_ABI_DT_RELR_PATCH_EOF
diff --git a/elf/dl-version.c b/elf/dl-version.c
index 8966d612cc79..7fb5cb16d47b 100644
--- a/elf/dl-version.c
+++ b/elf/dl-version.c
@@ -359,30 +359,6 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
\t}
}
- /* When there is a DT_VERNEED entry with libc.so on DT_NEEDED, issue
- an error if there is a DT_RELR entry without GLIBC_ABI_DT_RELR
- dependency. */
- if (dyn != NULL
- && map->l_info[DT_NEEDED] != NULL
- && map->l_info[DT_RELR] != NULL
- && __glibc_unlikely (!map->l_dt_relr_ref))
- {
- const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
- const ElfW(Dyn) *d;
- for (d = map->l_ld; d->d_tag != DT_NULL; ++d)
-\tif (d->d_tag == DT_NEEDED)
-\t {
-\t const char *name = strtab + d->d_un.d_val;
-\t if (strncmp (name, "libc.so.", 8) == 0)
-\t {
-\t\t_dl_exception_create
-\t\t (&exception, DSO_FILENAME (map->l_name),
-\t\t N_("DT_RELR without GLIBC_ABI_DT_RELR dependency"));
-\t\tgoto call_error;
-\t }
-\t }
- }
-
return result;
}
--
2.41.0
GLIBC_ABI_DT_RELR_PATCH_EOF
system 'patch', '-p1', '-i', '0009-Revert-Add-GLIBC_ABI_DT_RELR-for-DT_RELR-support.patch'
# See https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/refs/heads/release-R136-16238.B/sys-libs/glibc/files/local/glibc-2.39/0002-libc-Speed-up-large-memcpy-on-Cortex-A7-A15.patch
File.write '0002-libc-Speed-up-large-memcpy-on-Cortex-A7-A15.patch', <<~LIBC_SPEED_UP_PATCH_EOF
From e5b7f5d719e8fd03de363bc5bb5c28f1429e56bd Mon Sep 17 00:00:00 2001
From: Yunlian Jiang <yunlian@google.com>
Date: Fri, 1 Aug 2014 15:19:34 -0700
Subject: [PATCH 2/3] libc: Speed up large memcpy() on Cortex-A7/A15
Details please see crbug://331427
Experimentally it's been found that the "unaligned" memcpy() is
actually faster for sufficiently large memory copies. It appears that
the changeover point is a little different for different processors,
though. For A15 there's a lot more run-to-run variance for
medium-sized memcpy() but the changeover appears to be at ~16K. For
A7 (and maybe A9) the changeover seems to be a little further out.
We think the variance in A15 memcpy() is is due to different physical
addresses for the chunks of memory given to us by the kernel. It is
certain that the "aligned" code works faster at 4K and less and that
the "unaligned" code works faster with very large chunks of memory.
Since we care most about A15 performance and the A7 performance is not
that much worse (and actually better for SDRAM transfers), we'll pick
the number that's best for the A15.
Tests on snow (A15 only):
* Large (12M) aligned copies go from ~2350 MiB/s to ~2900 MiB/s.
* Medium (96K) aligned copies go from ~5900 MiB/s to ~6300 MiB/s.
* Medium (16K) aligned copies seem to be better but there's a lot of
noise (old=8151.8, 8736.6, 8168.7; new=9364.9, 9829.5, 9639.0)
* Small (4K, 8K) algined copies are unchanged.
For A7-only on pit:
* Large (12M) aligned copies go from 440 MiB/s to 930 MiB/s.
* Medium (96K) aligned copies regress from ~2650 MiB/s to ~2400 MiB/s.
* Medium (16K) aligned copies regress from ~3000 MiB/s to ~2800 MiB/s.
* Small (4K, 8K) aligned copies are unchanged.
See punybench changes at
<https://chromium-review.googlesource.com/#/c/182168/3> for how this
was tested. For A15 changes I ran 3 times and averaged (there wasn't
lots of variance except for 16K). For A7 changes I ran 2 times.
[Adrian: forward-ported to glibc 2.32]
---
sysdeps/arm/armv7/multiarch/memcpy_impl.S | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sysdeps/arm/armv7/multiarch/memcpy_impl.S b/sysdeps/arm/armv7/multiarch/memcpy_impl.S
index dc701827..ac171cde 100644
--- a/sysdeps/arm/armv7/multiarch/memcpy_impl.S
+++ b/sysdeps/arm/armv7/multiarch/memcpy_impl.S
@@ -327,6 +327,10 @@ ENTRY(memcpy)
\tcmp\ttmp1, tmp2
\tbne\t.Lcpy_notaligned
+\t/* Use the non-aligned code for >=16K; faster on A7/A15 (A9 too?) */
+\tcmp\tcount, #0x4000
+\tbge\t.Lcpy_notaligned
+
#ifdef USE_VFP
\t/* Magic dust alert! Force VFP on Cortex-A9. Experiments show
\t that the FP pipeline is much better at streaming loads and
--
2.49.0
LIBC_SPEED_UP_PATCH_EOF
system 'patch', '-p1', '-i', '0002-libc-Speed-up-large-memcpy-on-Cortex-A7-A15.patch'
Dir.glob('crew-package-glibc/patches/*.patch') do |patch|
puts "Applying #{patch}...".yellow
system 'patch', '-p1', '-i', patch
end
end
def self.build
glibc_libdir = File.join(CREW_PREFIX, 'opt/glibc-libs')
cc_macro_list = %W[
-DCREW_AUDIT=\\"#{CREW_GLIBC_PREFIX}/crew-audit.so\\"
-DCREW_PREFIX=\\"#{CREW_PREFIX}\\"
-DCREW_GLIBC_PREFIX=\\"#{CREW_GLIBC_PREFIX}\\"
-DCREW_GLIBC_VERSION=\\"#{version.partition('-')[0]}\\"
-DCREW_LD_LIBRARY_PATH=\\"#{CREW_GLIBC_PREFIX}:#{ENV.fetch('LD_LIBRARY_PATH', nil)}\\"
]
build_env = {
CFLAGS: '-O3 -pipe -fPIC -fno-lto -fuse-ld=lld',
CXXFLAGS: '-O3 -pipe -fPIC -fno-lto -fuse-ld=lld',
CFLAGS: "-O3 -pipe -fPIC -fno-lto -fuse-ld=lld #{cc_macro_list.join(' ')}",
CXXFLAGS: "-O3 -pipe -fPIC -fno-lto -fuse-ld=lld #{cc_macro_list.join(' ')}",
LDFLAGS: '-fno-lto -fuse-ld=lld',
LD: 'ld.lld' # use lld here as mold will segfault
}
config_opts = %W[
--prefix=#{CREW_PREFIX}
--libdir=#{glibc_libdir}
--libdir=#{CREW_GLIBC_PREFIX}
--libexecdir=#{CREW_PREFIX}/libexec
--mandir=#{CREW_PREFIX}/man
--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=#{ARCH.eql?('i686') ? '3.2' : '4.4'}
--enable-kernel=3.2
--disable-nscd
--disable-profile
--disable-sanity-checks
@@ -198,8 +80,8 @@ class Glibc_standalone < Package
FileUtils.mkdir_p 'builddir'
Dir.chdir('builddir') do
File.write 'configparms', <<~EOF
slibdir=#{glibc_libdir}
rtlddir=#{glibc_libdir}
slibdir=#{CREW_GLIBC_PREFIX}
rtlddir=#{CREW_GLIBC_PREFIX}
sbindir=#{CREW_PREFIX}/bin
rootsbindir=#{CREW_PREFIX}/bin
EOF
@@ -207,10 +89,36 @@ class Glibc_standalone < Package
system build_env.transform_keys(&:to_s), '../configure', *config_opts
system "make PARALLELMFLAGS='-j #{CREW_NPROC}'"
end
# compile crew-audit with system's glibc version, as we want it to work on system's glibc also
system "cc #{CREW_COMMON_FLAGS.sub(/-L[^\s]+/, '')} #{cc_macro_list.join(' ')} -shared crew-audit.c -o crew-audit.so", chdir: 'crew-package-glibc'
end
def self.install
system 'make', "DESTDIR=#{CREW_DEST_DIR}", 'install', chdir: 'builddir'
system "make -j1 DESTDIR=#{CREW_DEST_DIR} localedata/install-locales || make -j1 DESTDIR=#{CREW_DEST_DIR} localedata/install-locales", chdir: 'builddir'
FileUtils.mkdir_p %W[#{CREW_DEST_PREFIX}/etc/env.d #{CREW_DEST_PREFIX}/etc/ld.so.conf.d]
system "make DESTDIR=#{CREW_DEST_DIR} install", chdir: 'builddir'
system "make DESTDIR=#{CREW_DEST_DIR} localedata/install-locales", chdir: 'builddir'
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
# install crew-audit
FileUtils.install 'crew-package-glibc/crew-audit.so', File.join(CREW_DEST_DIR, CREW_GLIBC_PREFIX, 'crew-audit.so'), mode: 0o755
File.write "#{CREW_DEST_PREFIX}/etc/env.d/10-glibc", "LD_AUDIT=#{File.join(CREW_GLIBC_PREFIX, 'crew-audit.so')}\n"
end
def self.postinstall
# update search cache for ld.so
puts 'Updating ld.so cache...'.lightblue
system "#{CREW_PREFIX}/bin/ldconfig"
end
end

View File

@@ -3,7 +3,7 @@ require 'package'
class Hello_world_chromebrew < Package
description 'Chromebrew Package Build Test (for use in PR Actions)'
homepage 'https://github.com/chromebrew/chromebrew'
version '1.1'
version '1.2'
license 'MIT' # Package license (eg. GPL-3, MIT, etc.)
compatibility 'all' # Package architecture compatibility (eg. aarch64, armv7l, i686, x86_64 or all)
source_url 'https://github.com/chromebrew/chromebrew/raw/master/tools/hello_world_chromebrew.c'
@@ -13,19 +13,18 @@ class Hello_world_chromebrew < Package
# These are needed to successfully build and check for dependencies.
binary_sha256({
aarch64: '827f9794864aa76f4c99fd31f989077f1fa65771386f73db30a7681842f8736d',
armv7l: '827f9794864aa76f4c99fd31f989077f1fa65771386f73db30a7681842f8736d',
i686: 'ff0942c505b04982fed187bcda123adead37b3ac2dcfd7e2f0543ca179e81df6',
x86_64: '3081f1f25950c91f75db41095b644a2783987a3a7ef2832fc2b85bf138bb006f'
aarch64: 'd2fb648b2f41ea10f851fc66602a15e595866a7e0b6cd999969e038a3af74bc1',
armv7l: 'd2fb648b2f41ea10f851fc66602a15e595866a7e0b6cd999969e038a3af74bc1',
i686: '9303a26a1a3c9ad93edf874da13148ccd823e9c5f4739ca8675d141065eac9ab',
x86_64: '486eac7f7f9cbc5010d667c7bdd3991c4da6ef79040afc68775cbe7f0ee6a167'
})
# Register dependencies (use the following line as a basis)
#
# Runtime dependencies:
# depends_on '*' # R
# Build dependencies:
# depends_on '*' => :build
#
# Function to perform patch operations prior to build from source.
def self.patch
@@ -37,7 +36,7 @@ class Hello_world_chromebrew < Package
# Function to perform build from source.
def self.build
system 'gcc -o hello hello_world_chromebrew.c'
system "gcc #{CREW_COMMON_FLAGS} #{CREW_LINKER_FLAGS} -o hello hello_world_chromebrew.c"
end
# Function to perform check from source build.

View File

@@ -40,7 +40,7 @@ class Perl < Package
-Dvendorarch=#{CREW_LIB_PREFIX}/perl5/#{version}/vendor_perl \
-Dcc=#{CREW_TARGET}-gcc \
-Doptimize='#{CREW_COMMON_FLAGS}' \
-Dlldlflags='-shared #{CREW_LDFLAGS}' -Dldflags='#{CREW_LDFLAGS}' \
-Dlldlflags='-shared #{CREW_LINKER_FLAGS}' -Dldflags='#{CREW_LINKER_FLAGS}' \
-Dusethreads \
-Dinstallusrbinperl=n \
-Duseshrplib -Dman1dir=#{CREW_MAN_PREFIX}/man1 -Dman3dir=#{CREW_MAN_PREFIX}/man3"

View File

@@ -67,7 +67,7 @@ class Pipewire < Meson
system "#{CREW_PREFIX}/bin/update-ca-certificates --fresh --certsconf #{CREW_PREFIX}/etc/ca-certificates.conf"
end
pre_meson_options "LDFLAGS='#{CREW_LDFLAGS} -pthread'"
pre_meson_options "LDFLAGS='#{CREW_LINKER_FLAGS} -pthread'"
meson_options "-Dbluez5-backend-hsphfpd=disabled \
-Dbluez5-backend-ofono=disabled \
-Dbluez5=disabled \

View File

@@ -24,7 +24,7 @@ class Samurai < Package
end
def self.build
system "make CFLAGS='#{CREW_COMMON_FLAGS}' LDFLAGS='#{CREW_LDFLAGS}'"
system "make CFLAGS='#{CREW_COMMON_FLAGS}' LDFLAGS='#{CREW_LINKER_FLAGS}'"
end
def self.install