2017-02-09 6 views
5

GNU Makeが-Bオプションを持っていて、makeに既存のターゲットを無視させるオプション。ターゲットを再構築できますが、ターゲットのすべての依存関係ツリーも再構築されます。依存関係を再構築せずに(GNU Makeオプション、Makefileの設定、互換性のあるmakeのようなソフトウェアなどを使用して)ターゲットを強制的に再構築する方法はありますか?問題の依存関係を再構築せずにターゲット(make -B)を強制的に再構築する方法はありますか?

イラスト:もちろん

$ mkdir test; cd test 
$ unexpand -t4 >Makefile <<EOF 
huge: 
    @echo "rebuilding huge"; date >huge 
small: huge 
    @echo "rebuilding small"; sh -c 'cat huge; date' >small 
EOF 
$ make small 
rebuilding huge 
rebuilding small 
$ ls 
huge Makefile small 
$ make small 
make: 'small' is up to date. 
$ make -B small 
rebuilding huge # how to get rid of this line? 
rebuilding small 
$ make --version | head -n3 
GNU Make 4.0 
Built for x86_64-pc-linux-gnu 
Copyright (C) 1988-2013 Free Software Foundation, Inc. 

1はrm small; make smallことができますが、組み込みの方法はありますか?私はあなたがドキュメントを読み違えていると思う

-o FILE, --old-file=FILE, --assume-old=FILE 
     Consider FILE to be very old and don't remake it. 

EDIT

+0

ん[この質問を](http://stackoverflow.com/questions/12199237/telling-make-to-ignore-dependencies-when-top-target-has-been-created)はあなたを助けますか? – sycko

+0

ありがとうございます:私は 'ls'を使って示したように' hugeS 'は(.SECONDARY: 'ターゲットなしで)保存されており、' -B'のせいで再構築されています。 –

答えて

3

一つの方法は、あなたがリメイクしたくないすべてのターゲットの-oオプションを使用することです-B;それは言う:

-B, --always-make 
     Unconditionally make all targets. 

注意、ここにすべてのターゲットhugeは確かにターゲットであるため、-Bを使用すると再作成されます。

しかし、あなたの質問もちょっと読みました。私はhugeが新しい場合でも、あなたはhugeを再構築することなくsmallを再構築したいと思っていますが、smallhugeは、右変更されていないにもかかわらず、再構築するために取得しようとしていますか?

あなたは間違いなく-Bを使いたくありません。そのオプションはあなたが探しているものではありません。

rm -f small 
make small 

再作成する指定されたターゲットを強制オプションがあると便利かもしれませんが、そのオプションは存在しません:

普通の人はsmallを削除していることだろう。

-W hugeを使用することもできますが、これもまた、構築するターゲットだけでなく、前提条件の名前を知る必要があることを意味します。むしろ厄介なハック下

+0

「make -B -o huge small」は本当にうまくいきますが、そのような依存関係が自動的に得られない限り、理想的ではありません。 –

+0

私はそれが理想的ではないことに同意しますが、どんな方法も尋ねました:) – MadScientist

+0

はい、そうですなぜ私はupvoted(しかし、受け入れられたとして答えをマークする準備ができていない)。実際には、オプションが自分自身のことをした(ターゲットを非常に古いものとみなし、それを無視するのではなく、それを強制的に再作成する)場合、その答えは理想的です。 –

2

ファイル:

huge: 
    @echo "rebuilding huge"; date >huge 

small: $(if $(filter just,${MAKECMDGOALS}),huge) 
    @echo "rebuilding small"; sh -c 'cat huge; date' >small 

.PHONY: just 
just: ; 

することができます

$ make -B just small 
+0

それは確かに厄介です! –

+0

ありがとう、それはこれまでのところほとんど "呼び出し自動"ですが、残念ながら、ルールでは '$ <'、 '$ ^'などでは機能しません。 –

3

ウィルこのヘルプ:

touch huge; make small 

+0

ありがとう、それは動作します(そして 'make -W huge small small'も)。しかし、そのような依存関係が自動的に得られなければ理想的ではありません... –

0

まあ、私はこの部分的な解決策使用しているこれまでのところ:

$ cat >~/bin/remake <<'EOF' 
#!/bin/sh 
# http://stackoverflow.com/questions/42139227 
for f in "[email protected]"; do 
    if [ -f "$f" ]; then 
    # Make the file very old; it's safer than removing. 
    touch [email protected] "$f" 
    fi 
done 
make "[email protected]" 
EOF 
$ chmod u+x ~/bin/remake 
$ # PATH="$HOME/bin:$PATH" in .bashrc 
$ remake --debug=b small 
GNU Make 4.0 
Built for x86_64-pc-linux-gnu 
Copyright (C) 1988-2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
Reading makefiles... 
Updating goal targets.... 
Prerequisite 'huge' is newer than target 'small'. 
Must remake target 'small'. 
rebuilding small 
関連する問題