0

これはかなり一般的な問題だと思いますが、特定の状況ではどこにも答えが見つかりません。私はそのようなターゲットを持っています:

initfs.tar: $(INITFS_FILES)
    rm -f ./initfs.tar
    cd initfs_root
    tar --format ustar --exclude-vcs -cf ../initfs.tar ./

INITFS_FILESは次のように定義されています。

INITFS_FILES:=$(shell find ./initfs_root/ -not -path '*/.*/*' -not -name '.*' -type f)

を呼び出すたびにmake initfs.tar、このターゲットが実行されます。initfs_rootディレクトリ内のファイルは変更されていません(すべてのファイルはそのfindコマンドを使用して検索されます)。initfs.tarは確かに作成されています。

なぜこれが起こっているのかについて誰かが何か考えを持っていますか?それは私には意味がありません、そして私がインターネット上で出くわした他のすべての投稿と私の現在の専門知識によれば、私はすべて正しいです(しかし、明らかに、私の専門知識はMakefile領域に欠けています;)

4

1 に答える 1

5

makeのすべてのコマンドは、コマンドラインごとに新しいサブシェルで実行されます。これは、コマンドが

cd initfs_root
tar --format ustar --exclude-vcs -cf ../initfs.tar ./

2つの異なるサブシェルで実行されます。したがって、tarコマンドはそのinitfs_rootディレクトリを作業ディレクトリとして実行されません。

2つを1つのコマンドラインに結合することで、これを回避できます。

cd initfs_root; tar --format ustar --exclude-vcs -cf ../initfs.tar ./

ちなみに、tarパスや名前にスペースを入れようとしているファイルがある場合は注意してください。それらは変数内で複数の名前に分割され$INITFS_FILES、メカニズムが機能しなくなります。

于 2012-06-05T23:40:39.523 に答える