Makefile注释

本文详细解析了Makefile中的关键部分,包括版本及名称设定、内置隐含规则和变量、C语言区域设置、编译信息输出模式、源代码检查、输出目录配置、编译外部模块等内容,深入探讨了Makefile在操作系统构建中的作用和重要性。
摘要由CSDN通过智能技术生成

操作系统第三次实验作业: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

二.内置隐含规则和变量设置

  1. 隐含规则则是内建在make 中,为make 提供了重建某一类目标文件(.o 等)的通用方法,同时这些隐含规则所用到的变量也就是所谓的隐含变量。
  2. 隐含规则的好处是在Makefile 中不需要明确给出重建某一个目标的命令,甚至可以不需要规则。make会为你自动搜寻匹配的隐含规则链。
  3. 隐含规则的代价之一就是低效,系统必须搜索可能的隐含规则链。同时隐含规则也有可能应用了不是你想要的规则而引入很难debug的错误。
  4. 变量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语言区域设置

  1. 在locale环境中,有一组变量,代表国际化环境中的不同设置,"C"是系统默认的locale:
  2. #LC_ALL是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。
    #LC_COLLATE定义该环境的排序和比较规则
    #LC_NUMERIC非货币的数字显示格式
  3. export将变量传递到子make过程,unexport禁止将变量传递到子make过程。

unexport LC_ALL #非传递环境变量,不会传递到下一级Makefile
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC

四.设置编译信息的输出模式

  1. 应用变量的语法是:$(变量名)。如KBUILD_VERBOSE = $(V)中的$(V)。
  2. “ifeq”语法是ifeq (;, ;),功能是比较参数“arg1”和“arg2”的值是否相同。
  3. 函数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”这个变量是被命令行定义的
  1. ifndef与ifdef语法类似,但功能恰好相反:
    ifndef判断变量是不是没有被赋值。ifdef只检验一个变量是否已经被赋值,它并不会去推导这个变量,并不会把变量扩展到当前位置。
  2. 应用变量的语法是:$(变量名)。如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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值