0

実行時に次のことを行うメイクファイルを作成しようとしています。

CMVC_VIEW = ../../.. 
TB_DIR = $(CMVC_VIEW)/tarball_images 
SMAC_TOOLS = $(TB_DIR)/smac_tools 
SMAC_BIN = $(SMAC_TOOLS)/bin 
DIR_LIST = $(TB_DIR) \
    $(SMAC_TOOLS) \
    $(SMAC_BIN)

install:
    rm -f *.o
    for DIR in $(DIR_LIST); do \
      echo $${DIR}; \
      chmod 2775 $${DIR}; \
    done

ただし、makefile を実行すると、chmod: missing operand after というエラーが表示され2775ます。$${DIR}アクセス許可を変更する必要があるディレクトリに対応するパスが含まれているはずなので、なぜこれが起こっているのかわかりません。

$${DIR}これは、静的ディレクトリ パスに置き換えると機能するようです。

この makefile の目的のために、DIR_LIST空白で区切られたディレクトリのリストにマクロが割り当てられていると仮定します。

4

1 に答える 1

0

make 変数参照と shell 変数参照で混乱しています。make は、任意の文字列をmake変数$(FOO)への参照として解釈し、その名前で変数を検索し、参照を値に置き換えます。シェルベースのループはDIR と呼ばれるシェル変数を作成しますが、 がある (持っていた)ため、make は DIR と呼ばれる make 変数を見つけようとしました (そして失敗しました)。for$(DIR)

double$は make が独自の変数参照解決を行うのを防ぎ、リテラル$(DIR)がシェルに渡され、シェルが独自の変数解決を行うため、ソリューションが機能します! もちろん、forループが DIR 変数を作成したため、これは機能します。

于 2012-06-08T17:03:26.763 に答える