dev-qt/qt* подтвердите баг.

Всем добрый день!
Обновив в очередной раз portage, получил новость "2015-03-28 True multilib support on amd64".
Прочитал, поматерился, но пришлось инициировать процесс обновления.
(Вручную проставил abi-флаги, пришлось попотеть, но остальные предлагаемые решения не устроили по ряду причин, автоанмаск отключен).
Начал update @world. Все бы хорошо (из 149 пакетов недособралось 12), но подкачала Qt.

Живу на QT4 (проекты под него). Когда дело дошло до пересборки в двух вариантах (32-битный и 64-битный) Qt обнаружился следующий баг.
Привожу саму ошибку от emerge, далее мой анализ.

OCI auto-detection... ()
x86_64-pc-linux-gnu-g++ -c -pipe -march=native -O2 -pipe -O2 -Wall -W  -I../../../../qt-everywhere-opensource-src-4.8.6/mkspecs/linux-g++ -I../../../../qt-everywhere-opensource-src-4.8.6/config.tests/unix/oci -I/usr/lib64/oracle/11.2.0.4/client/rdbms/public -I../../../../qt-everywhere-opensource-src-4.8.6/config.tests/unix/oci -I. -o oci.o ../../../../qt-everywhere-opensource-src-4.8.6/config.tests/unix/oci/oci.cpp
x86_64-pc-linux-gnu-g++ -Wl,-O1 -Wl,--as-needed -Wl,-O1 -o oci oci.o     -L/usr/lib64/oracle/11.2.0.4/client/lib32 -lclntsh 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/../../../../x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib64/oracle/11.2.0.4/client/lib32/libclntsh.so when searching for -lclntsh
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lclntsh
collect2: error: ld returned 1 exit status
Makefile:98: recipe for target 'oci' failed
gmake: *** [oci] Error 1
OCI disabled.
Oracle (OCI) support cannot be enabled due to functionality tests!
 Turn on verbose messaging (-v) to /var/tmp/portage/dev-qt/qtsql-4.8.6-r1/work/qt-everywhere-opensource-src-4.8.6/configure to see the final report.
 If you believe this message is in error you may use the continue
 switch (-continue) to /var/tmp/portage/dev-qt/qtsql-4.8.6-r1/work/qt-everywhere-opensource-src-4.8.6/configure to continue.
 * ERROR: dev-qt/qtsql-4.8.6-r1::gentoo failed (configure phase):
 *   configure failed
 * 
 * Call stack:
 *     ebuild.sh, line   93:  Called src_configure
 *   environment, line 3181:  Called multilib-minimal_src_configure
 *   environment, line 2045:  Called multilib_foreach_abi 'multilib-minimal_abi_src_configure'
 *   environment, line 2252:  Called multibuild_foreach_variant '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure'
 *   environment, line 1976:  Called _multibuild_run '_multilib_multibuild_wrapper' 'multilib-minimal_abi_src_configure'
 *   environment, line 1974:  Called _multilib_multibuild_wrapper 'multilib-minimal_abi_src_configure'
 *   environment, line  389:  Called multilib-minimal_abi_src_configure
 *   environment, line 2039:  Called multilib_src_configure
 *   environment, line 2472:  Called qt4_multilib_src_configure
 *   environment, line 2958:  Called die
 * The specific snippet of code:
 *       "${S}"/configure "${conf[@]}" || die "configure failed";
 * 
 * If you need support, post the output of `emerge --info '=dev-qt/qtsql-4.8.6-r1::gentoo'`,
 * the complete build log and the output of `emerge -pqv '=dev-qt/qtsql-4.8.6-r1::gentoo'`.
 * The complete build log is located at '/var/tmp/portage/dev-qt/qtsql-4.8.6-r1/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/dev-qt/qtsql-4.8.6-r1/temp/environment'.
 * Working directory: '/var/tmp/portage/dev-qt/qtsql-4.8.6-r1/work/qt-everywhere-opensource-src-4.8.6-abi_x86_32.x86'

Падаем при сборке 32-битной версии (ABI_X86="32"). Причина обшибки понятна! При сборке qtsql стадии configure, тесты пытаемся собрать в 64-битном режиме (отстутствует флаг "-m32"), при этом пути до оракловской бибилиотеки устанавливаем верно, именно туда, где лежит правильная 32-битная версия libclntsh.so

Смотрим, что происходит... идем в /var/tmp/portage/dev-qt/qtsql-4.8.6-r1/work/qt-everywhere-opensource-src-4.8.6-abi_x86_32.x86
Там идем в тесты ./config.tests/unix/oci и видим два файла Makefile и oci.o

~ head -n 10 Makefile
#############################################################################
# Makefile for building: oci
# Generated by qmake (2.01a) (Qt 4.8.6) on: ?? ??? 30 15:58:28 2015
# Project:  ../../../../qt-everywhere-opensource-src-4.8.6/config.tests/unix/oci/oci.pro
# Template: app
# Command: /var/tmp/portage/dev-qt/qtsql-4.8.6-r1/work/qt-everywhere-opensource-src-4.8.6-abi_x86_32.x86/bin/qmake -spec ../../../../qt-everywhere-opensource-src-4.8.6/mkspecs/linux-g++ CONFIG+= CONFIG-=debug_and_release LIBS*=\ -L/usr/lib64/oracle/11.2.0.4/client/lib32 LIBS+= INCLUDEPATH*=\ /usr/lib64/oracle/11.2.0.4/client/include QMAKE_CXXFLAGS*= QMAKE_CXXFLAGS+= QMAKE_CC=x86_64-pc-linux-gnu-gcc QMAKE_CXX=x86_64-pc-linux-gnu-g++ QMAKE_LINK=x86_64-pc-linux-gnu-g++ QMAKE_CFLAGS+=-march=native\ -O2\ -pipe QMAKE_CXXFLAGS+=-march=native\ -O2\ -pipe QMAKE_LFLAGS+=-Wl,-O1\ -Wl,--as-needed -o Makefile ../../../../qt-everywhere-opensource-src-4.8.6/config.tests/unix/oci/oci.pro
#############################################################################

####### Compiler, tools and options
~ less oci.o | head -n 5
Заголовок ELF:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Класс:                             ELF64
  Данные:                            дополнение до 2, little endian
  Версия:                            1 (current)
  OS/ABI:                            UNIX - System V

На лицо БАГ! Собирая QT (в частности qtsql) в 32-битном режиме по факту ГЕНЕРИМ ТЕСТЫ В 64-БИТНОМ РЕЖИМЕ.
Место ошибки в принципе видно. Запуск qmake'а происходит не с той спецификацией. Для компилятора отсутствует флаг "-m32", который бы все расставил на место.
Но он не применяется, потому что mkspecs/linux-g++ его не содержит, но содержит mkspecs/linux-g++-32.
Как результат получаем неправильный Makefile, как результат получаем ошибку сборки.

СОБСТВЕННО, ВОПРОС:
Кто-нибудь уже напоролся на аналогичную проблему?? Что посоветуете делать??
1. Отказаться от QT - не вариант
2. Отказаться от 32-битных зависимостей QT (я подозреваю, что все идет от skype'а; skype зависит от qtgui, qtgui с флагом ABI_x86="32" в свою очередь тянет такой же флаг у остальных qt-пакетов) - тоже не вариант!!
3. Отказаться от qtsql тоже не могу, ибо нужно!
4. Могу копаться в нутре portage, думаю, что именно там происходит формирование вызова qmake и именно туда вносить исправления. Но здесь потребуется помощь более опытных участников, ибо я не силен в написании ebuild-ов и тем более eclass-ов.
5. Опыта составления bug-репорта нету, может кто возмется. (Мои поиски на bugs.gentoo.org по аналогичной проблеме пока ничего не дали).

Интересно, что dev-qt/qtgui собирается нормально, хотя тоже косячит при генерации тестов. Проверял через ebuild configure, но там все тесты простые и проходят, несмотря на то, что запускаются их 64-битные версии при 32-битной сборке.

Спасибо!
Будет благодарен за любые коснтруктивные комментарии.

Предполагаю, что исправления

Предполагаю, что исправления нужно вносить в /usr/portage/eclass/qt4-build-multilib.eclass
Функция qt4_get_mkspec. В ней ни слова об 32-битном режиме. По умолчанию формируется имя linux-g++, которое не содержит флагов 32-битной компиляции.
Для 64-битного режима стоит четкое указание добавить "-64", то есть получим: linux-g++-64

Давайте осудим, как правильно исправить ошибку.

.

georgedvo написал(а):
Предполагаю, что исправления нужно вносить в /usr/portage/eclass/qt4-build-multilib.eclass
Функция qt4_get_mkspec. В ней ни слова об 32-битном режиме. По умолчанию формируется имя linux-g++, которое не содержит флагов 32-битной компиляции.
Для 64-битного режима стоит четкое указание добавить "-64", то есть получим: linux-g++-64

Давайте осудим, как правильно исправить ошибку.

Подсмотреть правильное объявление, переопределить неправильное, проверить.
При успехе открыть баг с приложением переопределения.

:wq
--
Live free or die

Если бы знать где

Если бы знать где подсмотреть?! ;)
Возможно получилось что-нибудь

georgedvo

georgedvo написал(а):
Давайте осудим, как правильно исправить ошибку.

Я завтра могу попробовать воспроизвести проблему, но завести жука можно уже сейчас....

/

georgedvo написал(а):
На лицо БАГ! Собирая QT (в частности qtsql) в 32-битном режиме по факту ГЕНЕРИМ ТЕСТЫ В 64-БИТНОМ РЕЖИМЕ.

«Налицо» пишется слитно ☺

Чтение разного рода Makefile'ов — занятие конечно увлекательное, но…
Интересен уровень выше (журнал и окружение сборки).
В качестве workaround требуемый параметр можно временно (!) поправить посредством per-package bashrc (см. http://megabaks.blogspot.co.uk/2012/10/portage.html ).

ЗЫ: Тебе точно нужны 32-х битные тролли?

:wq
--
Live free or die

Anarchist

Anarchist написал(а):
«Налицо» пишется слитно ☺

Да, спасибо!!

Anarchist написал(а):
Чтение разного рода Makefile'ов — занятие конечно увлекательное, но…
Интересен уровень выше (журнал и окружение сборки).
В качестве workaround требуемый параметр можно временно (!) поправить посредством per-package bashrc (см. http://megabaks.blogspot.co.uk/2012/10/portage.html ).

Могу выложить и environment и build.log, но там сплошная простыня и думаю вряд ли это будет для вас увлекательное чтиво.
Насчет /etc/portage/env здесь может не подойти, ибо мне кажется, что все таки ошибка в eclass-файле.
Да и потом придется переопределять для множества dev-qt/qt*, где вряд ли удастся добиться некоего единообразия.
Вообщем костыль еще тот. Пока отложу. Спасибо.

Anarchist написал(а):
ЗЫ: Тебе точно нужны 32-х битные тролли?

Скайп точно нужен, остальные уже выпилил, wine вроде нормально пересобрался, emul-linux-x86-* уже удален. Сейчас дособрать в @world осталось вот

Calculating dependencies... done!
[ebuild  N    ~] dev-qt/qtsql-4.8.6-r1  USE="debug exceptions oci8 postgres qt3support sqlite (-aqua) -freetds -mysql -odbc -pch" ABI_X86="32 (64) (-x32)" 
[ebuild  N    ~] dev-qt/qttest-4.8.6-r1  USE="debug exceptions (-aqua) -pch" ABI_X86="(64) -32 (-x32)" 
[ebuild  N    ~] dev-qt/qtxmlpatterns-4.8.6-r1  USE="debug (-aqua) -pch" ABI_X86="32 (64) (-x32)" 
[ebuild  N    ~] dev-qt/qt3support-4.8.6-r1  USE="accessibility debug exceptions (-aqua) -pch" ABI_X86="32 (64) (-x32)" 
[ebuild  N    ~] dev-qt/qtsvg-4.8.6-r1  USE="accessibility debug exceptions (-aqua) -pch" ABI_X86="(64) -32 (-x32)" 
[ebuild  N    ~] dev-qt/designer-4.8.6-r1  USE="debug exceptions qt3support (-aqua) -declarative -kde -pch -phonon -webkit" ABI_X86="(64) -32 (-x32)" 
[ebuild  N    ~] dev-qt/qtwebkit-4.8.6-r1  USE="debug exceptions gstreamer jit (-aqua) -icu -pch" ABI_X86="32 (64) (-x32)" 
[ebuild  N    ~] dev-qt/qtopengl-4.8.6-r1  USE="debug exceptions qt3support (-aqua) -egl -pch" ABI_X86="(64) -32 (-x32)" 
[ebuild  N    ~] dev-qt/qtmultimedia-4.8.6-r1  USE="alsa debug exceptions (-aqua) -pch" ABI_X86="(64) -32 (-x32)" 
[ebuild  N    ~] dev-qt/qtdeclarative-4.8.6-r1  USE="accessibility debug exceptions qt3support (-aqua) -pch -webkit" ABI_X86="(64) -32 (-x32)" 
[ebuild     U  ] sys-auth/polkit-kde-agent-0.99.1-r1 [0.99.1]

Странно, у меня никаких проблем с QT нет!

Правда я смигрировал на мультилиб из-за того же Скайпа еще полгода назад, так что сейчас только профиль пришлось переключить. У меня на работе стабильный QT (4.8.5), а дома нестабильный (4.8.6 и 5.4.1) и проблем нет.

По делу:

1. Какой профиль?
2. Покажи emerge --info и eix -sI qt

SysA написал(а): Правда я

SysA написал(а):
Правда я смигрировал на мультилиб из-за того же Скайпа еще полгода назад

Значит запись в ЧаВо от 2009 года устарела?
Отпишись.

SysA написал(а):
так что сейчас только профиль пришлось переключить.

???
Там же только включение флагов для пакетов, которым нужна поддержка 32x?

SysA написал(а):
У меня на работе стабильный QT (4.8.5), а дома нестабильный (4.8.6 и 5.4.1) и проблем нет.

У меня на стабильном тоже нет проблем.
Но я не помню, чтобы поддерхка 32-х разрядной архитектуры требовалась (у меня) кому-то из троллей.
Так что в принципе в предмете темы не вижу ничего невероятного.

:wq
--
Live free or die

Anarchist написал(а): SysA

Anarchist написал(а):
SysA написал(а):
Правда я смигрировал на мультилиб из-за того же Скайпа еще полгода назад

Значит запись в ЧаВо от 2009 года устарела?
Отпишись.

Виноват, был неточен! :) имелось ввиду с app-emulation/emul-linux-x86-* на ABI_X86="32", конечно.

Anarchist написал(а):
SysA написал(а):
так что сейчас только профиль пришлось переключить.

???
Там же только включение флагов для пакетов, которым нужна поддержка 32x?

У меня уже был профиль с поддержкой мультилиба через ABI_X86="32" (не помню точно, как он назывался), который вчера выкинули + см. ответ выше.

SysA написал(а): Правда я

SysA написал(а):
Правда я смигрировал на мультилиб из-за того же Скайпа еще полгода назад, так что сейчас только профиль пришлось переключить. У меня на работе стабильный QT (4.8.5), а дома нестабильный (4.8.6 и 5.4.1) и проблем нет.

Странно, не понял. С какого на какой профиль вы переключились??

Я бы тоже спокойно жил на QT-4.8.5, но последнее обновление портежа сказало, давай ABI меняй и все! профиль no-multilib не могу поставить, ибо есть 32-битные приложения (хотя бы тот же скайп). До этого всегда жил на стандартном профиле, который по умолчанию multilib.

SysA написал(а):
По делу:

1. Какой профиль?
2. Покажи emerge --info и eix -sI qt

Профиль:
http://pastebin.com/JDQYAW68

emerge --info
http://pastebin.com/ALXV2b4J

eix -sI qt
http://pastebin.com/cTajFJCN

georgedvo

georgedvo написал(а):
Странно, не понял. С какого на какой профиль вы переключились??

Сейчас у меня default/linux/amd64/13.0/desktop.

georgedvo написал(а):
Я бы тоже спокойно жил на QT-4.8.5, но последнее обновление портежа сказало, давай ABI меняй и все!...

Нет, можно прекрасно и на стабильной версии жить, если аппликации не требуют нестабильности... просто вычищайте конфигурацию!

georgedvo написал(а):
emerge --info
http://pastebin.com/ALXV2b4J

Если добавишь ABI_X86="32 64" в /etc/portage/make.conf, это существенно упростит тебе жизнь. ;)

SysA написал(а): Нет, можно

SysA написал(а):
Нет, можно прекрасно и на стабильной версии жить, если аппликации не требуют нестабильности... просто вычищайте конфигурацию!

Спасибо, да надо будет заниматься на досуге. Уже порядочный бардак в /etc/portage/package.*.
К сожалению от скайпа не избавиться, поэтому пока приется тянуть такие зависимости

SysA написал(а):
Если добавишь ABI_X86="32 64" в /etc/portage/make.conf, это существенно упростит тебе жизнь. ;)

А не привидет ли это к избыточной сборке пакетов с ABI_X86="32" ??
Когда нужен multilib только для текущих зависимостей, может все же эффективней проставить их в package.use
(как предлагается в новости).

georgedvo написал(а): SysA

georgedvo написал(а):
SysA написал(а):
Если добавишь ABI_X86="32 64" в /etc/portage/make.conf, это существенно упростит тебе жизнь. ;)

А не привидет ли это к избыточной сборке пакетов с ABI_X86="32" ??
Когда нужен multilib только для текущих зависимостей, может все же эффективней проставить их в package.use
(как предлагается в новости).

Конечно, будет избыточность, но я и не говорил, что это минималистический вариант!
Но для себя я решил, что мое время дороже дисковой памяти :) - слишком много возни...

Спасибо, всем за

Спасибо, всем за информацию.
Короче для себя решил...
1. Пока проставил все abi флаги вручную. Не так уж много получилось.
2. Надо заниматься чисткой конфигуарции, ибо уже пора.
3. Запостил баг, жду реакции сообщества.
4. Но и вот такое поделие позволило успешно завершить обновление мира и корректно пересобирать QT4 32/64битные версии

diff -Naur /usr/portage/eclass/qt4-build-multilib.eclass.bak /usr/portage/eclass/qt4-build-multilib.eclass
--- /usr/portage/eclass/qt4-build-multilib.eclass.bak	2015-03-23 12:31:10.000000000 +1000
+++ /usr/portage/eclass/qt4-build-multilib.eclass	2015-03-30 23:39:04.516952386 +1000
@@ -815,6 +815,13 @@
 			die "qt4-build-multilib.eclass: unsupported compiler '$(tc-getCXX)'" ;;
 	esac
 
+    # Add -32 for explicit 32-bit flag
+#    ewarn "MULTIBUILD_VARIANT=${MULTIBUILD_VARIANT}"
+    if [[ "${MULTIBUILD_VARIANT}" == "abi_x86_32.x86" ]]
+    then
+		[[ -d ${S}/mkspecs/${spec}-32 ]] && spec+=-32
+    fi
+
 	# Add -64 for 64-bit prefix profiles
 	if use amd64-linux || use ia64-linux || use ppc64-linux ||
 		use x64-macos ||

на багзилле рапортовал? патч

на багзилле рапортовал? патч приложил?

Пользуясь моментом, хочу передать привет друзьям, которые также пользуются "Моментом"

/

Tzar написал(а):
на багзилле рапортовал? патч приложил?

Баг #545106.
Относительно целесообразности приложения цитированного наколенного (чтобы собралось без явных косяков) патча не уверен.
Ссылку на тему на форуме (вместе с рекомендацией бурдуям изучать труды тов. Кропоткина) приложить можно.

:wq
--
Live free or die

georgedvo, скажите, кроме

georgedvo, скажите, кроме скайпа, какие у вас в системе ещё есть 32-битные блобы-бинарники?

только wine стоит

только wine стоит

georgedvo написал(а): только

georgedvo написал(а):
только wine стоит

Аккуратно предположу, что, возможно, стоит перейти на no-multilib профиль и в нём организовать chroot 32-bits. Здесь выдержка их хэндбука о том как это сделать. А тут конкретно про skype, wine, etc внутри этого chroot.
Но с другой стороны, линуксовый скайп имеет урезанный функционал, например, не умеет групповые видеоконференции (оно и понятно). И по сему проще поставить ХРюндель в виртуальной коробке, и запускать блобы в нативной среде.
Есть ещё одно поделие под названием viber, в отличие от скайпа имеется линуксовая 64-битная сборка. Вполне возможно, что с него можно звонить на скайп и наоборот.

Спасибо за подборку полезного

Спасибо за подборку полезного чтива.
По теме: морально не готов ни к переходу на 32бит chroot, ни на запуск целой виртуалки для какого-то скайпа... ;) надо созреть, ну или случится какой-то жопе, что я не смогу из своего текущего multilib профиля поддерживать и обновлять свой мир.
Пока проставление и поддержание abi_x86_32 выглядит более привлекательным решением, чем указанные выше.

наложение патча

Ваше решение чисто индивидуальное, поэтому попытка наложения патча не привела к положительному результату. У меня не собирается dev-qt/qtscript-4.8.6-r1 (проблема как и вас возникла при обновлении).
Ну вот с грехом пополам собрал для этого использовал USE="-*". опасаюсь что при следующем обновлении ситуация повторится. И вдогонку:сделал emerge -e @system обновление прервалось на cups-filters(хотя до этого принтер работал) посмотрел вывод emerge -pqv отсутствует флаг perl? как такое может быть? С флагом собралось нормально.

99 % сбоев системы находятся между монитором и стулом.

по вашему скудному описанию

по вашему скудному описанию вообще сложно понять что происходит.
USE="-*" - это неудачный выбор, флаг perl поэтому и отсутствует, что вы его зарубили через USE="-*"
нужно смотреть, конкртеную ошибку с dev-qt и cups-filters.

я не претендовал на универсальность патча, как раз предлагал обсудить правильный способ исправления.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".