Makefileでファイル名を変更する

Makefileでファイル名を変更する

ここでは、重要ではない理由でファイルごとに自動的に処理し、処理されたソースファイルの名前を体系的に変更するソースコードがあります。たとえば、次のようなファイルから始めます。

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.cfun2_mod.cしかし」_mod1 _mod2 _mod3 _mod3butpartmod1などではありません。

どのモードセットでどのバイナリがコンパイルされたかを知るために、永遠に面倒なことが起こります。

したがって、各修正に対して、ソースコードツリー全体のコピーが生成される。各ディレクトリのソースコードを変更します。ファイル名を同じにしてください。 makefile を同じにしてください。

これにより、ディレクトリに移動してコンパイルできます。別のディレクトリに移動してコンパイルします。常に同じメイクファイルです。そして、常にどのファイルをコンパイルするかを決定します。 (メイクファイルが親ディレクトリと兄弟ディレクトリからソースファイルをインポートしない限り、これは一般的な慣行ではなく、メイクファイルコミュニティでは眉をひきます。)

ボーナス:

お気に入りのディレクトリ比較ツールを使用すると、1つのモードセットと別のモードセットの違いを簡単に確認できます。

gitなどのソース管理で修正を維持できます。モジュールごとに1つの分岐。マスターブランチで変更を適用し、それを別のブランチに伝播できます。周囲のバリエーションを選択して選択できます。仲間を押して引っ張ることができます。

おすすめ記事