<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/devops/build/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/devops/build/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/devops/build/cmake/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/devops/build/cmake/</guid><description>&lt;h2 id="cmake-100">
 CMAKE &amp;#x1f4af;
 &lt;a class="anchor" href="#cmake-100">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="基础">
 基础
 &lt;a class="anchor" href="#%e5%9f%ba%e7%a1%80">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;h4 id="简介">
 简介
 &lt;a class="anchor" href="#%e7%ae%80%e4%bb%8b">#&lt;/a>
&lt;/h4>
&lt;/li>
&lt;/ul>
&lt;p class="warn">gcc &lt;/br>gcc是用来编译c文件的编译器。简单来说就是给他输入一个（或几个）c文件，它可以输出一个可执行文件。当你的程序只有一个源文件时，直接就可以用gcc命令编译它。但是当你的程序包含很多个源文件时，用gcc命令逐个去编译时，容易混乱而且工作量大。&lt;/p>
&lt;p class="warn">make &lt;/br> 因此出现了make工具。它本身没有编译和链接功能。但是它可以按照&lt;code>Makefile&lt;/code>文件中的命令调用gcc来编译工程。有了make，我们就不用一个一个文件去编译，只要把他们的编译指令都写在Makefile中，然后make就可以一键完成。&lt;/p>
&lt;p class="warn">cmake &lt;/br> 为了进一步简化Makefile的书写，出现了&lt;code>cmake&lt;/code>。cmake根据CMakeLists.txt文件生成项目的makefile，而且写法也大大简化。总的来说，CMake，make，gcc组成一个工具链，让我们在构建项目时只需要编写源文件以及CmakeLists.txt即可。它的流程如下：&lt;/p>
&lt;div class="mermaid">graph LR
A(编写CMakeLists.txt)--&amp;gt;B((Cmake))
B--&amp;gt;C(Makefile等配置文件)
C--&amp;gt;D((make))
D--&amp;gt;F((gcc))
E(源文件)--&amp;gt;F
F--&amp;gt;G(可执行程序)
&lt;/div>&lt;p>&lt;img src="https://archive-w.netlify.app/.images/devops/build/clion-base-step-01.png" alt="" width="70%">
&lt;img src="https://archive-w.netlify.app/.images/devops/build/clion-base-step-02.png" alt="" width="70%">&lt;/p>
&lt;ul>
&lt;li>
&lt;h4 id="基本规则">
 基本规则
 &lt;a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e8%a7%84%e5%88%99">#&lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>
&lt;h5 id="变量">
 变量
 &lt;a class="anchor" href="#%e5%8f%98%e9%87%8f">#&lt;/a>
&lt;/h5>
&lt;/li>
&lt;/ol>
&lt;p>使用&lt;code>${}&lt;/code>方式取值，&lt;strong>变量名区分大小写&lt;/strong>（指令名不区分大小写）&lt;/br>
定义一个变量可以用&lt;strong>SET&lt;/strong>指令：&lt;/br>&lt;/p>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="shell" data-line="" class="language-shell line-numbers" style="max-height: none">&lt;code class="language-shell">SET(valname main.c src1.c src2.c)
&lt;/code>&lt;/pre>&lt;/div>
&lt;p>这条语句就是定一个一个名字叫&lt;code>valname&lt;/code>的变量，它的值是&lt;code>main.c src1.c src2.c&lt;/code>;相当于是&lt;code>valname=main.c src1.c src2.c&lt;/code>&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>系统预定义的变量&lt;/strong>&lt;/p>
&lt;p>在我们使用PROJECT指令指定工程名后，CMake会自动生成两个变量;可以在 CMakeCache.txt 中看到定义。&lt;/p>
&lt;ul>
&lt;li>&lt;em>&lt;strong>${pname}_BINARY_DIR&lt;/strong>&lt;/em>: 可执行程序目录，比如&lt;code>step1_BINARY_DIR&lt;/code>,其实就是执行cmake命令时的当前目录，比如在build/外部编译，那么它就是build的绝对路径 &lt;/br>&lt;/li>
&lt;li>&lt;em>&lt;strong>${pname}_SOURCE_DIR&lt;/strong>&lt;/em>: 源文件目录，比如&lt;code>step1_SOURCE_DIR&lt;/code>,就是主CmakeLists.txt所在的绝对路径。&lt;/li>
&lt;/ul>
&lt;p>我们可以使用他们。同时系统还会帮我们预定义两个与工程名无关的变量，他们的内容与上述两个变量相同，但是好处是变量名不会因为工程名改变而改变，因此推荐使用：&lt;/br>&lt;/p>
&lt;ul>
&lt;li>&lt;em>&lt;strong>PROJECT_BINARY_DIR&lt;/strong>&lt;/em> : 可执行程序目录&lt;/br>&lt;/li>
&lt;li>&lt;em>&lt;strong>PROJECT_SOURCE_DIR&lt;/strong>&lt;/em> : 源文件目录&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>
&lt;h5 id="指令">
 指令
 &lt;a class="anchor" href="#%e6%8c%87%e4%bb%a4">#&lt;/a>
&lt;/h5>
&lt;/li>
&lt;/ol>
&lt;p class="warn">指令就是CMake里的函数。它的名称不区分大小写，调用的格式如下:
* 指令名（参数1，参数2，参数3）
参数之间用空格或者分号隔开。
如果参数中包含括号，可以使用双引号将参数分开，如下所示：&lt;/p>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="shell" data-line="" class="language-shell line-numbers" style="max-height: none">&lt;code class="language-shell">SET(val fu n.c) # 指令会认为是'fu n.c'是两个参数
SET(val &amp;quot;fu n.c&amp;quot;) # 使用双引号避免错误
&lt;/code>&lt;/pre>&lt;/div>
&lt;ol start="3">
&lt;li>
&lt;h5 id="使用">
 使用
 &lt;a class="anchor" href="#%e4%bd%bf%e7%94%a8">#&lt;/a>
&lt;/h5>
&lt;/li>
&lt;/ol>
&lt;p class="warn">CMake命令用于生成中间文件，使用时要传入CmakeLists.txt文件所在的目录。如果在主目录下直接生成配置文件，&lt;strong>内部构建&lt;/strong>，这样做的坏处是使代码文件与中间文件相互混淆，因此最好的做法时&lt;strong>外部构件&lt;/strong>。&lt;br>
如下所示：在主目录下&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/devops/build/make/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/devops/build/make/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="intromake">
 Intro(make)
 &lt;a class="anchor" href="#intromake">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="demo">
 demo
 &lt;a class="anchor" href="#demo">#&lt;/a>
&lt;/h3> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel left-panel"style="max-width: 60%; width: 60%;">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="makefile" data-line="" class="language-makefile line-numbers" style="max-height: none">&lt;code class="language-makefile"># makefile 对空格相当挑剔，必须是制表符
# https://stackoverflow.com/questions/24145650/makefile6-missing-separator-stop
OBJS = main.o tool1.o tool2.o
CC = gcc
CFLAGS += -c -Wall -g

mytool: $(OBJS)
 $(CC) $^ -o $@

%.o: %.c
 $(CC) $^ $(CFLAGS) -o $@

.PHONY: clean
clean:
 # 禁用回显使用@，或者在外部 make -s clean
 # https://stackoverflow.com/questions/9967105/suppress-echo-of-command-invocation-in-makefile
 @$(RM) *.o mytool -r
&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
 &lt;div class="docsify-example-panel right-panel"style="max-width: 40%; width: 40%;">
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/devops/build/make-process-01.png" alt="" width="85%">&lt;/p>&lt;/div>&lt;/div>

&lt;ul>
&lt;li>


 &lt;a href="https://github.com/junegunn/fzf/blob/master/Makefile" rel="noopener" target="_blank">https://github.com/junegunn/fzf/blob/master/Makefile&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h3 id="spec">
 Spec
 &lt;a class="anchor" href="#spec">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;h4 id="rule">
 rule
 &lt;a class="anchor" href="#rule">#&lt;/a>
&lt;/h4>
&lt;p class="warn">Makefile文件由一系列的规则(rules)组成。每条规则的形式如下：
&lt;br>&lt;code>&amp;lt;target&amp;gt; : &amp;lt;prerequisites&amp;gt;&lt;/code>
&lt;br>&lt;code>[tab][commands]&lt;/code>
&lt;br>&lt;br>上面第一行冒号前面的部分，叫做&amp;quot;目标&amp;quot;（target），冒号后面的部分叫做&amp;quot;前置条件&amp;quot;（prerequisites）；第二行必须由一个tab键起首，后面跟着&amp;quot;命令&amp;quot;（commands）。
&lt;br>&amp;ldquo;目标&amp;quot;是必需的，不可省略；&lt;span style='color: blue'>&amp;ldquo;前置条件&amp;quot;和&amp;quot;命令&amp;quot;都是可选的，但是两者之中必须至少存在一个&lt;/span>。每条规则就明确两件事：构建目标的前置条件是什么，以及如何构建。举例如下：
&lt;br>&lt;br>&lt;code>a.txt: b.txt c.txt&lt;/code>
&lt;br>&lt;code> cat b.txt c.txt &amp;gt; a.txt&lt;/code>&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/devops/build/maven/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/devops/build/maven/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="maven分享">
 MAVEN分享
 &lt;a class="anchor" href="#maven%e5%88%86%e4%ba%ab">#&lt;/a>
&lt;/h2>
&lt;p class="warn">今天这次分享的主要就是maven构建工具使用的一些经验， 和大家起分享，交流一下。也是为了日后能够更加灵活的使用。内容中也包括我原来对maven存在的误解和疑问的一些答疑。以交流学习，整理归纳为主。&lt;/p>
&lt;ul>
&lt;li>
&lt;h3 id="tips">
 Tips
 &lt;a class="anchor" href="#tips">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>运行mvn compile 会执行 clean 吗? 运行 package 会执行 compile吗?&lt;/li>
&lt;li>optional,provided 区别?&lt;/li>
&lt;li>既然maven有自带的依赖仲裁机制，为什么还会出现依赖冲突?&lt;/li>
&lt;li>mvn 依赖可以定义的位置及加载顺序，远程仓库定义的位置及加载顺序。mirrorOf实际意义?&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;h3 id="介绍一笔带过">
 介绍（一笔带过）
 &lt;a class="anchor" href="#%e4%bb%8b%e7%bb%8d%e4%b8%80%e7%ac%94%e5%b8%a6%e8%bf%87">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="markup" data-line="" class="language-markup line-numbers" style="max-height: none">&lt;code class="language-markup">maven 是继 ant 之后apache开源的软件构建工具，由绑定在生命周期上的插件辅助完成构建任务，主要的
功能包括解决依赖，集成测试，编译项目，定制化资源打包发布等。
介绍，下载地址，使用方式。
&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;li>
&lt;h3 id="settingsxml-介绍">
 settings.xml 介绍
 &lt;a class="anchor" href="#settingsxml-%e4%bb%8b%e7%bb%8d">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="markup" data-line="" class="language-markup line-numbers" style="max-height: none">&lt;code class="language-markup">&amp;lt;localRepository&amp;gt;
&amp;lt;pluginGroups&amp;gt;
 配置插件的groupId。为的是单独执行插件的时候，可以简单调用。
 1，全路径执行。2，如何配置省略执行，3，自带的没有配置，为什么可以省略执行 4,prefix
&amp;lt;proxies&amp;gt;
&amp;lt;servers&amp;gt; 将pluginGroups中默认的标签解释一下
&amp;lt;mirrors&amp;gt;
 &amp;lt;mirror&amp;gt;
 &amp;lt;mirrorOf&amp;gt;
&amp;lt;profile&amp;gt; -- 属性压制
&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;li>
&lt;h3 id="pomxml介绍">
 POM.xml介绍
 &lt;a class="anchor" href="#pomxml%e4%bb%8b%e7%bb%8d">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="markup" data-line="" class="language-markup line-numbers" style="max-height: none">&lt;code class="language-markup">&amp;lt;relativePath/&amp;gt;
 查找parent路径优先级； 指定的位置 &amp;gt; 本地仓库 &amp;gt; 远程仓库 
 1,当为空标签得时候，默认从本地仓库查找没有的话再从远程，
 2,不写得时候这个值默认为 ../pom.xml，也就是他上级路径得pom.xml.

&amp;lt;properties&amp;gt;
&amp;lt;dependencyManagement&amp;gt;
&amp;lt;dependencies&amp;gt;
 &amp;lt;dependency&amp;gt;
 &amp;lt;scope&amp;gt;
 &amp;lt;type&amp;gt;
 &amp;lt;classifier&amp;gt;
&amp;lt;build&amp;gt;
 &amp;lt;filters&amp;gt;
 &amp;lt;filter&amp;gt;
 &amp;lt;resource&amp;gt;
 &amp;lt;filtering&amp;gt;true|false
 &amp;lt;plugins&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;li>
&lt;h3 id="properties-引用的各种形式">
 properties 引用的各种形式，${},@@
 &lt;a class="anchor" href="#properties-%e5%bc%95%e7%94%a8%e7%9a%84%e5%90%84%e7%a7%8d%e5%bd%a2%e5%bc%8f">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="markup" data-line="" class="language-markup line-numbers" style="max-height: none">&lt;code class="language-markup">https://maven.apache.org/pom.html#properties

resources 过滤或加载顺序
1,基本使用。
2，属性优先级
&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;li>
&lt;h3 id="maven特性">
 maven特性
 &lt;a class="anchor" href="#maven%e7%89%b9%e6%80%a7">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="markup" data-line="" class="language-markup line-numbers" style="max-height: none">&lt;code class="language-markup">生命周期，
继承与聚合，，
https://maven.apache.org/pom.html#a-final-note-on-inheritance-v-aggregation
 继承通过申明&amp;lt;parent&amp;gt;标签来定义。
依赖机制

&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;li>
&lt;h3 id="问题答疑">
 问题答疑
 &lt;a class="anchor" href="#%e9%97%ae%e9%a2%98%e7%ad%94%e7%96%91">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="markup" data-line="" class="language-markup line-numbers" style="max-height: none">&lt;code class="language-markup">1, 运行mvn compile 会执行 clean吗？运行package 会执行 compile吗？
 不会，因为查看文档发现 compile 阶段 跟 clean 阶段不属于同一个声明周期【分组】。
 或者执行命令也可发现在compile命令下，不会调用clean相关插件。

2, optional ,provided 区别，
 optional 表示可选依赖传递，可以理解为默认排除
 provided 表示依赖必选，但是使用方提供，

3，既然maven有自带的依赖仲裁机制，为什么还会出现依赖冲突？


4，mvn 依赖可以在哪些地方定义？最终生效的是那部分？
 1, &amp;lt;dependency&amp;gt; , &amp;lt;repository&amp;gt; 的定义是有顺序的。
 &amp;lt;dependency source&amp;gt; like repository,mirror,&amp;lt;profile&amp;gt;
 pom.dependency &amp;gt; profile.dependency &amp;gt; parent

 2,远程仓库定义
 settings &amp;gt; pom.profile &amp;gt; pom.repository
&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/devops/build/maven-project-dependency.png" alt="" width="70%">
&lt;img src="https://archive-w.netlify.app/.images/devops/build/maven-pull-process.png" alt="nihao" width="70%" title="repo">&lt;/p></description></item></channel></rss>