一个最简单的Makefile

Makefile好比菜谱,菜谱告诉厨师如何做菜,Makefile则告诉make工具如何编译源代码。

Makefile - 菜谱

Makefile的基本拼图是规则,规则可以简单的理解为,如何通过源生成目标,其格式如下:

目标 : 源
    从源生成目标的方法

规则至少说明了两件事:什么时间,如何生成目标。
当源发生变化时,目标被重新生成。生成的方法在规则的第二行中被描述。

我们看一个最简单的Makefile。

hello.c:

#include <stdio.h>

int main()
{
   printf("Hello world!\n");
}
Makefile:

hello : hello.c
        gcc hello.c -o hello

编译运行:

# make
gcc hello.c -o hello
# ./hello
Hello world!

虽然绝大多数Makefile都可以写得如此清晰执白,但是在现实中的Makefile却令人崩溃。我们看一个略显复杂的例子。

Makefile:

PROGRAMS = server client

server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol

client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol

# Everything after this is generic

.PHONY: all
all: $(PROGRAMS)

define PROGRAM_template =
        $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
        ALL_OBJS += $$($(1)_OBJS)
endef

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

$(PROGRAMS):
        $(LINK.o) $^ $(LDLIBS) -o $@
clean:
       rm -f $(ALL_OBJS) $(PROGRAMS)

然而,再复杂的Makefile都是由各种简单的部分构成。以后,我们将有机会学习每个简单而具体的知识点。

GNU Make Manual(参考1)有200多页,不好读,但却是找到Makefile各种问题答案的首选文档。

参考

  1. GNU Make 4.2 Manual
Great GNU
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,784评论 0 17
  • makefile关系到整个工程的编译规则,一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干的目录当中,...
    Joe_HUST阅读 1,984评论 0 3
  • @(linux 编程)[开发技能, 工具使用] What is GNU Make Make 是控制工程中通过源码生...
    orientlu阅读 11,612评论 0 26
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,545评论 19 139
  • 在我写 Makefile 的头 10 年里,我养成了一个非常不好的习惯-- 完全严格使用 GNU Make 的扩展...
    liuchengxu阅读 1,481评论 0 13

友情链接更多精彩内容