Hi, it took me a while to figure out why configure complained that I did not specify a host target type. Below are two bad approaches. In the first case below you can see there were two spaces in front of the '--enable-mpi' and that configure complained that econf did not provide --target, which it never does for me so (tested with coreutils package behaviour)) doubt in this particular case it is really necessary. The second is just an attempt to avoid two spaces in front of '--enable-mpi' (successfull, so do not look for the two spaces there) but the configure broke completely. Case 1: src_compile(){ local myconf="" if use mpi; then myconf="${myconf} --enable-mpi" fi if use threads; then myconf="${myconf} --enable-pthreads" fi econf "${myconf}" || die [cut] >>> Emerging (1 of 1) sci-biology/wcd-0.6.0 from science * wcd-0.6.0.tar.gz RMD160 SHA1 SHA256 size ;-) ... [ ok ] * Package: sci-biology/wcd-0.6.0 * Repository: science * Maintainer: mmokrejs@gentoo.org sci-biology@gentoo.org * USE: elibc_glibc kernel_linux mpi threads userland_GNU x86 >>> Unpacking source... >>> Unpacking wcd-0.6.0.tar.gz to /var/tmp/portage/sci-biology/wcd-0.6.0/work >>> Source unpacked in /var/tmp/portage/sci-biology/wcd-0.6.0/work >>> Compiling source in /var/tmp/portage/sci-biology/wcd-0.6.0/work/wcd-0.6.0 ... * econf: updating wcd-0.6.0/config.guess with /usr/share/gnuconfig/config.guess * econf: updating wcd-0.6.0/config.sub with /usr/share/gnuconfig/config.sub ./configure --prefix=/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --enable-mpi --enable-pthreads configure: WARNING: you should use --build, --host, --target configure: WARNING: invalid host type: --enable-mpi --enable-pthreads [cut] # cp /var/tmp/portage/sci-biology/wcd-0.6.0/work/wcd-0.6.0/config.guess /tmp/config.guess_invalid_host # cp /var/tmp/portage/sci-biology/wcd-0.6.0/work/wcd-0.6.0/config.sub /tmp/config.sub_invalid_host Case 2: src_compile(){ local myconf="" if use mpi; then myconf="--enable-mpi" fi if use threads; then myconf="${myconf} --enable-pthreads" fi econf "${myconf}" || die [cut] >>> Emerging (1 of 1) sci-biology/wcd-0.6.0 from science * wcd-0.6.0.tar.gz RMD160 SHA1 SHA256 size ;-) ... [ ok ] * Package: sci-biology/wcd-0.6.0 * Repository: science * Maintainer: mmokrejs@gentoo.org sci-biology@gentoo.org * USE: elibc_glibc kernel_linux mpi threads userland_GNU x86 >>> Unpacking source... >>> Unpacking wcd-0.6.0.tar.gz to /var/tmp/portage/sci-biology/wcd-0.6.0/work >>> Source unpacked in /var/tmp/portage/sci-biology/wcd-0.6.0/work >>> Compiling source in /var/tmp/portage/sci-biology/wcd-0.6.0/work/wcd-0.6.0 ... * econf: updating wcd-0.6.0/config.guess with /usr/share/gnuconfig/config.guess * econf: updating wcd-0.6.0/config.sub with /usr/share/gnuconfig/config.sub ./configure --prefix=/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --enable-mpi --enable-pthreads configure: error: invalid feature name: mpi --enable-pthreads * ERROR: sci-biology/wcd-0.6.0 failed: * econf failed * * Call stack: * ebuild.sh, line 56: Called src_compile * environment, line 2674: Called econf '--enable-mpi --enable-pthreads' [cut] # cp /var/tmp/portage/sci-biology/wcd-0.6.0/work/wcd-0.6.0/config.guess /tmp/config.guess_invalid_feature_mpi # cp /var/tmp/portage/sci-biology/wcd-0.6.0/work/wcd-0.6.0/config.sub /tmp/config.sub_invalid_feature_mpi In the end, I found out that I have extra double quotes on the econf line. Is there anything ebuild(1) or less preferably repoman(1) or other tool could do for me?
Created attachment 256829 [details] wcd-0.6.0.ebuild A testcase ebuild. Actually, in its fixed form but you can easily add the missing quotes to play with this.
$ emerge --info Portage 2.1.9.25 (default/linux/x86/10.0/desktop, gcc-4.5.1, glibc-2.12.1-r3, 2.6.27.56 i686) ================================================================= System uname: Linux-2.6.27.56-i686-Mobile_Intel-R-_Pentium-R-_4_-_M_CPU_1.80GHz-with-gentoo-2.0.1 Timestamp of tree: Thu, 09 Dec 2010 18:45:03 +0000 distcc 3.1 i686-pc-linux-gnu [enabled] app-shells/bash: 4.1_p9 dev-java/java-config: 1.3.7-r1, 2.1.11-r2 dev-lang/python: 2.5.4-r4, 2.6.6-r1, 2.7.1, 3.1.3 dev-util/cmake: 2.8.1-r2 sys-apps/baselayout: 2.0.1-r1 sys-apps/openrc: 0.6.7 sys-apps/sandbox: 2.4 sys-devel/autoconf: 2.13::<unknown repository>, 2.68 sys-devel/automake: 1.4_p6-r1, 1.5-r1, 1.6.3-r1, 1.7.9-r2, 1.8.5-r4, 1.9.6-r3, 1.10.3, 1.11.1 sys-devel/binutils: 2.20.1-r1 sys-devel/gcc: 3.3.6-r1, 4.2.4-r1, 4.3.5, 4.4.5, 4.5.1-r1 sys-devel/gcc-config: 1.4.1 sys-devel/libtool: 2.4-r1 sys-devel/make: 3.81-r2 virtual/os-headers: 2.6.36.1 (sys-kernel/linux-headers) ACCEPT_KEYWORDS="x86 ~x86" ACCEPT_LICENSE="* -@EULA dlj-1.1 sun-bcla-java-vm Nero-EULA-US skype-eula AdobeFlash AdobeFlash-10 AdobeFlash-10.1" CBUILD="i686-pc-linux-gnu" CFLAGS="-O2 -march=pentium4 -mmmx -msse -msse2 -pipe -fno-strict-aliasing -ggdb" CHOST="i686-pc-linux-gnu" CONFIG_PROTECT="/etc /var/bind /var/lib/hsqldb /var/qmail/alias /var/qmail/control /var/vpopmail/etc" CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/env.d /etc/env.d/java/ /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/php/apache2-php5.3/ext-active/ /etc/php/cgi-php5.3/ext-active/ /etc/php/cli-php5.3/ext-active/ /etc/revdep-rebuild /etc/sandbox.d /etc/terminfo /etc/texmf/language.dat.d /etc/texmf/language.def.d /etc/texmf/updmap.d /etc/texmf/web2c" CXXFLAGS="-O2 -march=pentium4 -mmmx -msse -msse2 -pipe -fno-strict-aliasing -ggdb" DISTDIR="/usr/portage/distfiles" FEATURES="assume-digests binpkg-logs distcc distlocks fixlafiles fixpackages metadata-transfer news nostrip parallel-fetch protect-owned sandbox sfperms splitdebug strict unknown-features-warn unmerge-logs unmerge-orphans userfetch" GENTOO_MIRRORS="http://gentoo.mirror.web4u.cz" LDFLAGS="-Wl,-O1 -Wl,--as-needed" LINGUAS="en cs cz" MAKEOPTS="-j6" PKGDIR="/usr/portage/packages" PORTAGE_CONFIGROOT="/" PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --compress --force --whole-file --delete --stats --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages" PORTAGE_TMPDIR="/var/tmp" PORTDIR="/usr/portage" PORTDIR_OVERLAY="/usr/local/portage /home/mmokrejs/proj/sci" SYNC="rsync://rsync.europe.gentoo.org/gentoo-portage" USE="32bit 7zip R X Xaw3d a52 aac aalib ace acl acpi alsa amr amrnb amrwb apache audacious audiofile bash-completion bcmath berkdb blas bluetooth boost branding bzip2 cairo caps cblas cddb cdparanoia cdr cgi clamav cli colordiff compress consolekit cpio cracklib crypt cscope css ctype cups curl curlwrappers cxx dbi dbus dga dia directfb djbfft dri dts dv dvb dvd dvdr dvdread emboss emf enblend encode enscript exif expat faad fam fame fat fbcon ffmpeg fftw firefox flac flash fontconfig fortran fpx ftp gcj gd gdbm ggi gif gimp gimpprint glibc-compat20 glibc-omitfp glut gmp gnuplot gnutls gpgme gphoto2 gpm graphviz gs gsl gsm gtk gtkhtml hal hdf hdf5 hp2xx i8x0 icc iconv icu id3 id3tag ieee1394 imagemagick imlib inifile innodb ithreads jack java javascript jbig jce jikes jpeg jpeg2k kdtree kerberos ladspa lame lapack laptop lcms leim libcaca libnotify libwww live lzo lzw mad maildir matroska mhash mikmod mime ming mjpeg mmap mmx mng mod_python modperl modplug modules motif mozilla moznoirc mp2 mp3 mp4 mpeg mpi mpi_njtree mpich2 mplayer mudflap mule musepack mxdatetime mysql mysqli nat ncurses netcdf netpbm network nls nntp nptl nptlonly nsplugin ntfs numeric objc ogg opengl openmp openssl pam pango pcmcia pcntl pcre pdf perl plotutils plugin png pnm postproc postscript ppds pppd procmail pymol python qt3support qt4 quicktime rar raw readline recode reiserfs romio rpm samba sasl scanner scp sdl seamonkey server session sftp sift slp smime sndfile soap sockets spell sqlite srt sse sse2 ssl startup-notification static-libs subtitles subversion svg svgz sysfs sysvipc t1lib tcl tcpd theora threads tidy tiff tk transcode truetype unicode urandom usb userlocales utils uuencode v4l v4l2 vcd vhook vim-syntax vim-with-x vorbis wavpack wifi win32codecs wmf wxwindows x264 x86 xanim xcb xcf xfs xft xinerama xinetd xml xorg xpm xsl xslt xulrunner xv xvid xvmc yv12 zip zlib" ALSA_CARDS="intel-8x0m" ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol" APACHE2_MODULES="actions alias auth_basic auth_digest authn_anon authn_dbd authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi dbd deflate dir disk_cache env expires ext_filter file_cache filter headers ident imagemap include info log_config mem_cache mime mime_magic rewrite setenvif speling status unique_id userdir usertrack vhost_alias negotiation" COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" ELIBC="glibc" GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf superstar2 timing tsip tripmate tnt ubx" INPUT_DEVICES="keyboard mouse evdev" KERNEL="linux" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LINGUAS="en cs cz" PHP_TARGETS="php5-2" RUBY_TARGETS="ruby18" USERLAND="GNU" VIDEO_CARDS="radeon vesa" XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account" Unset: CPPFLAGS, CTARGET, EMERGE_DEFAULT_OPTS, FFLAGS, INSTALL_MASK, LANG, LC_ALL, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS
(In reply to comment #0) > econf "${myconf}" || die This is incorrect. You are passing all the arguments as a single arg. You should not quote ${myconf}, or use an array.
I merely ;) understand but wonder: - why it breaks in the way so that configure claims no --target was specified, which is puzzling - I still think there could be a check that quotes are on an econf line But, as you wish. ;)
(In reply to comment #4) > I merely ;) understand but wonder: > - why it breaks in the way so that configure claims no --target was specified, > which is puzzling The call stack in the die message makes it obvious that there is a quoting problem in the econf call: * ERROR: sci-biology/wcd-0.6.0 failed: * econf failed * * Call stack: * ebuild.sh, line 56: Called src_compile * environment, line 2674: Called econf '--enable-mpi --enable-pthreads' > - I still think there could be a check that quotes are on an econf line Such a check is not necessary because the problem is easy to diagnose as said above.
(In reply to comment #5) > (In reply to comment #4) > > I merely ;) understand but wonder: > > - why it breaks in the way so that configure claims no --target was specified, > > which is puzzling > > The call stack in the die message makes it obvious that there is a quoting > problem in the econf call: > > * ERROR: sci-biology/wcd-0.6.0 failed: > * econf failed > * > * Call stack: > * ebuild.sh, line 56: Called src_compile > * environment, line 2674: Called econf '--enable-mpi --enable-pthreads' You mean as there is no '--prefix=/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib' as well on that line I should have realized a quoting problem on the econf line? Well, I am an ebuild-writing newbie so I really do not want to argue. Just wanted to give some feedback because it was tricky to me. Of course it takes a while until one learns how to interpret error messages. Will try to take care of it myself. ;-)
No, the key thing to notice is that '--enable-mpi --enable-pthreads' is invalid since you should never have more than one --foo-bar option inside a pair of quotes like that.
(In reply to comment #4) > - why it breaks in the way so that configure claims no --target was specified, > which is puzzling It doesn't claim it was not specified. It just notices unmatched arg, which way host was specified in the past. In other words, if you run configure like the following: $ ./configure i686-pc-linux-gnu You'll notice configure uses that and complains in the same way. The same is going to happen if you pass totally random, non-argument junk.
(In reply to comment #7) > No, the key thing to notice is that '--enable-mpi --enable-pthreads' is invalid > since you should never have more than one --foo-bar option inside a pair of > quotes like that. I see what you meant with the list previously ..., so what I would be thinking of doing is something about: if not isinstance(_myvar, list): if (isinstance(_myvar, stringtype) and not len(_myvar.split("'")) == 2): raise else: if len(_myvar) == 1 and "'" in _myvar[0]: raise It is not carefully coded and I see cases when it will break .. but I know I will not convince you anyway ... .;) But I got your points.
(In reply to comment #8) > (In reply to comment #4) > > - why it breaks in the way so that configure claims no --target was specified, > > which is puzzling > > It doesn't claim it was not specified. It just notices unmatched arg, which > way host was specified in the past. > > In other words, if you run configure like the following: > $ ./configure i686-pc-linux-gnu > > You'll notice configure uses that and complains in the same way. The same is > going to happen if you pass totally random, non-argument junk. Yes, and that is where portage could pre-filter the input from the 'user', because configure is careless and just breaks e.g. --enable-mpi into just 'mpi' and one just dreams about some ugly magic behind breaking on `-' separators. And portage just allows me to exploit such bugs while it could be helpful. ;)
Seriously, it's jut not worth it to add code to try to detect these kinds of errors when they're easy enough to diagnose with a little experience.
it's similar to unpack "${A}" (which is wrong also)
(In reply to comment #11) +1