Everyday DevOps: membangun gcc 9.3.1 untuk CentOS 8

Severstal telah menerapkan sistem perusahaan besar seperti SAP atau QMET, tetapi ada juga banyak tugas berbeda yang tercakup dalam pengembangan kami sendiri, dan tugas pengembangan ini jarang sederhana. Ini berarti bahwa persyaratan alat pengembangan cukup spesifik. Bagaimana jika developer Anda membutuhkan gcc-9 di CentOS dan tidak ada di repositori publik? Gulung lengan baju Anda dan buat tas yang dibutuhkan, tentunya. Tetapi tugas ini terlihat sederhana hanya pada pandangan pertama. 





Jika Anda bertanya-tanya garu apa yang diletakkan dalam cara mengganti compiler sistem, dan bagaimana kami menanganinya, selamat datang di cat. 





Tahap 1. Perakitan gcc yang sebenarnya 

Tampaknya semuanya sederhana di sini: ambil gcc.spec dari paket gcc-8.3.1, ubah 8 menjadi 9, jalankan rpmbuild –bb, berapa lama kita menunggu? Ya, tapi tidak. Untuk memulainya, Anda harus merevisi dan memperbaiki semua tambalan, dan pada saat yang sama juga menginstal binutils lebih baru, karena ini tidak sulit. Kemudian, kami tidak hanya mengubah kompiler, memberi kami beberapa alat nvptx lagi, yang berarti bahwa ketika build selesai dan pengujian dimulai, pengujian di libgomp, yang terkait dengan pembongkaran kode, akan mulai hang dan macet berbagai posisi aneh ... 





Ada dua solusi di sini: 





  1. Konservatif: beri tahu pengembang "maaf, saya tidak bisa melakukannya" dan nonaktifkan 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