void-packages/srcpkgs/mruby/template
Jürgen Buchmüller cdd806a989 mruby: build for host with clang
Trying to build for i686 native with gcc, or trying to cross build
with i686 as the host architecture, the build fails. This seems to
be a problem with either i686 gcc or the binutils (linker).

For now build with clang for native and for the host when cross
compiling to work around the problems.

TODO: find the real reason why the compiler or linker packages
for i686 are broken and switch back to using gcc.
2020-06-04 14:33:59 +02:00

133 lines
3.9 KiB
Bash

# Template file for 'mruby'
pkgname=mruby
version=2.1.0
revision=2
hostmakedepends="bison clang ruby"
short_desc="Lightweight implementation of the Ruby language (Ruby 1.9)"
maintainer="Jürgen Buchmüller <pullmoll@t-online.de>"
license="MIT"
homepage="https://mruby.org/"
distfiles="https://github.com/mruby/mruby/archive/${version}.tar.gz>${pkgname}-${version}.tar.gz"
checksum=d6733742a07e553c52ab71df08b0604b3b571768bbc0c2729fbf0389d1bb5d13
lib32disabled=yes
# I cannot get clang to link a PIE executable
nopie=yes
# Note: we use clang to build for the host because with gcc the build fails
# for i686 (native) and also when i686 is the host architecture for cross builds.
LIBS="m"
do_configure() {
vsed -i mrbgems/mruby-compiler/core/parse.y -e "s;%pure-parser;%define api.pure;"
if [ -z "$CROSS_BUILD" ]; then
# Native build
cat <<-EOF > xbps_config.rb
MRuby::Build.new do |conf|
toolchain :clang
conf.gem "#{root}/mrbgems/mruby-bin-mruby"
conf.gem "#{root}/mrbgems/mruby-bin-mrbc"
conf.cc do |cc|
cc.command = 'clang'
cc.flags = [ENV['CFLAGS'] || %w()]
cc.include_paths = ["#{root}/include"]
end
conf.linker do |linker|
linker.command = 'clang'
linker.flags = [ENV['LDFLAGS'] || %w()]
linker.libraries = [ENV['LIBS'] || 'm']
end
conf.archiver do |archiver|
archiver.command = 'ar'
end
end
EOF
else
# Cross build
cat <<-EOF > xbps_config.rb
MRuby::Build.new do |conf|
toolchain :clang
conf.gem "#{root}/mrbgems/mruby-bin-mruby"
conf.gem "#{root}/mrbgems/mruby-bin-mrbc"
conf.cc do |cc|
cc.command = 'clang'
cc.flags = [ENV['CFLAGS_host'] || %w()]
cc.include_paths = ["#{root}/include"]
end
conf.linker do |linker|
linker.command = 'clang'
linker.flags = [ENV['LDFLAGS_host'] || %w()]
linker.libraries = [ENV['LIBS'] || 'm']
end
conf.archiver do |archiver|
archiver.command = 'ar'
end
end
MRuby::CrossBuild.new('${XBPS_CROSS_TRIPLET}') do |conf|
toolchain :gcc
conf.gem "#{root}/mrbgems/mruby-bin-mruby"
conf.gem "#{root}/mrbgems/mruby-bin-mrbc"
conf.cc do |cc|
cc.command = ENV['CC'] || '${XBPS_CROSS_TRIPLET}-gcc'
cc.flags = [ENV['CFLAGS'] || %w()]
cc.include_paths = ["#{root}/include"]
cc.defines = %w()
cc.option_include_path = '-I%s'
cc.option_define = '-D%s'
cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
end
conf.linker do |linker|
linker.command = ENV['CC'] || '${XBPS_CROSS_TRIPLET}-gcc'
linker.flags = [ENV['LDFLAGS'] || %w()]
linker.libraries = [ENV['LIBS'] || 'm']
linker.library_paths = '${XBPS_CROSS_BASE}/usr/lib'
end
conf.archiver do |archiver|
archiver.command = ENV['AR'] || '${XBPS_CROSS_TRIPLET}-ar'
end
end
EOF
fi
}
do_build() {
# Enable verbosity and/or trace
# vsed -i minirake -e '/^$rake_failed/a $verbose = 1'
# vsed -i minirake -e '/^$rake_failed/a $trace = 1'
# Set the number of parallel jobs from $makejobs
vsed -i minirake -e "s;^\(\$rake_jobs =\).*;\1 ${makejobs/-j/};"
# clang does not understand -fstack-clash-protection
CFLAGS="${CFLAGS/-fstack-clash-protection/}"
if [ "$CROSS_BUILD" ]; then
CFLAGS_host="${CFLAGS_host/-fstack-clash-protection/}"
echo "CFLAGS_host : $CFLAGS_host"
echo "LDFLAGS_host : $LDFLAGS_host"
fi
echo "CFLAGS : $CFLAGS"
echo "LDFLAGS : $LDFLAGS"
echo "LIBS : $LIBS"
CFLAGS="$CFLAGS" CFLAGS_host="$CFLAGS_host" \
LDFLAGS="$LDFLAGS" LDFLAGS_host="$LDFLAGS_host" \
LIBS="$LIBS" MRUBY_CONFIG=xbps_config.rb VERBOS=1 \
ruby minirake
}
do_install() {
local _build
if [ "$CROSS_BUILD" ]; then
_build="build/${XBPS_CROSS_TRIPLET}"
else
_build="build/host"
fi
vmkdir usr/bin
vcopy "${_build}/bin/*" usr/bin
vmkdir usr/lib
vcopy "${_build}/lib/*.a" usr/lib
vmkdir usr/include
vcopy "include/*" usr/include
vlicense LICENSE
}