Linux&&MAKE[了解]
MakeFile的定义
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele就像一个Shell脚本一样,其中也可以执行操作系统的命令。
一般来说,无论是C、C++、还是 pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
make命令执行时,需要一个 Makele 文件,以告诉make命令需要怎么样的去编译和链接程序。
makefile带来的好处就是–“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make.可见,makefile都成为了一种在工程方面的编译方法。
Make的书写规则
- 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
- 1.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
- 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
- 在定义好依赖关系后,后续的那行定义了如何生成目标文件的操作系命令,一定要以一个Tab键作为开头(make并不管命令是怎么工作的,他只管执行所定义的命令。)。
Make如何工作
- make会在当前目录下找名字叫“Makele”或“makele”的文件;
- 如果找到,它会查找文件中的第一个目标文件.o;
- 如果文件不存在,它会根据依赖关系查找.s文件;
- 若.s文件不存在,make会在当前文件中查找.s文件的依赖文件.i;
- 若.i文件不存在,会根据依赖关系查找.c文件,当然.c文件是存在的,于是,make会生成一个.o文件,然后去执行文件。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么make就不工作啦。
Make命令
make
根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
make install
将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。
make dist
产生发布软件包文件(即distribution package)。这个命令会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。
它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
make distcheck
生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。
make distclean
类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile文件。
make menuconfig
make menuconfig 是执行makefile里面的menuconfig目标. 如果后面 ARCH =arm CROSS_COMPILE=arm-linux- 的话表明: 编译出来的目标是针对ARM体系结构的。因为是针对ARM体系结构,所以需要使用交叉编译器。使用CROSS_COMPILE=xxx来指定交叉编译器。
CROSS_COMPILE=arm-linux- 意思是制定交叉编译器为arm-linux-XXX。 如:makefile里面会指定CC为arm-linux-gcc。
make -j
为了使make命令执行并行处理,-j 选项可以用来指定作业数。
用法:make -j4 或 make -jobs=4 //-j==-jobs ;多线程的意思
作业数是在编译的时候指定主机的CPU个数,所以在脚本中写成一个常量很糟糕。(特别是把编译脚本给其他人的时候。)并行处理的作业数和编译的效率直接相关,所以需要设置合适的作业数量。
脚本实现make的任务数能自动设置成CPU的数量
vim linux/tools/perf/Makefile
# Do a parallel build with multiple jobs, based on the number of CPUs
online
# in this system: 'make -j8' on a 8-CPU system, etc.
# (To override it, run 'make JOBS=1' and similar.)
ifeq ($(JOBS),)
JOBS := $(shell grep -c ^processor /proc/cpuinfo 2>/dev/null)
ifeq ($(JOBS),)
JOBS := 1
endif
endif
这种计算了/proc/cpuinfo以processor开头的行的数量。
这里不使用wc命令来计算匹配的行数,而是用grep -c来获取。
这里JOBS是CPU的个数,用这个变量在子进程中使用make命令。
$(MAKE) -f Makefile.perf --no-print-directory -j$(JOBS) O=$(FULL_O) $(SET_DEBUG) $@
crosstool为xscale编译(ct-ng build)过程
ct-ng build.4 //意思是多线程去编译
make install -s //“-s”不输出详细log信息
make -f //”-f”指定特定的makefile文件,运行特定文件名的makefile文件
参考资料:
http://www.jb51.net/LINUXjishu/65444.html
http://blog.csdn.net/yu704645129/article/details/53169589