x86_64-pc-linux-gnu-g++ -DHAVE_CONFIG_H -I. -I.. -DSYSCONFDIR=\"/etc\" -DLOCALEDIR=\"/usr/share/locale\" -march=native -O2 -pipe -ggdb -frecord-gcc-switches -c -o versionsort.o versionsort.cc In file included from ./portage/extendedversion.h:21, from ./cache/base.h:24, from cache/cachetable.h:19, from eix-update.cc:21: ./eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ In file included from database/header.h:22, from eix-diff.cc:19: ./eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ In file included from ./database/header.h:22, from various/cli.cc:16: ./eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ In file included from masked-packages.cc:27: eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ In file included from database/header.h:22, from eix.cc:21: ./eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ x86_64-pc-linux-gnu-g++ -DHAVE_CONFIG_H -I. -I.. -DSYSCONFDIR=\"/etc\" -DLOCALEDIR=\"/usr/share/locale\" -march=native -O2 -pipe -ggdb -frecord-gcc-switches -c -o eix-header.o eix-header.cc x86_64-pc-linux-gnu-g++ -DHAVE_CONFIG_H -I. -I.. -DSYSCONFDIR=\"/etc\" -DLOCALEDIR=\"/usr/share/locale\" -march=native -O2 -pipe -ggdb -frecord-gcc-switches -c -o eix-drop-permissions.o eix-drop-permissions.cc In file included from versionsort.cc:25: eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ make[2]: *** [Makefile:1689: masked-packages.o] Error 1 make[2]: *** Waiting for unfinished jobs.... make[2]: *** [Makefile:1689: versionsort.o] Error 1 make[2]: *** [Makefile:1689: various/cli.o] Error 1 In file included from database/header.h:22, from eix-header.cc:19: ./eixTk/stringutils.h:221:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ 221 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:217:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool, const char*)’ previously defined here 217 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape, const char *at) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:233:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&, bool)’ 233 | inline static void split_string(WordUnorderedSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:229:20: note: ‘void split_string(WordUnorderedSet*, const string&, bool)’ previously defined here 229 | inline static void split_string(WordSet *vec, const std::string& str, bool handle_escape) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:245:20: error: redefinition of ‘void split_string(WordUnorderedSet*, const string&)’ 245 | inline static void split_string(WordUnorderedSet *vec, const std::string& str) { | ^~~~~~~~~~~~ ./eixTk/stringutils.h:241:20: note: ‘void split_string(WordUnorderedSet*, const string&)’ previously defined here 241 | inline static void split_string(WordSet *vec, const std::string& str) { | ^~~~~~~~~~~~ make[2]: *** [Makefile:1689: eix-update.o] Error 1 make[2]: *** [Makefile:1689: eix-diff.o] Error 1 make[2]: *** [Makefile:1689: eix-header.o] Error 1 make[2]: *** [Makefile:1689: eix.o] Error 1 make[2]: Leaving directory '/var/tmp/portage/app-portage/eix-0.36.1/work/eix-0.36.1/src' make[1]: *** [Makefile:529: all-recursive] Error 1 make[1]: Leaving directory '/var/tmp/portage/app-portage/eix-0.36.1/work/eix-0.36.1' make: *** [Makefile:449: all] Error 2 * ERROR: app-portage/eix-0.36.1::gentoo failed (compile phase): * emake failed * * If you need support, post the output of `emerge --info '=app-portage/eix-0.36.1::gentoo'`, * the complete build log and the output of `emerge -pqv '=app-portage/eix-0.36.1::gentoo'`. * The complete build log is located at '/var/tmp/portage/app-portage/eix-0.36.1/temp/build.log'. * The ebuild environment file is located at '/var/tmp/portage/app-portage/eix-0.36.1/temp/environment'. * Working directory: '/var/tmp/portage/app-portage/eix-0.36.1/work/eix-0.36.1' * S: '/var/tmp/portage/app-portage/eix-0.36.1/work/eix-0.36.1'
Thanks for reporting. This is due to the ebuild removing all *FLAG mangling by default and thus compiling eix with an ancient C++ dialect which does not have std::unordered_set (std::ordered_set is used as a substitute which breaks here because it causes a duplicate signature). Anyway, eix is meant to compile also with such old dialects (though running less efficiently as one can see with this example, and usually not well tested), so this is a valid eix bug which will be fixed in 0.36.2.
The bug has been closed via the following commit(s): https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ae6415caaae850c73c9d53515a7156dfeabe4b52 commit ae6415caaae850c73c9d53515a7156dfeabe4b52 Author: Sam James <sam@gentoo.org> AuthorDate: 2022-04-15 04:39:40 +0000 Commit: Sam James <sam@gentoo.org> CommitDate: 2022-04-15 04:39:45 +0000 app-portage/eix: add 0.36.2 Closes: https://bugs.gentoo.org/838358 Signed-off-by: Sam James <sam@gentoo.org> app-portage/eix/Manifest | 1 + app-portage/eix/eix-0.36.2.ebuild | 103 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+)
(In reply to Martin Väth from comment #1) > Thanks for reporting. This is due to the ebuild removing all *FLAG mangling > by default and thus compiling eix with an ancient C++ dialect which does not > have std::unordered_set (std::ordered_set is used as a substitute which > breaks here because it causes a duplicate signature). > I'm not convinced gnu++17 (default w/ GCC 11) is ancient. Anyway, I don't actually see why we should be adding --disable-new_dialect in the ebuild. The rest I understand mostly, but not that one.
(In reply to Sam James from comment #3) > > I'm not convinced gnu++17 (default w/ GCC 11) is ancient. No, gnu++17 is not ancient. Even c++1[1yz4] or gnu++1[1yz4] would be new enough to have std::unordered_set, and the problem would not occur if the dialect would be at least this. I assume that the compiler used in the report is older.