10

ファイルが変更された場合にsvnコミットを実行したい場合、このようなことをしたいと思います。ファイルには、常に変化するタイムスタンプがあります。したがって、タイムスタンプ以外のものが変更された場合は、ファイルをコミットします。

メイクファイルには、これに似たものが含まれます。しかし、If 条件が正しく機能していません。満たされない場合でも実行されています。If here の問題を誰かが教えてくれますか。

    UPDATE_STATE_FILE :
        $(eval NO_LINES_CHANGES_IN_STATE = $(shell svn di STATE/build.state --diff-cmd=diff -x --normal | grep "^[<>]" | wc -l))
        @echo $(NO_LINES_CHANGES_IN_STATE)
    ifneq ($(strip $(NO_LINES_CHANGES_IN_STATE)), 2)
    ifneq ($(strip $(NO_LINES_CHANGES_IN_STATE)), 0)
        @echo $(NO_LINES_CHANGES_IN_STATE)
        $(SVN) commit;
        $(SVN) update;
    endif
    endif
4

2 に答える 2

18

コマンド ルール内に make 条件を混在させることはできません。make 条件は、C または C++ のプリプロセッサ ステートメントに似ています。それらは、処理 (実行中のルールなど) が実行される前に、ファイルが読み込まれるときに処理されます。

ルール内に条件が必要な場合は、条件を作成するのではなく、シェルの条件を使用してルールを作成する必要があります。

UPDATE_STATE_FILE :
        @NO_LINES_CHANGES_IN_STATE=`svn di STATE/build.state --diff-cmd=diff -x --normal | grep "^[<>]" | wc -l`; \
        echo $$NO_LINES_CHANGES_IN_STATE; \
        if [ $$NO_LINES_CHANGES_IN_STATE -ne 2 ] && [ $$NO_LINES_CHANGES_IN_STATE -ne 0 ]; then \
            echo $$NO_LINES_CHANGES_IN_STATE; \
            $(SVN) commit; \
            $(SVN) update; \
        fi
于 2013-05-21T12:07:50.067 に答える
3

@MadScientist の回答を読んだ後、別のアプローチを思いつきました。

シェル条件が任意の環境 (Windows と Linux) で機能するかどうかわからないため、ルール内に条件を含める代わりに、ルールを条件内にラップしました。すなわち

ifdef MY_FLAG
%.o: %.c
    $(CC) -o $@ -c $^ $(CFLAGS)

else
%.o: %.c
    @$(CC) -o $@ -c $^ $(CFLAGS)

endif

ここを訪れる人に幸運を。

編集

コメントでジェームズ・ムーアが指摘したように、この異なるアプローチにはif、制御フロー内のステートメントの配置に関連して変数がいつ、どのように定義されるかについて注意と注意が必要です。

于 2016-07-04T19:47:18.577 に答える