源代码结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Makefile in Nachos
10.18
张鸿烈 2009
Makefile.dep
在code/目录中的Makefile.dep文件用于 定义由g++使用的系统依赖关系的宏。它 被括入在code/Makefile.common文件中。 当前发行的Nachos可生成4种不同的硬件 体系的可执行内核程序 nachos。 依赖、目标和可执行文件统一放在各子系 统目录的arch目录的对应体系目录下。 例如:在i386体系机器的linux系统中可执 行的内核程序存放在 arch/unknown-i386-linux/bin/nachos。
Makefile in Nachos
10.2
张鸿烈 2009
make包含以下目标软件的生 成规则: 目标体(target),即make要建 立的目标文件。 目标的依赖体(dependency) 列表,通常为要编译的源文件或 要连接的浮动目标代码文件。 从目标依赖体创建目标体的命 令(command)列表,通常为 编译或连接命令。
Makefile in Nachos
10.24
张鸿烈 2009
这些规则说明了我们将根据所有的.o文件在目 录unknown-i386-linux/bin 中(对于linux系统) 构造二进制可执行文件nachos。使用以上规则 构造这个目标的定义为:
Makefile in Nachos
10.17
张鸿烈 2009
threads/目录下的Makefile.local
CCFILES = main.cc\ list.cc\ scheduler.cc\ synch.cc\ synchlist.cc\ system.cc\ ... INCPATH += -I../threads -I../machine DEFINES += -DTHREADS
Makefile in Nachos
10.10
张鸿烈 2009
make中的预定义变量
AR 归档维护程序,默认值=ar AS 汇编程序,默认值=as CC C编译程序,默认值=gcc CPP C++编译程序,默认值=cpp RM 删除程序,默认值=rm -f ARFIAGS 归档选项开关,默认值=rv ASFLAGE 汇编选项开关 CFLAGS C编译选项开关 CPPFLAGS C++编译选项开关 LDFILAGS 链接选项开关
code下的每个子目录中的Makefile都 括入 include Makefile.local include ../Makefile.common
Makefile in Nachos
10.16
张鸿烈 2009
Makefile.local
每个子目录中都不同,主要用于说明本目 录中文件特有的依赖关系。其中预定义变 量的值为: CCFILE 本目录中构造Nachos系统所用 到的C++源文件的文件名串 INCPATH 指示g++编译器查找C++源程 序中括入的.h文件的路径名串 DEFINES 传递给g++编译器的标号串
Makefile in Nachos
10.7
张鸿烈 2009
在Makefile中可以说明伪目标。 上例的clean目标体就是一个伪目 标。即伪目标无依赖体,它仅指 定了要执行的命令。
clean:
rm –f *.o
张鸿烈 2009
Makefile in Nachos
10.8
make中的宏变量
在Makefile中可以定义宏变量。变 量的定义格式为: 变量名=字符串1 字符串2 …. 变量的引用格式为:$(变量名) 如上例可改写为: obj=-c hello.o hello.h hello: $(obj) gcc $(obj) -o hello
Makefile in Nachos
10.21
张鸿烈 2009
Makefile.dep中定义的其他系统依赖的宏 arch_dir = arch/$(arch) 归档文件目录 obj_dir = $(arch_dir)/objects 存放目标文件的目录 bin_dir = $(arch_dir)/bin 存放可执行文件的目录 depends_dir = $(arch_dir)/depends 存放依赖关系文件的目录
Makefile in Nachos
10.6
张鸿烈 2009
make怎样知道什么时候需要 重新编译或无需重新编译或编 译部分文件呢?答案是:
如果指定的目标体make找不到,
make就根据该目标体在Makefile中说 明的生成规则建立它。 如果目标体存在,make就对目标体 和依赖体的时间戳进行比较,若有一 个或多个依赖体比目标体新,make就 根据生成命令重新生成目标体。这意 味着每个依赖体的改动都将使目标体 重新生成。
Makefile in Nachos
10.15
张鸿烈 2009
Nachos Makefile系统的组织 ../code/Makefile.common,Makefile.dep |___threads/Makefile,Makefile.local
|___userprog/ Makefile,Makefile.local … |___filesys/Makefile,Makefile.local
Makefile in Nachos
10.12
张鸿烈 2009
make中的模式规则
% 用于匹配目标体和依赖体中任意 非空字符串,例如: %.o: %.c $(cc) –c $^ -o $@
以上的模式规则表示,用g++编译器编译 依赖体中所有的.c文件,生成.o浮动目标 模块,目标文件名采用目标体文件名。 前缀#符号的行为注释行。
操作系统课程设计-10
NachOS-3.4系统的 Makefiles结构说明
Makefile in Nachos
10.1
张鸿烈 2009
make命令与Makefiles 结构 make是一种控制编译或重复编译 软件的工具软件,make可以自动 管理软件的编译内容、 编译方式和编译时机。使用make 需要你为你所编写的软件的开发 过程和组织结构编写一个 Makefile文件。make将根据 MAkefile中的说明去自动管理你 的软件的开发过程。Makefile是 一个文本形式的数据库文件。
Makefile in Nachos
10.23
张鸿烈 2009
vpath定义告诉make到哪儿去查找在当前目录中找不到 的文件。这就是为什么我们在一个新的目录中构造一个 新的Nachos系统时不必复制那些我们不作修改的文件的 原因。 这个文件中还定义了编译开关宏CFLAGS、目标文件规 则宏ofile ,和最终目标程序规则宏program。
Makefile in Nachos
10.22
张鸿烈 2009
Makefile.common首先括入Makefile.dep, 然后用vpath定义各类文件搜索路径。 include ../Makefile.dep vpath %.cc ../network:../filesys:../vm:../userprog: ../threads:../machine vpath %.h ../network:../filesys:../vm:../userprog:. ./threads:../machine vpath %.s ../network:../filesys:../vm:../userprog:. ./threads:../machine
张鸿烈 2009
Makefile in Nachos
10.19
Makefile.dep 定义的依赖系统的宏
HOST arch CPP CPPFLAGS GCCDIR LDFLAGS ASFLAGS
Makefile in Nachos
主机系统架构 文档存放路径 C++编译器的别名 C++编译开关 C++编译安装路径 程序链接开关 汇编开关
Makefile in Nachos
10.9
张鸿烈 2009
make中的自动变量 make中提供了一组元字符用来表 示自动变量,自动变量用来匹配某 种规则,它们有:
$@ 规则的目标体所对应的文件名 $< 规则中第一个相关文件名 $^ 规则中所有相关文件名的列表 $? 规则中所有日期新于目标的列表 $(@D) 目标文件的目录部分 $(@F) 目标文件的文件名部分
Makefile in Nachos
10.13
张鸿烈 2009
Nachos系统源代码树结构
nachos-3.4/ |__C++examples/ |__code/ |__machine/*.cc,*.h | |__arch/ *.o |__threads/*.cc,*.h | |__arch/ *.o |__userprog/*.cc,*.h | |__arch/ *.o |__vm/ *.cc,*.h | |__arch/ *.o |__filesys/ *.cc,*.h | |__arch/ *.o |__network/ *.cc,*.h |__arch/ *.o
Makefile in Nachos
机器硬件模拟 内核线程管理 用户进程管理 虚拟内存管理 文件系统管理 网络系统管理
张鸿烈 2009
10.14
Nachos系统的Makefiles 结构
在code目录中有两个为其子目录所 公用的Makefile文件: Makefile.common Makefile.dep 在code/的每个子目录中各自都有 两个Makefile文件: Makefile Makefile.local
10.20
张鸿烈 2009
i386-linux系统的宏定义:
HOST_LINUX = -linux HOST = -DHOST_i386 DHOST_LINUX CPP = /lib/cpp CPPFLAGS = $(INCDIR) -D HOST_i386 -D HOST_LINUX arch = unknown-i386-linux
Makefile in Nachos
10.3
张鸿烈 2009
源自文库
以上叙述在Makefile中用以下 规则形式表示
target:dependency[…] command1 command2 […]
Makefile in Nachos
10.4
张鸿烈 2009
例如我们编写了一个C程序存放在 hello.c和一个hello.h文件中,为了 使用make自动管理这个C程序的开 发,可以编写以下Makefile文件:
hell.o: hello.c hello.h gcc -c hello.c hello.h hello: hello.o gcc hello.o –o hello clean: rm –f *.o
Makefile in Nachos
10.5
张鸿烈 2009
这样我们就可以使用make按 我们说明在Makefile中的编译 规则编译我们的程序了: $make 生成可执行文件hello $make hello.o 生成浮动模块文件hello.o $make clean 清除所有.o文件
Makefile in Nachos
10.11
张鸿烈 2009
make中隐式规则(静态规则)
编译过程中一些固定的规则可以省略说 明,称为隐式规则。如上例中目标体 hello.o的规则隐含在目标体hello的规 则中,就属于隐式规则,可以省略为:
obj=hello.c hello: $(obj) gcc $(obj) -o hello
CFLAGS = -g -Wall -Wshadow -fwritablestrings $(INCPATH) $(DEFINES) $(HOST) -DCHANGED s_ofiles = $(SFILES:%.s=$(obj_dir)/%.o) c_ofiles = $(CFILES:%.c=$(obj_dir)/%.o) cc_ofiles = $(CCFILES:%.cc=$(obj_dir)/%.o) ofiles = $(cc_ofiles) $(c_ofiles) $(s_ofiles) program = $(bin_dir)/nachos $(program): $(ofiles)
10.18
张鸿烈 2009
Makefile.dep
在code/目录中的Makefile.dep文件用于 定义由g++使用的系统依赖关系的宏。它 被括入在code/Makefile.common文件中。 当前发行的Nachos可生成4种不同的硬件 体系的可执行内核程序 nachos。 依赖、目标和可执行文件统一放在各子系 统目录的arch目录的对应体系目录下。 例如:在i386体系机器的linux系统中可执 行的内核程序存放在 arch/unknown-i386-linux/bin/nachos。
Makefile in Nachos
10.2
张鸿烈 2009
make包含以下目标软件的生 成规则: 目标体(target),即make要建 立的目标文件。 目标的依赖体(dependency) 列表,通常为要编译的源文件或 要连接的浮动目标代码文件。 从目标依赖体创建目标体的命 令(command)列表,通常为 编译或连接命令。
Makefile in Nachos
10.24
张鸿烈 2009
这些规则说明了我们将根据所有的.o文件在目 录unknown-i386-linux/bin 中(对于linux系统) 构造二进制可执行文件nachos。使用以上规则 构造这个目标的定义为:
Makefile in Nachos
10.17
张鸿烈 2009
threads/目录下的Makefile.local
CCFILES = main.cc\ list.cc\ scheduler.cc\ synch.cc\ synchlist.cc\ system.cc\ ... INCPATH += -I../threads -I../machine DEFINES += -DTHREADS
Makefile in Nachos
10.10
张鸿烈 2009
make中的预定义变量
AR 归档维护程序,默认值=ar AS 汇编程序,默认值=as CC C编译程序,默认值=gcc CPP C++编译程序,默认值=cpp RM 删除程序,默认值=rm -f ARFIAGS 归档选项开关,默认值=rv ASFLAGE 汇编选项开关 CFLAGS C编译选项开关 CPPFLAGS C++编译选项开关 LDFILAGS 链接选项开关
code下的每个子目录中的Makefile都 括入 include Makefile.local include ../Makefile.common
Makefile in Nachos
10.16
张鸿烈 2009
Makefile.local
每个子目录中都不同,主要用于说明本目 录中文件特有的依赖关系。其中预定义变 量的值为: CCFILE 本目录中构造Nachos系统所用 到的C++源文件的文件名串 INCPATH 指示g++编译器查找C++源程 序中括入的.h文件的路径名串 DEFINES 传递给g++编译器的标号串
Makefile in Nachos
10.7
张鸿烈 2009
在Makefile中可以说明伪目标。 上例的clean目标体就是一个伪目 标。即伪目标无依赖体,它仅指 定了要执行的命令。
clean:
rm –f *.o
张鸿烈 2009
Makefile in Nachos
10.8
make中的宏变量
在Makefile中可以定义宏变量。变 量的定义格式为: 变量名=字符串1 字符串2 …. 变量的引用格式为:$(变量名) 如上例可改写为: obj=-c hello.o hello.h hello: $(obj) gcc $(obj) -o hello
Makefile in Nachos
10.21
张鸿烈 2009
Makefile.dep中定义的其他系统依赖的宏 arch_dir = arch/$(arch) 归档文件目录 obj_dir = $(arch_dir)/objects 存放目标文件的目录 bin_dir = $(arch_dir)/bin 存放可执行文件的目录 depends_dir = $(arch_dir)/depends 存放依赖关系文件的目录
Makefile in Nachos
10.6
张鸿烈 2009
make怎样知道什么时候需要 重新编译或无需重新编译或编 译部分文件呢?答案是:
如果指定的目标体make找不到,
make就根据该目标体在Makefile中说 明的生成规则建立它。 如果目标体存在,make就对目标体 和依赖体的时间戳进行比较,若有一 个或多个依赖体比目标体新,make就 根据生成命令重新生成目标体。这意 味着每个依赖体的改动都将使目标体 重新生成。
Makefile in Nachos
10.15
张鸿烈 2009
Nachos Makefile系统的组织 ../code/Makefile.common,Makefile.dep |___threads/Makefile,Makefile.local
|___userprog/ Makefile,Makefile.local … |___filesys/Makefile,Makefile.local
Makefile in Nachos
10.12
张鸿烈 2009
make中的模式规则
% 用于匹配目标体和依赖体中任意 非空字符串,例如: %.o: %.c $(cc) –c $^ -o $@
以上的模式规则表示,用g++编译器编译 依赖体中所有的.c文件,生成.o浮动目标 模块,目标文件名采用目标体文件名。 前缀#符号的行为注释行。
操作系统课程设计-10
NachOS-3.4系统的 Makefiles结构说明
Makefile in Nachos
10.1
张鸿烈 2009
make命令与Makefiles 结构 make是一种控制编译或重复编译 软件的工具软件,make可以自动 管理软件的编译内容、 编译方式和编译时机。使用make 需要你为你所编写的软件的开发 过程和组织结构编写一个 Makefile文件。make将根据 MAkefile中的说明去自动管理你 的软件的开发过程。Makefile是 一个文本形式的数据库文件。
Makefile in Nachos
10.23
张鸿烈 2009
vpath定义告诉make到哪儿去查找在当前目录中找不到 的文件。这就是为什么我们在一个新的目录中构造一个 新的Nachos系统时不必复制那些我们不作修改的文件的 原因。 这个文件中还定义了编译开关宏CFLAGS、目标文件规 则宏ofile ,和最终目标程序规则宏program。
Makefile in Nachos
10.22
张鸿烈 2009
Makefile.common首先括入Makefile.dep, 然后用vpath定义各类文件搜索路径。 include ../Makefile.dep vpath %.cc ../network:../filesys:../vm:../userprog: ../threads:../machine vpath %.h ../network:../filesys:../vm:../userprog:. ./threads:../machine vpath %.s ../network:../filesys:../vm:../userprog:. ./threads:../machine
张鸿烈 2009
Makefile in Nachos
10.19
Makefile.dep 定义的依赖系统的宏
HOST arch CPP CPPFLAGS GCCDIR LDFLAGS ASFLAGS
Makefile in Nachos
主机系统架构 文档存放路径 C++编译器的别名 C++编译开关 C++编译安装路径 程序链接开关 汇编开关
Makefile in Nachos
10.9
张鸿烈 2009
make中的自动变量 make中提供了一组元字符用来表 示自动变量,自动变量用来匹配某 种规则,它们有:
$@ 规则的目标体所对应的文件名 $< 规则中第一个相关文件名 $^ 规则中所有相关文件名的列表 $? 规则中所有日期新于目标的列表 $(@D) 目标文件的目录部分 $(@F) 目标文件的文件名部分
Makefile in Nachos
10.13
张鸿烈 2009
Nachos系统源代码树结构
nachos-3.4/ |__C++examples/ |__code/ |__machine/*.cc,*.h | |__arch/ *.o |__threads/*.cc,*.h | |__arch/ *.o |__userprog/*.cc,*.h | |__arch/ *.o |__vm/ *.cc,*.h | |__arch/ *.o |__filesys/ *.cc,*.h | |__arch/ *.o |__network/ *.cc,*.h |__arch/ *.o
Makefile in Nachos
机器硬件模拟 内核线程管理 用户进程管理 虚拟内存管理 文件系统管理 网络系统管理
张鸿烈 2009
10.14
Nachos系统的Makefiles 结构
在code目录中有两个为其子目录所 公用的Makefile文件: Makefile.common Makefile.dep 在code/的每个子目录中各自都有 两个Makefile文件: Makefile Makefile.local
10.20
张鸿烈 2009
i386-linux系统的宏定义:
HOST_LINUX = -linux HOST = -DHOST_i386 DHOST_LINUX CPP = /lib/cpp CPPFLAGS = $(INCDIR) -D HOST_i386 -D HOST_LINUX arch = unknown-i386-linux
Makefile in Nachos
10.3
张鸿烈 2009
源自文库
以上叙述在Makefile中用以下 规则形式表示
target:dependency[…] command1 command2 […]
Makefile in Nachos
10.4
张鸿烈 2009
例如我们编写了一个C程序存放在 hello.c和一个hello.h文件中,为了 使用make自动管理这个C程序的开 发,可以编写以下Makefile文件:
hell.o: hello.c hello.h gcc -c hello.c hello.h hello: hello.o gcc hello.o –o hello clean: rm –f *.o
Makefile in Nachos
10.5
张鸿烈 2009
这样我们就可以使用make按 我们说明在Makefile中的编译 规则编译我们的程序了: $make 生成可执行文件hello $make hello.o 生成浮动模块文件hello.o $make clean 清除所有.o文件
Makefile in Nachos
10.11
张鸿烈 2009
make中隐式规则(静态规则)
编译过程中一些固定的规则可以省略说 明,称为隐式规则。如上例中目标体 hello.o的规则隐含在目标体hello的规 则中,就属于隐式规则,可以省略为:
obj=hello.c hello: $(obj) gcc $(obj) -o hello
CFLAGS = -g -Wall -Wshadow -fwritablestrings $(INCPATH) $(DEFINES) $(HOST) -DCHANGED s_ofiles = $(SFILES:%.s=$(obj_dir)/%.o) c_ofiles = $(CFILES:%.c=$(obj_dir)/%.o) cc_ofiles = $(CCFILES:%.cc=$(obj_dir)/%.o) ofiles = $(cc_ofiles) $(c_ofiles) $(s_ofiles) program = $(bin_dir)/nachos $(program): $(ofiles)