linux中gmake怎么调用


本篇内容主要讲解“linux中gmake怎么调用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中gmake怎么调用”吧! 在linux中,gmake就是GUN make,是一种流行的、常用的用于构建C语言软件的程序,用于构建Linux内核和其他常用的GNU/Linux程序和软件库。GNU Make是一个可以自动运行shell命令并帮助执行重复任务的程序;它通常用于将文件转换成其他形式,例如将源代码文件编译成程序或库。gmake就是GUN make,因为在linux外的平台上,make一般被占用了,所以GUN make只好叫gmake了。GNU Make是一种流行的、常用的用于构建C语言软件的程序。用于构建Linux内核和其他常用的GNU/Linux程序和软件库。大多数嵌入式软件开发人员在职业生涯中的某个时候都会使用GNU Make,要么使用它来编译小型库,要么构建整个项目。尽管有很多很多的选项可以替代Make,但是由于它的特性集和广泛的支持,它仍然通常被选择为新软件的构建系统。什么是GNU Make?GNU Make是一个可以自动运行shell命令并帮助执行重复任务的程序。它通常用于将文件转换成其他形式,例如将源代码文件编译成程序或库。它通过跟踪先决条件和执行命令层次结构来生成目标来实现这一点。何时选择MakeMake适用于构建小型C/ c++项目或库,这些项目或库将包含在另一个项目的构建系统中。大多数构建系统都有办法集成基于make的子项目。对于较大的项目,您会发现更现代的构建系统更易于使用。在以下情况下,我建议使用非Make的构建系统:当正在构建的目标(或文件)数量为(或最终将为)数百时。 需要一个“配置”步骤,它设置和保存变量、目标定义和环境配置。 该项目将保持内部或私有,将不需要由终端用户构建。 您会发现调试是一项令人沮丧的工作。 您需要构建的是跨平台的,可以在macOS、Linux和Windows上构建。 在这些情况下,您可能会发现使用CMake、Bazel、Meson或其他现代构建系统是一种更愉快的体验。调用Make运行make将从当前目录加载一个名为Makefile的文件,并尝试更新默认目标(稍后会详细介绍目标)。Make将依次搜索名为GNUmakefile、makefile和makefile的文件你可以使用-f/——file参数指定一个特定的makefile:$ make -f foo.mk 你可以指定任意数量的目标,列出它们作为位置参数:#典型目标 $ make clean all 你可以用-C参数传递Make目录,它会运行Make,就像它首先被cd到那个目录一样。$ make -C some/sub/directory 有趣的事实:git也可以和-C一起运行,达到同样的效果!并行调用如果提供-j或-l选项,Make可以并行运行作业。我被告知的一个指导原则是,将作业限制设置为处理器核心数量的1.5倍:#a machine with 4 cores: make -j make -j 有趣的是,我发现使用-l“负载限制”选项的CPU利用率比使用-j“工作”选项略好。尽管YMMV !有几种方法可以通过编程方式找到当前机器的CPU计数。一个简单的方法是使用python multiprocessing.cpu_count()函数来获得支持的系统的线程数量(注意与超线程系统,这将消耗大量的计算机资源,但可能是更可取的让让产生无限的工作)。#在子shell中调用python的cpu_count()函数 make -l (python -c “import multiprocessing;print (multiprocessing.cpu_count())”)并行调用期间的输出如果Make正在并行执行的命令有大量输出,您可能会看到在stdout上交错输出。为了处理这个问题,Make有一个选项——output -sync。我建议使用——output-sync=recurse,它将在每个目标完成时打印recipe的全部输出,而不会分散其他recipe输出。如果recipe使用递归Make,它还将一起输出整个递归Make的输出。对Makefile的剖析 Makefile包含用于生成目标的规则。Makefile的一些基本组件如下所示:让我们看看上面例子的每个部分。变量变量使用语法$(FOO),其中FOO是变量名。变量包含纯字符串,因为Make没有其他数据类型。附加到一个变量将添加一个空格和新的内容:变量赋值在GNU Make语法中,变量的赋值方式有两种:右边的表达式是逐字赋值给变量的——这很像C/ c++中的宏,在使用变量时对表达式求值:将一个表达式的结果赋值给一个变量;表达式在赋值时展开:注意:上面的$(info…)函数用于打印表达式,在调试makefile时非常方便!*’未显式、隐式或未自动设置的变量将计算为空字符串。环境变量环境变量被携带到Make执行环境中。以下面的makefile为例:如果我们在运行make时在shell命令中设置了变量YOLO,我们将设置这个值:注意:Make打印“No targets”错误,因为我们的makefile没有列出目标!如果你使用?=赋值语法,Make只会在变量没有值的情况下赋值:Makefile:然后我们可以重写makefile中的$(CC):$ CC=clang make另一个常见的模式是允许插入额外的标志。在makefile中,我们将追加变量而不是直接赋值给它。CFLAGS += -Wall这允许从环境中传入额外的标志:这是非常有用的!最重要的变量变量使用的一个特殊类别称为覆盖变量。使用此命令行选项将覆盖设置在环境中的或Makefile中的值!Makefile:命令:有针对性的变量这些变量仅在recipe上下文中可用。它们也适用于任何必备配方!隐式变量这些都是由Make预先定义的(除非用同名的任何其他变量类型重写)。一些常见的例子:自动变量这些是由Make设置的特殊变量,在recipe上下文中可用。它们对于防止重复的名字很有用(Don ‘t Repeat Yourself)。一些常见的自动变量:目标(目标)目标是规则语法的左边:target几乎总是命名文件。这是因为Make使用最后修改时间来跟踪target是否比其prerequistite更新或更早,以及是否需要重新构建它!当调用Make时,你可以通过将其指定为位置参数来指定想要构建的target:如果您没有在命令中指定目标,Make将使用makefile中指定的第一个目标,称为“默认目标”(如果需要,也可以覆盖默认目标)。虚假phony目标有时候设置元目标是很有用的,比如all, clean, test等等。在这些情况下,您不希望Make检查名为all/clean等的文件。Make提供.PHONY目标语法,将目标标记为不指向文件:假设我们的项目构建了一个程序和一个库foo和foo.a;如果我们想要 在默认情况下,我们可以创建一个’all’规则来构建两者 .PHONY:all all : foo foo.a如果你有多个假目标,一个好的模式可能是将每个目标都附加到定义它的.PHONY中:请注意! !. phony目标总是被认为是过期的,因此Make将总是运行这些目标的配方(因此也运行任何具有. phony先决条件的目标!)小心使用! !隐式规则隐含规则由Make提供。我发现使用它们会让人感到困惑,因为在幕后发生了太多的行为。你偶尔会在野外遇到它们,所以要小心。模式的规则模式规则允许你编写一个通用规则,通过模式匹配应用于多个目标:or先决条件如上所述,Mak免费云主机域名e将在运行规则之前检查这些目标。它们可以是文件或其他目标。如果任何先决条件比目标更新(修改时间),Make将运行目标规则。在C项目中,你可能有一个将C文件转换为目标文件的规则,如果C文件发生变化,你希望目标文件重新生成:自动的先决条件对于C语言项目来说,一个非常重要的考虑是,如果C文件的#include头文件发生了变化,那么将触发重新编译。这是通过gcc/clang的-M编译器标志完成的,它将输出一个.d文件,然后用Make include指令导入。.d文件将包含.c文件的必要先决条件,因此任何头文件的更改都会导致重新构建。基本形式可能是:
Order-only 先决条件这些先决条件只有在不存在的情况下才会构建;如果它们比目标更新,则不会触发目标重新构建。典型的用法是为输出文件创建一个目录;将文件发送到目录将更新其mtime属性,但我们不希望由此触发重新构建。recipe“recipe”是创建目标时要执行的shell命令列表。它们被传递到子shell中(默认为/bin/sh)。如果target在recipe运行后更新,则认为规则是成功的(但如果没有更新,则不视为错误)。如果配方中的任何一行返回非零退出代码,Make将终止并打印一条错误消息。你可以通过前缀-字符来告诉Make忽略非零退出码:在recipe行前面加上@将禁止在执行之前echo该行:Make会在运行recipe上下文中展开变量/函数表达式,但不会处理它。如果你想访问shell变量,请使用$:functionMake函数的调用语法如下:$(function-name arguments) 其中arguments是用逗号分隔的参数列表。For example:用户定义函数shell函数你可以让Make调用一个shell表达式并捕获结果:TODAYS_DATE=$(shell date –iso-8601)不过,我在使用这个功能时很谨慎;它会增加对你使用的任何程序的依赖,所以如果你正在调用更奇特的程序,确保你的构建环境是受控的(例如在容器中或使用Conda)。make的条件表达式make includesources.mk:SOURCE_FILES :=
bar.c
foo.c Makefile:include sources.mkOBJECT_FILES = $(SOURCE_FILES:.c=.o)%.o: %.c (CC) -c ^ -o $@make eval请注意,使用Make的这个特性的方法可能会让人很困惑,添加一些有用的注释来解释意图是什么,对您未来的自己会很有用!VPATHVPATH是一个特殊的Make变量,它包含Make在查找先决条件和目标时应该搜索的目录列表。它可以用来将对象文件或其他派生文件发送到./build目录中,而不是把src目录弄得乱七八糟:touch file调试makefile对于小问题,我通常使用printf的Make等效函数,即$(info/warning/error)函数,例如当检查不工作的条件路径时:verbose flag$ V=1 makemake 建议让Make发挥最大作用的建议列表:target通常应该是真实的文件。 当发出子MAKE命令时,总是使用(MAKE)。 尽量避免使用.phony目标。如果规则生成任何文件工件,请考虑将其作为目标,而不是冒名! 尽量避免使用隐含的规则。 对于C文件,确保使用.d自动包括跟踪! 小心使用元编程。 在规则中使用自动变量。总是尝试使用@作为菜谱输出路径,这样你的规则和Make的路径就完全相同了。 在makefile中自由地使用注释,特别是在使用了复杂的行为或微妙的语法时。你的同事(还有未来的自己)会感谢你的。 使用-j或-l选项并行运行Make ! 尽量避免使用touch命令来跟踪规则完成。到此,相信大家对“linux中gmake怎么调用”有了更深的了解,不妨来实际操作一番吧!这里是开发云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: linux驱动程序运行空间是什么

这篇文章主要介绍“linux驱动程序运行空间是什么”,在日常操作中,相信很多人在linux驱动程序运行空间是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux驱动程序运行空间是什么”的疑惑有所帮助!接下来,请跟着小编一…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 12/28 15:40
下一篇 12/28 15:40