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

Posted

技术标签:

【中文标题】在 makefile 中使用 ifeq 编译 C 或 CPP 文件【英文标题】:Using ifeq in makefile to compile either C or CPP file 【发布时间】:2018-08-11 13:00:55 【问题描述】:

我想将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' 时也是如此)。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于在 makefile 中使用 ifeq 编译 C 或 CPP 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Makefile(vim)中的ifeq检查头文件是否位于main.c中

内核makefile里面的如何定义宏

如何使用makefile?

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法

怎样使用 makeflags in makefile

请教多文件夹makefile问题