2017-12-18 17 views
-2

私はファイルをコピーしようとしています(別の名前のファイルに同じ名前のファイルを2つ持っています) MAKEFILEの 私はfolliwngを実行しようとしていますが、おそらく実行順序に不一致があります。 どうすれば正しく行うことができますか?MAKEFILEを使用してコンパイル前にファイルをコピーしてから削除する

all: copy_dup_files $(dst_dir) $(APP_TARGET_LIB) delete_dup_files 

copy_dup_files: 
    @echo "COPYING DUP FILES" 
    $(shell cp /aaa/hmac.c /aaa/hmac1.c) 
    $(shell cp /bbb/hmac.c /bbb/hmac2.c) 

delete_dup_files: 
    @echo "DELETING DUP FILES" 
    $(shell rm /aaa/hmac1.c) 
    $(shell rm /bbb/hmac2.c) 

おかげ

答えて

2

$(shell)の目的は読みください出力を生成することです。レシピの行には、この構造体をまったく持たないでください。だから、

# this is evaluated when the Makefile is read 
value := $(shell echo "Use the shell to produce a value for a variable") 

# this is evaluated when you say "make foo" 
foo: 
    echo 'No $$(shell ...) stuff here' 

Makefileが読み込まれるときに、あなたの試みで、すべての$(shell ...)ものが評価されますが、任意の実際のターゲットが実行される前に。

+4

コンパイルする前にファイルをコピーすることは、それ自身の反パターンのように思えます。なぜあなたはそれをやっていますか、あなたは実際に何を達成しようとしていますか? – tripleee

0

/aaa/hmac1.cは、/aaa/hmac.cに依存しています。 したがって、私たちは持っている:

/aaa/hmac1.c: /aaa/hmac.c 
    cp $< [email protected] 

/bbb/hmac2.c: /bbb/hmac.c 
    cp $< [email protected] 

/aaa/hmac1.o /bbb/hmac2.o: %.o: %.c 
    gcc $< -o [email protected] 

myprog: /aaa/hmac1.o /bbb/hmac2.o 
    gcc $^ -o [email protected] 

これは、清潔で安全なパラレル(任意のメイクファイルの良いテスト)です。

  • 依存関係の自動生成をコピーするので
  • 利用代わりにシンボリックリンクの絶対パスを取り除く

    • のようなあなたが作ることができる無数のスタイルの改善、
    • .hファイルについては、など、)があります
    • ソースツリーを仲介しないでください—すべての中間ファイル(.oと暫定.c)を自分のビルドフォルダに入れます

    & c。 & c。

  • +0

    最後にhmac1.cとhmac2.cを削除する必要もあります。どのようにこれを行うことができますか? –

    +0

    @RanTeshuva個人的には私はそれらを残しておきます。あなたが '.o'ファイルについて考えるのと同じ方法でそれらを考えてください。それらはビルド製品なので、オブジェクトファイルが入っているものと同じ一時フォルダに作成します。 – bobbogo

    +0

    @RanTeshuva本当に削除したい場合は、コンパイルのためにレシピで作成して削除してください。一度にすべてのコピーを行う、重い 'copy_dup_files'ステップを持つことは、誤ったステップです。 _Make_は細粒度の依存関係を優先します(並列ビルドでうまくいく)。 – bobbogo

    関連する問題