ucore step by step
tutorial
tutorial
  • 欢迎来到ucore step-by-step的世界
  • lab0: 预备起
    • 溯源: ucore的历史
    • 概览: 指导书的结构
    • 开搞: 实验环境搭建
  • lab0.5: 比麻雀更小的麻雀(最小可执行内核)
    • 内存布局,OpenSBI,elf和bin
    • 链接脚本和入口点
    • "真正的"入口点
    • 从SBI到stdio
    • Just make it
    • 项目组成和执行流
  • lab1: 断, 都可以断
    • 掉进兔子洞(中断入口点)
    • 中断处理程序
    • 滴答滴答(时钟中断)
    • 项目组成和执行流
  • lab2: 物理内存和页表
    • 内核初始映射
    • 物理内存管理
    • 页面分配算法
    • 项目组成和执行流
  • lab3: 缺页异常和页面置换
    • 扫清外围
    • 使用多级页表
    • 页面置换机制
    • FIFO置换算法
    • 项目组成和执行流
  • lab4: 进程管理
    • 进程与线程
    • 相关数据结构
    • 进程模块初始化
    • 进程切换
    • 项目组成和执行流
  • lab5: 用户程序
    • 用户程序
    • system call!
    • 中断处理
    • 项目组成和执行流
  • lab6: 进程调度
    • 再次认识进程切换
    • 调度算法框架
    • 项目组成和执行流
  • lab7: 同步互斥
    • 同步互斥的基本概念
    • 信号量
    • 条件变量与管程
    • 项目组成和执行流
  • lab8: 文件系统
    • 文件系统抽象层VFS
    • 硬盘文件系统SFS
    • 设备即文件
    • 从zhong duan 到 zhong duan
    • 项目组成和执行流
  • 练习题
    • lab1
    • lab2
    • lab3
    • lab4
    • lab5
    • lab6
    • lab7
    • lab8
  • 附录
    • makefile
由 GitBook 提供支持
在本页
  • makefile文件的基本结构
  • 使用宏变量
  • 控制流和函数
  • 参考资料

这有帮助吗?

  1. 附录

makefile

makefile是一种自动构建项目的工具。在我们的ucore实现中, 我们使用了makefile进行项目的自动构建。下面我们来讨论一些关于makefile文件的基本知识。

makefile文件的基本结构

makefile文件的基本结构是目标(target)、依赖(prerequisites)和命令(command)。每一个makefile文件的内部都包含了许多这样的生成规则。

target ... : prerequisites ...
    command
    ...
    ...

这三个要件描述了一种依赖关系:当依赖比目标文件新的时候,则命令被执行。当我们在命令行输入make的时候,make程序会自动寻找目录下的makefile文件,依次检查依赖关系(以及依赖关系的依赖关系),最终按照合适的顺序执行命令,保证所需要的目标文件被生成。

使用宏变量

为了方便把重复的内容进行统一的管理,可以使用makefile的变量。这样,对于重复内容的修改就变成了对变量值的修改。我们一般使用大写的字符串表示变量,比如OBJ,OBJECTS等。变量定义的方法非常简单,只需要通过等号赋值即可,如下

OBJ = a.o b.o

在需要使用变量的地方,我们用$(变量名)来使用变量。比如一段makefile代码如下所示:

main: a.o b.o
    gcc a.o b.o -o main

使用了宏变量后就变成了下面这样:

OBJ = a.o b.o
main: $(OBJ)
    gcc $(OBJ) -o main

如果我们需要添加一个新的.o文件,我们只需要修改第一行代码就可以啦~

变量也可以使用shell命令来定义,比如:

cur_dir   := $(shell pwd)

使用这条命令会把当前所在的目录赋给变量cur_dir,这是也一种非常好的将shell指令和makefile结合起来的方式。

控制流和函数

在makefile中,可以使用if等方法控制makefile执行的控制流。比如下面这个例子:

foo: $(objects)
ifeq ($(CC),gcc)
    $(CC) -o foo $(objects) $(libs_for_gcc)
else
    $(CC) -o foo $(objects) $(normal_libs)
endif

这里使用了ifeq指令判断变量CC是否为gcc,如果是则执行链接gcc相关的库,否则采取另外一套操作。类似的关键字还有ifneq(如果不相等)、ifdef(如果某个变量已定义)、ifndef(如果某个变量未定义)。

makefile中也可以使用函数。函数调用遵循下面的范式:

$(<function> <arguments>)

makefile提供了许多函数,如字符处理函数,目录操作函数等等,可以帮助我们完成一些makefile中的常用操作。关于如何自定义函数的内容,感兴趣的同学可以自己去了解。

参考资料

上一页附录

最后更新于4年前

这有帮助吗?

跟我一起写makefile