我是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 $@

感谢您的关注。

#1楼 票数:2

您可以使用VPATH

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

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

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

还有许多其他因素需要考虑,例如自动依赖性检测,是否可以将所有目标文件真正放入同一个目录等。

  ask by Kostya translate from so

未解决问题?本站智能推荐:

1回复

如何在makefile中正确编写模式规则?

C_SOURCES = $(wildcard src/kernel/*.c) C_HEADERS = $(wildcard src/kernel/*.h) C_SRC_NOT_DIR = $(notdir $(C_SOURCES)) C_OBJS = $(C_SRC_NOT_DIR:%.c=%.o)
2回复

Makefile,更好地理解规则

阅读官方文档 前提条件是文件将用作创建目标的输入。 目标通常取决于多个文件。 如果我的源文件已经包含标题,是否应该在规则中列出标题? src.c myheader.h 生成文件 如果在先决条件中添加myheader.h ,它什么也不会改变,则相同
3回复

如何编写可以接受CMD行中的参数的Makefile

因此,我正在努力实现自己的类似于链表的数据结构,并且我创建了一个make文件,该文件使用测试用例文件来编译.c文件,该用例文件将检查我的实现是否正常运行 原本是我的make文件现在可以正常工作,但是如果我需要更改测试用例,则必须手动编辑我的make文件 我想知道是否有一种方法可以在
1回复

如何编写Makefile从一个来源生成两个可执行文件?

我有两个源文件, foo.c和bar.c 我有一个Makefile来像这样构建它们: 然后我意识到foo.c和bar.c是相同的,除了一个功能。 所以我删除了bar.c并在foo.c bar.c #if defined() bar.c #if defined()放在函数周围,如下所示
4回复

如何编写“选择性” Makefile?

菜鸟问题在这里。 我的目录中有很多.c文件,它们基本上是libc函数,我将自己编码为执行程序。 我在这些文件中写了一点main()来测试功能,并且我想编写一个Makefile,例如,我可以只编译我要测试的文件: 并且仅获取在memset.c中编写的代码的可执行文件。 我
3回复

我无法弄清楚此makefile中出了什么问题?

我正在尝试编译一个用于遗传编程的C库,称为lil-gp 。 我不知道这种问题是否适合在这里提出,但我正在寻求有关此问题的认真帮助。 生成文件位于目录lilgp1.1/1.1/kernel并命名为GNUmakefile.kernel 。 它看起来像这样: 首先,我遵循以下步骤
1回复

如何为不同的配置分离Makefile构建输出?

鉴于我有一个简单的Makefile项目,如下所示: 我可以构建以针对不同的体系结构: 这有效但我希望能够同时维护多个配置的输出,例如在构建服务器上。 什么是一个好的,干净的方式来解决这个问题? 我考虑过以下几点: 使用autotools或其他构建工具,但我希望看
2回复

便携式等效的GNU使%风格的模式规则

我正在按照“ 使用Autotools的检查”页面上的说明尝试在(当前)小型C项目中构建对单元测试的支持。 虽然我使用的是Cgreen而不是Check 。 我遇到了第9步的问题,这导致automake发出关于使用`%'的警告 - 样式模式规则是GNU make扩展。 具体的制定规则是