Severstal telah menerapkan sistem perusahaan besar seperti SAP atau QMET, tetapi ada juga banyak tugas berbeda yang tercakup dalam pengembangan kami sendiri, dan tugas pengembangan ini jarang sederhana. Ini berarti bahwa persyaratan alat pengembangan cukup spesifik. Bagaimana jika developer Anda membutuhkan gcc-9 di CentOS dan tidak ada di repositori publik? Gulung lengan baju Anda dan buat tas yang dibutuhkan, tentunya. Tetapi tugas ini terlihat sederhana hanya pada pandangan pertama.
Jika Anda bertanya-tanya garu apa yang diletakkan dalam cara mengganti compiler sistem, dan bagaimana kami menanganinya, selamat datang di cat.
Tahap 1. Perakitan gcc yang sebenarnya
Tampaknya semuanya sederhana di sini: ambil gcc.spec dari paket gcc-8.3.1, ubah 8 menjadi 9, jalankan rpmbuild βbb, berapa lama kita menunggu? Ya, tapi tidak. Untuk memulainya, Anda harus merevisi dan memperbaiki semua tambalan, dan pada saat yang sama juga menginstal binutils lebih baru, karena ini tidak sulit. Kemudian, kami tidak hanya mengubah kompiler, memberi kami beberapa alat nvptx lagi, yang berarti bahwa ketika build selesai dan pengujian dimulai, pengujian di libgomp, yang terkait dengan pembongkaran kode, akan mulai hang dan macet berbagai posisi aneh ...
Ada dua solusi di sini:
Konservatif: beri tahu pengembang "maaf, saya tidak bisa melakukannya" dan nonaktifkan nvptx-tools.
: , nvptx , rpmbuild, . tests failed , .
Stage 2. Package libgcc.i686 has inferior architecture
, gcc-9.3.1-3.el8.x86_64.rpm, gcc-offload-nvptx-9.3.1-3.el8.x86_64.rpm .. .. , , /etc/yum.repos.d, dnf update β¦ , , ? . , 64- Debian RedHat x86 32- ( , multilib), multilib 32- , (libgcc.i686, libgfortran.i686, libgomp.i686, libquadmath.i686 libstdc++.i686) . , :
: mock i686, (nvptx, , ).
: , 32- 64-, . gcc.spec , . gcc.spec libgcc-i686.spec, %build, %install :
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
tar cf - -C %{_buildrootdir}/%{name}-%{version}-%{release}.x86_64 usr | tar xf - -C %{buildroot}
FULLPATH=%{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}
FULLEPATH=%{buildroot}%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_major}
# fix some things
mkdir -p %{buildroot}/%{_lib}
mv -f %{buildroot}%{_prefix}/%{_lib}/libgcc_s.so.1 %{buildroot}/%{_lib}/libgcc_s-%{gcc_major}-%{DATE}.so.1
chmod 755 %{buildroot}/%{_lib}/libgcc_s-%{gcc_major}-%{DATE}.so.1
ln -sf libgcc_s-%{gcc_major}-%{DATE}.so.1 %{buildroot}/%{_lib}/libgcc_s.so.1
mkdir -p %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}
mv -f %{buildroot}%{_prefix}/%{_lib}/libstdc++*gdb.py* \
%{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/
pushd %{name}-%{version}-%{DATE}/libstdc++-v3/python
for i in `find . -name \*.py`; do
touch -r $i %{buildroot}%{_prefix}/share/gcc-%{gcc_major}/python/$i
done
touch -r hook.in %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/libstdc++*gdb.py
popd
for f in `find %{buildroot}%{_prefix}/share/gcc-%{gcc_major}/python/ \
%{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/ -name \*.py`; do
r=${f/$RPM_BUILD_ROOT/}
%{__python3} -c 'import py_compile; py_compile.compile("'$f'", dfile="'$r'")'
%{__python3} -O -c 'import py_compile; py_compile.compile("'$f'", dfile="'$r'")'
done
rm -rf %{buildroot}%{_prefix}/%{_lib}/%{name}
rpmbuild βbb libgcc-i686.spec - , gcc torture, , 32- ( , $RPM_BUILD_ROOT/RPMS/i686). , , dnf makecache βrepo gcc-9 && dnf update β¦ , .
Stage 3. Annobin libtool
, RHEL CentOS, , gcc annobin. , . annobin.spec , , : , gcc 8.3.1, gcc, gcc < %{gcc_next} gcc <= %{gcc_next}, , gcc, , gcc < %{gcc_next} %undefine _annotated_build β . , _annotated_build , ( ) .
libtool. gcc, , , libtool gcc, gcc gcc-9.
, . , , , ( dnf downgrade gcc), .
-, ?