有时需要通过make编译命令时确定代码中的宏定义,如编译不同的版本只需要使用不同的编译命令即可,而不需要修改内部代码。

当前的需求是代码中有一部分代码通过宏定义来确定编译的是 DIE0 版本还是 DIE1 版本,如果定义了DIE_ORDINAL_0 就使用 DIE0 的基地址,如果未定义就使用 DIE1 的基地址。

#define DIE_ORDINAL_0
#ifdef DIE_ORDINAL_0
#define PERIPH_BASE (SYS_BASE_ADDR_DIE0)
#else
#define PERIPH_BASE (SYS_BASE_ADDR_DIE1)
#endif

gcc 命令支持-D宏定义,相当于 C 中的全局#define,在 Makefile 中我们可以通过宏定义来控制源程序的编译。只要在 Makefile 中的 CFLAGS 中通过选项-D 来指定你于定义的宏即可。

CFLAGS += -D DIE_ORDINAL_0
# 在编译的时候加上此选项就可以了
$(CC) $(CFLAGS) $^ -o $@

这样的话,相当于设置了DIE_ORDINAL_0这个宏定义。但是我们想通过命令行的参数来决定是否使用这个宏定义,可以通过一些简单的方法获取:

ifeq ($(DIE0), y)
  CFLAGS +=-DDIE_ORDINAL_0
else
  CFLAGS +=-DDIE_ORDINAL_1
endif
$(CC) $(CFLAGS) $^ -o $@

从命令行找到DIE0这个参数,如果它等于y表示使用DIE_ORDINAL_0。如果不等于y则使用DIE_ORDINAL_1,因为我们代码里没有DIE_ORDINAL_1,所以就相当于没有定义DIE_ORDINAL_0

命令行示例:

# 编译DIE0
make DIE0="y"
# 编译DIE1
make DIE0="n"