2017-06-10 7 views
2

GNU makeを使っていくつかのファイルを圧縮したいだけです。 次のようにだから私は、Makefileを書きました:デフォルトでGNU makeのコンパイルを停止する

lib.tar.lzma: $(shell find ~/lib -name "*") 
    rm -f lib.tar.lzma 
    tar -cavf lib.tar.lzma -C ~/ lib/ 

しかし、私はmakeを実行した後、それは自動的にそのディレクトリにC++ソースコードをコンパイルします。

コンパイルを停止するにはどうすればよいですか?私はそれらを圧縮したいだけです。

更新:これは、内蔵のレシピ思わ

<builtin>: recipe for target '/home/xxx/lib/app' failed 

私は、次のエラーを得ました。

答えて

2

(私たちはMakefileあなた全体とあなたのフルファイルツリーを知らないので、これが唯一の推測であり、私はあなたが私たちにMakefileあなたはるかに大きいのフラグメントを示していることを前提とし)

However, after I run make, it automatically compile the c++ source code in that directory.

$(shell find ~/lib -name "*")がオブジェクトファイルを含むものに展開されている可能性があります。それらはあなたの依存関係にあるので、のソースファイルは、新しいものであれば再コンパイルされます。ところで、あなたは代わりに$(shell cd .. ; find lib -name "*")を使用することがありますかlibは何のサブディレクトリを持っていない場合でも$(wildcard ../lib/*)

あなたは、おそらく、これだけ持って、そのlib.tar.lzmaターゲットの任意の依存関係を必要としない:

ところで
lib.tar.lzma: 
    rm -f lib.tar.lzma 
    tar -cavf lib.tar.lzma -C ~/ lib/ 

-C ~/おそらくことmake/bin/shを使用してコマンドを実行し、そのPOSIXシェルは~を知らないので、-C $$HOMEである必要があります。おそらく-C ..

はおそらく、あなたがtarもっと巧妙な操作を行うために、いくつかのシェルスクリプトmake-backup.shを書くかもしれません...良いかもしれないと、あなたは、コード

lib.tar.lzma: make-backup.sh 
     ./make-backup.sh [email protected] 

しかし、おそらくあなたは(が依存関係を持っていますう例えば、個のファイルをアーカイブする必要がある場合)。次に明示的かつ賢明にそれらをリストする必要があります(あなたは確かにすべてのファイルに依存したくない、おそらく元のファイルのみに依存したくない)。また、一部のオブジェクトファイル(YMMV)がある場合は、オブジェクトファイル*.oをアーカイブする必要はありません。

メイクファイルをデバッグする場合は、make --traceまたはremake-xを使用することをお勧めします。

BTW、Makefileのみバックアップ用にはです。代わりにシェルスクリプトを書いてください。

何も使用しない場合は、バージョン管理システム(gitなど)を使用することを強くお勧めします。 gitには、より巧妙なバックアップかもしれないarchiveサブコマンドがあることに注意してください。

+0

ご返信ありがとうございます。実際、アーカイブを更新するには依存関係が必要です。ところで、私は次のエラーを受け取りました::ターゲット '/ home/xxx/lib/app'のレシピが失敗しました –

+0

実際には暗黙のルールがあり、無効にするには.SUFFIXES行を追加する必要があります。 –

関連する問題