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
, но там все тесты простые и проходят, несмотря на то, что запускаются их 64-битные версии при 32-битной сборке.
Спасибо!
Будет благодарен за любые коснтруктивные комментарии.
- Для комментирования войдите или зарегистрируйтесь
Предполагаю, что исправления
Предполагаю, что исправления нужно вносить в /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
Я завтра могу попробовать воспроизвести проблему, но завести жука можно уже сейчас....
/
«Налицо» пишется слитно ☺
Чтение разного рода Makefile'ов — занятие конечно увлекательное, но…
Интересен уровень выше (журнал и окружение сборки).
В качестве workaround требуемый параметр можно временно (!) поправить посредством per-package bashrc (см. http://megabaks.blogspot.co.uk/2012/10/portage.html ).
ЗЫ: Тебе точно нужны 32-х битные тролли?
:wq
--
Live free or die
Anarchist
Да, спасибо!!
Могу выложить и environment и build.log, но там сплошная простыня и думаю вряд ли это будет для вас увлекательное чтиво.
Насчет /etc/portage/env здесь может не подойти, ибо мне кажется, что все таки ошибка в eclass-файле.
Да и потом придется переопределять для множества dev-qt/qt*, где вряд ли удастся добиться некоего единообразия.
Вообщем костыль еще тот. Пока отложу. Спасибо.
Скайп точно нужен, остальные уже выпилил, wine вроде нормально пересобрался, emul-linux-x86-* уже удален. Сейчас дособрать в @world осталось вот
Странно, у меня никаких проблем с QT нет!
Правда я смигрировал на мультилиб из-за того же Скайпа еще полгода назад, так что сейчас только профиль пришлось переключить. У меня на работе стабильный QT (4.8.5), а дома нестабильный (4.8.6 и 5.4.1) и проблем нет.
По делу:
1. Какой профиль?
2. Покажи
emerge --info
иeix -sI qt
SysA написал(а): Правда я
Значит запись в ЧаВо от 2009 года устарела?
Отпишись.
???
Там же только включение флагов для пакетов, которым нужна поддержка 32x?
У меня на стабильном тоже нет проблем.
Но я не помню, чтобы поддерхка 32-х разрядной архитектуры требовалась (у меня) кому-то из троллей.
Так что в принципе в предмете темы не вижу ничего невероятного.
:wq
--
Live free or die
Anarchist написал(а): SysA
Виноват, был неточен! :) имелось ввиду с
app-emulation/emul-linux-x86-*
наABI_X86="32"
, конечно.У меня уже был профиль с поддержкой мультилиба через
ABI_X86="32"
(не помню точно, как он назывался), который вчера выкинули + см. ответ выше.SysA написал(а): Правда я
Странно, не понял. С какого на какой профиль вы переключились??
Я бы тоже спокойно жил на QT-4.8.5, но последнее обновление портежа сказало, давай ABI меняй и все! профиль no-multilib не могу поставить, ибо есть 32-битные приложения (хотя бы тот же скайп). До этого всегда жил на стандартном профиле, который по умолчанию multilib.
Профиль:
http://pastebin.com/JDQYAW68
emerge --info
http://pastebin.com/ALXV2b4J
eix -sI qt
http://pastebin.com/cTajFJCN
georgedvo
Сейчас у меня
default/linux/amd64/13.0/desktop
.Нет, можно прекрасно и на стабильной версии жить, если аппликации не требуют нестабильности... просто вычищайте конфигурацию!
Если добавишь
ABI_X86="32 64"
в/etc/portage/make.conf
, это существенно упростит тебе жизнь. ;)SysA написал(а): Нет, можно
Спасибо, да надо будет заниматься на досуге. Уже порядочный бардак в /etc/portage/package.*.
К сожалению от скайпа не избавиться, поэтому пока приется тянуть такие зависимости
А не привидет ли это к избыточной сборке пакетов с ABI_X86="32" ??
Когда нужен multilib только для текущих зависимостей, может все же эффективней проставить их в package.use
(как предлагается в новости).
georgedvo написал(а): SysA
Конечно, будет избыточность, но я и не говорил, что это минималистический вариант!
Но для себя я решил, что мое время дороже дисковой памяти :) - слишком много возни...
Спасибо, всем за
Спасибо, всем за информацию.
Короче для себя решил...
1. Пока проставил все abi флаги вручную. Не так уж много получилось.
2. Надо заниматься чисткой конфигуарции, ибо уже пора.
3. Запостил баг, жду реакции сообщества.
4. Но и вот такое поделие позволило успешно завершить обновление мира и корректно пересобирать QT4 32/64битные версии
на багзилле рапортовал? патч
на багзилле рапортовал? патч приложил?
Пользуясь моментом, хочу передать привет друзьям, которые также пользуются "Моментом"
/
Баг #545106.
Относительно целесообразности приложения цитированного наколенного (чтобы собралось без явных косяков) патча не уверен.
Ссылку на тему на форуме (вместе с рекомендацией бурдуям изучать труды тов. Кропоткина) приложить можно.
:wq
--
Live free or die
georgedvo, скажите, кроме
georgedvo, скажите, кроме скайпа, какие у вас в системе ещё есть 32-битные блобы-бинарники?
только wine стоит
только wine стоит
georgedvo написал(а): только
Аккуратно предположу, что, возможно, стоит перейти на 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.
я не претендовал на универсальность патча, как раз предлагал обсудить правильный способ исправления.