<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>40958</bug_id>
          
          <creation_ts>2021-09-20 10:50:52 +0300</creation_ts>
          <short_desc>Re-linking during %install</short_desc>
          <delta_ts>2021-09-20 18:03:23 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>samba</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>minor</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ivan A. Melnikov">iv</reporter>
          <assigned_to name="Evgeny Sinelnikov">sin</assigned_to>
          <cc>sin</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>202948</commentid>
    <comment_count>0</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 10:50:52 +0300</bug_when>
    <thetext>Как оказалось, уже довольно давно в самбе в секции %install заново линкуются почти все бинарники. Вот, например, отрывок из сборочных логов первой таски где самба стала четвёртой:

http://git.altlinux.org/tasks/archive/done/_88/90112/build/76/x86_64/log:

[...]
Executing(%install): /bin/sh -e /usr/src/tmp/rpm-tmp.56363
[...]
[ 108/2815] Generating VERSION
[ 130/2815] Generating smbd/build_options.c
[ 137/2815] Generating smbdotconf/parameters.all.xml
[...]
[ 425/2815] Compiling dynconfig/dynconfig.c
[...]
[2183/2815] Linking default/lib/util/libsamba-util.inst.so
[2184/2815] Linking default/lib/util/libutil_setid.inst.so
[2185/2815] Linking default/lib/tdb_compat/libtdb_compat.inst.so
[2186/2815] Linking default/lib/ldb/libldb-cmdline.inst.so
[2187/2815] Linking default/nsswitch/libwbclient/libwbclient.inst.so
[...]

И далее по списку.

Это не только концептуально нехорошо, но и, в связи с LTO, в последнее время очень сильно увеличивает время сборки.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202949</commentid>
    <comment_count>1</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 10:53:22 +0300</bug_when>
    <thetext>&gt; Это не только концептуально нехорошо, но и, в связи с LTO, в последнее время очень сильно увеличивает время сборки.

Небольшая иллюстрация. Как я понял, начиная с 4.14.7 апстрим включил LTO сам, и от этого время сборки выросло примерно в 2.5 раза:

x86_64:
 #279733/100 samba.git 4.14.6-alt1:   30m32s
 #283654/100 samba.git 4.14.6-alt1: 1h17m58s

mipsel:
 #67841/100 samba-4.14.6-alt1.src.rpm: 2h52m21s
 #70377/100 samba-4.14.7-alt1.src.rpm: 7h49m04s</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202950</commentid>
    <comment_count>2</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 11:06:33 +0300</bug_when>
    <thetext>Ещё одня небольшая иллюстация. Обратите внимание на timestamp&apos;ы в последней на сегодня сборке samba:

http://git.altlinux.org/tasks/archive/done/_277/284376/build/100/x86_64/log

[00:00:06] Building target platforms: x86_64
[...]
[00:00:10] Executing(%prep): /bin/sh -e /usr/src/tmp/rpm-tmp.82376
[...]
[00:00:11] + exit 0
[00:00:11] Executing(%build): /bin/sh -e /usr/src/tmp/rpm-tmp.1230
[...]
[00:11:25] + exit 0
[00:11:26] Executing(%install): /bin/sh -e /usr/src/tmp/rpm-tmp.29524
[...]
[01:00:51] + exit 0
[01:00:51] Finding Provides (using /usr/lib/rpm/find-provides)
[...]
[01:13:52] 6073.87user 1058.42system 1:13:43elapsed 161%CPU (0avgtext+0avgdata 1515000maxresident)k
[01:13:52] 0inputs+0outputs (0major+267632404minor)pagefaults 0swaps


То есть, %build занял чуть больше 11 минут, а %install -- чуть меньше 50.

Это и понятно, учитывая, что make install работает в один поток. Так что если не получится победить регенерацию некоторых исходников (VERSION, build_options.c, dynconfig.c), можно будет хотя бы распараллелить make install, и это как-то улучшит ситуацию.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202968</commentid>
    <comment_count>3</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 12:06:03 +0300</bug_when>
    <thetext>А начал я всё это потому, что samba 4.14.7 на riscv64 собирается 11h55m10s.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202976</commentid>
    <comment_count>4</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 13:09:26 +0300</bug_when>
    <thetext>После небольшого патча на спек удалось увидеть коммандную строку компилятора. dynconfig.c в первый раз собирается с очень интересными DEFINE&apos;ами. Вот, например, diff для не-heimdal (да, на локалхосте без hasher&apos;а, но думаю всё равно репрезентативно):


- &apos;-DBINDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/bin&quot;&apos;
- &apos;-DSBINDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/bin&quot;&apos;
+ &apos;-DBINDIR=&quot;/usr/bin&quot;&apos;
+ &apos;-DSBINDIR=&quot;/usr/sbin&quot;&apos;
- &apos;-DPYTHONDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/bin/python&quot;&apos;
- &apos;-DPYTHONARCHDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/bin/python&quot;&apos;
+ &apos;-DPYTHONDIR=&quot;/usr/lib/python3/site-packages&quot;&apos;
+ &apos;-DPYTHONARCHDIR=&quot;/usr/lib64/python3/site-packages&quot;&apos;
- &apos;-DSCRIPTSBINDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/source4/scripting/bin&quot;&apos;
- &apos;-DSETUPDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/source4/setup&quot;&apos;
+ &apos;-DSCRIPTSBINDIR=&quot;/usr/sbin&quot;&apos;
+ &apos;-DSETUPDIR=&quot;/usr/share/samba/setup&quot;&apos;
- &apos;-DCODEPAGEDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/codepages&quot;&apos;
+ &apos;-DCODEPAGEDIR=&quot;/usr/share/samba/codepages&quot;&apos;
- &apos;-DMODULESDIR=&quot;/tmp/.private/iv/RPM/BUILD/samba-4.14.7/bin/modules&quot;&apos;
+ &apos;-DMODULESDIR=&quot;/usr/lib64/samba&quot;&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202982</commentid>
    <comment_count>5</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 14:04:52 +0300</bug_when>
    <thetext>(In reply to Ivan A. Melnikov from comment #4)
&gt; После небольшого патча на спек удалось увидеть коммандную строку
&gt; компилятора. dynconfig.c в первый раз собирается с очень интересными
&gt; DEFINE&apos;ами.

И сделано это специально, чтобы samba работала из каталога, в котором только что собралась -- см. dynconfig_cflags:

http://git.altlinux.org/gears/s/samba.git?p=samba.git;a=blob;f=dynconfig/wscript;h=f455699f06291bc14352b485d68c62b171fa9082#l382</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202984</commentid>
    <comment_count>6</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 14:54:12 +0300</bug_when>
    <thetext>(In reply to Ivan A. Melnikov from comment #5)
&gt; И сделано это специально, чтобы samba работала из каталога, в котором только
&gt; что собралась -- см. dynconfig_cflags:

Отрывание четырёх строчек помогает от пересборки dynconfig.c

--- a/dynconfig/wscript
+++ b/dynconfig/wscript
@@ -389,4 +388,0 @@ def dynconfig_cflags(bld, list=None):
-        if not bld.is_install:
-            override = get_override(bld)
-            if varname in override:
-                value = os.path.join(bld.env.srcdir, override[varname])


Однако VERSION всё равно генерируется и собирается каждый раз заново, и с ней всё как-то совсем печально (см. buildtools/wafsamba/samba_patterns.py).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202998</commentid>
    <comment_count>7</comment_count>
    <who name="Ivan A. Melnikov">iv</who>
    <bug_when>2021-09-20 18:03:23 +0300</bug_when>
    <thetext>
&gt; Так что если не получится победить регенерацию некоторых исходников (VERSION,
&gt; build_options.c, dynconfig.c), можно будет хотя бы распараллелить make
&gt; install, и это как-то улучшит ситуацию.

Я решил попробовать этот консервативный вариант. Вот как-то так:

http://git.altlinux.org/tasks/285522/build/100/x86_64/log


[00:00:06] Building target platforms: x86_64
[...]
[00:00:11] Executing(%prep): /bin/sh -e /usr/src/tmp/rpm-tmp.24622
[...]
[00:11:08] + exit 0
[00:11:08] Executing(%install): /bin/sh -e /usr/src/tmp/rpm-tmp.2757
[...]
[00:21:09] + exit 0
[00:21:09] Finding Provides (using /usr/lib/rpm/find-provides)
[...]
[00:36:53] 6352.95user 1331.43system 36:45.00elapsed 348%CPU (0avgtext+0avgdata 1521136maxresident)k
[00:36:53] 0inputs+0outputs (0major+266526143minor)pagefaults 0swaps

Сравните это с comment #2: всё то же самое, только %install вместо почти 50 минут уложился в 10. Не идеально, просто чуть менее ужасно.

sin@, в samba из 285522 это и ещё ещё несколько моих изменений, please review:

http://git.altlinux.org/people/iv/packages/samba.git?a=shortlog;h=refs/tags/4.14.7-alt4

Предлагаю распараллеленый make install отправить в Сизиф, но багу не закрывать. Чтобы её нормально решить (и не линковать всё по два раза) нужно взаимодействовать с апстримом, я пока не собираюсь этим заниматься. Может найдётся герой)</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>