操作系统第三次实验作业:OS-lab3-linux下C代码的编写和运行
本文按照老师给的Makefile文件的顺序进行注释,不同版本的Makefile文件略微不同。(注释在代码框里,颜色较浅,代码框外的为一些额外说明)
可到GNU Linux kernel官网,下载GNU Linux内核文件(最新版本)https://www.kernel.org/
一.版本及名称
VERSION = 3 #主修版本号
PATCHLEVEL = 11 #修补版本号
SUBLEVEL = 2 #次版本号
EXTRAVERSION = #附加信息,一般默认为空,我们可以自己设置
NAME = Linux for Workgroups
二.内置隐含规则和变量设置
- 隐含规则则是内建在make 中,为make 提供了重建某一类目标文件(.o 等)的通用方法,同时这些隐含规则所用到的变量也就是所谓的隐含变量。
- 隐含规则的好处是在Makefile 中不需要明确给出重建某一个目标的命令,甚至可以不需要规则。make会为你自动搜寻匹配的隐含规则链。
- 隐含规则的代价之一就是低效,系统必须搜索可能的隐含规则链。同时隐含规则也有可能应用了不是你想要的规则而引入很难debug的错误。
- 变量SHELL与MAKEFLAGS一样,默认情况(没有用“unexport”声明)下在整个make的执行过程中被自动的传递给所有的子make。
MAKEFLAGS += -rR --no-print-directory
#这是GNU make的的环境变量,为了避免覆盖已有值,所以使用+=来追加变量,在下一级子目录中执行的make时,这些选项会被附加作为make的命令行参数来执行,
#-r禁止使用build-in规则(build-in规则是指隐含规则)
#--no-print-directory是:不要再屏幕上打印"Entering directory.."
# 在下一级子目录中执行的make时,这些选项会被附加作为make的命令行参数来执行,
三.修改C语言区域设置
- 在locale环境中,有一组变量,代表国际化环境中的不同设置,"C"是系统默认的locale:
- #LC_ALL是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。
#LC_COLLATE定义该环境的排序和比较规则
#LC_NUMERIC非货币的数字显示格式 -
export将变量传递到子make过程,unexport禁止将变量传递到子make过程。
unexport LC_ALL #非传递环境变量,不会传递到下一级Makefile
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC
四.设置编译信息的输出模式
- 应用变量的语法是:$(变量名)。如KBUILD_VERBOSE = $(V)中的$(V)。
- “ifeq”语法是ifeq (;, ;),功能是比较参数“arg1”和“arg2”的值是否相同。
- 函数origin并不操作变量的值,只是告诉你你的这个变量是哪里来的。
origin函数的返回值有:
"undefined"从来没有定义过、“default”是一个默认的定义、“
"environment"是一个环境变量、
"file"这个变量被定义在Makefile中
"command line"这个变量是被命令行定义的
"override"是被override指示符重新定义的
"automatic"是一个命令运行中的自动化变量
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
#KBUILD_VERBOSE的值根据在命令行中是否定义了变量V,如果V在命令行中定义,则将此变量赋给KBUILD_VERBOSE
#“command line”这个变量是被命令行定义的
- ifndef与ifdef语法类似,但功能恰好相反:
ifndef判断变量是不是没有被赋值。ifdef只检验一个变量是否已经被赋值,它并不会去推导这个变量,并不会把变量扩展到当前位置。 - 应用变量的语法是:$(变量名)。如KBUILD_VERBOSE = $(V)中的$(V)。
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
#如果KBUILD_VERBOSE 没有定义,则将0赋给
五.设置是否进行对源代码的检查
ifeq ("$(origin C)", "command line")
KBUILD_CHECKSRC = $(C)
endif
# 如果”C“被定义了,并且”C“ 是通过命令行设置的,则KBUILD_CHEC