NISHIMURA Yutaka <iscr...@aypio.net> wrote
  in <20141122113504.a8a1.bd318...@aypio.net>:

is> pkgで導入したものと、make configでコンパイルオプションを
is> 変更してインストールしたportsが有りますが、
is>
is> pkg upgrade ではportsで入れたものもpkgから入れられていまうようです。
is> 昔はportupgradeを使っていたのですが、
is> これはすべてコンパイルしてしまうので時間が掛かります。
is>
is> デフォルトから変更されていないものはpkgで導入
is> デフォルトから変更されているものは、portsから導入すると言う条件で
is> インストールされたパッケージ群をアップグレードする方法は無いでしょうか?

 pkg(8) にはオプションが変更されているか判別する機能が
 一応あるのですが、現時点では確実に動作しません。

 なので、手動で検出するしかないと思います。
 たとえばやっつけですが、添付のようなスクリプトを実行すると
 変更されている ports の一覧が出せます。

 % sh ./list_touchedpkgs.sh | tee ./list

 この結果を pkg lock に渡せば、インストール済みの package を
 ロックすることができます。

 # sh -c 'cat ./list | while read L; do env ASSUME_ALWAYS_YES=yes pkg lock $L; 
done'

 ロック後に pkg upgrade を実行すれば、オプションを変更していない
 package のみが更新されるはずです。

 lock したままでは ports を使っての再インストールもできないので、
 pkg upgrade 後に次のように unlock して、
 個別に手動で make install すれば、目的は達成できるように思います。

 # sh -c 'cat ./list | while read L; do env ASSUME_ALWAYS_YES=yes pkg unlock 
$L; done'

-- Hiroki
#!/bin/sh
PORTSDIR=/usr/ports

for d in $(pkg query %o); do
        u=$( (cd $PORTSDIR/$d && (make showconfig | awk "/=on/ && \
            !/IPV6=|DOCS=|NLS=|EXAMPLES=/{print \$1}"; \
            for i in $(make -VOPTIONS_DEFAULT); do \
                echo "$i=on" | grep -v "IPV6=\|DOCS=\|NLS=\|EXAMPLES="; \
            done ) | sed -e "s/://g" | sort | uniq -u))
        if [ -n "$u" ]; then
                echo "$d"
        fi
done

Attachment: pgpyfcvhw3qMu.pgp
Description: PGP signature

メールによる返信