<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Makefile on 夜云泊</title>
    <link>https://lifeislife.cn/tags/makefile/</link>
    <description>feedId:57980998056508425+userId:73222296380546048 Recent content in Makefile on 夜云泊</description>
    <generator>Hugo -- 0.157.0</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 26 Sep 2022 21:36:18 +0000</lastBuildDate>
    <atom:link href="https://lifeislife.cn/tags/makefile/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Makefile 基础</title>
      <link>https://lifeislife.cn/posts/makefile%E5%9F%BA%E7%A1%80/</link>
      <pubDate>Mon, 26 Sep 2022 21:36:18 +0000</pubDate>
      <guid>https://lifeislife.cn/posts/makefile%E5%9F%BA%E7%A1%80/</guid>
      <description>&lt;h2 id=&#34;目标依赖命令&#34;&gt;目标、依赖、命令&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目标就是我们要去 make xxx 的那个 xxx，就是我们最终要生成的东西。&lt;/li&gt;
&lt;li&gt;依赖是用来生成目录的原材料&lt;/li&gt;
&lt;li&gt;命令就是加工方法，所以 make xxx 的过程其实就是使用命令将依赖加工成目标的过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;通配符--和-makefile-自动推导&#34;&gt;通配符 &lt;code&gt;%&lt;/code&gt; 和 Makefile 自动推导&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%&lt;/code&gt; 是 Makefile 中的通配符，代表一个或几个字母。也就是说&lt;code&gt;%.o&lt;/code&gt;就代表所有以&lt;code&gt;.o&lt;/code&gt;为结尾的文件。&lt;/li&gt;
&lt;li&gt;所谓自动推导其实就是 Makefile 的规则。当 Makefile 需要某一个目标时，他会把这个目标去套规则说明，一旦套上了某个规则说明，则 Makefile 会试图寻找这个规则中的依赖，如果能找到则会执行这个规则用依赖生成目标。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;makefile-中定义和使用变量&#34;&gt;Makefile 中定义和使用变量&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Makefile 中定义和使用变量，和 shell 脚本中非常相似。相似的是都没有变量类型，直接定义使用，引用变量时用&lt;code&gt;$var&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;伪目标phony&#34;&gt;伪目标（&lt;code&gt;.PHONY&lt;/code&gt;）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;伪目标意思是这个目标本身不代表一个文件，执行这个目标不是为了得到某个文件或东西，而是单纯为了执行这个目标下面的命令。&lt;/li&gt;
&lt;li&gt;伪目标一般都没有依赖，因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖，因为不加依赖意思就是无条件执行。&lt;/li&gt;
&lt;li&gt;伪目标可以直接写，不影响使用；但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用&lt;code&gt;.PHONY&lt;/code&gt;来明确声明它是伪目标。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;makfile-中引用其他-makefile&#34;&gt;Makfile 中引用其他 Makefile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;有时候 Makefile 总体比较复杂，因此分成好几个 Makefile 来写。然后在主 Makefile 中引用其他的，用 &lt;code&gt;include&lt;/code&gt; 指令来引用。引用的效果也是原地展开，和 C 语言中的头文件包含非常相似。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;赋值&#34;&gt;赋值&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;=&lt;/code&gt;最简单的赋值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:=&lt;/code&gt;一般也是赋值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上这两个大部分情况下效果是一样的，但是有时候不一样。用&lt;code&gt;=&lt;/code&gt;赋值的变量，在被解析时他的值取决于最后一次赋值时的值，所以你看变量引用的值时不能只往前面看，还要往后面看。用&lt;code&gt;:=&lt;/code&gt;来赋值的，则是就地直接解析，只用往前看即可。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;?=&lt;/code&gt;如果变量前面并没有赋值过则执行这条赋值，如果前面已经赋值过了则本行被忽略。（实验可以看出：所谓的没有赋值过其实就是这个变量没有被定义过）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+=&lt;/code&gt;用来给一个已经赋值的变量接续赋值，意思就是把这次的值加到原来的值的后面，有点类似于 &lt;code&gt;strcat&lt;/code&gt;。（注意一个细节，&lt;code&gt;+=&lt;/code&gt;续接的内容和原来的内容之间会自动加一个空格隔开）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：Makefile 中并不要求赋值运算符两边一定要有空格或者无空格，这一点比 shell 的格式要求要松一些。&lt;/p&gt;
&lt;h2 id=&#34;makefile-的环境变量&#34;&gt;Makefile 的环境变量&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;makefile 中用 &lt;code&gt;export&lt;/code&gt; 导出的就是环境变量。一般情况下要求环境变量名用大写，普通变量名用小写。&lt;/li&gt;
&lt;li&gt;环境变量和普通变量不同，可以这样理解：环境变量类似于整个工程中所有 Makefile 之间可以共享的全局变量，而普通变量只是当前本 Makefile 中使用的局部变量。所以要注意：定义了一个环境变量会影响到工程中别的 Makefile 文件，因此要小心。&lt;/li&gt;
&lt;li&gt;Makefile 中可能有一些环境变量可能是 makefile 本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量（譬如我们在 &lt;code&gt;make&lt;/code&gt; 执行时给 makefile 传参。&lt;code&gt;make CC=arm-linux-gcc&lt;/code&gt;，其实就是给当前 Makefile 传了一个环境变量 &lt;code&gt;CC&lt;/code&gt;，值是 &lt;code&gt;arm-linux-gcc&lt;/code&gt;。我们在 &lt;code&gt;make&lt;/code&gt; 时给 &lt;code&gt;makefile&lt;/code&gt; 传的环境变量值优先级最高的，可以覆盖 makefile 中的赋值）。这就好像 C 语言中编译器预定义的宏&lt;code&gt;__LINE__&lt;/code&gt; &lt;code&gt;__FUNCTION__&lt;/code&gt;等一样。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;makefile-中使用通配符&#34;&gt;Makefile 中使用通配符&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt;：若干个任意字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?&lt;/code&gt;：1 个任意字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[]&lt;/code&gt;：将 &lt;code&gt;[]&lt;/code&gt; 中的字符依次去和外面的结合匹配&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有个&lt;code&gt;%&lt;/code&gt;，也是通配符，表示任意多个字符，和&lt;code&gt;*&lt;/code&gt;很相似，但是&lt;code&gt;%&lt;/code&gt;一般只用于规则描述中，又叫做规则通配符。&lt;/p&gt;
&lt;h2 id=&#34;makefile-的自动变量&#34;&gt;Makefile 的自动变量&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;为什么使用自动变量。在有些情况下文件集合中文件非常多，描述的时候很麻烦，所以我们 Makefile 就用一些特殊的符号来替代符合某种条件的文件集，这就形成了自动变量。&lt;/li&gt;
&lt;li&gt;自动变量的含义：预定义的特殊意义的符号。就类似于 C 语言编译器中预制的那些宏&lt;code&gt;__FILE__&lt;/code&gt;一样。&lt;/li&gt;
&lt;li&gt;常见自动变量：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$@&lt;/code&gt;：规则的目标文件名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&amp;lt;&lt;/code&gt;：规则的依赖文件名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$^&lt;/code&gt;：依赖的文件集合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;其他&#34;&gt;其他&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Makefile 中的注释用&lt;code&gt;#&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在 makefile 的命令行中前面的&lt;code&gt;@&lt;/code&gt;表示静默执行&lt;/li&gt;
&lt;li&gt;Makefile 中默认情况下在执行一行命令前会先把这行命令给打印出来，然后再执行这行命令&lt;/li&gt;
&lt;li&gt;如果你不想看到命令本身，只想看到命令执行就静默执行即可&lt;/li&gt;
&lt;/ul&gt;
</description>
      <content:encoded><![CDATA[<h2 id="目标依赖命令">目标、依赖、命令</h2>
<ul>
<li>目标就是我们要去 make xxx 的那个 xxx，就是我们最终要生成的东西。</li>
<li>依赖是用来生成目录的原材料</li>
<li>命令就是加工方法，所以 make xxx 的过程其实就是使用命令将依赖加工成目标的过程。</li>
</ul>
<h2 id="通配符--和-makefile-自动推导">通配符 <code>%</code> 和 Makefile 自动推导</h2>
<ul>
<li><code>%</code> 是 Makefile 中的通配符，代表一个或几个字母。也就是说<code>%.o</code>就代表所有以<code>.o</code>为结尾的文件。</li>
<li>所谓自动推导其实就是 Makefile 的规则。当 Makefile 需要某一个目标时，他会把这个目标去套规则说明，一旦套上了某个规则说明，则 Makefile 会试图寻找这个规则中的依赖，如果能找到则会执行这个规则用依赖生成目标。</li>
</ul>
<h2 id="makefile-中定义和使用变量">Makefile 中定义和使用变量</h2>
<ul>
<li>Makefile 中定义和使用变量，和 shell 脚本中非常相似。相似的是都没有变量类型，直接定义使用，引用变量时用<code>$var</code>。</li>
</ul>
<h2 id="伪目标phony">伪目标（<code>.PHONY</code>）</h2>
<ul>
<li>伪目标意思是这个目标本身不代表一个文件，执行这个目标不是为了得到某个文件或东西，而是单纯为了执行这个目标下面的命令。</li>
<li>伪目标一般都没有依赖，因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖，因为不加依赖意思就是无条件执行。</li>
<li>伪目标可以直接写，不影响使用；但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用<code>.PHONY</code>来明确声明它是伪目标。</li>
</ul>
<h2 id="makfile-中引用其他-makefile">Makfile 中引用其他 Makefile</h2>
<ul>
<li>有时候 Makefile 总体比较复杂，因此分成好几个 Makefile 来写。然后在主 Makefile 中引用其他的，用 <code>include</code> 指令来引用。引用的效果也是原地展开，和 C 语言中的头文件包含非常相似。</li>
</ul>
<h2 id="赋值">赋值</h2>
<ul>
<li><code>=</code>最简单的赋值</li>
<li><code>:=</code>一般也是赋值</li>
</ul>
<p>以上这两个大部分情况下效果是一样的，但是有时候不一样。用<code>=</code>赋值的变量，在被解析时他的值取决于最后一次赋值时的值，所以你看变量引用的值时不能只往前面看，还要往后面看。用<code>:=</code>来赋值的，则是就地直接解析，只用往前看即可。</p>
<ul>
<li><code>?=</code>如果变量前面并没有赋值过则执行这条赋值，如果前面已经赋值过了则本行被忽略。（实验可以看出：所谓的没有赋值过其实就是这个变量没有被定义过）</li>
<li><code>+=</code>用来给一个已经赋值的变量接续赋值，意思就是把这次的值加到原来的值的后面，有点类似于 <code>strcat</code>。（注意一个细节，<code>+=</code>续接的内容和原来的内容之间会自动加一个空格隔开）</li>
</ul>
<p>注意：Makefile 中并不要求赋值运算符两边一定要有空格或者无空格，这一点比 shell 的格式要求要松一些。</p>
<h2 id="makefile-的环境变量">Makefile 的环境变量</h2>
<ul>
<li>makefile 中用 <code>export</code> 导出的就是环境变量。一般情况下要求环境变量名用大写，普通变量名用小写。</li>
<li>环境变量和普通变量不同，可以这样理解：环境变量类似于整个工程中所有 Makefile 之间可以共享的全局变量，而普通变量只是当前本 Makefile 中使用的局部变量。所以要注意：定义了一个环境变量会影响到工程中别的 Makefile 文件，因此要小心。</li>
<li>Makefile 中可能有一些环境变量可能是 makefile 本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量（譬如我们在 <code>make</code> 执行时给 makefile 传参。<code>make CC=arm-linux-gcc</code>，其实就是给当前 Makefile 传了一个环境变量 <code>CC</code>，值是 <code>arm-linux-gcc</code>。我们在 <code>make</code> 时给 <code>makefile</code> 传的环境变量值优先级最高的，可以覆盖 makefile 中的赋值）。这就好像 C 语言中编译器预定义的宏<code>__LINE__</code> <code>__FUNCTION__</code>等一样。</li>
</ul>
<h2 id="makefile-中使用通配符">Makefile 中使用通配符</h2>
<ul>
<li><code>*</code>：若干个任意字符</li>
<li><code>?</code>：1 个任意字符</li>
<li><code>[]</code>：将 <code>[]</code> 中的字符依次去和外面的结合匹配</li>
</ul>
<p>还有个<code>%</code>，也是通配符，表示任意多个字符，和<code>*</code>很相似，但是<code>%</code>一般只用于规则描述中，又叫做规则通配符。</p>
<h2 id="makefile-的自动变量">Makefile 的自动变量</h2>
<ul>
<li>为什么使用自动变量。在有些情况下文件集合中文件非常多，描述的时候很麻烦，所以我们 Makefile 就用一些特殊的符号来替代符合某种条件的文件集，这就形成了自动变量。</li>
<li>自动变量的含义：预定义的特殊意义的符号。就类似于 C 语言编译器中预制的那些宏<code>__FILE__</code>一样。</li>
<li>常见自动变量：
<ul>
<li><code>$@</code>：规则的目标文件名</li>
<li><code>$&lt;</code>：规则的依赖文件名</li>
<li><code>$^</code>：依赖的文件集合</li>
</ul>
</li>
</ul>
<h2 id="其他">其他</h2>
<ul>
<li>Makefile 中的注释用<code>#</code></li>
<li>在 makefile 的命令行中前面的<code>@</code>表示静默执行</li>
<li>Makefile 中默认情况下在执行一行命令前会先把这行命令给打印出来，然后再执行这行命令</li>
<li>如果你不想看到命令本身，只想看到命令执行就静默执行即可</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Makefile 确定宏定义</title>
      <link>https://lifeislife.cn/posts/makefile%E7%A1%AE%E5%AE%9A%E5%AE%8F%E5%AE%9A%E4%B9%89/</link>
      <pubDate>Wed, 27 Jul 2022 08:28:03 +0000</pubDate>
      <guid>https://lifeislife.cn/posts/makefile%E7%A1%AE%E5%AE%9A%E5%AE%8F%E5%AE%9A%E4%B9%89/</guid>
      <description>&lt;p&gt;有时需要通过&lt;code&gt;make&lt;/code&gt;编译命令时确定代码中的宏定义，如编译不同的版本只需要使用不同的编译命令即可，而不需要修改内部代码。&lt;/p&gt;
&lt;p&gt;当前的需求是代码中有一部分代码通过宏定义来确定编译的是 DIE0 版本还是 DIE1 版本，如果定义了&lt;code&gt;DIE_ORDINAL_0&lt;/code&gt; 就使用 DIE0 的基地址，如果未定义就使用 DIE1 的基地址。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define DIE_ORDINAL_0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#ifdef DIE_ORDINAL_0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define PERIPH_BASE (SYS_BASE_ADDR_DIE0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define PERIPH_BASE (SYS_BASE_ADDR_DIE1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gcc 命令支持&lt;code&gt;-D&lt;/code&gt;宏定义，相当于 C 中的全局&lt;code&gt;#define&lt;/code&gt;，在 Makefile 中我们可以通过宏定义来控制源程序的编译。只要在 Makefile 中的 CFLAGS 中通过选项-D 来指定你于定义的宏即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; -D DIE_ORDINAL_0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 在编译的时候加上此选项就可以了
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CC&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$^&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;-o&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的话，相当于设置了&lt;code&gt;DIE_ORDINAL_0&lt;/code&gt;这个宏定义。但是我们想通过命令行的参数来决定是否使用这个宏定义，可以通过一些简单的方法获取：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;ifeq&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DIE&lt;/span&gt;0&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;y)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;-DDIE_ORDINAL_0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;-DDIE_ORDINAL_1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CC&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CFLAGS&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$^&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;-o&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$@&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从命令行找到&lt;code&gt;DIE0&lt;/code&gt;这个参数，如果它等于&lt;code&gt;y&lt;/code&gt;表示使用&lt;code&gt;DIE_ORDINAL_0&lt;/code&gt;。如果不等于&lt;code&gt;y&lt;/code&gt;则使用&lt;code&gt;DIE_ORDINAL_1&lt;/code&gt;，因为我们代码里没有&lt;code&gt;DIE_ORDINAL_1&lt;/code&gt;，所以就相当于没有定义&lt;code&gt;DIE_ORDINAL_0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;命令行示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Bash&#34; data-lang=&#34;Bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 编译DIE0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nv&#34;&gt;DIE0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 编译DIE1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nv&#34;&gt;DIE0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>有时需要通过<code>make</code>编译命令时确定代码中的宏定义，如编译不同的版本只需要使用不同的编译命令即可，而不需要修改内部代码。</p>
<p>当前的需求是代码中有一部分代码通过宏定义来确定编译的是 DIE0 版本还是 DIE1 版本，如果定义了<code>DIE_ORDINAL_0</code> 就使用 DIE0 的基地址，如果未定义就使用 DIE1 的基地址。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-C" data-lang="C"><span class="line"><span class="cl"><span class="cp">#define DIE_ORDINAL_0
</span></span></span><span class="line"><span class="cl"><span class="cp">#ifdef DIE_ORDINAL_0
</span></span></span><span class="line"><span class="cl"><span class="cp">#define PERIPH_BASE (SYS_BASE_ADDR_DIE0)
</span></span></span><span class="line"><span class="cl"><span class="cp">#else
</span></span></span><span class="line"><span class="cl"><span class="cp">#define PERIPH_BASE (SYS_BASE_ADDR_DIE1)
</span></span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span></code></pre></div><p>gcc 命令支持<code>-D</code>宏定义，相当于 C 中的全局<code>#define</code>，在 Makefile 中我们可以通过宏定义来控制源程序的编译。只要在 Makefile 中的 CFLAGS 中通过选项-D 来指定你于定义的宏即可。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Makefile" data-lang="Makefile"><span class="line"><span class="cl"><span class="nv">CFLAGS</span> <span class="o">+=</span> -D DIE_ORDINAL_0
</span></span><span class="line"><span class="cl"><span class="c"># 在编译的时候加上此选项就可以了
</span></span></span><span class="line"><span class="cl"><span class="k">$(</span><span class="nv">CC</span><span class="k">)</span> <span class="k">$(</span><span class="nv">CFLAGS</span><span class="k">)</span> <span class="err">$^</span> <span class="err">-o</span> <span class="k">$@</span>
</span></span></code></pre></div><p>这样的话，相当于设置了<code>DIE_ORDINAL_0</code>这个宏定义。但是我们想通过命令行的参数来决定是否使用这个宏定义，可以通过一些简单的方法获取：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Makefile" data-lang="Makefile"><span class="line"><span class="cl"><span class="err">ifeq</span> <span class="err">(</span><span class="k">$(</span><span class="nv">DIE</span>0<span class="k">)</span><span class="err">,</span> <span class="err">y)</span>
</span></span><span class="line"><span class="cl">  <span class="nv">CFLAGS</span> <span class="o">+=</span>-DDIE_ORDINAL_0
</span></span><span class="line"><span class="cl"><span class="err">else</span>
</span></span><span class="line"><span class="cl">  <span class="nv">CFLAGS</span> <span class="o">+=</span>-DDIE_ORDINAL_1
</span></span><span class="line"><span class="cl"><span class="err">endif</span>
</span></span><span class="line"><span class="cl"><span class="k">$(</span><span class="nv">CC</span><span class="k">)</span> <span class="k">$(</span><span class="nv">CFLAGS</span><span class="k">)</span> <span class="err">$^</span> <span class="err">-o</span> <span class="k">$@</span>
</span></span></code></pre></div><p>从命令行找到<code>DIE0</code>这个参数，如果它等于<code>y</code>表示使用<code>DIE_ORDINAL_0</code>。如果不等于<code>y</code>则使用<code>DIE_ORDINAL_1</code>，因为我们代码里没有<code>DIE_ORDINAL_1</code>，所以就相当于没有定义<code>DIE_ORDINAL_0</code>。</p>
<p>命令行示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl"><span class="c1"># 编译DIE0</span>
</span></span><span class="line"><span class="cl">make <span class="nv">DIE0</span><span class="o">=</span><span class="s2">&#34;y&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 编译DIE1</span>
</span></span><span class="line"><span class="cl">make <span class="nv">DIE0</span><span class="o">=</span><span class="s2">&#34;n&#34;</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
  </channel>
</rss>
