ruby3.2/ruby3.2.spec

508 lines
15 KiB
RPMSpec

#
# spec file
#
# Copyright (c) 2022 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%ifarch x86_64 aarch64
%bcond_with yjit
%else
%bcond_with yjit
%endif
%global flavor @BUILD_FLAVOR@%{nil}
%if "%{flavor}" == "testsuite"
%define psuffix -testsuite
%else
%define psuffix %{nil}
%endif
####
#!!!
#!!! when updating, check versions of embedded rubygems in package stdlib below
#!!!
####
%global patch_level p0
Name: ruby3.2%{psuffix}
Version: 3.2.1
Release: 0
%global pkg_version %{version}
# make the exported API version explicit
%global api_version 3.2.0
%global rb_binary_suffix .ruby3.2
%global rb_soname ruby3.2
%global _rb_ua_weight 32
# ruby-macros and ruby-common version
%global rpm_macros_version 3
#
%define libname libruby3_2-3_2
# keep in sync with macro file!
%global rb_ver %{api_version}
%global rb_arch %(echo %{_target_cpu}-linux-gnu | sed -e "s/ppc/powerpc/")
%global rb_arch_short %(echo %{_target_cpu}-linux-gnu | sed -e "s/ppc/powerpc/ ; s/i[0-9]86/x86/")
%global rb_libdir %{_libdir}/ruby/%{rb_ver}/
%global rb_archdir %{_libdir}/ruby/%{rb_ver}/%{rb_arch}
%global rb_extdir %{_libdir}/ruby/gems/%{rb_ver}/extensions/
%global rb_extarchdir %{_libdir}/ruby/gems/%{rb_ver}/extensions/%{rb_arch_short}/
%global rb_extversionedarchdir %{_libdir}/ruby/gems/%{rb_ver}/extensions/%{rb_arch_short}/%{rb_ver}
%global rb_extdocdir %{_libdir}/ruby/gems/%{rb_ver}/doc/extensions
%global rb_extarchdocdir %{_libdir}/ruby/gems/%{rb_ver}/doc/extensions/%{rb_arch_short}
%global rb_include_dir %{_includedir}/ruby-%{api_version}
%if "%{rb_default_ruby_suffix}" == "%{rb_soname}"
%global is_default_ruby 1
%global rb_ua_weight 1%{_rb_ua_weight}
%else
%global rb_ua_weight %{_rb_ua_weight}
%endif
%define ua_binaries bundle bundler racc rake rbs rdoc ri typeprof rdbg
# keep in sync with macro file!
#
# from valgrind.spec
%ifarch %ix86 aarch64 x86_64 ppc64le s390x
%define use_valgrind 1
%endif
%bcond_without build_docs
%if 0%{?suse_version} >= 1500
%bcond_with jemalloc
%else
%bcond_with jemalloc
%endif
%bcond_with clang
%bcond_with separate_stdlib
%bcond_with system_ruby
#
URL: https://www.ruby-lang.org/
Source: https://cache.ruby-lang.org/pub/ruby/3.2/ruby-%{pkg_version}.tar.xz
Source3: %{rb_soname}.macros
Source4: %{rb_soname}-default.macros
Source5: vendor.tar.xz
Source6: cargo_config
Source98: series
Source99: %{rb_soname}-rpmlintrc
Patch: use-pie.patch
BuildRequires: ruby-bundled-gems-rpmhelper
%if %{with clang}
BuildRequires: clang
BuildRequires: lld
BuildRequires: llvm-devel
%endif
BuildRequires: gmp-devel
%if %{with jemalloc}
BuildRequires: jemalloc-devel
%endif
BuildRequires: autoconf
BuildRequires: libffi-devel
BuildRequires: libyaml-devel
BuildRequires: ncurses-devel
BuildRequires: openssl-devel
BuildRequires: pkg-config
BuildRequires: update-alternatives
%if "%{flavor}" == "testsuite"
#!BuildIgnore: ruby
#!BuildIgnore: ruby-common
BuildRequires: %{rb_soname}
BuildRequires: netcfg
BuildRequires: procps
BuildRequires: timezone
%endif
%if %{with yjit}
BuildRequires: cargo >= 1.56.0
BuildRequires: rust >= 1.56.0
%endif
%if %{with system_ruby}
BuildRequires: ruby
%endif
BuildRequires: readline-devel
BuildRequires: zlib-devel
%if 0%{?use_valgrind}
%if 0%{?suse_version} < 1550
BuildRequires: valgrind-devel
%else
BuildRequires: valgrind-client-headers
%endif
%endif
BuildRequires: xz
Provides: ruby(abi) = %{rb_ver}
Conflicts: ruby(abi) = %{rb_ver}
Provides: ruby32 = %{version}-%{release}
%if 0%{?is_default_ruby}
Provides: ruby-default = %{version}-%{release}
Conflicts: otherproviders(ruby-default)
%endif
Requires: %{libname} = %{version}
%if %{with separate_stdlib}
Requires: %{name}-stdlib = %{version}
%else
Provides: %{name}-stdlib = %{version}-%{release}
Obsoletes: %{name}-stdlib < %{version}-%{release}
%endif
PreReq: update-alternatives
Requires: ruby-common >= 3.2
Summary: An Interpreted Object-Oriented Scripting Language
License: BSD-2-Clause OR Ruby
Group: Development/Languages/Ruby
%description
Ruby is an interpreted scripting language for object-oriented programming. It
has many features for processing text files and performing system management
tasks (as in Perl). It is extensible.
* Ruby features:
- Simple Syntax
- *Normal* Object-Oriented features (class, method calls, for
example)
- *Advanced* Object-Oriented features(Mix-in, Singleton-method, for
example)
- Operator Overloading
- Exception Handling
- Iterators and Closures
- Garbage Collection
- Dynamic Loading of Object Files (on some architectures)
%package -n %{libname}
Summary: Dynamic runtime library for Ruby
# Both ruby and ruby-stdlib now depend explicitly on libruby by version,
# however it was not always the case, so the conflicts statements below
# are needed to handle updates.
Group: System/Libraries
Conflicts: %{name} < %{version}-%{release}
Conflicts: %{name}-stdlib < %{version}-%{release}
%description -n %{libname}
Dynamic runtime library for Ruby
%package doc
Summary: Documentation and samples for Ruby
Group: Development/Languages/Ruby
%description doc
Documentation and samples for Ruby
%if %{with separate_stdlib}
%package stdlib
Summary: The Ruby standard library
Group: Development/Languages/Ruby
Provides: ruby-stdlib = %{version}-%{release}
Requires: %{libname} = %{version}
%description stdlib
The Ruby standard library
%endif
%package devel
Summary: Development files to link against Ruby
Group: Development/Languages/Ruby
Requires: %{name} = %{version}
Provides: rubygems = 3.2.22
Provides: rubygems_with_buildroot_patch
%if %{with jemalloc}
Requires: jemalloc-devel
%endif
%description devel
Development files to link against Ruby.
%package devel-extra
Summary: Special development files of ruby, normally not installed
Group: Development/Languages/Ruby
Requires: %{name}-devel = %{version}
%description devel-extra
Development files to link against Ruby.
%package doc-ri
Summary: Ruby Interactive Documentation
Group: Development/Languages/Ruby
Requires: %{name} = %{version}
BuildArch: noarch
%description doc-ri
This package contains the RI docs for ruby
%package doc-html
Summary: This package contains the HTML docs for ruby
Group: Development/Languages/Ruby
Requires: %{name} = %{version}
BuildArch: noarch
%description doc-html
This package contains the HTML docs for ruby
%package examples
Summary: Example scripts for ruby
Group: Development/Languages/Ruby
Requires: %{name} = %{version}
BuildArch: noarch
%description examples
Example scripts for ruby
%package test-suite
Summary: An Interpreted Object-Oriented Scripting Language
Group: Development/Languages/Ruby
Requires: %{name} = %{version}
BuildArch: noarch
%description test-suite
Ruby is an interpreted scripting language for object-oriented programming. It
has many features for processing text files and performing system management
tasks (as in Perl). It is extensible.
* Ruby features:
- Simple Syntax
- *Normal* Object-Oriented features (class, method calls, for
example)
- *Advanced* Object-Oriented features(Mix-in, Singleton-method, for
example)
- Operator Overloading
- Exception Handling
- Iterators and Closures
- Garbage Collection
- Dynamic Loading of Object Files (on some architectures)
%prep
%autosetup -p1 -n ruby-%{pkg_version}
pushd yjit
tar xf %{SOURCE5}
install -m 0644 -D %{SOURCE6} .cargo/config
popd
find sample -type f -perm /a=x -ls -exec chmod a-x \{\} \+
# replace "/usr/bin/env ruby" and "/usr/local/bin/ruby" with correct path
grep -Erl '^#! */.*ruby' benchmark bootstraptest ext lib sample test \
| xargs -r perl -p -i -e 's|^#!\s*\S+\s*ruby\S*(\s+.*)?$|#!/usr/bin/ruby%{rb_binary_suffix} $1|'
%build
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
%if %{with clang}
export CC="clang"
export CXX="clang++"
export LD="lld"
%endif
# iseq.c needs -fno-strict-aliasing
export CFLAGS="%{optflags} -fno-strict-aliasing -std=gnu99"
%configure \
--with-baseruby=%{_bindir}/ruby \
%if %{with yjit}
--enable-yjit \
%endif
%if %{with jemalloc}
--with-jemalloc \
%endif
--enable-pie \
%if 0%{?suse_version} >= 1550
--with-compress-debug-sections=none \
%endif
--program-suffix="%{rb_binary_suffix}" \
--with-soname=%{rb_soname} \
--target=%{_target_platform} \
%if 0%{?use_valgrind}
--with-valgrind \
%endif
%if %{without build_docs}
--disable-install-doc \
--disable-install-rdoc \
--disable-install-capi \
%endif
--with-mantype=man \
--enable-shared \
--disable-static \
--disable-rpath
make %{?_smp_mflags} all V=1 STRIP=/bin/true
%install
%if "%{flavor}" != "testsuite"
%make_install V=1 STRIP=/bin/true
perl -p -i -e 's|#!/usr/local/bin/ruby|%{_bindir}/ruby|g' $(grep -r -l /usr/local/bin/ruby %{buildroot})
echo "%defattr(-,root,root,-)" > devel-extra-excludes
echo "%defattr(-,root,root,-)" > devel-extra-list
install -D -d -m 0755 %{buildroot}%{rb_include_dir}
for i in iseq.h insns.inc insns_info.inc revision.h version.h thread_pthread.h \
ruby_atomic.h method.h internal.h id.h vm_core.h vm_opts.h node.h eval_intern.h vm_debug.h; do
install -m 644 $i %{buildroot}%{rb_include_dir}/
echo "%exclude %{rb_include_dir}/$i" >> devel-extra-excludes
echo "%{rb_include_dir}/$i" >> devel-extra-list
done
# Create gem native extensions dir
# use shell scripting here as we're executing the just installed binary
%define rb_binary %{buildroot}%{_bindir}/ruby -I %{buildroot}%{rb_libdir} -I %{buildroot}%{rb_archdir}
export LD_LIBRARY_PATH=%{buildroot}%{_libdir}
install -D -m 0644 %{SOURCE3} %{buildroot}%{_rpmmacrodir}/macros.suse-ruby3.2
mkdir -p %{buildroot}%{_sysconfdir}/alternatives
%if 0%{?is_default_ruby}
install -D -m 0644 %{SOURCE4} %{buildroot}%{_rpmmacrodir}/macros.suse-ruby3.2-default
for bin in %{buildroot}%{_bindir}/{erb,gem,irb,ruby}%{rb_binary_suffix} ; do
# yes really hard links
ln $bin ${bin%%%{rb_binary_suffix}}
done
for man in %{buildroot}%{_mandir}/man1/*%{rb_binary_suffix}.1* ; do
# yes really hard links
# TODO: this is dangerous as we cant anc
ln $man ${man%%%{rb_binary_suffix}.1}.1
done
ln -s lib%{rb_soname}.so %{buildroot}%{_libdir}/libruby.so
%endif
for bin in %{ua_binaries}; do
# dummy
mv %{buildroot}%_bindir/${bin}%{rb_binary_suffix} %{buildroot}%_bindir/$bin.ruby%{rb_binary_suffix}
#
ln -s %{_sysconfdir}/alternatives/$bin %{buildroot}%_bindir/$bin
#
ln -s %{_sysconfdir}/alternatives/$bin%{rb_binary_suffix} %{buildroot}%_bindir/$bin%{rb_binary_suffix}
done
install -dD %{buildroot}%{rb_extdir} %{buildroot}%{rb_extarchdir} %{buildroot}%{rb_extversionedarchdir} %{buildroot}%{rb_extarchdocdir}
chmod -R go-w,go+rX %{buildroot}%{_libdir}/ruby
# keep in sync with ruby-common/gem_build_cleanup
find %{buildroot} \
\( -name \*.o -o -name Makefile -o -name config.log -o -name config.status -o -name Makefile.html -o -name gem_make.out -o -name mkmf.log -o -name \*.bak -o -name .deps -o -name .libs -o -name CVS \) \
-print0 | xargs -r0 rm -rv || :
# remove more strict in the docu
find %{buildroot}/doc \( -name Makefile.ri -o -name ext -o -name page\*.ri \) -print0 | xargs -r0 rm -rv || :
find %{buildroot} -type d -name '.gem.*' -print0 | xargs -r0 rm -rv || :
find %{buildroot} -type f -name \*.pem -delete
%post
for bin in %{ua_binaries}; do
%{_sbindir}/update-alternatives --install \
%{_bindir}/$bin $bin %{_bindir}/$bin.ruby%{rb_binary_suffix} %{rb_ua_weight}
%{_sbindir}/update-alternatives --install \
%{_bindir}/$bin%{rb_binary_suffix} $bin%{rb_binary_suffix} %{_bindir}/$bin.ruby%{rb_binary_suffix} %{rb_ua_weight}
done
%preun
if [ "$1" = 0 ] ; then
for bin in %{ua_binaries}; do
%{_sbindir}/update-alternatives --remove $bin %{_bindir}/$bin.ruby%{rb_binary_suffix}
%{_sbindir}/update-alternatives --remove $bin%{rb_binary_suffix} %{_bindir}/$bin.ruby%{rb_binary_suffix}
done
fi
%post -n %{libname} -p /sbin/ldconfig
%postun -n %{libname} -p /sbin/ldconfig
%endif
%if "%{flavor}" == "testsuite"
%check
DISABLE_TESTS=""
# Allow MD5 in OpenSSL.
# https://bugs.ruby-lang.org/issues/9154
export OPENSSL_ENABLE_MD5_VERIFY=1
export LD_LIBRARY_PATH="$PWD"
export PATH=%{buildroot}%{_bindir}:$PATH
make test test-tool test-all V=1 TESTOPTS="%{?_smp_mflags} -q --tty=no $DISABLE_TESTS" TESTS="-x test_rinda -x test_address_resolve -x test_tcp -x test_gem_installer -x test_readline -x test_reline"
%else
%files
%ghost %{_sysconfdir}/alternatives/bundle
%ghost %{_sysconfdir}/alternatives/bundle%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/bundler
%ghost %{_sysconfdir}/alternatives/bundler%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/erb*
%ghost %{_sysconfdir}/alternatives/racc
%ghost %{_sysconfdir}/alternatives/racc%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/rake
%ghost %{_sysconfdir}/alternatives/rake%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/rbs
%ghost %{_sysconfdir}/alternatives/rbs%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/rdbg
%ghost %{_sysconfdir}/alternatives/rdbg%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/rdoc
%ghost %{_sysconfdir}/alternatives/rdoc%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/ri
%ghost %{_sysconfdir}/alternatives/ri%{rb_binary_suffix}
%ghost %{_sysconfdir}/alternatives/typeprof
%ghost %{_sysconfdir}/alternatives/typeprof%{rb_binary_suffix}
%{_bindir}/bundle*
%{_bindir}/erb*
%{_bindir}/gem*
%{_bindir}/rdbg*
%{_bindir}/irb*
%{_bindir}/rake*
%{_bindir}/rdoc*
%{_bindir}/rbs*
%{_bindir}/ri*
%{_bindir}/ruby*
%{_bindir}/racc*
%{_bindir}/typeprof*
%{_mandir}/man1/irb*.1%{?ext_man}
%{_mandir}/man1/erb*.1%{?ext_man}
#{_mandir}/man1/rake*.1*
%{_mandir}/man1/ri*.1%{?ext_man}
%{_mandir}/man1/ruby*.1%{?ext_man}
%doc ChangeLog KNOWNBUGS.rb NEWS.md README.EXT README.EXT.ja README.ja.md README.md CONTRIBUTING.md
%license COPYING COPYING.ja GPL LEGAL BSDL
%{_rpmmacrodir}/macros.suse-ruby3.2*
%if %{with separate_stdlib}
%files stdlib
%endif
%{_libdir}/ruby/
%dir %{rb_extdir}
%dir %{rb_extarchdir}
%dir %{rb_extversionedarchdir}
%dir %{rb_extdocdir}
%dir %{rb_extarchdocdir}
%files -n %{libname}
%{_libdir}/libruby*.so.*
%files devel -f devel-extra-excludes
%{rb_include_dir}/
%{_libdir}/libruby*.so
%{_libdir}/pkgconfig/ruby-3.2.pc
%files devel-extra -f devel-extra-list
%if %{with build_docs}
%files doc
%doc doc/* sample/
%files doc-ri
%dir %{_datadir}/ri/
%{_datadir}/ri/%{rb_ver}/
%endif
%endif
%changelog