Powered by SmartDoc

4 二重ビルド問題

これは,$WRKDIR/.package_done.$PORTNAME._usr_localというクッキーをtouchしとけば,そのportのpackage作成はスルーされるので,

  1. *_DEPENDSなport全てについて$PACKAGES/All/*にそのportの$PKGNAMEが無いかどうかを調べる

    あれば ⇒ (2)

  2. $WRKDIR/.package_done.$PORTNAME._usr_localをtouchを`make package-recursive'する前に行なう.

    とりあえず↓の set-pkgbuilt を使って `set-pkgbuilt -r portdir' す れば良い.

    : ${PORTSDEFAULTDIR:=/usr/ports}
    : ${PORTSDIRPREFIX:=/var/ports}
    : ${PORTSDIR:=$PORTSDEFAULTDIR}
    : ${PACKAGESPREFIX:=$PORTSDIRPREFIX}
    : ${PACKAGES:=$PACKAGESPREFIX/packages}
    : ${PKGSUFX:=.pkg}
            _f_get_pkgbuiltports_awk='
            BEGIN {
                    if (ports) { split(ports, port, /[[:space:]]+/) }
                    found = 0
            }
            {
                    if (ports) { for (i in port) { if ($2 != port[i]) { print $0 } else { found = 1 }}} else { print $0 }
            }
            END {
                    exit ! found
            }'
    get-wrkdir()
    {
            local   __function__=get-wrkdir                         \
                    __port=$1
    
            (cd $PORTSDIR/$__port; make -VWRKDIR)
    }
    get-alldependslist()
    {
            local   __port=$1
    
            (cd $PORTSDIR/$__port; make -ki all-depends-list 2> /dev/null | egrep "^$PORTSDIR") | sed -Ee "s,^$PORTSDIR/,,"
    }
    set-pkgbuilt()
    {
            local   __function__=set-pkgbuilt                       \
                    __mode=normal                                   \
                    __pkgname                                       \
                    __port                                          \
                    __portname                                      \
                    __ports                                         \
                    __wrkdir
    
            while [ $# -gt 0 ]; do
                    case $1 in
                    -r)
                            __mode=recursive
                            ;;
                    -*)
                            error "unknown option '$1'"
                            ;;
                    *)
                            break
                            ;;
                    esac
                    shift
            done
            __port=$1
            case $__mode in
            recursive)
                    get-alldepends $__port | \
                    awk -v ports="$NONPKGBUILTPORTS" "$_f_get_pkgbuiltports_awk" | \
                    while read __pkgname __port; do
                            putdebug 1 0 __pkgname __port
                            __portname=$(portname $__port)
                            if [ -f $PACKAGES/All/$__pkgname$PKGSUFX ]; then
                                    __wrkdir=$(get-wrkdir $__port)
                                    runc mkdir -p $__wrkdir
                                    runc touch $__wrkdir/.package_done.$__portname._usr_local
                            fi
                    done
                    ;;
            *)
                    __pkgname=$(pkgname $__port)
                    if $(echo "$__pkgname $__port" | \
                                    awk -v ports="$NONPKGBUILTPORTS" "$_f_get_pkgbuiltports_awk" > /dev/null); then
                            return 0
                    fi
                    __portname=$(portname $__port)
                    if [ -f $PACKAGES/All/$__pkgname$PKGSUFX ]; then
                            __wrkdir=$(get-wrkdir $__port)
                            mkdir -p $__wrkdir
                            touch $__wrkdir/.package_done.$__portname._usr_local
                    fi
                    ;;
            esac
    }