Это не флуд и не провокация холиваров, мне действительно интересно. Ведь на то, чтобы освоить gentoo на уровне, достаточном для более-менее грамотной его сборки, нужно не так уж много времени.
Так почему опытные пользователи сидят, к примеру, на убунте?
> В любом случае у меня как у пользователя ПК есть желание что бы софт работал мгновенно после того как я захотел его иметь. Дебиан почти позволяет это, единственное ограничение - это скорость интернета. При пересборке всего дистрибутива (за что выступает топикстартер) это время очень сильно растягивается. А собирать пакеты (если это очень нужно) средствами пакетного менеджера можно и в Дебиане и в Федоре и еще много где.
Вы вообще читаете мои посты? Речь идёт как раз о уменьшении обьёмов скачаного трафика, а как следствие - более быстрой загрузки. при этом скорость непосредственно компиляции ничтожно мала т.к. собираются только отдельные библиотеки(0,5 - 1.0 сек./штука). А таких библиотек приобновлении и пересборки под новые USE-флаги. максимум 6-7 на одну софтину(это действительно максимум). И весят они порядка 15 кб.
> Под слабую машинку может смысл и есть, под современную вряд ли. Хотя... такой софт как ООо и кое что из гнома я бы с радостью пересобрал, только руки не доходят, да и лень... Потом все это чудо обновлять нужно.
Прошу прощения за переход на личности, но я сомневаюсь в Вашей компетентности. Вы, извините, собирали когда-нибудь Xorg? A gtk+? Прошу извинить, если это так. Просто не верится, что Вы не почувствовали разницы...
> Сколько времени вы потратили на переустановку системы после этого? За это время моя система уже была бы близка к идеалу производительности и удобства после пересборки ядра, glibc, gtk+ и Xorg-а.
Неслабый такой dist-upgrade рабочей дебиановской системы проходит за полчаса. Дебиановцы уже играют в веснот в то время, как гентушники ещё компилируют опенофис :о)
>Дебиановцы уже играют в веснот в то время, как гентушники ещё компилируют опенофис :о)
Целесообразность "опеноффисса" на десктопе весьма сомнительна, да и какой смысл пересобирать такой огромный хлам со всем остальным?
А Дебиан вчерашний, сам пока еще дебианщик, но уже ушел частями на генту, гента позволяет отключить всякий хлам типа биди, ненужных функций в к3б, и прочего мусора, вот если бы в дебиане были USE флаги..., то тогда все было бы хоккей, а так мой выбор - Гента.
> Нужно просто правильно использовать USE - флаги. Просто во многий софт по умолчанию включена поддержка технологий и средств, которые Вы никогда не будете использовать, а иногда даже и не слышали о таковых. И Вы сможете убрать эту КУЧУ лишней информации из софта, а как следствие и из оперативки только пересобиранием.
Угу, а потом, как один известный местный гентушник, будете ставить nero вместо k3b, потому что что-то криво собралось в кделибсах и теперь кнопка "отмена" в одном из диалоговых окон не работает :о) И на ваш багрепорт автор не сможет ответить, потому что не сумеет воспроизвести всю хитровы-нную комбинацию версий и юз-флагов. Выдохнул...
>> Дебиановцы уже играют в веснот в то время, как гентушники ещё компилируют опенофис :о) > Целесообразность "опеноффисса" на десктопе весьма сомнительна, да и какой смысл пересобирать такой огромный хлам со всем остальным?
Гек называет "мне не нужно" громкими словами "аргумент фетишиста". И, представь себе, я с ним согласен. > А Дебиан вчерашний, сам пока еще дебианщик, но уже ушел частями на генту, гента позволяет отключить всякий хлам типа биди, ненужных функций в к3б, и прочего мусора, вот если бы в дебиане были USE флаги..., то тогда все было бы хоккей, а так мой выбор - Гента.
ыыы, либастрал рулит. почитай моё предыдущее сообщение =)
Ну неужели Вы не можете отличить то, что пишу я от того, на что отвечает Dudraug? Я говорю о том, что в Gentoo компиляция необходимого минимума занимет мало времени, а мне отвечают, что в Дебиане зато установка происходит быстро.
Ну где тут логика? Не вызывает ничего кроме искренней улыбки)
Я полностью разделяю ваши позиции. Просто мы используем разные дистрибутивы. А это просто потому, что вначале своего линуксоидного пути я верил, что компиляция спасёт мир:) Теперь я более умерен, но навыки, которые я приобрёл в те славные времена помогают мне всегда иметь быструю и приятную систему, не проводя долгие часы созерцая процесс emerge --emptytree world:) Просто Gentoo позволяет делать это быстро и удобно)
>Прошу прощения за переход на личности, но я сомневаюсь в Вашей компетентности. Вы, извините, собирали когда-нибудь Xorg? A gtk+? Прошу извинить, если это так. Просто не верится, что Вы не почувствовали разницы...
Ни то ни другое я не пересобирал (можешь начинать кидаться в меня тапками ;), но смысла я в этом не вижу. И то и другое у меня летает, я не представляю как они могут работать быстрее, хотя у меня машинка далека от понятия "современная". Я долгое время убеждал себя что грамотная пересборка ядра дает прирост процентов на 30 в производительности. Но теперь я понимаю на сколько я заблуждался... Не хочу жить еще одной иллюзией. Возможно есть задачи, когда пересборка ядра дает прирост в производительности для таких задач, но мне это не нужно... А если будет нужно я пересоберу ядро - это несложно.
У меня есть претензии к отдельным приложениям и если я пересилю свою лень, то я наверное пересоберу их, хотя бы ради эксперимента.
Вопрос в том зачем возводить почти в религию "сборку из исходников"? Я просто этого не понимаю...
> 2. Пересобирать, как я уже говорил, надо тоже не всё.
Тут яватролли постоянно напоминают про несовместимость ABI, которой страдают C++-компиляторы. В частности, это ведёт к тому, что при обновлении g++ надо (ну не всегда, разумеется) перекомпилить все программы на цпп. Интересно, а как же это отслеживается в гентушных ебилдах? > 3. Вы слышали что-нибудь об утилите deltup? Думаю, что нет. А хотя бы о getdelta? Вряд ли. Эти утилиты позволяют даже в случае утери скачаного пакета качать не все сырцы, а только недостающую часть. А это очень экономит траффик. Сам пользуюсь)
>Я говорю о том, что в Gentoo компиляция необходимого минимума занимет мало времени
у меня не было возможности сравнить, я ставила Генту в VirtualBox, мне стало скучно на этапе " А теперь давайте соберем ядро для вашей новой системы " , я не знаю что вы называете "необходимым минимумом" , в любом случае поставить qt4 binary (еще и разрезаный на куски) будет быстрее чем выкачать те же исходники Qt и собирать их (celeron 1700) в течении 4 часов, даже если исходники предыдущей версии Qt у вас есть и вы их deltup'нули до новой версии, то все равно те же 4 часа на сборку... сэкономили только на траффике.
>Вопрос в том зачем возводить почти в религию "сборку из исходников"? Я просто этого не понимаю...
Blender есть такой знаете, так вот сбраныс с оптимизациями считает на 25 процентов быстрее гениричного из репов, есть еще масса софта который становится быстрее после оптимизаций.
>> Гек называет "мне не нужно" громкими словами "аргумент фетишиста". И, представь себе, я с ним согласен. > Хто такой Гек, и почему я с ним согласен?
man lor, man притяжательные_местоимения >> ыыы, либастрал рулит. почитай моё предыдущее сообщение =)
> Какой лиастрал, речь об убогости механизма apt-build.
>Blender есть такой знаете, так вот сбраныс с оптимизациями считает на 25 процентов быстрее гениричного из репов, есть еще масса софта который становится быстрее после оптимизаций.
Дело в том, что я не спорю. Вопрос в том, что я утверждаю, что нужно пересобирать только нужные тебе приложения и если это действительно тебе нужно (моя лень обычно говорит что мне это не нужно, но иногда я все же красноглазю), но заниматься пересборкой всего и вся...
>Тут яватролли постоянно напоминают про несовместимость ABI, которой страдают C++-компиляторы. В частности, это ведёт к тому, что при обновлении g++ надо (ну не всегда, разумеется) перекомпилить все программы на цпп. Интересно, а как же это отслеживается в гентушных ебилдах?
Ну допустим обновлять компилятор совсем не обязательно.
> Ни то ни другое я не пересобирал (можешь начинать кидаться в меня тапками ;), но смысла я в этом не вижу. И то и другое у меня летает, я не представляю как они могут работать быстрее, хотя у меня машинка далека от понятия "современная". Я долгое время убеждал себя что грамотная пересборка ядра дает прирост процентов на 30 в производительности. Но теперь я понимаю на сколько я заблуждался... Не хочу жить еще одной иллюзией. Возможно есть задачи, когда пересборка ядра дает прирост в производительности для таких задач, но мне это не нужно... А если будет нужно я пересоберу ядро - это несложно.
> У меня есть претензии к отдельным приложениям и если я пересилю свою лень, то я наверное пересоберу их, хотя бы ради эксперимента.
> Вопрос в том зачем возводить почти в религию "сборку из исходников"? Я просто этого не понимаю...
Я прошу Вас. Начните читать мои посты полностью.
Я уже не один раз утверждал, что я не сторонник сборки всего, что движется. Но Вам не кажется, что фраза "И то и другое у меня летает, я не представляю как они могут работать быстрее" немного смахивает на разговоры сторонников ОС Windows. Я не пробовал, но что пробовать, всё равно у меня лучше.
Я не хочу Вас обидеть, но выглядит это приблизительно так.
>> Тут яватролли постоянно напоминают про несовместимость ABI, которой страдают C++-компиляторы. В частности, это ведёт к тому, что при обновлении g++ надо (ну не всегда, разумеется) перекомпилить все программы на цпп. Интересно, а как же это отслеживается в гентушных ебилдах? > Ну допустим обновлять компилятор совсем не обязательно.
>Но Вам не кажется, что фраза "И то и другое у меня летает, я не представляю как они могут работать быстрее" немного смахивает на разговоры сторонников ОС Windows. Я не пробовал, но что пробовать, всё равно у меня лучше.
Нет не кажется. Все работает мгновенно, понимаешь, что такое мгновенно?
>Я уже не один раз утверждал, что я не сторонник сборки всего, что движется.
А в Дебиане пересобрать то что нужно невозможно? А если не пересобирать все какой тогда смысл в Генте? Зачем тогда создавалась такая мощная система сборок? Что бы пересобрать две либы? Сомневаюсь... Это культ - культ сборки из исходников. Разговор был именно об этом, а не о том нужно ли вообще что-либо пересобирать, я никогда не говорил что это не нужно, сам иногда балуюсь=) .
>> Понятно, гентушникам обновлять компиляторы "не нужно". Смачный слив. Внушает. > Слив то слив, никто не спорит. Я просто заметил, что обновления компилятора не является критически важным действом.
Но зачем-то ведь их обновляют? Например, захочется лямбд из c++09, а из в g++ 3.3 нема :)
> Тут яватролли постоянно напоминают про несовместимость ABI, которой страдают C++-компиляторы. В частности, это ведёт к тому, что при обновлении g++ надо (ну не всегда, разумеется) перекомпилить все программы на цпп. Интересно, а как же это отслеживается в гентушных ебилдах?
Если необходимо обновить компилятор, то при обновлении до определённой версии идёт проверка текущей версии и если интерфейсы ABI несовместимы, то вступают в силу зависимости, которые прописаны в самих ебилдах. Компилируется в последствии только необходимое.
> А ты слышал об утилите debdelta?
Слышал, но её не сравнить с getdelta.
1. Нет интеграции в менеджер пакетов.
2. Нет разветвлённой сети хранилищ дельт.
3. В debdelta нужно работать ручками, а в getdelta всё делается само.
И после этого вы будете говорить, что Ubuntu економит время? Возможно, но не в случае с debdelta.
>> Тут яватролли постоянно напоминают про несовместимость ABI, которой страдают C++-компиляторы. В частности, это ведёт к тому, что при обновлении g++ надо (ну не всегда, разумеется) перекомпилить все программы на цпп. Интересно, а как же это отслеживается в гентушных ебилдах? > Если необходимо обновить компилятор, то при обновлении до определённой версии идёт проверка текущей версии и если интерфейсы ABI несовместимы, то вступают в силу зависимости, которые прописаны в самих ебилдах. Компилируется в последствии только необходимое.
Примерчик ебилда имеется? >> А ты слышал об утилите debdelta?
> Слышал, но её не сравнить с getdelta. 1. Нет интеграции в менеджер пакетов.
> 3. В debdelta нужно работать ручками, а в getdelta всё делается само.
а в readme сказано другое > 2. Нет разветвлённой сети хранилищ дельт.
Зеркало репозитория оказывается гораздо более удобным. В том числе и из-за того, что экономия от дельт грошовая.
> А в Дебиане пересобрать то что нужно невозможно? А если не пересобирать все какой тогда смысл в Генте? Зачем тогда создавалась такая мощная система сборок? Что бы пересобрать две либы? Сомневаюсь... Это культ - культ сборки из исходников. Разговор был именно об этом, а не о том нужно ли вообще что-либо пересобирать, я никогда не говорил что это не нужно, сам иногда балуюсь=) .
Система эта нужна не только для того, чтобы пересобирать всё и вся, но ещё и для того, чтобы можно было собрать что-то правильно, красиво, быстро (именно быстро) и чтобы всё после этого работало.
В этом суть Gentoo.
Хотя, если есть время, то можно собрать и всё, хуже от этого не станет:)
# Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/gcc-4.3.2.ebuild,v 1.1 2008/10/04 21:13:28 halcy0n Exp $
PATCH_VER="1.0" UCLIBC_VER="1.0"
ETYPE="gcc-compiler"
# whether we should split out specs files for multiple {PIE,SSP}-by-default # and vanilla configurations. SPLIT_SPECS=no #${SPLIT_SPECS-true} hard disable until #106690 is fixed
inherit toolchain
DESCRIPTION="The GNU Compiler Collection. Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking"
Ну и? Где здесь выражена логика "Если необходимо обновить компилятор, то при обновлении до определённой версии идёт проверка текущей версии и если интерфейсы ABI несовместимы, то вступают в силу зависимости, которые прописаны в самих ебилдах. Компилируется в последствии только необходимое."
Да, и просьба не "на пальцах" рассказывать, а потрудиться добыть ссылку на документацию с описанием этого поведения.
>> Да, и просьба не "на пальцах" рассказывать, а потрудиться добыть ссылку на документацию с описанием этого поведения. > Такое поведение не реализуется ебилдом. Его реализует сам менеджер пакетов. Ебилд только несёт информацию о том, что делать с даными сорсами.
Слов recompile, rebuild или abi нагрепать по ссылке не удалось. Просьба выложить здесь релевантный экстракт сего труда.
Кроме того несовместимость ABI есть достаточно частный симптом, я, например, за все свои пересборки с таким не сталкивался... Но верю, что подобное случается.
В любом случае было бы глупо искать информацию об очень конкретной проблеме в общей энциклопедии по ебилдам или emerge.
> Кому-то компьютер нужен, чтобы дрочить на вывод компилятора. Но большинству, всё таки для работы.
Имею основания думать, что Вы не читали весь топик. Здесь люди как раз обсуждают, как построить отношения с дистрибутивом таким образом, чтобы получить максимальный выигрыш. Под максимальным выиграшем я подразумеваю наилучшее соотношение прирост_производительности/затраченое_время. Имхо он достигается при компиляции всего нескольких пакетов. Их я уже перечислял, читатйте топик, если Вас это интересует.
У меня пакеты по выбору GCC или ICC собираются. Выигрыш от ICC заметен (см мой топик по теме), но глюкиии... Так что годится не как системный компилятор, а для отдельных пакетов.
насчет icc была мягко говоря провокация, рекомендации собрать p7zip или свежий gimp привели бы к тому что 7zip не распаковывал бы архивы, утверждая что они битые. а gimp бы грузил картинки как прозрачный фон ( ICC 11.0 с 10.0 - нормально)
там выше тестик есть с gzip
если i486 взять за 100%, то core2 архитектура дает около 8%, а вот icc 15%
> С упомянутыми библиотеками проблем не помню. Может, в ~arch проблемы были?
У libssl менялось API при переходе с версии 0.9.7 на 0.9.8. Этого нельзя было пропустить.
Вот тут пишут, что были проблемы с expat: http://test.gentoo.ru/node/8478#comment-58892 . > А про bluez-utils - я, вот, после Gentoo не понимаю, как система может хотеть снести что-то, что я _сам_ ставил, а не по зависимостям...
Иногда чтение того, что пишет аптитуда, помогает избавиться от таких гаданий по удалённым пакетам :)
Такое бывает в тестируемых или нестабильных дистрибутивах, когда обновилась какая-то либа, на которую у пакета стоит жёсткая зависимость, а сам пакет ещё не обновили. И такая ситуация разруливается штатными средствами аптитуды, главное только сказать "а вот этот пакет удалять не смей".
Не вижу в этой куче буковок нужного. Покажи. > Кроме того несовместимость ABI есть достаточно частный симптом, я, например, за все свои пересборки с таким не сталкивался... Но верю, что подобное случается.
Если ты на грабли ещё не встал, то это не повод говорить, что их не существует.
обновление glibc иногда ведет к тому что собраные для старой версии glibc программы будут падать ( не все, но некоторые будут, procps, coreutils особенно часто падают)
Фух... Это так, для всех. Только что нашёл в исходниках процедуру. отвечающую за вычисление зависимостей при изменении USE-флагов.
def dep_getusedeps( depend ): """ Pull a listing of USE Dependencies out of a dep atom. Example usage: >>> dep_getusedeps('app-misc/test:3[foo][-bar]') ['foo','-bar'] @param depend: The depstring to process @type depend: String @rtype: List @return: List of use flags ( or [] if no flags exist ) """ use = getattr(depend, "use", None) if use is not None and hasattr(use, "tokens"): return use.tokens use_list = [] open_bracket = depend.find('[') # -1 = failure (think c++ string::npos) while( open_bracket != -1 ): close_bracket = depend.find(']', open_bracket ) if close_bracket == -1: raise InvalidAtom("USE Dependency with no closing bracket: %s" % depend ) use = depend[open_bracket + 1: close_bracket] # foo[1:1] may return '' instead of None, we don't want '' in the result if len(use): use_list.append(use) else: raise InvalidAtom("USE Dependency with no use flag ([]): %s" % depend ) # Find next use flag open_bracket = depend.find( '[', open_bracket+1 ) return tuple(use_list)
А что вы здесь все про Генту. И чем оно так сильно рулит? Что оно надежнее других или может как-то быстрее загружается, или красивей, или веселее в чем-то? Нет, я не против, но не делайте других дураками.
Функция определения пакетов, которые не будут работать после обновления лежит здесь. Это не флуд. Я перелопатил пер этим в пятьдесят раз больше сырцов. Вы заставили меня КОНКРЕТНО попотеть, gaa. Это функция "def dep_zapdeps". Остальные две принимают в этом непосредственное участие. Я не кидал сюда совсем уж базисные функции которые безусловно тоже крайне важны для emerge-a.
def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None): if trees is None: global db trees = db writemsg("ZapDeps -- %s\n" % (use_binaries), 2) if not reduced or unreduced == ["||"] or dep_eval(reduced): return [] if unreduced[0] != "||": unresolved = [] for dep, satisfied in izip(unreduced, reduced): if isinstance(dep, list): unresolved += dep_zapdeps(dep, satisfied, myroot, use_binaries=use_binaries, trees=trees) elif not satisfied: unresolved.append(dep) return unresolved deps = unreduced[1:] satisfieds = reduced[1:] preferred = [] preferred_any_slot = [] possible_upgrades = [] other = [] parent = trees[myroot].get("parent") graph_db = trees[myroot].get("graph_db") vardb = None if "vartree" in trees[myroot]: vardb = trees[myroot]["vartree"].dbapi if use_binaries: mydbapi = trees[myroot]["bintree"].dbapi else: mydbapi = trees[myroot]["porttree"].dbapi for dep, satisfied in izip(deps, satisfieds): if isinstance(dep, list): atoms = dep_zapdeps(dep, satisfied, myroot, use_binaries=use_binaries, trees=trees) else: atoms = [dep] if not vardb: other.append((atoms, None, False)) continue all_available = True versions = {} for atom in atoms: avail_pkg = mydbapi.match(atom) if avail_pkg: avail_pkg = avail_pkg[-1] # highest (ascending order) avail_slot = "%s:%s" % (dep_getkey(atom), mydbapi.aux_get(avail_pkg, ["SLOT"])[0]) if not avail_pkg: all_available = False break versions[avail_slot] = avail_pkg this_choice = (atoms, versions, all_available) if all_available: all_installed = True for atom in set([dep_getkey(atom) for atom in atoms]): if not vardb.match(atom) and not atom.startswith("virtual/"): all_installed = False break all_installed_slots = False if all_installed: all_installed_slots = True for slot_atom in versions: if not vardb.match(slot_atom) and \ not slot_atom.startswith("virtual/"): all_installed_slots = False break if all_installed: if all_installed_slots: preferred.append(this_choice) else: preferred_any_slot.append(this_choice) elif graph_db is None: possible_upgrades.append(this_choice) else: all_in_graph = True for slot_atom in versions: if not graph_db.match(slot_atom) and \ not slot_atom.startswith("virtual/"): all_in_graph = False break if all_in_graph: if parent is None: preferred.append(this_choice) else: cpv_slot_list = [parent] circular_atom = None for atom in atoms: if "!" == atom[:1]: continue if vardb.match(atom): continue if dep_getkey(atom) != parent.cp: continue if match_from_list(atom, cpv_slot_list): circular_atom = atom break if circular_atom is None: preferred.append(this_choice) else: other.append(this_choice) else: possible_upgrades.append(this_choice) else: other.append(this_choice) preferred.extend(preferred_any_slot) preferred.extend(possible_upgrades) possible_upgrades = preferred[1:] for possible_upgrade in possible_upgrades: atoms, versions, all_available = possible_upgrade myslots = set(versions) for other_choice in preferred: if possible_upgrade is other_choice: break o_atoms, o_versions, o_all_available = other_choice intersecting_slots = myslots.intersection(o_versions) if not intersecting_slots: continue has_upgrade = False has_downgrade = False for myslot in intersecting_slots: myversion = versions[myslot] o_version = o_versions[myslot] difference = pkgcmp(catpkgsplit(myversion)[1:], catpkgsplit(o_version)[1:]) if difference: if difference > 0: has_upgrade = True else: has_downgrade = True break if has_upgrade and not has_downgrade: preferred.remove(possible_upgrade) o_index = preferred.index(other_choice) preferred.insert(o_index, possible_upgrade) break preferred.extend(other) for allow_masked in (False, True): for atoms, versions, all_available in preferred: if all_available or allow_masked: return atoms assert(False)
def dep_expand(mydep, mydb=None, use_cache=1, settings=None): if not len(mydep): return mydep if mydep[0]=="*": mydep=mydep[1:] orig_dep = mydep mydep = dep_getcpv(orig_dep) myindex = orig_dep.index(mydep) prefix = orig_dep[:myindex] postfix = orig_dep[myindex+len(mydep):] expanded = cpv_expand(mydep, mydb=mydb, use_cache=use_cache, settings=settings) try: return portage.dep.Atom(prefix + expanded + postfix) except portage.exception.InvalidAtom: # Missing '=' prefix is allowed for backward compatibility. if not isvalidatom("=" + prefix + expanded + postfix): raise return portage.dep.Atom("=" + prefix + expanded + postfix)
def dep_check(depstring, mydbapi, mysettings, use="yes", mode=None, myuse=None, use_cache=1, use_binaries=0, myroot="/", trees=None): """Takes a depend string and parses the condition.""" edebug = mysettings.get("PORTAGE_DEBUG", None) == "1" #check_config_instance(mysettings) if trees is None: trees = globals()["db"] if use=="yes": if myuse is None: myusesplit = mysettings["PORTAGE_USE"].split() else: else: myusesplit=[] try: mysplit = portage.dep.paren_reduce(depstring) except portage.exception.InvalidDependString, e: return [0, str(e)] mymasks = set() useforce = set() useforce.add(mysettings["ARCH"]) if use == "all": mymasks.update(mysettings.usemask) mymasks.update(mysettings.archlist()) mymasks.discard(mysettings["ARCH"]) useforce.update(mysettings.useforce) useforce.difference_update(mymasks) try: mysplit = portage.dep.use_reduce(mysplit, uselist=myusesplit, masklist=mymasks, matchall=(use=="all"), excludeall=useforce) except portage.exception.InvalidDependString, e: return [0, str(e)] mysplit=portage.dep.dep_opconvert(mysplit) if mysplit == []: return [1,[]] try: mysplit = _expand_new_virtuals(mysplit, edebug, mydbapi, mysettings, use=use, mode=mode, myuse=myuse, use_cache=use_cache, use_binaries=use_binaries, myroot=myroot, trees=trees) except portage.exception.ParseError, e: return [0, str(e)] mysplit2=mysplit[:] mysplit2=dep_wordreduce(mysplit2,mysettings,mydbapi,mode,use_cache=use_cache) if mysplit2 is None: return [0,"Invalid token"] writemsg("\n\n\n", 1) writemsg("mysplit: %s\n" % (mysplit), 1) writemsg("mysplit2: %s\n" % (mysplit2), 1) myzaps = dep_zapdeps(mysplit, mysplit2, myroot, use_binaries=use_binaries, trees=trees) mylist = flatten(myzaps) writemsg("myzaps: %s\n" % (myzaps), 1) writemsg("mylist: %s\n" % (mylist), 1) #remove duplicates mydict={} for x in mylist: mydict[x]=1 writemsg("mydict: %s\n" % (mydict), 1) return [1,mydict.keys()]