在生成文件中使用 ifeq 编译 C 或 CPP 文件

Using ifeq in makefile to compile either C or CPP file

本文关键字:文件 编译 CPP ifeq      更新时间:2023-10-16

我想将目录中的所有文件编译src/bc/%.bc.
因为我使用了不能与.c文件一起使用的std=c++17标志,所以我尝试了这个:

bc/%.bc: src/%.*
ifeq '$(suffix $^)' '.c'
emcc $^ -o $@
else
em++ $^ -o $@ -std=c++17
endif

但它不起作用,条件ifeq总是假的(当我用'.cpp'替换'.c'时也是如此(。

有没有办法实现基于文件后缀的单独编译?

有不止一种方法可以做到这一点。最好的办法可能是将规则分成两个规则,一个用于.c,一个用于.cpp

bc/%.bc: src/%.c
emcc $< -o $@
bc/%.bc: src/%.cpp
em++ $^ -o $@ -std=c++17

然后,您需要一种方法来构建所需文件的列表。(无论如何,您都需要这个,因为该src/%.*并不像您想象的那样工作。

SRC_FILES := $(wildcard src/%.*)
TARTGETS := $(patsubst src/%, bc/%.bc, $(basename $(SRC_FILES)))

以及构建所有内容的默认规则:

$(TARGETS):