2

conf.py各サブディレクトリ(変数に格納されている)のファイル()のテキストブロックが削除されるようにしようとしていますSUBDIRS#--Beginこのテキストのブロックは、タグと。内にあります#--End。以下のコードサンプルを参照してください。きちんとしていて、makefile内から実行するために余分なシェルスクリプトを作成する必要がないようにするために、makefile内からsedコマンドを使用したいのですが、そうするのに問題があります。私は他のフォーラムの投稿でこれに対する解決策を見つけることができないので、どんな助けもありがたいことに受け取られるでしょう。

.PHONY $(SUBDIRS)
SUBDIRS = (list of all subdirectories that contain a relevant conf.py)
$(SUBDIRS):  
    sed '/#--Begin/,/#--End/d' Docs/$@/conf.py  

このコマンドの結果として何も起こりません。

ありがとう!

4

2 に答える 2

5

ルールは、ターゲットにSUBDIRSリストを使用します。Makeは、これらが存在するかどうかを確認します。もちろん、存在します。それらは他のものに依存しないので、最新であるため、Makeは何もする必要がありません。

これを回避する方法は2つあります。1つは、 Phony Targetを使用して 、コマンドを毎回強制的に実行することです。

.PHONY: $(SUBDIRS)
$(SUBDIRS):
    sed .....

もう1つは、編集済みバージョンと未編集バージョンのファイルに異なる名前(たとえば conf.py、と)を付け、パターンルールconf.py.inを使用して最初のバージョンを2番目のファイルに依存させることです。

$(SUBDIRS): Docs/%/conf.py: Docs/%/conf.py.in
   sed '/#--Begin/,/#--End/d' $< >$@

入力ファイルが変更されるたびに自動的に実行されるため、これはより優れています。

于 2012-07-24T16:33:17.070 に答える
5

sedコマンドをmakefileに組み込む前に、コマンドラインでコマンドをテストしておく必要があります。書かれているように、削除したい行を削除し、結果をstdoutに送信します。所定の場所にあるファイルを変更するには、次を使用する必要があります-i

sed -i -e '/#--Begin/,/#--End/d' Docs/$@/conf.py

他の問題があるかもしれません。実際のmakefileを表示していませんが(.PHONY $(SUBDIRS)合法ではないため、作業中のmakefileの一部を貼り付けていません)、ルールが思ったとおりに実行されていない可能性があります。これを試して:

$(SUBDIRS):
    @echo attempting to act on $@
    @ls Docs/$@/conf.py

コマンドを導入する前に、これを完全sedに機能させてください。

于 2012-07-24T23:54:00.807 に答える