4

ディレクトリ内のすべてのファイルを解凍し、ビルドディレクトリに移動する次のコードがあります。make を複数回呼び出すと、ビルド ディレクトリが既に存在する場合でも、毎回「ビルド」ターゲットを実行しようとします。誰かがこれに出くわしましたか?

この質問を見つけましたが、同じではありません。 Makefile は常にターゲットを実行しています

OS: Ubuntu 12.04 プログラム: GNU Make 3.81

build: mkBuildDir untar 
    chmod 700 build

.PHONY: mkBuildDir untar 

mkBuildDir: 
    mkdir build 

untar: *.tar.gz
    for prefix in *.tar.gz; do \
        tar xvf $$prefix --directory=build; \
    done

clean: 
    rm -Rf build
4

1 に答える 1

7

これ、リンクした質問とほとんど同じです。という名前のファイルを作成することはないため、mkBuildDir常に古くなっているため、build常に古くなっています。

あなたのmkBuildDirターゲットは何も役に立ちません(ただし、これは削減されたメイクファイルだと思います)。代わりにあなたがした場合

# it'd be better to list the TARFILES explicitly, though this will probably work
TARFILES=`ls *.tar.gz`

all: build untar

build: $(TARFILES)
    test -d build || mkdir build
    chmod 700 build
    for prefix in $(TARFILES); do \
        tar xvf $$prefix --directory=build; \
    done

clean: 
    rm -Rf build

それはおそらくあなたが探しているものを達成するでしょう.

Makefile に偽のターゲットが多すぎると、通常は Makefile の「コードの匂い」になります。それらが物事を行うための最良の/慣用的な方法であることはめったにありません。

于 2012-08-24T11:31:18.547 に答える