Severstalは、SAPやQMETなどの大規模な企業システムを実装していますが、独自の開発でカバーするさまざまなタスクもあり、この開発のタスクが単純になることはめったにありません。これは、開発ツールの要件が非常に具体的であることを意味します。開発者がCentOSでgcc-9を必要としていて、それが公開リポジトリにない場合はどうなりますか?もちろん、袖をまくり上げて必要なバッグを作りましょう。しかし、このタスクは一見単純に見えます。
システムコンパイラを置き換える途中でどのレーキが配置されているのか、そしてそれらをどのように処理したのか疑問に思っている場合は、catへようこそ。
ステージ1。gccの実際の組み立て
ここではすべてが単純に見えるでしょう。gcc-8.3.1パッケージからgcc.specを取得し、8を9に変更し、rpmbuild –bbを実行します。どのくらい待っていますか?はい、しかしいいえ。まず、すべてのパッチを修正して修正する必要があります。同時に、binutilsを新しくインストールする必要があります。これは、難しくないためです。次に、コンパイラを変更するだけでなく、nvptx-toolsを追加します。つまり、ビルドが終了してテストが開始されると、コードのアンロードに関連付けられたlibgompのテストがハングし始め、スタックします。様々な奇妙な位置..。
ここには2つの解決策があります。
保守的:開発者に「申し訳ありませんが、できませんでした」と伝え、nvptx-toolsを無効にします。
: , 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), .
-, ?