make_Makefile 结构分析
make makefile 的参数

make makefile 的参数make是一个常用的构建工具,用于自动化编译和构建软件项目。
makefile是make工具的配置文件,用于描述项目的构建规则和依赖关系。
本文将介绍makefile的参数,包括常用的参数及其用法。
一、常用参数及其用法1. -f 文件名:指定makefile的文件名,默认为"makefile"或"Makefile"。
通过该参数,可以使用其他名称的makefile文件。
2. -C 目录:指定make命令的工作目录。
在执行make命令时,会切换到指定的目录,并在该目录下查找makefile文件进行构建。
3. -n:显示执行make命令时的操作,但不实际执行。
通过该参数,可以预览make命令的执行过程,检查构建规则是否正确。
4. -p:显示make命令的内置变量和规则。
通过该参数,可以查看make命令的内部工作机制,了解makefile文件的编写规则和使用方法。
5. -B:强制重新构建目标文件。
通过该参数,可以忽略文件的时间戳,强制重新执行构建规则,生成新的目标文件。
6. -j 并发数:指定make命令的并发执行数。
通过该参数,可以提高构建速度,同时执行多个任务。
7. -s:静默模式,不显示执行的命令。
通过该参数,可以减少输出信息,使构建过程更加清晰。
二、makefile的构建规则makefile由一系列构建规则组成,每个规则定义了目标文件、依赖文件和构建命令。
make命令根据构建规则,自动判断需要更新的文件,并执行相应的构建命令。
构建规则的基本格式如下:目标文件: 依赖文件构建命令其中,目标文件是要生成的文件,依赖文件是目标文件依赖的文件,构建命令是生成目标文件的命令。
构建规则中的目标文件和依赖文件可以是文件名,也可以是变量。
通过使用变量,可以提高makefile的可维护性和灵活性。
构建命令可以是任意的Shell命令,包括编译、链接、拷贝等操作。
makefile arm编译

makefile arm编译Makefile是一种用于自动化构建项目的工具,可以帮助开发人员更方便地编译和链接程序。
在ARM架构下,Makefile也是一种常用的编译方式。
本文将介绍如何使用Makefile在ARM架构下进行编译。
为了能够正确地编译ARM架构的程序,我们需要确保系统上已经安装了ARM交叉编译工具链。
这个工具链包含了一系列的工具,如编译器、链接器等,可以将源代码编译成可在ARM架构上运行的机器码。
安装好工具链后,我们可以开始编写Makefile。
Makefile是一个文本文件,其中包含了一系列规则和命令,用于告诉Make工具如何编译和链接程序。
我们可以通过编写Makefile来定义编译的规则,如源文件和目标文件的依赖关系,以及编译和链接的命令。
下面是一个简单的Makefile示例:```CC = arm-linux-gccCFLAGS = -Wall -O2TARGET = programOBJS = main.o func.o$(TARGET): $(OBJS)$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)main.o: main.c$(CC) $(CFLAGS) -c main.cfunc.o: func.c$(CC) $(CFLAGS) -c func.cclean:rm -f $(TARGET) $(OBJS)```在这个Makefile中,我们首先定义了编译器和编译选项的变量。
CC 变量指定了使用的编译器,CFLAGS变量指定了编译选项,如-Wall 表示开启所有警告信息,-O2表示启用优化。
接下来,我们定义了目标文件和源文件的变量。
TARGET变量指定了目标文件的名称,OBJS变量指定了源文件编译后生成的目标文件。
然后,我们定义了一个规则来编译目标文件。
$(TARGET): $(OBJS)表示$(TARGET)依赖于$(OBJS),即目标文件依赖于源文件。
makefile中make指令传入的参数

makefile中make指令传入的参数(实用版)目录1.Makefile 简介2.Make 指令的作用3.Make 指令传入的参数4.示例与实践正文1.Makefile 简介Makefile 是一种构建脚本,用于自动化构建和编译软件项目。
它通常包含一系列的规则和指令,可以自动地执行编译、链接和安装等任务。
Makefile 最早用于 Unix 系统,现在已广泛应用于各种操作系统和编程语言。
2.Make 指令的作用在 Makefile 中,Make 指令是最核心的命令。
它可以自动地执行一系列的编译、链接和安装等任务,以构建软件项目。
Make 指令的工作原理是基于依赖关系,它可以自动地发现源文件和目标文件之间的依赖关系,并按照一定的顺序执行相应的操作。
3.Make 指令传入的参数Make 指令传入的参数主要有以下几种:(1)目标:指定要构建的目标文件,通常是可执行文件或库文件。
(2)源文件:指定构成目标文件的源文件,可以是 C、C++等源代码文件。
(3)编译器:指定用于编译源文件的编译器,例如 gcc、g++等。
(4)链接器:指定用于链接目标文件和库文件的链接器,例如 ld、ld.so 等。
(5)其他选项:还可以指定其他选项,例如优化级别、输出文件名等。
4.示例与实践下面是一个简单的 Makefile 示例,用于编译一个 C 语言程序:```CC = gccCFLAGS = -Wall -o2SOURCES = main.cOBJECTS = main.oTARGET = mainall: $(TARGET)$(TARGET): $(OBJECTS)t$(CC) $(CFLAGS) $^ -o $@$(OBJECTS): $(SOURCES)t$(CC) $(CFLAGS) -c $< -o $@```在这个示例中,我们指定了编译器(CC)、优化选项(CFLAGS)、源文件(SOURCES)、目标文件(TARGET)和依赖关系(all: $(TARGET))。
makefile基本使用方法

makefile基本使用方法makefile是一种用来管理和自动化构建程序的工具。
它可以根据源代码文件的依赖关系和编译规则来自动构建目标文件和可执行文件。
makefile的基本使用方法如下:1. 创建makefile文件:在项目的根目录下创建一个名为makefile 的文件。
2. 定义变量:在makefile中,可以使用变量来存储一些常用的参数和路径,以便于后续的使用。
例如,可以定义一个名为CC的变量来指定编译器的名称,如:CC=gcc。
3. 编写规则:在makefile中,可以使用规则来指定如何编译源代码文件和生成目标文件。
一个规则由两部分组成:目标和依赖。
目标是要生成的文件,依赖是生成目标文件所需要的源代码文件。
例如,可以编写以下规则:```target: dependency1 dependency2command1command2```其中,target是目标文件,dependency1和dependency2是依赖的源代码文件,command1和command2是生成目标文件所需要执行的命令。
4. 编写默认规则:在makefile中,可以使用一个默认规则来指定如何生成最终的可执行文件。
默认规则的目标通常是可执行文件,依赖是所有的源代码文件。
例如,可以编写以下默认规则:```all: target1 target2```其中,target1和target2是生成的目标文件。
5. 编写clean规则:在makefile中,可以使用clean规则来清理生成的目标文件和可执行文件。
例如,可以编写以下clean规则: ```clean:rm -f target1 target2```其中,target1和target2是要清理的目标文件。
6. 运行make命令:在命令行中,使用make命令来执行makefile 文件。
make命令会自动根据规则和依赖关系来编译源代码文件和生成目标文件。
例如,可以运行以下命令:``````make命令会根据makefile文件中的规则和依赖关系来编译源代码文件并生成目标文件和可执行文件。
linux 顶层makefile分析

Linux顶层Makefile文件分析分类:Linux 系列2013-05-06 17:05 585人阅读评论(0) 收藏举报1、make menuconfigVERSION = 2PATCHLEVEL = 6SUBLEVEL = 26EXTRAVERSION =NAME = Rotary Wombat# *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file.# Do not:# o use make's built-in rules and variables# (this increases performance and avoids hard-to-debug behaviour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory#-r禁止使用build-in规则#--no-print-directory是:不要再屏幕上打印"Entering directory.."#记住变量SHELL,MAKEFLAGS在整个make的执行过程中#始终被自动的传递给所有的子make# We are using a recursive build, so we need to do a little thinking# to get the ordering right.## Most importantly: sub-Makefiles should only ever modify files in# their own directory. If in some directory we have a dependency on# a file in another dir (which doesn't happen often, but it's often# unavoidable when linking the built-in.o targets which finy# turn into vmlinux), we will call a sub make in that other dir, and# after that we are sure that everything which is in that other dir# is now up to date.## The only cases where we need to modify files which have global# effects are thus separated out and done before the recursive# descending is started. They are now explicitly listed as the# prepare rule.# To put more focus on warnings, be less verbose as default# Use 'make V=1' to see the full commandsifdef V #v=1ifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V) #把V的值作为KBUILD_VERBOSE的值 endifendififndef KBUILD_VERBOSE #即默认我们是不回显的#回显即在命令执行前显示要执行的命令KBUILD_VERBOSE = 0endif# 函数origin并不操作变量的值,只是告诉你你的这个变量是哪里来的。
make的工作原理

make的工作原理引言make是一个流行的构建工具,广泛应用于软件开发中。
它能够根据代码的依赖关系自动构建并更新目标文件,提高编译效率。
本文将深入探讨make的工作原理。
1. make的概述Make是一个基于规则的构建工具,可以自动根据源文件的改变来更新目标文件。
它将每个文件的依赖关系描述为一个规则,然后根据这些规则来执行构建任务。
2. makefile文件make使用makefile文件来定义规则和构建任务。
makefile是一个文本文件,其中包含一系列目标、依赖关系和相应的构建命令。
make根据这些规则来决定是否需要重新构建目标文件。
2.1 目标和依赖关系makefile中的每个规则都由一个目标和依赖关系组成。
目标是需要构建的文件,而依赖关系是构建目标所需的文件或其他目标。
make会根据目标和依赖关系来确定构建顺序。
2.2 构建命令每个规则还包含一个或多个构建命令,用于执行构建任务。
构建命令通常是一些shell命令,用于编译源代码、链接目标文件等操作。
make通过执行这些命令来生成目标文件。
3. make的工作流程make的工作流程可以分为以下几个步骤:3.1 解析makefile当执行make命令时,首先会读取makefile文件,并解析其中的规则和命令。
make 会根据文件中的规则建立依赖关系图,并确定构建任务的顺序。
3.2 检查目标和依赖关系在执行构建任务之前,make会检查目标文件和依赖关系的状态。
如果目标文件不存在或者依赖关系中的文件有修改,则需要重新构建目标文件。
3.3 执行构建命令如果需要重新构建目标文件,make会依次执行与该目标关联的构建命令。
构建命令通常是通过调用编译器、链接器等工具来实现的。
执行构建命令后,生成新的目标文件。
3.4 更新目标文件在执行构建命令后,make会根据构建结果更新目标文件的状态。
如果构建成功,目标文件的时间戳会更新为最新时间;如果构建失败,则不会更新目标文件。
linux中make函数作用

linux中make函数作用make函数是Linux系统中常用的命令之一,它的作用是根据源文件的依赖关系,自动化地管理程序的编译、链接和安装过程。
在Linux系统中,make函数被广泛应用于软件开发、系统维护和自动化脚本编写等领域。
一、make函数的基本概念和用法make函数是一个构建工具,它通过读取名为Makefile的文件来执行相应的操作。
Makefile是一个文本文件,其中包含了一系列规则和指令,用于描述源文件之间的依赖关系和构建过程。
通过执行make命令,系统会根据Makefile中的规则来判断需要重新编译哪些文件,并自动执行编译、链接等操作。
make函数的基本用法如下:1. 创建Makefile文件:在项目目录下创建名为Makefile的文件,并使用文本编辑器打开。
2. 编写规则和指令:在Makefile中编写一系列规则和指令,用于描述源文件之间的依赖关系和构建过程。
每个规则由一个目标(target)、依赖(dependencies)和指令(commands)组成。
3. 执行make命令:在命令行终端中执行make命令,系统会读取Makefile文件,并根据规则和指令执行相应的操作。
二、Makefile文件的基本结构Makefile文件由一系列规则和指令组成,每个规则描述了一个或多个源文件的依赖关系和构建过程。
一个基本的Makefile文件包含以下几个部分:1. 声明变量:可以使用变量来定义一些常用的路径、编译选项等信息,使Makefile更加灵活和可维护。
2. 定义规则:通过规则来描述源文件之间的依赖关系和构建过程。
每个规则由一个目标(target)、依赖(dependencies)和指令(commands)组成。
3. 定义伪目标:伪目标是一种特殊的目标,它不表示真实的文件,而是用于执行一些特定的操作,比如清理临时文件、生成文档等。
4. 定义默认目标:默认目标是在执行make命令时,如果没有指定目标,则系统会执行的第一个目标。
简述Makefile文件的格式

简述Makefile文件的格式Makefile文件是一种常见的文本文件,用于描述一个项目中各个文件之间的依赖关系和编译规则。
Makefile文件通常由一系列规则组成,每个规则由一个目标、依赖关系和命令组成。
Makefile文件的格式如下:1. 目标(Target)目标是指需要生成的文件或者执行的操作。
在Makefile中,目标通常是一个可执行程序或者一个库文件。
目标的格式为:target: dependenciescommand其中,target表示目标名称,dependencies表示该目标所依赖的其他文件或者操作,command表示生成该目标所需要执行的命令。
2. 依赖关系(Dependencies)依赖关系指该目标所依赖的其他文件或者操作。
在Makefile中,可以通过在目标后面加上冒号(:)来定义该目标所依赖的其他文件或者操作。
多个依赖关系之间可以使用空格或者Tab键来进行分隔。
3. 命令(Command)命令是指生成该目标所需要执行的具体操作。
在Makefile中,可以通过在每个规则后面添加一行以Tab键开头的命令来定义具体操作。
4. 变量(Variables)变量是指用于存储各种编译参数和路径等信息的变量。
在Makefile中,可以通过使用$()符号来引用变量,并使用=符号来进行赋值操作。
例如:CFLAGS = -Wall -O2CC = gcctarget: dependencies$(CC) $(CFLAGS) -o target dependencies5. 注释(Comments)注释是指用于对Makefile中各个规则进行解释说明的文本。
在Makefile中,可以使用#符号来进行注释,#符号后面的内容将被忽略。
总之,Makefile文件是一个非常重要的工具,在项目开发过程中起到了至关重要的作用。
掌握Makefile文件的格式和编写方法,可以帮助我们更加高效地管理和组织项目代码,并提高项目开发效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Makefile结构分析-----uClinux (2.6.x内核)系统映像过程刘江欧阳昭暐吕熙隆1、源代码文件及目录构成解压缩uClinux-dist-20070130.tar.gz压缩文件,在uClinux-dist原始子目录下主要有:config、Bin、linux-2.4.x、linux-2.6.x 、lib、tools、Include、user和vendors,以及文件Makefile。
另外,在编译后生成子目录images和romfs,以及文件autoconfig.h、config.in和两个隐含文件:.config和.depend。
config子目录包含文件及下一级子目录,如config.in、configure.help、Fixconfig、Makefile、Mkconfig、Setconfig所有这些文件及子目录Scripts均与系统配置有关;linux-2.6.x子目录是嵌入式操作系统uClinux-2.6.x的核心目录,包括下一级子目录arch、include、init、drivers、fs、ipc、kernel、lib、Mm、scripts和关键文件Makefile、rules.make,编译后还要生成新文件romfs.o、linux和system.map;lib子目录为嵌入式操作系统提供压缩和改进了的函数库支持;tools子目录包含romfs-inst.sh文件,通过调用此文件,可以把目录或文件加入到romfs子目录中;user子目录包含各种驱动程序文件目录,根据用户的配置情况,不同的驱动程序会被编译进最后形成的操作系统中;vendors子目录包括与特定硬件平台相关的分类目录组。
目录结构如图1所示。
Makefile的详细介绍情况在uClinux-dist\linux-2.6.x\Documentation\kbuild中,如图2所示。
图1、目录结构即Linux 内核中的 Makefile 以及与 Makefile 直接相关的文件有:a. Makefile:顶层 Makefile,是整个内核配置、编译的总体控制文件。
b. .config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如 make config)。
c. arch/*/Makefile:位于各种 CPU 体系目录下的 Makefile,如arch/arm/Makefile,是针对特定平台的 Makefile。
d. 各个子目录下的 Makefile:比如 drivers/Makefile,负责所在子目录下源代码的管理。
e. Rules.make:规则文件,被所有的 Makefile 使用。
图2、make说明文档2、编译过程简介该编译过程的方法在uClinux-dist/ linux-2.6.x /Readme中有详细描述。
将uClinux-dist-20070130.tar.gz放入/usr目录中,依次在终端输入如下命令:# cd /usr/# tar –zxvf uClinux-dist-20070130.tar.gz# cd uClinux-dist (Cd into the source tree)# make clean# make config (Configure the build target)# make dep (Build the dependencies)# make (Build the image)终端提示在/image目录下成功生成映像文件。
3、核心Make文件运行分析3.1、make clean执行情况分析3.1.1 uClinux-dist/Makefile中的clean命令图3、核心makefile中clean代码在根目录Makefile可以找到LINUXDIR = $(CONFIG_LINUXDIR), CONFIG_ LINUXDIR定义在前面生成的.config文件中,CONFIG_LINUXDIR =linux-2.6.x。
所以执行该核心makefile首先调用modules clean命令进行扩充(modules_clean: -[ ! -d modules ] || $(MAKEARCH) -C modules clean),然后命令再执行删除/ linux-2.6.x/目录下以前编译生成的linux、asm、perlasm等文件。
3.1.2 uClinux-dist/ linux-2.6.x /Makefile中的clean命令在/linux-2.6.x/Makefile文件中,make clean相关部分代码如下:图4、linux-2.6.x /Makefile中clean代码"make clean"删除几乎所有的在编译内核时生成的文件,该命令首先删除相同目录下的文件和目录CLEAN_FILES,CLEAN_DIRS,接着通过archclean命令进行扩充。
此外,在"make clean"还会删除匹配 "*.[oas]","*.ko" 的文件。
Archclean在/linux-2.6.x/arch/arm/Makefile中,相关代码如下:图5、/arch/arm/Makefile中archclean代码当"make clean"执行时,make会递归访问archclean并清理boot,因此,make clean就相当于make archclean。
具有清除功能的命令还有make mrproper、make distclean。
他们和make clean 有区别,具体在核心Makefile中有说明,如图6所示:图6、/arch/arm/Makefile中archclean代码没搞清楚uClinux-dist/Makefile和uClinux-dist/ linux-2.6.x /Makefile中clean的联系,猜测在uClinux-dist/执行make clean命令时,根本不调用uClinux-dist/ linux-2.6.x /Makefile中clean命令。
3.2、make config执行情况分析make config的功能是完成系统配置,在uClinux-dist/文件中,源代码如图7所示:图7、核心makefile中config代码图8、核心makefile中config.in代码从该代码可以看出make config用scripts/Configure去解释执行在uClinux-dist/config/mkconfig/目录下的congif.in,同时还调用执行该目录下的setconfig配置文件进行环境设置。
由此可见uClinux-dist/ makefile只是个索引,最终调用指向uClinux-dist/config/Makefile。
在uClinux-dist/config/Makefile文件中,源代码如图9所示:图9、四种?config代码比较从该代码可以看出make config用scripts/Configure去解释执行在当前目录下的congif.in;make oldconfig配置情况与make config基本相同,仅仅多了一个参数 –d,大概表示它要使用默认配置文件的意思。
make menuconfig与前两种相比有很大的不同,虽然依然使用了config.in文件,但使用电工具不同,是Menuconfig,并且在开始部分还有一些准备工作要做。
主要因为将config.in转化为菜单形式,用户工作界面有较大的改进,工作就要复杂一些。
Make Xconfig更加复杂,首先要制作合理的文件,然后用wish执行,使config.in转变为xwindows方式进行系统配置的工具。
因此,以上四种配置方式在完成系统赋予的使命上功能是一致的,只不过操作界面有所不同。
用户通过 make config 配置后,产生了 .config。
顶层 Makefile 读入 .config 中的配置选择。
顶层 Makefile 有两个主要的任务:产生 vmlinux(未压缩的内核)文件和内核模块(module)。
为了达到此目的,顶层 Makefile 递归的进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile。
至于到底进入哪些子目录,取决于内核的配置。
在顶层 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 体系结构下的 Makefile,这个 Makefile 中包含了平台相关的信息。
3.3、make dep执行情况分析make dep读取系统配置以创建编译时可依赖的关系树,结果被存储在隐含文件.depend中,makefile通过包含.depend文件来包含这种依赖关系树,用于指导编译。
在uClinux-dist/makefile中dep代码如图10所示:图10、核心makefile中dep代码该代码告诉我们在/ linux-2.6.x/.config文件,如果找不到提示错误退出,反之执行该目录下的dep命令(假定配置时选定的为linux-2.6.新的内核),而在该目录下该命令根本找不到。
即使具有类似功能的depend dep仅有一个文本输出的提示信息。
depend dep:@echo '*** Warning: make $@ is unnecessary now.'由此可见,该命令主要是针对以前编译2.4内核的时候用的,以保证编译内核时所有的依赖,例如头文件,都存在。
但对于2.6来讲已经不需要了,直接一个make命令把make dep和make zImage的事请就做了。
3.4、make执行情况分析在Makefile中提供了配置编译选项的各种规则,执行make help命令可以打印出详细的帮助信息,从中我们可以看出执行“#make”或执行“make all”,将自动编译带“*”的目标,即自动自动编译vmlinux、modules、zImage(或xipImage)。
在uClinux-dist/目录下运行#make命令,进行编译链接内核映像,从makefile关联关系看,过程应该是:先编译链接生成顶层目录的vmlinux,然后再把vmlinux精简压缩成piggy.gz,最后加上自引导程序链接成linux-2.6.x/arch/arm/boot/zImage,这是一个具备自启动能力的linux内核映像。
对最后一步make命令详细分析如下:3.4.1 [uClinux-dist/makefile]: /*根目录下的入口*/(1) 找到makefile程序执行的入口,如图11所示。