【问题标题】:How can i simplify a pattern rules in makefile?如何简化makefile中的模式规则?
【发布时间】:2019-09-12 18:04:30
【问题描述】:

我是 makefile 创建的新手。 你能告诉我如何简化我的makefile,给一些提示吗? 在我的代码中,我必须为每个新目录创建一个新的模式规则。

KERNEL_SRCS = $(wildcard $(KERNEL_DIR)*.c)
KERNEL_HDRS = $(wildcard $(KERNEL_DIR)*.h)

DRIVERS_SRCS = $(wildcard $(DRIVERS_DIR)*.c)
DRIVERS_HDRS = $(wildcard $(DRIVERS_DIR)*.h)

LIBS_SRCS = $(wildcard $(LIBS_DIR)*.c)
LIBS_HDRS = $(wildcard $(LIBS_DIR)*.h)

KERNEL_DIR = src/kernel/
DRIVERS_DIR = src/drivers/
LIBS_DIR = src/libs/
OBJS_DIR = objs/

$(OBJS_DIR)%.o: $(DRIVERS_DIR)%.c $(HDRS)
    gcc -m32 -fno-pie -ffreestanding -c $< -o $@

$(OBJS_DIR)%.o: $(KERNEL_DIR)%.c $(HDRS)
    gcc -m32 -fno-pie -ffreestanding -c $< -o $@

$(OBJS_DIR)%.o: $(LIBS_DIR)%.c $(HDRS)
    gcc -m32 -fno-pie -ffreestanding -c $< -o $@

感谢您的关注。

【问题讨论】:

  • 将对象构建到与其对应的源相同的目录中更为常规。这样做有几个优点,尤其是您不需要为每个源目录设置单独的规则。事实上,对于你实际编译的方式,你完全可以不用任何明确的 %.o:%.c 规则。

标签: c makefile gnu-make


【解决方案1】:

你可以use VPATH:

VPATH := $(KERNEL_DIR):$(DRIVERS_DIR):$(LIBS_DIR)

$(OBJS_DIR)%.o: %.c $(HDRS)
        gcc -m32 -fno-pie -ffreestanding -c $< -o $@

您应该使用更多变量,例如 CC 保存编译器,CFLAGS 保存编译器标志等。

还有很多其他的事情需要考虑,比如自动依赖检测,你是否真的可以把所有的目标文件放到同一个目录中等等。

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多