[TaskDone]
Ошибка в debian/rules при сборке в несколько потоков
Автор |
Повідомлення |
Повідомлення створено: 02. 06. 2015 [21:17]
|
aleax
Alexey Bondarchuk
Автор теми
Зареєстрован(а) с: 27.01.2010
Повідомлення: 73
|
В ревизии 2266 LTS ветки 0.8 возникла проблема с паралельной сборкой пакетов,
если запусть сборку например в 3 потока, получаем следующий лог ( раскомментировал #export DH_VERBOSE=1):
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
если же запускать в один поток, то проблема не наблюдается:
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 файла:
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:
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
Повідомлення: 3750
|
"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
Повідомлення: 3750
|
"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
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
Повідомлення: 3750
|
"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.
|
|
|