Bug 40958

Summary: Re-linking during %install
Product: Sisyphus Reporter: Ivan A. Melnikov <iv>
Component: sambaAssignee: Evgeny Sinelnikov <sin>
Status: NEW --- QA Contact: qa-sisyphus
Severity: minor    
Priority: P5 CC: sin
Version: unstable   
Hardware: all   
OS: Linux   

Description Ivan A. Melnikov 2021-09-20 10:50:52 MSK
Как оказалось, уже довольно давно в самбе в секции %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, в последнее время очень сильно увеличивает время сборки.
Comment 1 Ivan A. Melnikov 2021-09-20 10:53:22 MSK
> Это не только концептуально нехорошо, но и, в связи с 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
Comment 2 Ivan A. Melnikov 2021-09-20 11:06:33 MSK
Ещё одня небольшая иллюстация. Обратите внимание на timestamp'ы в последней на сегодня сборке 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, и это как-то улучшит ситуацию.
Comment 3 Ivan A. Melnikov 2021-09-20 12:06:03 MSK
А начал я всё это потому, что samba 4.14.7 на riscv64 собирается 11h55m10s.
Comment 4 Ivan A. Melnikov 2021-09-20 13:09:26 MSK
После небольшого патча на спек удалось увидеть коммандную строку компилятора. dynconfig.c в первый раз собирается с очень интересными DEFINE'ами. Вот, например, diff для не-heimdal (да, на локалхосте без hasher'а, но думаю всё равно репрезентативно):


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

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

http://git.altlinux.org/gears/s/samba.git?p=samba.git;a=blob;f=dynconfig/wscript;h=f455699f06291bc14352b485d68c62b171fa9082#l382
Comment 6 Ivan A. Melnikov 2021-09-20 14:54:12 MSK
(In reply to Ivan A. Melnikov from comment #5)
> И сделано это специально, чтобы samba работала из каталога, в котором только
> что собралась -- см. 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).
Comment 7 Ivan A. Melnikov 2021-09-20 18:03:23 MSK
> Так что если не получится победить регенерацию некоторых исходников (VERSION,
> build_options.c, dynconfig.c), можно будет хотя бы распараллелить make
> 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 отправить в Сизиф, но багу не закрывать. Чтобы её нормально решить (и не линковать всё по два раза) нужно взаимодействовать с апстримом, я пока не собираюсь этим заниматься. Может найдётся герой)