2010-11-20 9 views
1

私は、一連の変数を繰り返し処理するシェルスクリプトを作成しています。現在の反復値に従って1行ずつソースファイルを編集してから、再作成し、コンパイルされたバイナリ。実行後、古い行が復元されます。ここでbashスクリプトからmakeを呼び出すことはできません

は抜粋です:

#!/bin/sh 
for i in 0..4; do 
    perl -i -pe "s/.*/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
    make 
    ./bin/myTool 
    perl -i -pe "s/.*/\/\/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
done 

は基本的に私はC++ソースファイルで約10相互に排他的#defineを持っている、と私はそれぞれの効果を実験しています。私は怠け者なので、自動化されたプロセスにしたいと思います。ここで私は立ち往生しました。私は、ファイルごとにperl命令の前と後のdiffしようとした、今

`make: Nothing to be done for 'all'` 

をし、ファイルが、これはなぜ起こるか私には理解できない...正しい表示されます:

は、時にはシェルが言うことを起こります正しい動作をさせる方法。

ありがとうございます。

+0

固定されており、間違いは完全に鉱山でした。私は 'sleep'命令を追加しましたが間違った場所に間違いなく...ループの最初に置いてください(答えに正しく記載されています)、すべてうまく行きました。ありがとう! – Daniele

+0

スクリプトの最新バージョン:スリープ状態にする代わりに、私は 'touch -t 1010101010 $ {SOURCE} $ {OBJECT}'を優先しました...時間が無駄になりません! :) – Daniele

答えて

2

これはおそらくmakeがそれぞれの反復を区別するのが速すぎるかもしれません。ループの最初または最後に、製品を削除するか、遅延を2秒追加してください。

+0

私は両方の方法を試みましたが、どれも正しく動作していません。 まず、 'touch $ {SOURCE}'を 'make'の直前に置いていますが、目立った変更はありません。 'make clean && make 'は動作しているようですが、毎回すべてを再構築する必要があるとは思っていません。 私も '.o'だけを削除しようとしましたが、まだニュースはありません。 「スリープスリー」はまだ仕事をしません。 それは、それぞれの行が独自のスレッドで起動されているように見えます。したがって、非同期の動作(ああ、私は成功しないで「待ち」しようとしました)。 – Daniele

1

Makeは、ターゲットタイムスタンプがソースタイムスタンプより若いかどうかをチェックするだけです。これは、更新が必要なものを知る唯一の方法です。ですから、繰り返しループを1秒未満で実行すると、makeは何かが変更されたことを知らないでしょう。

Ignacio Vazquez-Abramsが指摘したように、各反復の先頭でクリーンアップするか、遅延を追加することができます。

関連する問題