
ここでは、重要ではない理由でファイルごとに自動的に処理し、処理されたソースファイルの名前を体系的に変更するソースコードがあります。たとえば、次のようなファイルから始めます。
fun1.c fun2.c
そしてついにファイルを受け取る
fun1_a.c fun2_a.c
また、Makefileを自動的に調整したいと思います。 Makefileのデフォルトバージョンは次のとおりです。
SRC= fun1.c fun2.c
%.o: $.c
$(CC) $(CFLAGS) -c $< -o $@
OBJ= $(SRC:.c=.o)
fun2.o: fun1.o
ソースファイルと依存関係定義のすべての項目は必要に応じて変更されますが、パターンルールは同じままになるようにファイルを最適に処理するにはどうすればよいですか。つまり、私に必要なものは次のとおりです。
SRC= fun1_a.c fun2_a.c
%.o: $.c
$(CC) $(CFLAGS) -c $< -o $@
OBJ= $(SRC:.c=.o)
fun2_a.o: fun1_a.o
私はそれがマイナーだと思いますが、私のスクリプト能力は特にsed
制限されていperl
ます。
編集する:実際、すべてのファイルが整数で呼び出されるわけではないので、funx.c
すべてx
のファイル名に対して機能する解決策を探しています。
答え1
完全なソースツリーのコピーを作成し、名前を変更せずにコピーディレクトリにあるファイルを変更することをお勧めします。これにより、makefileを変更する必要がなくなります。ボーナスとして、カタログを比較するだけで変更の概要を得ることができます。
これの代わりに
project
fun1.c
fun1_mod.c
fun2.c
fun2_mod.c
Makefile
Makefile_mod
あなたはこれを持っています
project
fun1.c
fun2.c
Makefile
project_mod
fun1.c
fun2.c
Makefile
洗練された
例のように、makefile が非常に単純な場合、sed を使用して makefile のファイル名を変更できます。しかし、makefileは神秘的な獣です。いくつかの暗黙の規則と多段階変数の拡張が特徴です。
単純なメイクファイルでもファイル名を変更するのが一般的です。メイクファイルにもファイル名が一部変更されました( OBJ= $(SRC:.c=.o)
)。これできるsed を使用して何かを変更すると、予期しない結果が得られます。
このような一般的なワイルドカードを使用すると、*.c
予想以上に多くのファイルを収集することが容易になります。サフィックスを除外または埋め込むためにワイルドカードを作成することは、猫を集めるのと同じです。
元のソースファイルと変更されたソースファイルが同じディレクトリにある場合、ソースソースファイルが変更されたmakefileによって誤ってコンパイルされたかどうかはわかりません。
そして、私の気持ちには1回の修正だけでは十分ではないようです。あなたはたくさんを持っているでしょう。だからそれは単にfun1_mod.c
「fun2_mod.c
しかし」_mod1
_mod2
_mod3
_mod3butpartmod1
などではありません。
どのモードセットでどのバイナリがコンパイルされたかを知るために、永遠に面倒なことが起こります。
したがって、各修正に対して、ソースコードツリー全体のコピーが生成される。各ディレクトリのソースコードを変更します。ファイル名を同じにしてください。 makefile を同じにしてください。
これにより、ディレクトリに移動してコンパイルできます。別のディレクトリに移動してコンパイルします。常に同じメイクファイルです。そして、常にどのファイルをコンパイルするかを決定します。 (メイクファイルが親ディレクトリと兄弟ディレクトリからソースファイルをインポートしない限り、これは一般的な慣行ではなく、メイクファイルコミュニティでは眉をひきます。)
ボーナス:
お気に入りのディレクトリ比較ツールを使用すると、1つのモードセットと別のモードセットの違いを簡単に確認できます。
gitなどのソース管理で修正を維持できます。モジュールごとに1つの分岐。マスターブランチで変更を適用し、それを別のブランチに伝播できます。周囲のバリエーションを選択して選択できます。仲間を押して引っ張ることができます。
答え2
元のファイル名が静的であると仮定すると、名前変更操作の結果のみを予測することはできません。ファイル名を変更すると、元のファイル名と新しい名前のマッピングを含む追加のファイルが作成されます。例:
fun1.c=fun1_a.c
fun2.c=fun2_a.c
生成されたマッピングファイルの名前があると仮定すると、次の方法で変更rename.mk
できます。Makefile
include rename.mk
SRC= $(fun1.c) $(fun2.c)
%.o: $.c
$(CC) $(CFLAGS) -c $< -o $@
OBJ= $(SRC:.c=.o)
$(fun2.c:.c=.o): $(fun1.c:.c=.o)
ファイル名は変数名になり、経由で使用されますrename.mk
。