2017-01-27 42 views
2

変数から特定の拡張子に一致するファイルを選択して残りを破棄することはできますか?Makefile:変数から拡張子でファイルを選択する

SRCS = file1.c file2.c file3.cpp 

OBJS = $(SRCS:%.c=%.o) 
OBJS += $(SRCS:%.cpp=%.o) 

それに伴う問題は$(SRCS:%.c=%.o)は、.oファイルに.cファイルを変換が、の.cppファイルが保持していることです。この場合

OBJS変数は

file1.o file2.o file3.cpp file1.c file2.c file3.o 

に等しいことになるだろうと私がしたいことはそう

file1.o file2.o file3.o 

で、それは可能ですか?または、唯一の唯一の方法は、SRCS_CSRCS_CPPの変数ですか?

答えて

5

私は2つの可能な回避策を見ることができます(しかし、彼らは少し異なる プロジェクト組織を持って来るでしょう)。まず、ちょうど持っていることです。

SRCS := file1 file2 file3 
OBJS := $(SRCS:%=%.o) 

次に、あなたがチェックするために、依存関係を使用してターゲットを定義することができますいずれか ソースファイルは、CまたはC++ファイルです:

%.o: %.cpp 
    g++ $< [...] 

%.o: %.c 
    gcc $< [...] 

それとも、オブジェクトを持つことができますfile1.c.o/file3.cpp.oのようなファイルです。つまり、 は同じ名前のCとC++ファイルを持つことができます。 次に、あなただけ行う必要があります:

SRCS := file1.c file2.c file3.cpp 
OBJS := $(SRCS:%=%.o) 

%.cpp.o: %.cpp 
    g++ $< [...] 

%.c.o: %.c 
    gcc $< [...] 

希望は、私はすべてのあなたが持っているOSの種類の:)

+0

第2の解決策はまさに私が望んでいたものです。ありがとう! – rtur

+2

私は@ Cakeisalie5の答えがそれを行うためのより良い方法だとも思います。 –

3

GNU makeでは、いくつかのものがあります。text processing functionsがあります。あなたはこれを試すことができます:

CSRCS = $(filter %.c,$(SRCS)) 
CPPSRCS = $(filter %.cpp,$(SRCS)) 

これは2つのオブジェクトのリストを分割します。あなたはその後、個別に処理することができます。

OBJS = $(CSRCS:%.c=%.o) 
OBJS += %(CPPSRCS:%.cpp=%.o) 

別のオプションは、ただ一度に2つのフィルタを適用することです。これはしかし読みにくくている

OBJS = $($(SRCS:%.c=%.o):%.cpp=%.o) 

+0

私はまた、あなたの第2の提案が好きで、私は – Ctx

+0

にこのソリューションを読み取ることは困難であること、とは思わないが、かなり良いですあまりにも!ありがとう! – rtur

-2

ファーストを助けましたか?

Linuxの味なら、 grep ext

これは、代わりに...

ファイル選択を構築しながら、あなたは、ファイル選択を使用する場合は、必要な拡張機能を埋めることができますし、必ず他の人が破棄されます...

コマンドラインからC++/Cプログラムを実行する場合、次に選択上記。

変数に特定の拡張子を付ける場合は、正規表現 を使用して、その後ろに#文字を指定します。 (ドット)を使用し、1つの内線のみを許可します。詳細は

: 訪問https://msdn.microsoft.com/en-us/library/bb982727.aspx

0
set_o_suffix=$(addsuffix .o,$(basename $1)) 
set_o_suffix_for_cxx=$(addsuffix .o,$(basename $(filter %.c %.cpp,$1))) 

SRCS := foo.c buz/bar.cpp main.js 
$(info set_o_suffix=$(call set_o_suffix,$(SRCS))) 
$(info set_o_suffix_for_cxx=$(call set_o_suffix_for_cxx,$(SRCS))) 
all: 

出力:

set_o_suffix=foo.o buz/bar.o main.o 
set_o_suffix_for_cxx=foo.o buz/bar.o 
関連する問題