Severstal implementou grandes sistemas corporativos como SAP ou QMET, mas também há muitas tarefas diferentes que nosso próprio desenvolvimento cobre, e as tarefas desse desenvolvimento raramente são simples. Isso significa que os requisitos para ferramentas de desenvolvimento são bastante específicos. E se seus desenvolvedores precisarem do gcc-9 no CentOS e ele não estiver nos repositórios públicos? Arregace as mangas e crie as malas necessárias, é claro. Mas essa tarefa parece simples apenas à primeira vista.
Se você está se perguntando o que há de errado com a substituição do compilador do sistema e como lidamos com eles, bem-vindo ao cat.
Etapa 1. A montagem real do gcc
Parece que tudo é simples aqui: pegue gcc.spec do pacote gcc-8.3.1, altere 8 para 9, execute rpmbuild –bb, quanto tempo estamos esperando? Sim mas não. Para começar, você terá que revisar e corrigir todos os patches, e ao mesmo tempo instalar binutils fresher, já que não é difícil. Então, não apenas mudamos o compilador, mas nos damos mais algumas ferramentas nvptx, o que significa que quando a construção terminar e o teste começar, os testes em libgomp, vinculados ao descarregamento do código, começarão a travar e ficar presos em várias posições estranhas ...
Pode haver duas soluções aqui:
Conservador: diga aos desenvolvedores "desculpe, não pude fazer isso" e desabilite as ferramentas nvptx.
: , 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), .
-, ?