УкраїнськаEnglishmRussian
Вхід/Новий
У темі немає нових постів

[TaskDone] Ошибка в debian/rules при сборке в несколько потоков


Автор Повідомлення
Повідомлення створено: 02. 06. 2015 [21:17]
aleax
Alexey Bondarchuk
Автор теми
Зареєстрован(а) с: 27.01.2010
Повідомлення: 73
В ревизии 2266 LTS ветки 0.8 возникла проблема с паралельной сборкой пакетов,
если запусть сборку например в 3 потока, получаем следующий лог ( раскомментировал #export DH_VERBOSE=1):
JAVASCRIPT
dpkg-buildpackage -rfakeroot -D -us -uc -j3 -b
dpkg-buildpackage: пакунок джерельних кодів openscada
dpkg-buildpackage: версія джерельних кодів 0.8.13-1
dpkg-buildpackage: source distribution experimental
 
<skip>
 
checking gd.h usability... yes
checking gd.h presence... yes
checking for gd.h... yes
checking for gdImageCreate in -lgd... yes
configure: LibGD: Pass global library using
Build module: UI.WebVision
Build module: UI.WebUser
Build module: Special.SystemTests
Build module: Special.FLibComplex1
Build module: Special.FLibMath
Build module: Special.FLibSYS
===========================================
checking that generated files are newer than configure... done
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src_call/Makefile
config.status: creating src/moduls/Makefile
config.status: creating src/moduls/arhiv/Makefile
config.status: creating src/moduls/bd/Makefile
config.status: creating src/moduls/protocol/Makefile
config.status: creating src/moduls/special/Makefile
config.status: creating src/moduls/daq/Makefile
config.status: creating src/moduls/transport/Makefile
config.status: creating src/moduls/ui/Makefile
config.status: creating src/moduls/bd/DBF/Makefile
config.status: creating src/moduls/bd/MySQL/Makefile
config.status: creating src/moduls/bd/SQLite/Makefile
config.status: creating src/moduls/bd/FireBird/Makefile
config.status: creating src/moduls/bd/PostgreSQL/Makefile
config.status: creating src/moduls/daq/System/Makefile
config.status: creating src/moduls/daq/BlockCalc/Makefile
config.status: creating src/moduls/daq/JavaLikeCalc/Makefile
config.status: creating src/moduls/daq/LogicLev/Makefile
config.status: creating src/moduls/daq/SNMP/Makefile
config.status: creating src/moduls/daq/Siemens/Makefile
config.status: creating src/moduls/daq/ModBus/Makefile
config.status: creating src/moduls/daq/DCON/Makefile
config.status: creating src/moduls/daq/DAQGate/Makefile
config.status: creating src/moduls/daq/SoundCard/Makefile
config.status: creating src/moduls/daq/OPC_UA/Makefile
config.status: creating src/moduls/daq/OPC_UA/libOPC_UA/Makefile
config.status: creating src/moduls/daq/BFN/Makefile
config.status: creating src/moduls/arhiv/FSArch/Makefile
config.status: creating src/moduls/arhiv/DBArch/Makefile
config.status: creating src/moduls/transport/Sockets/Makefile
config.status: creating src/moduls/transport/SSL/Makefile
config.status: creating src/moduls/transport/Serial/Makefile
config.status: creating src/moduls/protocol/HTTP/Makefile
config.status: creating src/moduls/protocol/SelfSystem/Makefile
config.status: creating src/moduls/protocol/UserProtocol/Makefile
config.status: creating src/moduls/ui/VCAEngine/Makefile
config.status: creating src/moduls/ui/Vision/Makefile
config.status: creating src/moduls/ui/QTStarter/Makefile
config.status: creating src/moduls/ui/QTCfg/Makefile
config.status: creating src/moduls/ui/WebCfg/Makefile
config.status: creating src/moduls/ui/WebCfgD/Makefile
config.status: creating src/moduls/ui/WebVision/Makefile
config.status: creating src/moduls/ui/WebUser/Makefile
config.status: creating src/moduls/special/SystemTests/Makefile
config.status: creating src/moduls/special/FLibComplex1/Makefile
config.status: creating src/moduls/special/FLibMath/Makefile
config.status: creating src/moduls/special/FLibSYS/Makefile
config.status: creating src/config.h
config.status: executing depfiles commands
config.status: executing libtool commands
============ Final configuration results ==============
* Status:
  - Enable(yes)/disable(no) all modules                         = individual
  - Crosscompile build                                          = no
  - Core lib build only static                                  = no
* Generic features:
  - Strings charset encode support (by iconv)                   = yes
  - Interfaces internationalisation (I18N) support (by LibIntl) = yes
  - Graphical library (LibGD2) use by core                      = no
  - Subsystem modules build:
    "DB":                   DBF MySQL SQLite FireBird PostgreSQL 
    "DAQ":                  System BlockCalc JavaLikeCalc LogicLev SNMP Siemens ModBus DCON DAQGate SoundCard OPC_UA BFN 
    "Archive":              FSArch DBArch 
    "Transport":            Sockets SSL Serial 
    "Transport's protocol": HTTP SelfSystem UserProtocol 
    "UI":                   VCAEngine Vision QTStarter QTCfg WebCfg WebCfgD WebVision WebUser 
    "Special":              SystemTests FLibComplex1 FLibMath FLibSYS 
  - Modules included to OpenSCADA core: 
* Modules' features:
  - FFTW3 for signal spectrum purchase: -lfftw3
  - Linux sensors library use:          -lsensors
  - Media play engine:                  -lphonon -lQtGui -lQtDBus -lQtXml -lQtCore  
touch configure-stamp
dpkg-buildpackage: помилка: debian/rules build повернув код помилки 2


если же запускать в один поток, то проблема не наблюдается:
JAVASCRIPT
dpkg-buildpackage -rfakeroot -D -us -uc -j1 -b
dpkg-buildpackage: пакунок джерельних кодів openscada
dpkg-buildpackage: версія джерельних кодів 0.8.13-1
dpkg-buildpackage: source distribution experimental
dpkg-buildpackage: джерельні коди змінено Roman Savochenko <rom_as@oscada.org>
 dpkg-source --before-build openscada
dpkg-buildpackage: архітектура хосту amd64
 fakeroot debian/rules clean
 
<skip>
 
config.status: creating src/moduls/special/SystemTests/Makefile
config.status: creating src/moduls/special/FLibComplex1/Makefile
config.status: creating src/moduls/special/FLibMath/Makefile
config.status: creating src/moduls/special/FLibSYS/Makefile
config.status: creating src/config.h
config.status: executing depfiles commands
config.status: executing libtool commands
============ Final configuration results ==============
* Status:
  - Enable(yes)/disable(no) all modules                         = individual
  - Crosscompile build                                          = no
  - Core lib build only static                                  = no
* Generic features:
  - Strings charset encode support (by iconv)                   = yes
  - Interfaces internationalisation (I18N) support (by LibIntl) = yes
  - Graphical library (LibGD2) use by core                      = no
  - Subsystem modules build:
    "DB":                   DBF MySQL SQLite FireBird PostgreSQL 
    "DAQ":                  System BlockCalc JavaLikeCalc LogicLev SNMP Siemens ModBus DCON DAQGate SoundCard OPC_UA BFN 
    "Archive":              FSArch DBArch 
    "Transport":            Sockets SSL Serial 
    "Transport's protocol": HTTP SelfSystem UserProtocol 
    "UI":                   VCAEngine Vision QTStarter QTCfg WebCfg WebCfgD WebVision WebUser 
    "Special":              SystemTests FLibComplex1 FLibMath FLibSYS 
  - Modules included to OpenSCADA core: 
* Modules' features:
  - FFTW3 for signal spectrum purchase: -lfftw3
  - Linux sensors library use:          -lsensors
  - Media play engine:                  -lphonon -lQtGui -lQtDBus -lQtXml -lQtCore  
touch configure-stamp
dh_testdir
/usr/bin/make
make[1]: Вхожу у каталог "/home/aleax/documents/work/build/openscada/git/openscada/openscada"
Making all in src
make[2]: Вхожу у каталог "/home/aleax/documents/work/build/openscada/git/openscada/openscada/src"
/usr/bin/make  all-recursive
make[3]: Вхожу у каталог "/home/aleax/documents/work/build/openscada/git/openscada/openscada/src"
Making all in moduls
make[4]: Вхожу у каталог "/home/aleax/documents/work/build/openscada/git/openscada/openscada/src/moduls"
Making all in bd
make[5]: Вхожу у каталог "/home/aleax/documents/work/build/openscada/git/openscada/openscada/src/moduls/bd"
Making all in DBF
make[6]: Вхожу у каталог "/home/aleax/documents/work/build/openscada/git/openscada/openscada/src/moduls/bd/DBF"
/bin/bash ../../../../libtool  --tag=CXX --tag=disable-static  --mode=compile g++ -DHAVE_CONFIG_H -I. -I../../../../src     -g -O2   -MT bd_DBF_la-dbf_mod.lo -MD -MP -MF .deps/bd_DBF_la-dbf_mod.Tpo -c -o bd_DBF_la-dbf_mod.lo `test -f 'dbf_mod.cpp' || echo './'`dbf_mod.cpp
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I../../../../src -g -O2 -MT bd_DBF_la-dbf_mod.lo -MD -MP -MF .deps/bd_DBF_la-dbf_mod.Tpo -c dbf_mod.cpp  -fPIC -DPIC -o .libs/bd_DBF_la-dbf_mod.o
mv -f .deps/bd_DBF_la-dbf_mod.Tpo .deps/bd_DBF_la-dbf_mod.Plo
/bin/bash ../../../../libtool  --tag=CXX --tag=disable-static  --mode=compile g++ -DHAVE_CONFIG_H -I. -I../../../../src     -g -O2   -MT bd_DBF_la-dbf.lo -MD -MP -MF .deps/bd_DBF_la-dbf.Tpo -c -o bd_DBF_la-dbf.lo `test -f 'dbf.cpp' || echo './'`dbf.cpp
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I../../../../src -g -O2 -MT bd_DBF_la-dbf.lo -MD -MP -MF .deps/bd_DBF_la-dbf.Tpo -c dbf.cpp  -fPIC -DPIC -o .libs/bd_DBF_la-dbf.o


Проблема в следующей части debian/rules файла:
JAVASCRIPT
build: build-arch build-indep
build-arch: configure-stamp build-stamp
build-indep: configure-stamp build-stamp
configure-stamp:
    dh_testdir
    dh_autoreconf
    ./configure $(CROSS) --prefix=/usr --sysconfdir=/etc --enable-DiamondBoards --enable-ICP_DAS --enable-BFN
    touch $@
build-stamp:
    dh_testdir
    $(MAKE)
    touch $@


цели build-arch и build-indep запускаются паралельно, и в свою очередь паралельно запускают цели configure-stamp build-stamp, таким образом цель configure-stamp не успевает завершиться до запуска build-stamp.

В качесвте решения предлагаю для цели build-stamp записать пререквизит configure-stamp:
JAVASCRIPT
Index: debian/rules
===================================================================
--- debian/rules        (revision 2266)
+++ debian/rules        (working copy)
@@ -27,7 +27,7 @@
        dh_autoreconf
        ./configure $(CROSS) --prefix=/usr --sysconfdir=/etc --enable-DiamondBoards --enable-ICP_DAS --enable-BFN
        touch $@
-build-stamp:
+build-stamp: configure-stamp
        dh_testdir
        $(MAKE)
        touch $@


После данной правки, паралельная сборка работает нормально.

[Повідомлення редагувалось 3 раз(ів), останній раз 02.06.2015 в 21:22.]
Повідомлення створено: 02. 06. 2015 [21:34]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3742
"aleax" wrote:

dpkg-buildpackage -rfakeroot -D -us -uc -j3 -b

Не вижу никакого смысла указывать -j3 здесь, достаточно указать его к make, где оно и смысл имеет и проблем не создаёт.
Собственно и не ошибка, поскольку на вызов правил параллельно я не рассчитывал.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 02. 06. 2015 [21:41]
aleax
Alexey Bondarchuk
Автор теми
Зареєстрован(а) с: 27.01.2010
Повідомлення: 73
"roman" wrote:

"aleax" wrote:

dpkg-buildpackage -rfakeroot -D -us -uc -j3 -b

Не вижу никакого смысла указывать -j3 здесь, достаточно указать его к make, где оно и смысл имеет и проблем не создаёт.
Собственно и не ошибка, поскольку на вызов правил параллельно я не рассчитывал.


ну, как бы, на ноуте я собираю в 3 потока, а на рабочей билд-машине в 7 (в отдельном "чистом" chroot окружении под нужные целевые системы
sudo -E ARCH=i386 DIST=squeeze ADDREPOS='local-oscada-dev60' pdebuild --debbuildopts "-j7 -b" --use-pdebuild-internal --pbuilder cowbuilder --buildresult `pwd`/../ )
и хардкодить в майкфайл, или править каждый раз его перед сборкой не хотелось бы)

тем более что -j стандартная опция для dpkg-buildpackage, и раньше, на протяжении нескольких последний лет, все отлично собиралось во столько потоков, во сколько закажешь

PS. И пусть будет не ошибка, а фичреквест :D

[Повідомлення редагувалось 1 раз(ів), останній раз 02.06.2015 в 21:42.]
Повідомлення створено: 03. 06. 2015 [08:11]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3742
"aleax" wrote:

"roman" wrote:

"aleax" wrote:

dpkg-buildpackage -rfakeroot -D -us -uc -j3 -b

Не вижу никакого смысла указывать -j3 здесь, достаточно указать его к make, где оно и смысл имеет и проблем не создаёт.
Собственно и не ошибка, поскольку на вызов правил параллельно я не рассчитывал.

ну, как бы, на ноуте я собираю в 3 потока, а на рабочей билд-машине в 7 (в отдельном "чистом" chroot окружении под нужные целевые системы
sudo -E ARCH=i386 DIST=squeeze ADDREPOS='local-oscada-dev60' pdebuild --debbuildopts "-j7 -b" --use-pdebuild-internal --pbuilder cowbuilder --buildresult `pwd`/../ )
и хардкодить в майкфайл, или править каждый раз его перед сборкой не хотелось бы)

Я тоже: http://oscada.org/ru/razrabotka/zadachi/posts/core/the_automatic_openscada_builder
И меня не напрягает добавить к make ключ "-j2".

"aleax" wrote:

тем более что -j стандартная опция для dpkg-buildpackage, и раньше, на протяжении нескольких последний лет, все отлично собиралось во столько потоков, во сколько закажешь

PS. И пусть будет не ошибка, а фичреквест :D

Может и стандартная, но проблемная, требует особого и неочевидного подхода, как минимум Ваш патч этой задачи не решает уже для двух потоков, на Debian8:
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2


Learn, learn and learn better than work, work and work.
Повідомлення створено: 03. 06. 2015 [09:05]
aleax
Alexey Bondarchuk
Автор теми
Зареєстрован(а) с: 27.01.2010
Повідомлення: 73
"roman" wrote:

Может и стандартная, но проблемная, требует особого и неочевидного подхода, как минимум Ваш патч этой задачи не решает уже для двух потоков, на Debian8:
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2



Буду разбиратся, раньше ж работало!
Повідомлення створено: 03. 06. 2015 [23:14]
aleax
Alexey Bondarchuk
Автор теми
Зареєстрован(а) с: 27.01.2010
Повідомлення: 73
Новый вариант патча, отключает паралельную обработку make-файла debian/rules, и при этом, если задано колиичество потоков через опцию -j для debuild или dpkg-buildpackage, или через переменную окружения DEB_BUILD_OPTIONS="parallel=jobs" добавляет установленное количество потоков к MAKEFLAGS
JAVASCRIPT
Index: debian/rules
===================================================================
--- debian/rules	(revision 2266)
+++ debian/rules	(working copy)
@@ -19,6 +19,14 @@
 CROSS= --build $(DEB_BUILD_GNU_TYPE)
 endif
 
+# These are used for support -j option of dpkg-buildpackage
+ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
+PARALLEL = -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
+else
+PARALLEL =
+endif
+MAKEFLAGS += $(PARALLEL)
+
 build: build-arch build-indep
 build-arch: configure-stamp build-stamp
 build-indep: configure-stamp build-stamp
@@ -94,4 +102,7 @@
 	dh_autoreconf_clean
 	dh_clean
 
-.PHONY: build build-arch build-indep install install-indep install-arch binary binary-indep binary-arch clean
\ No newline at end of file
+.PHONY: build build-arch build-indep install install-indep install-arch binary binary-indep binary-arch clean
+
+# This GNU make extensions disables parallel builds for the current Makefile but not for sub-Makefiles.
+.NOTPARALLEL:
\ No newline at end of file


P.S.: Пока искал решение, просмотрел кучу debian/rules файлов разлиичных проектов, в них для целей install-arch/install-indep установленны зависимости build-arch/build-indep и т.п., чего у нас не наблюается.
Тем не мение с приложенным патчем получилось собрать в 1,2,5 и 7 потоков.
Повідомлення створено: 04. 06. 2015 [12:07]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3742
"aleax" wrote:

Новый вариант патча, отключает паралельную обработку make-файла debian/rules, и при этом, если задано колиичество потоков через опцию -j для debuild или dpkg-buildpackage, или через переменную окружения DEB_BUILD_OPTIONS="parallel=jobs" добавляет установленное количество потоков к MAKEFLAGS
...

Годится такое, принял.

"aleax" wrote:

P.S.: Пока искал решение, просмотрел кучу debian/rules файлов разлиичных проектов, в них для целей install-arch/install-indep установленны зависимости build-arch/build-indep и т.п., чего у нас не наблюается.

Да, так правильнее, исправил.

Learn, learn and learn better than work, work and work.



8501