如何在Makefile中使用config选项

如何在Makefile中使用config选项,makefile,config,Makefile,Config,我的主项目目录有4个子目录,每个子目录都有一些.c和.S文件。我只在外部编写了一个Makefile,其中包含以下行: ... AS_SRC= $(wildcard cpu/*.S) $(wildcard drivers/*.S) $(wildcard lib/*.S) $(wildcard init/*.S) C_SRC= $(wildcard cpu/*.c) $(wildcard drivers/*.c) $(wildcard lib/*.c) $(wildcard init/*.c)

我的主项目目录有4个子目录,每个子目录都有一些.c和.S文件。我只在外部编写了一个Makefile,其中包含以下行:

...

AS_SRC= $(wildcard cpu/*.S) $(wildcard drivers/*.S) $(wildcard lib/*.S) $(wildcard init/*.S)
C_SRC= $(wildcard cpu/*.c) $(wildcard drivers/*.c) $(wildcard lib/*.c) $(wildcard init/*.c)

OBJS =  $(AS_SRC:.S=.o) $(C_SRC:.c=.o)

.PHONY: all
all: $(TARGET).bin

%.o: %.S
    @$(CC) -x assembler-with-cpp $(ASFLAGS) $< -o $@

%.o: %.c
    @$(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@

$(TARGET).elf: $(OBJS)
    @$(CC) $^ $(LFLAGS) -o $@

$(TARGET).bin: $(TARGET).elf
    @$(OC) -S -O binary $< $@

...
。。。
AS_SRC=$(通配符cpu/*.S)$(通配符驱动程序/*.S)$(通配符lib/*.S)$(通配符init/*.S)
C_SRC=$(通配符cpu/*.C)$(通配符驱动程序/*.C)$(通配符lib/*.C)$(通配符init/*.C)
OBJS=$(AS_SRC:.S=.o)$(C_SRC:.C=.o)
冒牌货:全部
全部:$(目标).bin
%.o:%.S
@$(CC)-x汇编程序,带有cpp$(ASFLAGS)$<-o$@
%.o:%.c
@$(CC)-c$(CFLAGS)$(包括)$<-o$@
$(目标).elf:$(OBJS)
@$(CC)$^$(LFLAGS)-o$@
$(目标).bin:$(目标).elf
@$(OC)-S-O二进制$<$@
...
我知道这不是一个很好的编写Makefile的方法。我想要一个.config文件,根据它来决定编译哪些文件。我还想在代码中使用那些配置选项,比如
#ifdef config\u something
。我试图从Linux内核代码的主Makefile中理解并实现类似的东西,但Makefile似乎太复杂了


有人能就如何进行提出建议吗?我已经试着在谷歌上搜索过了,但是找不到任何关于如何使用配置文件的提示

如果配置文件遵循Makefile规则(var=value),则可以使用include

在Makefile中:

CONFIG = default.config
include ${CONFIG}

ifdef (... test on CONFIG setting)
endif

当在没有参数的情况下调用make时(即
make target
),它将使用“default”配置文件(上面的default.config)。要使用不同的配置运行make,请使用
make config=alt.config…

这听起来像是在寻找GNU自动工具,它将生成一个config.h文件,您可以在配置中包含并使用配置变量code@jenesaisquoi如果我只想编译特定的文件,构建系统将生成makefile,因此您应该能够在常规makefile中执行所有操作。我不是自动工具方面的专家——它是非常可配置的,而且非常简单complex@jenesaisquoi好的,谢谢。我会看一下。我看不出这个makefile有什么问题(尽管我个人更喜欢在我的makefiles中列出文件,而不是使用
通配符
)。我们不能给出太多建议,除非你描述你所说的决定编译什么文件的意思;您有时不想全部编译它们吗?为什么?在什么情况下?另外,在什么情况下,您希望使用不同的预处理器宏?