关于makefile:Makefile-简易教程

如果你是命令行重度使用者,学习 Makefile 将能够大大提高你的开发效率,上面简略介绍一下 Makefile 的常识和应用形式。 Makefile 是一种蕴含一组指令来编译和构建软件我的项目的文件。 Makefile 文件通常蕴含一组规定和依赖关系,以指定如何将源代码编译成可执行文件或库。 当执行 make 命令时,make 工具将解析 Makefile 文件,并依据定义的规定和依赖关系来执行所需的操作,以生成最终的指标文件。 Makefile 是一个罕用的构建工具,尤其在 Unix 和 Linux 零碎上宽泛应用。 Makefile文件由一系列规定(rules)形成。每条规定的模式如下。 规定语法 target ... : prerequisites ... command ...下面第一行冒号后面的局部,叫做"指标"(target),冒号前面的局部叫做"前置条件"(prerequisites); 第二行必须由一个tab键起首,前面跟着"命令"(commands)。 "指标"是必须的,不可省略;"前置条件"和"命令"都是可选的,然而两者之中必须至多存在一个。 每条规定就明确两件事:构建指标的前置条件是什么,以及如何构建。 上面就具体解说,每条规定的这三个组成部分。 示例文件 .PHONY: test #.PHONY 伪指标,代表无论 test 文件或目录是否存在都会执行 make test 命令txt = Hello World #Makefile 容许应用等号自定义变量。all: clear test php #当执行 make 不带其余命令时,默认执行第一条python: -python vv #命令前加 - 代表执行谬误继续执行上面的命令 php -v #井号(#)在Makefile中示意正文。php: @php -v #失常状况下,make会打印每条命令,而后再执行,这就叫做回声(echoing)。在命令的后面加上@,就能够敞开回声。clear: cleartest: @echo $(txt) #应用变量 @echo =============这是一篇比拟简洁的文章,心愿能够让您对 Makefile 有一个根本理解。 ...

May 15, 2023 · 1 min · jiezi

关于makefile:轻松玩转makefile-基础用法

前言本文通过几个简略的示例,能够疾速理解Makefile的根本应用办法,实用于编译咱们平时练习所编写的小量代码。 1. make命令Makefile文件内容: all为<font color='green'>指标</font>,这里没有<font color='green'>依赖</font>的文件,这条<font color='green'>命令</font>是打印(echo)出“Hello Makefile”这行文字 all: echo "Hello Makefile"运行make后,终端打印的内容 $ makeecho "Hello Makefile"Hello Makefile能够看到,Makefile的命令也打印在了终端,要想不输入命令的内容,能够在命令后面加上@ make能够指定要生成的指标,如果不指定,则默认第一个指标,咱们将Makefile文件内容批改一下 all: @echo "Hello Makefile"test: @echo "Hello Test"运行不同的命令,能够看到不同的打印信息 $ makeHello Makefile$ make allHello Makefile$ make testHello Test2. 生成文件假如当初有两个文件fun.c和main.c,须要利用Makefile生成一个可执行文件app。fun.c的内容 #include <stdio.h>void fun(){ printf("This is fun()!\n");}main.c的内容 extern void fun(); int main(){ fun(); return 0; }Makefile的内容 all: main.o fun.o gcc -o app main.o fun.omain.o : main.c gcc -o main.o -c main.cfun.o : fun.c gcc -o fun.o -c fun.cclean: rm app main.o fun.o当执行make命令后,终端会打印下列内容,并生成对应的app , main.o ,fun.o文件 ...

March 1, 2023 · 1 min · jiezi

关于makefile:轻松玩转makefile-基础知识

1、什么是Makefile 在嵌入式软件开发畛域,应用 make 工具构建开发环境是十分常见的。而要应用 make 工具,就须要编写 Makefile 文件来定义一系列规定,指定须要先编译、后编译以及从新编译的文件。 应用 Makefile 的益处是实现了“自动化编译”,只须要一个 make 命令,整个工程就可能主动编译,大大提高了软件开发效率。 2、Makefile的规定2.1 命名规定 通常状况下,无论是应用"Makefile"还是"makefile"作为文件名都能够,常见的是应用"Makefile"作为文件名。 当然你也能够应用其余名称(例如"My_makefile")来命名Makefile,但在应用时应该加上-f选项,如: make -f My_makefile2.2 书写规定指标 (target):指的是运行make生成什么,能够是执行文件,还能够是一个标签 依赖(prerequisites) : 要生成那个 target 所须要的文件或是指标 命令(command ):make 须要执行的命令 target : prerequisites command # 例如test: test.c gcc test.c -o test<font color='red'>留神</font>,命令所在的行必须是以 Tab 结尾。很多初学者容易犯的“低级”谬误是,用空格代替结尾的Tab 键。 3、Makefile的工作原理3.1 指标文件的生成先查看生成指标文件所须要的依赖文件是否存在,如果不存在,则先按规定生成依赖文件,再生成指标文件。 例如: 指标文件是test,依赖所有的 ".o" 文件,如果没有检测到"main.o fun.o drv.o" 文件,则依据".o"的依赖规定, 让“main.c fun.c drv.c”文件生成对应的“ .o”文件, 之后再生成test文件 3.2 指标文件的更新任何一个依赖文件有更新了,或者依赖文件的工夫戳比指标文件新,则从新生成指标文件 以上是对Makefile基础知识的介绍,前面的文章将会联合例子,来介绍Makefile的具体用法。

March 1, 2023 · 1 min · jiezi

关于makefile:Makefile-学习一运行机制

你必须十分致力,能力看起来毫不费力! 微信搜寻公众号[ 漫漫Coding路 ],一起From Zero To Hero ! 前言在 Go 语言开发中,咱们心愿可能标准代码格调,每个成员在提交时能够一键格式化,同时查看是否有语法错误;咱们心愿可能一键运行单测,生成单测报告;咱们心愿可能一键编译、打包、公布我的项目,这就须要应用到 Make。Make 有很多种,咱们罕用的就是 GUN Make,有了 Make,咱们将极大的进步我的项目开发、测试、公布的效率。 Make 最后是为 C、C++我的项目的编译、构建服务的,因而有很多为C、C++的个性,然而这些个性在 Go 开发中应用不到。毕竟每个人的工夫无限,咱们就只学习Go 开发中 Make 应用所必须的常识。Make 的规定都在 Makefile 文件编写上,咱们前面就一起来学习 Makefile 的编写吧! make 命令在 Windows 下不反对运行,须要在 Linux 或 Mac 环境下运行规定Makefile 的规定很简略,分为三个局部: target : prerequisites command ...target:指标,能够是一个文件,或者是一个标签 label prerequisites:targets 依赖的货色, 能够是文件,也能够依赖其余 target command:shell 命令(结尾是 Tab 键) 如果 prerequisites 比 target 要新,就会 执行 command 命令 (已存在的文件比不存在的文件新)如果 prerequisites 中存在其余 target,对该 target 反复第一条举个例子: hello: hello.go go build hello.go如果 hello 文件不存在,hello.go 必定比不存在的 hello 新,执行命令 go build hello.go ...

October 30, 2022 · 3 min · jiezi

关于makefile:翻译最好的makefile入门教程

入门为什么会存在 Makefile?Makefile 用于帮忙决定大型程序的哪些局部须要从新编译。在绝大多数状况下,编译 C 或 C++ 文件。其余语言通常有本人的工具,其用处与 Make 类似。当你须要一系列指令来运行取决于哪些文件已更改时,Make 也能够在编译之外应用。本教程将重点介绍 C/C++ 编译用例。 这是你能够应用 Make 构建的示例依赖关系图。如果任何文件的依赖项产生更改,则该文件将被从新编译: Make 有哪些代替计划?风行的 C/C++ 代替构建零碎是SCons、CMake、Bazel和Ninja。一些代码编辑器(如Microsoft Visual Studio)有本人的内置构建工具。对于 Java,有Ant、Maven和Gradle。Go 和 Rust 等其余语言有本人的构建工具。 Python、Ruby 和 Javascript 等解释型语言不须要相似于 Makefile。Makefiles 的指标是依据已更改的文件来编译须要编译的任何文件。然而当解释语言中的文件发生变化时,不须要从新编译任何货色。当程序运行时,将应用该文件的最新版本。 Make的版本和类型Make 有多种实现形式,但本指南的大部分内容都实用于你应用的任何版本。然而,它是专门为 GNU Make 编写的,它是 Linux 和 MacOS 上的规范实现。所有示例都实用于 Make 版本 3 和 4,除了一些深奥的差别之外,它们简直雷同。 运行示例要运行这些示例,你须要一个终端并装置“make”。对于每个示例,将内容放在一个名为 的文件Makefile中,而后在该目录中运行命令make。让咱们从最简略的 Makefile 开始: hello: echo "Hello, World"留神:Makefile必须应用TAB而不是空格缩进,否则make会失败。 这是运行上述示例的输入: $ makeecho "Hello, World"Hello, World而已!如果你有点困惑,这里有一个视频,介绍了这些步骤,并形容了 Makefile 的根本构造。 <iframe width="1131" height="703" src="https://www.youtube.com/embed/zeEMISsjO38" title="Beginner Makefile Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> ...

September 25, 2022 · 10 min · jiezi

关于makefile:彻底掌握Makefile二

彻底把握Makefile(二)前言在后面的文章彻底把握Makefile(一)当中,咱们简要的介绍了一些常见的makefile应用办法,在本篇文章当中咱们将持续介绍一些makefile当中的常见用法。 Makefile中的条件判断ifeq 和 ifneq咱们在写makefile的时候经常会有通过if语句进行判断的需要,比如说依据不同的文件设置不同的编译器等等。 cc=g++main: demo.c echo $(cc)ifeq ($(cc), gcc) echo $(cc) = 相等的语句执行了else echo $(cc) != 不相等的语句执行了endif下面的makeifle的执行后果如下: 在下面的makefile当中定义了一个变量cc,他的值为gcc。在下面的makefile当中ifeq示意如果后边的表达式成立的话,也就是$(cc)的值等于gcc那么就执行前面的语句,否则执行else前面的语句。依据下面makefile的执行后果来看,$(cc)和gcc不相等,因而和咱们的期待的后果是统一的。 咱们批改下面的makefile文件如下: cc=g++main: demo.c echo $(cc)ifneq ($(cc), gcc) echo $(cc) != gccelse echo $(cc) = gccendif执行下面的makefile文件输入的后果如下: 在下面的makefile当中ifneq的含意示意如果不相等,因为g++不等于gcc,因而这个满足条件,程序执行的后果满足条件。 对于make的输入问题,当makefile执行到echo $(cc) != gcc的时候,首先这条命令会被make输入,而后make会执行这条命令,而这条命令是输入g++ != gcc,因而才会有下面的输入。echo g++ != gcc,而执行这条命令还会输入g++ != gcc,看到这应该可能了解下面的makefile的输入后果了。 后面两个关键字的语法如下所示: ifeq (<arg1>, <arg2>)ifeq '<arg1>' '<arg2>'ifeq "<arg1>" "<arg2>"ifeq "<arg1>" '<arg2>'ifeq '<arg1>' "<arg2>"ifneq (<arg1>, <arg2>)ifneq '<arg1>' '<arg2>'ifneq "<arg1>" "<arg2>"ifneq "<arg1>" '<arg2>'ifneq '<arg1>' "<arg2>"ifdef 和 ifndef除了下面的两个关键字之外,make还给咱们提供了另外两个关键字ifdef和ifndef。 ...

September 23, 2022 · 2 min · jiezi

基于GitLab-CI搭建Golang自动构建环境

基于GitLab CI搭建Golang自动构建环境Golang发布遇到的问题对于golang的发布,之前一直没有一套规范的发布流程,来看看之前发布流程: 方案一开发者本地环境需要将环境变量文件改为正式环境配置编译成可执行文件发送给运维(运维)将文件覆盖为线上(运维)重启进程(可谓“又臭又长”) 方案二开发者讲代码commit到gitlab上交给运维同学(运维)pull代码(运维)编译成可执行文件(运维)覆盖线上文件(运维)重启进程这种对于运维属于重度依赖,而运维同学又需要去关心代码的编译,增加了运维同学的工作了。 以上两种方案都是之前项目中发生过的,对于发版来说可谓是一种“噩梦”,易出错,流程长,运维要是不在根本无法操作。 解决方案为了解决上面提到的两种发布问题,目前我们做了如下的设计方案: 开发者提交代码到GitLab服务器添加一个Tag触发构建(.gitlab-ci.yml+makefile)将构建后的文件打包添加上版本号(1.0.0+)后推送到版本服务器在Jenkins选择对应的版本号发布到指定Web Server上发布时,开发只需要编写“.gitlab-ci.yml”以及makefile对项目进行构建,而运维只需要配置jenkins,将文件发布到Web Server上即可,完成了开发和运维的解耦。 什么是GitLab-CIGitLab CI 是 GitLab Continuous Integration (Gitlab 持续集成)的简称。从 GitLab 的 8.0 版本开始,GitLab 就全面集成了 Gitlab-CI,并且对所有项目默认开启。只要在项目仓库的根目录添加 .gitlab-ci.yml 文件,并且配置了 Runner(运行器),那么每此添加新的tag都会触发 CI pipeline。 一些概念在介绍 GitLab CI 之前,我们先看看一些持续集成相关的概念。 Pipeline一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。 任何提交或者 Merge Request 的合并都可以触发 Pipeline,如下图所示: +------------------+ +----------------+| | trigger | || Commit / MR +---------->+ Pipeline || | | |+------------------+ +----------------+StagesStages 表示构建阶段,说白了就是上面提到的流程。 我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点: 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败因此,Stages 和 Pipeline 的关系就是: ...

June 19, 2019 · 2 min · jiezi