DevOps diário: criando gcc 9.3.1 para CentOS 8

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: 





  1. Conservador: diga aos desenvolvedores "desculpe, não pude fazer isso" e desabilite as ferramentas nvptx. 





  1. : ,  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) . , : 





  1. :  mock      i686, (nvptx, , ). 





  1. : , 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),  . 





-, ? 








All Articles