日常のDevOps:CentOS8用のgcc9.3.1の構築

Severstalは、SAPやQMETなどの大規模な企業システムを実装していますが、独自の開発でカバーするさまざまなタスクもあり、この開発のタスクが単純になることはめったにありません。これは、開発ツールの要件が非常に具体的であることを意味します。開発者がCentOSでgcc-9を必要としていて、それが公開リポジトリにない場合はどうなりますか?もちろん、袖をまくり上げて必要なバッグを作りましょう。しかし、このタスクは一見単純に見えます。 





システムコンパイラを置き換える途中でどのレーキが配置されているのか、そしてそれらをどのように処理したのか疑問に思っている場合は、catへようこそ。 





ステージ1。gccの実際の組み立て 

ここではすべてが単純に見えるでしょう。gcc-8.3.1パッケージからgcc.specを取得し、8を9に変更し、rpmbuild –bbを実行します。どのくらい待っていますか?はい、しかしいいえ。まず、すべてのパッチを修正して修正する必要があります。同時に、binutilsを新しくインストールする必要があります。これは、難しくないためです。次に、コンパイラを変更するだけでなく、nvptx-toolsを追加します。つまり、ビルドが終了してテストが開始されると、コードのアンロードに関連付けられたlibgompのテストがハングし始め、スタックします。様々な奇妙な位置..。 





ここには2つの解決策があります。 





  1. 保守的:開発者に「申し訳ありませんが、できませんでした」と伝え、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