2017-09-27 18 views
0

私は多くの.cと.sファイルを持つプロジェクトを持っています。個々のルールを書くことは面倒です。以前は.cファイルに対してこれを実行していました。make:パターンのない前提条件でターゲットのステムを参照

$(OBJ_DIR)/%.o : %.c %.h 
    *recipe* 

これはcソースファイルのみのプロジェクトでは問題ありませんが、アセンブリファイルを含むプロジェクトでは機能しません。

私はgnu.orgのmakeのドキュメントを読んできましたが、パターンを使用せずに前提条件のターゲット名またはターゲット名全体を参照する方法を見つけることができませんでした。私はこれらの行に沿って何かしたいと思います。

$(C_OBJ_FILES) : %.c %.h # Where % WOULD be the stem of the target name 
$(AS_OBJ_FILES) : %.s  # Where % WOULD be...... 

私は現在、アセンブリソースからコンパイルされたオブジェクトと、cソースでコンパイルされたオブジェクトに対して別々のディレクトリを持っています。これが動作している間、私は同じディレクトリにそれらを持っていたいと思います。私はアセンブリディレクトリとcソースファイルを区別するために使用できるオブジェクトディレクトリを指す隠しシンボリックリンクを作成することも考えましたが、それは私の質問を解決しません。

編集:ターゲット名を参照するのを避ける回避策を探しているわけではありません。前提条件で参照できるため、Makefileの他の部分に役立ちます。これは間違いなく可能な場合は、そう言えば、それは私の質問に答えるでしょう。

all: x.o y.o z.o 

%.o: %.s 
     *recipe* 

%.o: %.c 
     *recipe* 

そしてmakedependようなCヘッダーとして推移DEPSに充填することができる:

答えて

1

おそらくstatic pattern rulesあなたが探しているものです:あなたのレシピで

C_OBJ_FILES = $(patsubst %.c,$(OBJ_DIR)/%.o,$(wildcard *.c)) 
AS_OBJ_FILES = $(patsubst %.s,$(OBJ_DIR)/%.o,$(wildcard *.s)) 

# static pattern rule for C files 
$(C_OBJ_FILES) : $(OBJ_DIR)/%.o : %.c %.h 
    <recipe> 

# static pattern rule for assembly files 
$(AS_OBJ_FILES) : $(OBJ_DIR)/%.o : %.s 
    <recipe> 

はあなたが[email protected]$<$*を使用することができます。それらはそれぞれターゲット(オブジェクトファイル)、最初の前提条件(Cまたはアセンブリソースファイル)、ステム(Cまたはアセンブリソースファイルのベース名)として展開されます。例:

# static pattern rule for C files 
$(C_OBJ_FILES) : $(OBJ_DIR)/%.o : %.c %.h 
    @echo '[CC] $*' && \ 
    $(CC) -c $(CFLAGS) $(INCLUDES) $< -o [email protected] 
+0

私は数日前に非常に似たようなことを試みましたが、うまくいかなかったのですが、私の$(OBJ_DIR)が%.oに追加されていないはずはないと思います。私はおそらく移動する前に少し静的なパターンのルールを使用して作業する必要があります。今読んで、私はそれが最善の解決だと理解しています。ありがとう! –

0

標準的なアプローチです。 「個別のルールを書く」のは「面倒なこと」ではなく、自動的にプログラムに実行させるだけです。

makeの文脈では、「ターゲット名の参照を避ける」という言葉([email protected])はちょっと奇妙です。 MakefileにDAGを書かないほうがいいと思うのですが、ビルドプロセスを説明する退屈な繰り返しのBourneスクリプトを書いてください。私はpatternsを作成することをお勧めします。それは問題を表現する自然な方法であり、ほんの数行のコードで要件を記述するのに役立ちます。

+0

私が完全に言っていたことを誤解しているかもしれないと思います。私の質問をもう一度読んでください。ターゲット名を参照したいが、$ @が前提条件で正しく動作しない。 –

+0

あなたの答えは、私が最後に試したときに、エラーが出てASSEMBLYFILE.cの代わりにASSEMBLYFILE.cを探していました。私はもう一度やってみました。当時私は別の問題を抱えていたに違いないが、私の質問には答えられない。 –

関連する問題