DevOps cotidiano: compilando gcc 9.3.1 para CentOS 8

Severstal ha implementado grandes sistemas corporativos como SAP o QMET, pero también hay muchas tareas diferentes que cubre nuestro propio desarrollo, y las tareas de este desarrollo rara vez son simples. Esto significa que los requisitos para las herramientas de desarrollo son bastante específicos. ¿Qué pasa si sus desarrolladores necesitan gcc-9 en CentOS y no está en los repositorios públicos? Remangue sus mangas y cree las bolsas requeridas, por supuesto. Pero esta tarea parece simple solo a primera vista. 





Si se está preguntando qué rakes se distribuyen en el camino para reemplazar el compilador del sistema y cómo los manejamos, bienvenido a cat. 





Etapa 1. El montaje real de gcc 

Parecería que todo es simple aquí: tome gcc.spec del paquete gcc-8.3.1, cambie 8 a 9, ejecute rpmbuild –bb, ¿cuánto tiempo estamos esperando? Si pero no. Para empezar, tendrás que revisar y corregir todos los parches, y al mismo tiempo también instalar binutils más fresco, ya que no es difícil. Entonces, no solo cambiamos el compilador, nos damos más herramientas nvptx, lo que significa que cuando la compilación termine y comience la prueba, las pruebas en libgomp, vinculadas a la descarga del código, comenzarán a bloquearse y atascarse en varias posiciones extrañas ... 





Aquí puede haber dos soluciones: 





  1. Conservador: diga a los desarrolladores "lo siento, no pude hacerlo" y desactive nvptx-tools. 





  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