Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Nov 2009 06:56:13 +0000
From:      "b. f." <bf1783@googlemail.com>
To:        freebsd-questions@FreeBSD.org
Cc:        dougb@FreeBSD.org, Scott Bennett <bennett@cs.niu.edu>
Subject:   Re: math/py-numpy vs. math/atlas-devel
Message-ID:  <d873d5be0911082256y5c35d288i13b40f8d6e1f6285@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Scott Bennett wrote:
>I would like to install science/gnudatalanguage but have been running
>into various obstacles.  Lars Engels very kindly just fixed one of them
>(devel/lasi) (Thanks, Lars!), so now I'm on to the next one, which may not
>be a showstopper, but it's at least a nuisance.  One of the gnudatalanguage
>dependencies is math/py-numpy, which, in turn, depends upon math/atlas.
>However, I have math/atlas-devel installed and do not wish to revert to an
>older, slower version of the ATLAS library.  Adding a "-x atlas-\*" onto
>the portmaster command to build math/py-numpy fails to prevent portmaster
>from trying to build math/atlas.  Creating a
>/var/db/pkg/atlas-3.8.3_1,1/+IGNOREME file in addition doesn't help.  How
>can I force math/py-numpy to accept the already installed math/atlas-devel
>libraries?
>Thanks in advance for any help!


Congratulations, you've managed to defeat three sets of safeguards in
portmaster.

Problem #1

math/atlas and math/atlas-devel don't have proper CONFLICTS entries in
their Makefiles (this should be fixed), so the following code in
portmaster, from dependency_check ():


   1612                 conflicts=''
   1613                 if pm_cd $d_port; then
   1614                         grep -ql ^CONFLICTS Makefile &&
   1615                                 conflicts=`pm_make_b -V CONFLICTS`
   1616                 else
   1617                         fail "Cannot cd to $d_port"
   1618                 fi
   1619                 for glob in $conflicts; do
   1620                         confl_p=`pkg_info -I $glob 2>/dev/null`
   1621                         if [ -n "$confl_p" ]; then
   1622                                 confl_p=${confl_p%% *}
   1623                                 echo ''
   1624                                 echo "===>>> The dependency
for ${origin}"
   1625                                 echo "       seems to be
handled by $confl_p"
   1626                                 echo ''
   1627                                 d_port="$pd/`origin_from_pdb $confl_p`"
   1628                         fi
   1629                 done

doesn't substitute your alternative dependency, math/atlas-devel, for
math/atlas.


 Problem #2:

You're using the -x flag incorrectly.  Or portmaster isn't
implementing it properly when the port to be excluded is not actually
installed, take your pick.  It's not completely fool-proof.  Since you
don't have math/atlas installed, the code in portmaster's
dependency_check ():

   1632                 origin="${d_port#$pd/}" ;
iport=`iport_from_origin ${origin}`
   1633
   1634                 if [ -n "$iport" ]; then
   1635                         check_exclude $iport || continue
   1636                 else
   1637                         check_exclude $origin || continue
   1638                 fi

   gives origin="math/atlas", and then uses:

    385 iport_from_origin () {
    386         local dir
    387         dir=`grep -l "@comment ORIGIN:${1}$" $pdb/*/+CONTENTS`
    388
    389         # It should not happen that more than one port meets this
    390         # requirement, but it can if the pkg data is corrupted.
    391         dir="${dir%%/+CONTENTS*}"
    392         echo ${dir#$pdb/}
    393 }

to find that iport="" , so "check_exclude math/atlas" is called. Then,
in accordance with:

   1483 check_exclude () {
   1484         [ -n "$PM_EXCL" ] || return 0
   1485
   1486         local pat
   1487
   1488         for pat in $PM_EXCL; do
   1489                 case "$1" in
   1490                 *${pat}*)
   1491                 if [ -n "$PM_VERBOSE" ]; then
   1492                         echo "===>>> Skipping $1"
   1493                         echo "       because it matches the
pattern: *${pat}*"
   1494                         echo ''
   1495                 fi
   1496                 return 1 ;;
   1497                 esac
   1498         done
   1499
   1500         return 0
   1501 }

check_exclude tries to match your patterns in PM_EXCL against
"math/atlas".  But you've got "atlas-" in PM_EXCL (after portmaster's
globstrip removed the trailing asterisk, negating your attempt protect
it with quotes), which won't match because of the hyphen.  It would
have matched if math/atlas were actually installed, in which case
iport="atlas-3.8.3_1,1" and portmaster would have compared iport with
*atlas-*.  You must use a port origin glob with the -x flag when the
port that you wish to exclude isn't installed.

Problem #3:

The +IGNOREME checks in portmaster aren't properly implemented for
this case, so they fail to prevent math/atlas from being built.  To
see this, Continue along in dependency_check (). Here, since iport="",
dependency_check () next calls "check_interactive math/atlas":

   1459 check_interactive () {
   1460         [ -n "$INTERACTIVE_UPDATE" ] || return 0
   1461
   1462         local update_to
   1463
   1464         [ -n "$2" ] && update_to=" to $2"
   1465
   1466         case "$INTERACTIVE_YES" in *:${1}:*) return 0 ;; esac
   1467         case "$INTERACTIVE_NO" in *:${1}:*) return 1 ;; esac
   1468
   1469         if [ -e "$pdb/$1/+IGNOREME" ]; then
   1470                 echo ''
   1471                 echo "===>>> +IGNOREME file is present for $1"
   1472         fi
   1473
   1474         echo '' ; echo -n "===>>> Update ${1}${update_to}? [y] "
   1475         local answer ; read answer
   1476         case "$answer" in
   1477         [nN]*)  INTERACTIVE_NO="${INTERACTIVE_NO}${1}:" ; return 1 ;;
   1478         *)      INTERACTIVE_YES="${INTERACTIVE_YES}${1}:" ;;
   1479         esac
   1480         return 0
   1481 }

This subroutine can only fail if you've specified an interactive
update and you  decline to update math/atlas.  If that case,
portmaster will start to build math/py-numpy, and if math/atlas-devel
is installed with the needed static libraries, then math/py-numpy
should build normally.  Apparently this didn't happen during your
attempts.

The +IGNOREME check is useless here because the subroutine checks only
for /var/db/pkg/math/atlas/+IGNOREME, not the usual
/var/db/pkg/atlas-3.8.3_1,1/+IGNOREME.

Returning to dependency_check (), "update_port math/atlas" is called
next, which then recursively calls "portmaster math/atlas" with many
of your original flags.  This jumps to

1943 # Figure out what we are going to be working on

Shortly afterwards, portdir is found to be ="math/atlas", and

2020 [ -z "$upg_port" -a -z "$REPLACE_ORIGIN" ] &&
2021         upg_port=`iport_from_origin ${portdir}`

gives upg_port="", as before when computing iport in dependency_check ().  Hence

2023 if [ -e "$pdb/$upg_port/+IGNOREME" ]; then

is false, and another +IGNOREME check is bypassed.  math/atlas is then built.


So what can you do while these problems are being fixed?  You could either:

1) Install math/atlas-devel, and use -x math/atlas on the portmaster
command line; or
2) Install math/atlas-devel, and use only interactive portmaster
builds in which you decline to build math/atlas; or
3) Install math/atlas-devel, and patch the math/atlas Makefile:

--- ports/math/atlas/Makefile.orig      2009-11-09 01:19:21.000000000 -0500
+++ ports/math/atlas/Makefile   2009-11-09 01:15:55.000000000 -0500
@@ -22,6 +22,7 @@
 USE_GMAKE=     yes
 WRKSRC=                ${WRKDIR}/ATLAS
 USE_LDCONFIG=  yes
+CONFLICTS=     atlas-devel-[0-9]*

 .include <bsd.port.pre.mk>

 ; or

 4) Patch the math/py-numpy Makefile:


 --- ports/math/py-numpy/Makefile.orig   2009-11-08 20:49:13.000000000 -0500
+++ ports/math/py-numpy/Makefile        2009-11-08 20:49:30.000000000 -0500
@@ -35,7 +35,7 @@
 .include <bsd.port.pre.mk>

 .if defined(WITH_ATLAS)
-LIB_DEPENDS+=  atlas.2:${PORTSDIR}/math/atlas
+LIB_DEPENDS+=  atlas.2:${PORTSDIR}/math/atlas-devel
 .if !exists(${LOCALBASE}/lib/libalapack.a)
 IGNORE=        atlas needs to be built with WITH_STATICLIB for numpy
to function properly
 .endif

; or

5) Use portupgrade for science/gnudatalanguage and math/py-numpy,
instead of portmaster, with  ALT_PKGDEP set to substitute
math/atlas-devel for math/atlas in pkgtools.conf; or
6) Put an +IGNOREME in directories for science/gnudatalanguage and
math/py-numpy as well as math/atlas, and update these ports by hand,
with make -C ... deinstall clean install ... ; or
7) (Ugly hack) Install math/atlas-devel, and then math/py-numpy, by
hand.  Thereafter, before each invocation of portmaster involving
math/py-numpy, edit that port's registration information, switching
it's math/atlas-related entries in +CONTENTS to math/atlas-devel.

b.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d873d5be0911082256y5c35d288i13b40f8d6e1f6285>