① makefile教程
基于 Make 命令教程 - 阮一峰的网络日志 (ruanyifeng.com) 总结,可以将make看作一个自顶向下的构建工具
在makefile相同目录下执行 make 可查看效果
makefile文件名默认 Makefile 或 makefile .也可以指定文件: make -f rules.txt 或者 make --file=rules.txt
如果 前置条件 满足,执行 命令 构建 目标
目标可以是文件,也可以是某个操作的名字
运行 make clean 可以执行这个操作:
如果make检测到当前目录中存在clean文件,就不会执行clean操作,因此最好标明clean是个操作
前置条件通常是一组文件名,用空格分割,指定了目标是否重新构建的标准:只要有一个前置文件不存在,或者有过更新(前置文件的修改时间晚于目标文件),目标就需要重新构建
如果当前目录没有source.txt,make会首到makefile的下面去寻找有没有生成source.txt的目标
命令行首默认必须是一个tab键!!!,如果测试过程有报错记得检查下 ,如果想替换,可用.RECIPEPREFIX替换(对整个文件生效 (The .RECIPEPREFIX is only supported since 3.82
每条命令都在单独的shell中执行,这些shell没有关联,也没有继承关系
解决办法就是通过写成一行
或者用反斜杠转义
最后一个办法是加上 .ONESHELL: 命令 (同上
# 表示注释
正常情况下,make会打印每条命令,即使注释也会打印,在命令前面加@可以关闭打印
通配符
用来指定一组符合条件的文件名,与bash类似 * ? [...]
允许对文件名进行模式匹配,匹配符是%
下面的命令将 file1.c 编译为file1.o
允许使用 = 自定义变量
调用shell变量,需要两个$$,因为make命令会使$转义
变量支持引用
为了区分生效时间,分成四类 gnu make - What is the difference between the GNU Makefile variable assignments =, ?=, := and +=? - Stack Overflow
内置变量
$(CC)指向当前编译器
$(MAKE)指向当前make工具
详细如表 https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
自动变量
https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
判断和循环 与bash相同
函数格式
内置函数
https://www.gnu.org/software/make/manual/html_node/Functions.html
② 纯小白求教.Ubuntu如何安装GNUMake3.8.2.附上下
您好,官方教程地址http //gnuradio org/redmine/projects/gnuradio/wiki/InstallingGR 希望你能点击有用 祝你愉快,满意请采纳。
③ make 软件怎样制作
代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。
Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。
本文介绍Make命令的用法,从简单的讲起,不需要任何基础,只要会使用命令行,就能看懂。我的参考资料主要是Isaac Schlueter的《Makefile文件教程》和《GNU Make手册》。
④ 纯小白求教.Ubuntu如何安装GNUMake3.8.2,说明越
make3.8.2的安装步骤:
tar -zxvf make3.8.2.tar.gz
在make-3.8.2目录下
./configure
make
make install
一般情况下不会出现错误,在/usr/local/bin中可得到新版本的make,复制到/usr/bin中。
⑤ 纯小白求教.Ubuntu如何安装GNUMake3.8.2.附上下
1.安装前GNU Radio正常运行,需要好多包,包括:开发工具,library,wx GUI,Qt GUI等(还有好多,不说了,对回安装而言没啥用)。这些东答西在终端里输入以下命令就可以自动安装:
sudo apt-get -y install git-core autoconf automake libtool g++ python-dev swig \
pkg-config libboost-all-dev libfftw3-dev libcppunit-dev libgsl0-dev \
libusb-dev sdcc libsdl1.2-dev python-wxgtk2.8 python-numpy \
python-cheetah python-lxml doxygen python-qt4 python-qwt5-qt4 libxi-dev \
libqt4-opengl-dev libqwt5-qt4-dev libfontconfig1-dev libxrender-dev
2.安装GNU Radio
⑥ Makefile入门(八):make运行
一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用 make命令的。
make命令执行后有三个退出码:
0 —— 表示成功执行。
1 —— 如果make运行时出现任何错误,其返回1。
2 —— 如果你使用了make的“-q”选项,并且make使得一些目标不需要更新,那么返回2。
Make的相关参数我们会在后续章节中讲述。
前面我们说过,GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件——“GNUmakefile”、“makefile”和“Makefile”。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。
当然,我们也可以给make命令指定一个特殊名字的Makefile。要达到这个功能,我们要使用make的“-f”或是“--file”参数(“--makefile”参数也行)。例如,我们有个makefile的名字是“hchen.mk”,那么,我们可以这样来让make来执行这个文件:
make –f hchen.mk
如果在make的命令行是,你不只一次地使用了“-f”参数,那么,所有指定的makefile将会被连在一起传递给make执行。
一般来说,make的最终目标是makefile中的第一个目标,而其它目标一般是由这个目标连带出来的。这是make的默认行为。当然,一般来说,你的makefile中的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make clean”形式)
任何在makefile中的目标都可以被指定成终极目标,但是除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。甚至没有被我们明确写出来的目标也可以成为make的终极目标,也就是说,只要make可以找到其隐含规则推导规则,那么这个隐含目标同样可以被指定成终极目标。
有一个make的环境变量叫“MAKECMDGOALS”,这个变量中会存放你所指定的终极目标的列表,如果在命令行上,你没有指定目标,那么,这个变量是空值。这个变量可以让你使用在一些比较特殊的情形下。比如下面的例子:
基于上面的这个例子,只要我们输入的命令不是“make clean”,那么makefile会自动包含“foo.d”和“bar.d”这两个makefile。
使用指定终极目标的方法可以很方便地让我们编译我们的程序,例如下面这个例子:
从这个例子中,我们可以看到,这个makefile中有四个需要编译的程序——“prog1”, “prog2”, “prog3”和 “prog4”,我们可以使用“make all”命令来编译所有的目标(如果把all置成第一个目标,那么只需执行“make”),我们也可以使用 “make prog2”来单独编译目标“prog2”。
即然make可以指定所有makefile中的目标,那么也包括“伪目标”,于是我们可以根据这种性质来让我们的makefile根据指定的不同的目标来完成不同的事。在Unix世界中,软件发布时,特别是GNU这种开源软件的发布时,其makefile都包含了编译、安装、打包等功能。我们可以参照这种规则来书写我们的makefile中的目标。
<dl style="font-size: 12.6667px; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">
<dt>“all”</dt>
<dd>这个伪目标是所有目标的目标,其功能一般是编译所有的目标。</dd>
<dt>clean”</dt>
<dd>这个伪目标功能是删除所有被make创建的文件。</dd>
<dt>“install”</dt>
<dd>这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。</dd>
<dt>print”</dt>
<dd>这个伪目标的功能是例出改变过的源文件。</dd>
<dt>“tar”</dt>
<dd>这个伪目标功能是把源程序打包备份。也就是一个tar文件。</dd>
<dt>“dist”</dt>
<dd>这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。</dd>
<dt>TAGS”</dt>
<dd>这个伪目标功能是更新所有的目标,以备完整地重编译使用。</dd>
<dt>“check”和“test”</dt>
<dd>这两个伪目标一般用来测试makefile的流程。</dd>
</dl>
当然一个项目的makefile中也不一定要书写这样的目标,这些东西都是GNU的东西,但是我想,GNU搞出这些东西一定有其可取之处(等你的 UNIX下的程序文件一多时你就会发现这些功能很有用了),这里只不过是说明了,如果你要书写这种功能,最好使用这种名字命名你的目标,这样规范一些,规范的好处就是——不用解释,大家都明白。而且如果你的makefile中有这些功能,一是很实用,二是可以显得你的makefile很专业(不是那种初学者的作品)。
有时候,我们不想让我们的makefile中的规则执行起来,我们只想检查一下我们的命令,或是执行的序列。于是我们可以使用make命令的下述参数:
“-n” “--just-print” “--dry-run” “--recon” 不执行参数,这些参数只是打印命令,不管目标是否更新,把规则和连带规则下的命令打印出来,但不执行,这些参数对于我们调试makefile很有用处。
“-t” “--touch” 这个参数的意思就是把目标文件的时间更新,但不更改目标文件。也就是说,make假装编译目标,但不是真正的编译目标,只是把目标变成已编译过的状态。
“-q” “--question” 这个参数的行为是找目标的意思,也就是说,如果目标存在,那么其什么也不会输出,当然也不会执行编译,如果目标不存在,其会打印出一条出错信息。
“-W <file>;” “--what-if=<file>;” “--assume-new=<file>;” “--new-file=<file>;” 这个参数需要指定一个文件。一般是是源文件(或依赖文件),Make会根据规则推导来运行依赖于这个文件的命令,一般来说,可以和“-n”参数一同使用,来查看这个依赖文件所发生的规则命令。
另外一个很有意思的用法是结合“-p”和“-v”来输出makefile被执行时的信息(这个将在后面讲述)。
下面列举了所有GNU make 3.80版的参数定义。其它版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文档。
“-b” “-m” 这两个参数的作用是忽略和其它版本make的兼容性。
“-B” “--always-make” 认为所有的目标都需要更新(重编译)。
“-C <dir>” “--directory=<dir>” 指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的作为相对路径,并以最后的目录作为被指定目录。如:“make –C ~hchen/test –C prog”等价于“make –C ~hchen/test/prog”。
“—debug[=<options>]” 输出make的调试信息。它有几种不同的级别可供选择,如果没有参数,那就是输出最简单的调试信息。下面是<options>的取值:
a —— 也就是all,输出所有的调试信息。(会非常的多)
b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。
v —— 也就是verbose,在b选项的级别之上。输出的信息包括哪个makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。
i —— 也就是implicit,输出所有的隐含规则。
j —— 也就是jobs,输出执行规则中命令的详细信息,如命令的PID、返回码等。
m —— 也就是makefile,输出make读取makefile,更新makefile,执行makefile的信息。
“-d” 相当于“--debug=a”。
“-e” “--environment-overrides” 指明环境变量的值覆盖makefile中定义的变量的值。
“-f=<file>” “--file=<file>” “--makefile=<file>” 指定需要执行的makefile。
“-h” “--help” 显示帮助信息。
“-i” “--ignore-errors” 在执行时忽略所有的错误。
“-I <dir>” “--include-dir=<dir>” 指定一个被包含makefile的搜索目标。可以使用多个“-I”参数来指定多个目录。
“-j [<jobsnum>]” “--jobs[=<jobsnum>]” 指同时运行命令的个数。如果没有这个参数,make运行命令时能运行多少就运行多少。如果有一个以上的“-j”参数,那么仅最后一个“-j”才是有效的。(注意这个参数在MS-DOS中是无用的)
“-k” “--keep-going” 出错也不停止运行。如果生成一个目标失败了,那么依赖于其上的目标就不会被执行了。
“-l <load>” “--load-average[=<load]” “—max-load[=<load>]” 指定make运行命令的负载。
“-n” “--just-print” “--dry-run” “--recon” 仅输出执行过程中的命令序列,但并不执行。
“-o <file>” “--old-file=<file>” “--assume-old=<file>” 不重新生成的指定的<file>,即使这个目标的依赖文件新于它。
“-p” “--print-data-base” 输出makefile中的所有数据,包括所有的规则和变量。这个参数会让一个简单的makefile都会输出一堆信息。如果你只是想输出信息而不想执行makefile,你可以使用“make -qp”命令。如果你想查看执行makefile前的预设变量和规则,你可以使用 “make –p –f /dev/null”。这个参数输出的信息会包含着你的makefile文件的文件名和行号,所以,用这个参数来调试你的 makefile会是很有用的,特别是当你的环境变量很复杂的时候。
“-q” “--question” 不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生。
“-r” “--no-builtin-rules” 禁止make使用任何隐含规则。
“-R” “--no-builtin-variabes” 禁止make使用任何作用于变量上的隐含规则。
“-s” “--silent” “--quiet” 在命令运行时不输出命令的输出。
“-S” “--no-keep-going” “--stop” 取消“-k”选项的作用。因为有些时候,make的选项是从环境变量“MAKEFLAGS”中继承下来的。所以你可以在命令行中使用这个参数来让环境变量中的“-k”选项失效。
“-t” “--touch” 相当于UNIX的touch命令,只是把目标的修改日期变成最新的,也就是阻止生成目标的命令运行。
“-v” “--version” 输出make程序的版本、版权等关于make的信息。
“-w” “--print-directory” 输出运行makefile之前和之后的信息。这个参数对于跟踪嵌套式调用make时很有用。
“--no-print-directory” 禁止“-w”选项。
“-W <file>” “--what-if=<file>” “--new-file=<file>” “--assume-file=<file>” 假定目标<file>;需要更新,如果和“-n”选项使用,那么这个参数会输出该目标更新时的运行动作。如果没有“-n”那么就像运行UNIX的“touch”命令一样,使得<file>;的修改时间为当前时间。
“--warn-undefined-variables” 只要make发现有未定义的变量,那么就输出警告信息。
⑦ 经常看到很多人翻译了GNU Make 使用手册,但不知道这个手册原版的英文版在哪里有啊,是linux源码里忙
简答:
在线的单个html的版本的GNU Make的网址:
https://www.gnu.org/software/make/manual/make.html
详解:
在GNU的官网网站中的Make的主页:
Make - GNU Project - Free Software Foundation
https://www.gnu.org/software/make/
中可以找到Make的英文版手册:
https://www.gnu.org/software/make/manual/
而且还有多种格式:
在线的单个html的,在线的多个html的,压缩好的(可供下载的)单个html的,压缩好的(可供下载的)多个html的,pdf的,等等。就不贴每个的地址了,自己去看即可。
⑧ GNU_Make中文手册
在make执行第一阶段中如果变量和函数被展开,那么称此展开为立即展开,在第二阶段的展开称为延后展开。区别如下:
立即展开就是变量定义时,就确定变量的值,比如a=1,b=a+1,如果是立即展开,那么b就确定为2了,而延后展开不同,同样a=1,b=a+1,需要等到使用变量b的时候才展开,但是如果在b=a+1之后,且在使用变量b之前,a的值变为2了,那么使用b的时候就变为b=2+1=3了。那么哪些情形是立即展开,哪些是延后展开呢?定义变量的三种方法,如果变量 a 通过 a+= 的方式赋值,且之前 a 是一个简单变量,即通过 a:= 的方式定义,那么 a 是 立即展开 的,其余情况都是 延后展开 。
foo.o 是这个规则的目标, def.h foo.c 是目标的依赖,第二行是规则的命令。上述规则告诉我们如何重建目标文件,以及何时重建。
其余情况不能直接使用,需要配合wildcard函数来使用。
本意是foo依赖目录下所有的.o文件,如果所有的.o文件都存在,那么 能正确编译出foo,但是如果删掉所有.o后,就会报错,说没有重建*.o的规则,这里是因为使用通配符的时候出了错。应该改为
仅列出常用的,其余的暂时不需要。
当重建一个目标时,所依赖的文件名为 -INAME ,make将执行以下搜索:
一般情况下,我们的库文件是不会在make的时候重建的,所以只要能在上述4个步骤中的某一个找到它就行。下面是一个具体的栗子。
在目录 dynamic_lib 中有一个简单的动态库,在 static_lib 中有一个简单的静态库,静态库和动态库的生成见 你的动态库还在报错? 。文件 main.c 引用了两个库中的函数,我们的Makefile应该怎么写呢?
有一下几点需要格外注意:
我们写一个运行脚本,把环境变量 LD_LIBRARY_PATH 设置好,进行验证。
执行结果如下:
使用场景有两个,这里只介绍一个,那就是如果我们的规则是执行一段命令,而不是重建某个文件,如clean。
FORCE仅仅是一个符号,也可以用其他任意未用过的符号替代,FORCE出现在依赖列表中,如果FORCE是一个真正存在的文件名,那么将根据文件的新旧来决定是否重建target,但是FORCE是一个不存在的文件,且FORCE本身的依赖是空,规则命令也是空,在这种情下,依赖与FORCE的目标将无条件被重建,看例子。
下面是一个具体的栗子:下面这个例子中,终极目标 gen_file ,这个目标依赖文件 test.log ,即如果文件 test.log 不存在或比 gen_file文件 新,将会执行 echo "gen_file" ,所以在第一次执行 make 时,由于 test.log 文件不存在,会执行一次,并生成文件 test.log ,此后再执行将不会有任何输出,因为文件 test.log 并没有变得更新,所以make觉得不需要执行。
要想每次都执行日期更新,那么需要文件 test.log 依赖于一个永远是最新的东西,那么就是FORCE,如下所示,由于FORCE并不存在,所以每次都需要更新 test.log 也就会执行 echo和rm 命令了。
在makefile1中使用include包含另一个makefile2相当于把makefile2中的内容贴到include处合并为一个makefile文件。然后该怎么执行就怎么执行。
如果执行 make -f makefile1 ,那么先包含文件 makefile2 ,那么 __all 成为第一目标,也就是终极目标,所以默认重建 __all ,所以输出 target __all 。
静态模式定义了一种比较简约的目标依赖的书写方法,有三种不同的写法,意义等价。完全不用纠结其中的意义。
⑨ 纯小白求教.Ubuntu如何安装GNUMake3.8.2,说明越
Ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb。sudoapt-getinstallalien#alien默认没有安装,所以首先要安装它sudoalienxxxx.rpm#将rpm转换位deb,完成后会生成一个同名的xxxx.debsudodpkg-ixxxx.deb#安装注意,用alien转换的deb包并不能保证100%顺利安装,所以可以找到deb最好直接用deb有时候,我们想要使用的软件并没有被包含到Ubuntu的仓库中,而程序本身也没有提供让Ubuntu可以使用的deb包,你又不愿从源代码编译。但假如软件提供有rpm包的话,我们也是可以在Ubuntu中安装的。方法一:1.先安装alien和fakeroot这两个工具,其中前者可以将rpm包转换为deb包。安装命令为:sudoapt-getinstallalienfakeroot2.将需要安装的rpm包下载备用,假设为package.rpm。3.使用alien将rpm包转换为deb包:fakerootalienpackage.rpm4.一旦转换成功,我们可以即刻使用以下指令来安装:sudodpkg-ipackage.deb
⑩ 纯小白求教.Ubuntu如何安装GNUMake3.8.2,说明越
make3.8.2的安装步骤:tar-zxvfmake3.8.2.tar.gz在make-3.8.2目录下./configuremakemakeinstall一般情况下不会出现错误,在/usr/local/bin中可得到新版本的make,复制到/usr/bin中。