Files
chromebrew/lib/musl.rb
2024-02-11 01:10:30 -06:00

110 lines
5.3 KiB
Ruby

ENV['CREW_DISABLE_ENV_OPTIONS'] = '1'
warn_level = $VERBOSE
$VERBOSE = nil
load "#{CREW_LIB_PATH}/lib/const.rb"
# Defines common musl build constants used in musl builds
MUSL_ARCH_SSP_CFLAGS = ''
MUSL_ARCH_C_FLAGS = ''
MUSL_ARCH_CXX_FLAGS = ''
case ARCH
when 'i686', 'x86_64'
MUSL_ABI = ''
MUSL_ARCH = ARCH
when 'aarch64', 'armv7l'
MUSL_ABI = 'eabihf'
MUSL_ARCH = 'armhf'
end
MUSL_CFLAGS = "-isysroot=#{CREW_MUSL_PREFIX} -B#{CREW_MUSL_PREFIX}/include -flto -pipe -O2 -ffat-lto-objects -fipa-pta -fno-semantic-interposition -fdevirtualize-at-ltrans #{MUSL_ARCH_C_FLAGS} #{MUSL_ARCH_SSP_CFLAGS} -fcommon -fPIC -ffunction-sections -fdata-sections"
MUSL_CXXFLAGS = "-isysroot=#{CREW_MUSL_PREFIX} -B#{CREW_MUSL_PREFIX}/include -flto -pipe -O2 -ffat-lto-objects -fipa-pta -fno-semantic-interposition -fdevirtualize-at-ltrans #{MUSL_ARCH_CXX_FLAGS} #{MUSL_ARCH_SSP_CFLAGS} -fcommon -fPIC -ffunction-sections -fdata-sections"
# Setting -static & -flto in CMAKE LDFLAGS breaks builds
MUSL_CMAKE_LDFLAGS = '-flto'
if @pkg.is_static?
MUSL_LDFLAGS = "-L#{CREW_MUSL_PREFIX}/lib -Wl,-rpath=#{CREW_MUSL_PREFIX}/lib -Wl,--enable-new-dtags -Wl,--gc-sections -flto -isysroot=#{CREW_MUSL_PREFIX} -static --static"
MUSL_PKG_CONFIG = 'pkg-config --static'
else
MUSL_LDFLAGS = "-L#{CREW_MUSL_PREFIX}/lib -Wl,-rpath=#{CREW_MUSL_PREFIX}/lib -Wl,--enable-new-dtags -Wl,--dynamic-linker,#{CREW_MUSL_PREFIX}/lib/libc.so -Wl,--gc-sections -flto -isysroot=#{CREW_MUSL_PREFIX} "
MUSL_PKG_CONFIG = 'pkg-config'
end
MUSL_ENV_OPTIONS = "PATH=#{CREW_MUSL_PREFIX}/bin:#{ENV.fetch('PATH', nil)} \
CC='#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-gcc' \
CXX='#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-g++' \
LD='#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-ld.gold -L#{CREW_MUSL_PREFIX}/lib' \
AR=#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-ar \
LIBRARY_PATH=#{CREW_MUSL_PREFIX}/lib \
MUSL_PKG_CONFIG='#{MUSL_PKG_CONFIG}' \
PKG_CONFIG_LIBDIR=#{CREW_MUSL_PREFIX}/lib/pkgconfig \
CFLAGS='#{MUSL_CFLAGS}' \
CXXFLAGS='#{MUSL_CXXFLAGS}' \
CPPFLAGS='-I#{CREW_MUSL_PREFIX}/include -fcommon -idirafter#{CREW_PREFIX}/include' \
LDFLAGS='#{MUSL_LDFLAGS}'"
MUSL_CMAKE_OPTIONS = "PATH=#{CREW_MUSL_PREFIX}/bin:#{CREW_MUSL_PREFIX}/#{ARCH}-linux-musl#{MUSL_ABI}/bin:#{ENV.fetch('PATH', nil)} \
CC='#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-gcc' \
CXX='#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-g++' \
LD=#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-ld.gold \
AR=#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-ar \
MUSL_PKG_CONFIG='#{MUSL_PKG_CONFIG}' \
PKG_CONFIG_LIBDIR=#{CREW_MUSL_PREFIX}/lib/pkgconfig \
CFLAGS='#{MUSL_CFLAGS}' \
CXXFLAGS='#{MUSL_CXXFLAGS}' \
CPPFLAGS='-I#{CREW_MUSL_PREFIX}/include -fcommon -idirafter#{CREW_PREFIX}/include' \
LDFLAGS='#{MUSL_CMAKE_LDFLAGS}' \
cmake \
-DCMAKE_INSTALL_PREFIX='#{CREW_MUSL_PREFIX}' \
-DCMAKE_INSTALL_LIBDIR='#{CREW_MUSL_PREFIX}/lib' \
-DCMAKE_LIBRARY_PATH='#{CREW_MUSL_PREFIX}/lib' \
-DCMAKE_C_COMPILER=#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-gcc \
-DCMAKE_CXX_COMPILER=#{CREW_MUSL_PREFIX}/bin/#{ARCH}-linux-musl#{MUSL_ABI}-g++ \
-DCMAKE_INCLUDE_DIRECTORIES_BEFORE=ON \
-DINCLUDE_DIRECTORIES=#{CREW_MUSL_PREFIX}/include \
-DCMAKE_C_FLAGS='#{MUSL_CFLAGS}' \
-DCMAKE_CXX_FLAGS='#{MUSL_CXXFLAGS}' \
-DCMAKE_EXE_LINKER_FLAGS='#{MUSL_CMAKE_LDFLAGS}' \
-DCMAKE_SHARED_LINKER_FLAGS='#{MUSL_CMAKE_LDFLAGS}' \
-DCMAKE_STATIC_LINKER_FLAGS='#{MUSL_CMAKE_LDFLAGS}' \
-DCMAKE_MODULE_LINKER_FLAGS='#{MUSL_CMAKE_LDFLAGS}' \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE \
-DCMAKE_BUILD_TYPE=Release"
MUSL_MESON_OPTIONS = <<~OPT.chomp
-Dprefix=#{CREW_MUSL_PREFIX} \
-Dlibdir=#{CREW_MUSL_PREFIX}/lib \
-Dmandir=../man \
-Dbuildtype=release \
-Db_lto=true \
-Dstrip=true \
-Db_pie=true \
-Dcpp_args='-O2' \
-Dc_args='-O2'
OPT
$VERBOSE = warn_level
class Musl
class << self
def patchelf
puts 'Running Musl.patchelf'.lightblue
abort('No Patchelf found!').lightred unless File.exist?("#{CREW_PREFIX}/bin/patchelf")
execfiles = `find . -executable -type f ! \\( -name \"*.a\" \\) -exec sh -c \"file -i \'{}\' | grep -q \'executable; charset=binary\'\" \\; -exec ls -1i {} \\; | sort -u -n -s -k1,1 | awk '{print $2}'`.chomp
return if execfiles.to_s.empty?
puts 'Running patchelf to patch binaries for musl paths'.lightblue
execfiles.each_line(chomp: true) do |execfiletopatch|
execfiletopatch = Dir.pwd + execfiletopatch.delete_prefix('.')
system "patchelf --set-interpreter #{CREW_MUSL_PREFIX}/lib/libc.so #{execfiletopatch}"
system "patchelf --set-rpath #{CREW_MUSL_PREFIX}/lib #{execfiletopatch}"
neededlibs = `patchelf --print-needed #{execfiletopatch}`
next if neededlibs.to_s.empty?
neededlibs.each_line(chomp: true) do |neededlibspatch|
next if neededlibspatch.include?("#{CREW_MUSL_PREFIX}/lib")
neededlibspatchednamepath = "#{CREW_MUSL_PREFIX}/lib/" + File.basename(neededlibspatch)
puts "patchelf --replace-needed #{neededlibspatch} #{neededlibspatchednamepath} #{execfiletopatch}"
system "patchelf --replace-needed #{neededlibspatch} #{neededlibspatchednamepath} #{execfiletopatch}"
end
end
end
end
end