Cygwin 用パッケージの依存関係列挙

ホーム > (Cygwin で 日本語 TeX) > Cygwin 用パッケージの依存関係列挙 / English Version

Cygwin 用のバイナリファイルたちがどのパッケージに依存しているかを, 半自動で列挙するプログラムを公開します. 主なターゲットは,Cygwin 用パッケージ制作者ですが, インストールしたのにうまく動かないプログラムがあるときにユーザが自己解 決を図りたいときにも利用できます.

まだ備忘録程度です.

プログラムと使い方

メインのスクリプト

以下のスクリプト (main.sh として以下説明) は, インストール済みのパッケージ名 (バージョン番号は不要) を第 1 引数に与 えて,

$ ./main.sh ghostscript-bin

などと実行すると,ghostscript-bin パッケージに含まれるファ イルを探索して,バイナリファイルであったときには,依存するパッケージを列挙します.

#!/bin/sh

### already installed package
PACKAGE=$1
BINFILES=`gzip -dc /etc/setup/${PACKAGE}.lst.gz`
ROOT=/

### before a new release
# PACKAGE=glpk
# BINFILES=`tar tjf glpk-4.19-1.tar.bz2`
# ROOT=`pwd`/.inst/

### direct access
# PACKAGE=glpk
# BINFILES=`(cd .inst && find usr/bin)`
# ROOT=`pwd`/.inst/

for f in ${BINFILES}; do
    ff=`echo ${ROOT}${f} | sed -e 's/\/\//\//g'`
    if [ -f ${ff} ]; then
        if `file ${ff} | grep -q 'MS-DOS executable'`; then
            echo "#--- $ff ---"
            for prog in `cygcheck ${ff}`; do
                progunix=`cygpath -u "${prog}" | tr -d "\r"`
                if ! `echo ${progunix} | grep -q cygdrive`; then
                    progshort=`cygcheck -f ${progunix} | sed -e 's/\-[^\-]*\-[^\-]*$//'`;
                    if [ x${progshort} != x${PACKAGE} ]; then echo ${progshort}; fi
                fi
            done;
        fi;
    fi;
done

後処理

たとえば,以下のように UNIX コマンドを組み合わせれば, 重複がなく,依存パッケージ名が昇順に並んだ出力が得られます.

$ ./main.sh ghostscript-bin > ghostscript-bin.log
$ sort -u ghostscript-bin.log | grep -e ^[^#]

などと実行することになるでしょう.

ホーム > (Cygwin で 日本語 TeX) > Cygwin 用パッケージの依存関係列挙 / English Version