Severstal a implémenté de grands systèmes d'entreprise tels que SAP ou QMET, mais il existe également de nombreuses tâches différentes couvertes par notre propre développement, et les tâches de ce développement sont rarement simples. Cela signifie que les exigences pour les outils de développement sont assez spécifiques. Que faire si vos développeurs ont besoin de gcc-9 sur CentOS et qu'il ne se trouve pas dans les référentiels publics? Retroussez vos manches et créez les sacs nécessaires, bien sûr. Mais cette tâche ne semble simple qu'à première vue.
Si vous vous demandez quels râteaux sont prévus pour remplacer le compilateur système et comment nous les avons traités, bienvenue dans cat.
Étape 1. L'assemblage proprement dit de gcc
Il semblerait que tout soit simple ici: prendre gcc.spec du paquet gcc-8.3.1, changer 8 en 9, lancer rpmbuild –bb, combien de temps attendons-nous? Oui mais non. Pour commencer, vous devrez réviser et corriger tous les correctifs, et en même temps également installer des binutils plus frais, car ce n'est pas difficile. Ensuite, nous ne changeons pas simplement le compilateur, nous nous donnons quelques outils nvptx supplémentaires, ce qui signifie que lorsque la construction est terminée et que les tests commencent, les tests dans libgomp, liés au déchargement du code, commenceront à se bloquer et à rester bloqués. diverses positions étranges ...
Il peut y avoir deux solutions ici:
Conservateur: dites aux développeurs "désolé, je n'ai pas pu le faire" et désactivez 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), .
-, ?