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

Using ifeq in makefile to compile either C or CPP file

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

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

但它不起作用,条件 ifeq 始终为假(当我将 '.c' 替换为 '.cpp' 时也是如此)。

有没有办法实现根据文件后缀单独编译?

有不止一种方法可以做到这一点。最好的可能是将规则分成两条规则,一条用于 .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):