Severstal hat große Unternehmenssysteme wie SAP oder QMET implementiert, aber es gibt auch viele verschiedene Aufgaben, die unsere eigene Entwicklung abdeckt, und die Aufgaben dieser Entwicklung sind selten einfach. Dies bedeutet, dass die Anforderungen an Entwicklungswerkzeuge sehr spezifisch sind. Was ist, wenn Ihre Entwickler gcc-9 unter CentOS benötigen und es sich nicht in den öffentlichen Repositorys befindet? Krempeln Sie die Ärmel hoch und stellen Sie natürlich die gewünschten Taschen her. Diese Aufgabe sieht aber nur auf den ersten Blick einfach aus.
Wenn Sie sich fragen, welche Rechen auf dem Weg zum Ersetzen des System-Compilers ausgelegt sind und wie wir damit umgegangen sind, sind Sie bei cat willkommen.
Stufe 1. Die eigentliche Montage von gcc
Hier scheint alles einfach zu sein: Nehmen Sie gcc.spec aus dem Paket gcc-8.3.1, ändern Sie 8 in 9, führen Sie rpmbuild –bb aus, wie lange warten wir? Ja aber nein. Zunächst müssen Sie alle Patches überarbeiten und korrigieren und gleichzeitig binutils frischer installieren, da dies nicht schwierig ist. Dann ändern wir nicht nur den Compiler, sondern geben uns weitere nvptx-Tools. Wenn der Build beendet ist und der Test beginnt, hängen die Tests in libgomp, die mit dem Entladen des Codes verbunden sind, hängen und bleiben hängen verschiedene seltsame Positionen ...
Hier kann es zwei Lösungen geben:
Konservativ: Sagen Sie den Entwicklern "Entschuldigung, ich konnte es nicht tun" und deaktivieren Sie 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), .
-, ?