<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 3.1 注釋 井號(#)在Makefile中表示注釋。 ~~~ # 這是注釋 result.txt: source.txt # 這是注釋 cp source.txt result.txt # 這也是注釋 ~~~ ## 3.2 回聲(echoing) 正常情況下,make會打印每條命令,然后再執行,這就叫做回聲(echoing)。 ~~~ test: # 這是測試 ~~~ 執行上面的規則,會得到下面的結果。 ~~~ $ make test # 這是測試 ~~~ 在命令的前面加上@,就可以關閉回聲。 ~~~ test: @# 這是測試 ~~~ 現在再執行`make test`,就不會有任何輸出。 由于在構建過程中,需要了解當前在執行哪條命令,所以通常只在注釋和純顯示的echo命令前面加上@。 ~~~ test: @# 這是測試 @echo TODO ~~~ ## 3.3 通配符 通配符(wildcard)用來指定一組符合條件的文件名。Makefile 的通配符與 Bash 一致,主要有星號(*)、問號(?)和 [...] 。比如, *.o 表示所有后綴名為o的文件。 ~~~ clean: rm -f *.o ~~~ ## 3.4 模式匹配 Make命令允許對文件名,進行類似正則運算的匹配,主要用到的匹配符是%。比如,假定當前目錄下有 f1.c 和 f2.c 兩個源碼文件,需要將它們編譯為對應的對象文件。 ~~~ %.o: %.c ~~~ 等同于下面的寫法。 ~~~ f1.o: f1.c f2.o: f2.c ~~~ 使用匹配符%,可以將大量同類型的文件,只用一條規則就完成構建。 ## 3.5 變量和賦值符 Makefile 允許使用等號自定義變量。 ~~~ txt = Hello World test: @echo $(txt) ~~~ 上面代碼中,變量 txt 等于 Hello World。調用時,變量需要放在 $( ) 之中。 調用Shell變量,需要在美元符號前,再加一個美元符號,這是因為Make命令會對美元符號轉義。 ~~~ test: @echo $$HOME ~~~ 有時,變量的值可能指向另一個變量。 ~~~ v1 = $(v2) ~~~ 上面代碼中,變量 v1 的值是另一個變量 v2。這時會產生一個問題,v1 的值到底在定義時擴展(靜態擴展),還是在運行時擴展(動態擴展)?如果 v2 的值是動態的,這兩種擴展方式的結果可能會差異很大。 為了解決類似問題,Makefile一共提供了四個賦值運算符 (=、:=、?=、+=),它們的區別請看[StackOverflow](http://stackoverflow.com/questions/448910/makefile-variable-assignment)。 ~~~ VARIABLE = value # 在執行時擴展,允許遞歸擴展。 VARIABLE := value # 在定義時擴展。 VARIABLE ?= value # 只有在該變量為空時才設置值。 VARIABLE += value # 將值追加到變量的尾端。 ~~~ ## 3.6 內置變量(Implicit Variables) Make命令提供一系列內置變量,比如,$(CC) 指向當前使用的編譯器,$(MAKE) 指向當前使用的Make工具。這主要是為了跨平臺的兼容性,詳細的內置變量清單見[手冊](https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html)。 ~~~ output: $(CC) -o output input.c ~~~ ## 3.7 自動變量(Automatic Variables) Make命令還提供一些自動變量,它們的值與當前規則有關。主要有以下幾個。 **(1)$@** $@指代當前目標,就是Make命令當前構建的那個目標。比如,`make foo`的 $@ 就指代foo。 ~~~ a.txt b.txt: touch $@ ~~~ 等同于下面的寫法。 ~~~ a.txt: touch a.txt b.txt: touch b.txt ~~~ **(2)$<** $< 指代第一個前置條件。比如,規則為 t: p1 p2,那么$< 就指代p1。 ~~~ a.txt: b.txt c.txt cp $< $@ ~~~ 等同于下面的寫法。 ~~~ a.txt: b.txt c.txt cp b.txt a.txt ~~~ **(3)$?** $? 指代比目標更新的所有前置條件,之間以空格分隔。比如,規則為 t: p1 p2,其中 p2 的時間戳比 t 新,$?就指代p2。 **(4)$^** $^ 指代所有前置條件,之間以空格分隔。比如,規則為 t: p1 p2,那么 $^ 就指代 p1 p2 。 **(5)$*** $* 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。 **(6)$(@D) 和 $(@F)** $(@D) 和 $(@F) 分別指向 $@ 的目錄名和文件名。比如,$@是 src/input.c,那么$(@D) 的值為 src ,$(@F) 的值為 input.c。 **`(7)$(<D) 和 $(<F)`** `$(<D) 和 $(<F)` 分別指向 $< 的目錄名和文件名。 所有的自動變量清單,請看[手冊](https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html)。下面是自動變量的一個例子。 ~~~ dest/%.txt: src/%.txt @[ -d dest ] || mkdir dest cp $< $@ ~~~ 上面代碼將 src 目錄下的 txt 文件,拷貝到 dest 目錄下。首先判斷 dest 目錄是否存在,如果不存在就新建,然后,$< 指代前置文件(src/%.txt), $@ 指代目標文件(dest/%.txt)。 ## 3.8 判斷和循環 Makefile使用 Bash 語法,完成判斷和循環。 ~~~ ifeq ($(CC),gcc) libs=$(libs_for_gcc) else libs=$(normal_libs) endif ~~~ 上面代碼判斷當前編譯器是否 gcc ,然后指定不同的庫文件。 ~~~ LIST = one two three all: for i in $(LIST); do \ echo $$i; \ done # 等同于 all: for i in one two three; do \ echo $i; \ done ~~~ 上面代碼的運行結果。 ~~~ one two three ~~~ ## 3.9 函數 Makefile 還可以使用函數,格式如下。 ~~~ $(function arguments) # 或者 ${function arguments} ~~~ Makefile提供了許多[內置函數](http://www.gnu.org/software/make/manual/html_node/Functions.html),可供調用。下面是幾個常用的內置函數。 **(1)shell 函數** shell 函數用來執行 shell 命令 ~~~ srcfiles := $(shell echo src/{00..99}.txt) ~~~ **(2)wildcard 函數** wildcard 函數用來在 Makefile 中,替換 Bash 的通配符。 ~~~ srcfiles := $(wildcard src/*.txt) ~~~ **(3)subst 函數** subst 函數用來文本替換,格式如下。 ~~~ $(subst from,to,text) ~~~ 下面的例子將字符串"feet on the street"替換成"fEEt on the strEEt"。 ~~~ $(subst ee,EE,feet on the street) ~~~ 下面是一個稍微復雜的例子。 ~~~ comma:= , empty:= # space變量用兩個空變量作為標識符,當中是一個空格 space:= $(empty) $(empty) foo:= a b c bar:= $(subst $(space),$(comma),$(foo)) # bar is now `a,b,c'. ~~~ **(4)patsubst函數** patsubst 函數用于模式匹配的替換,格式如下。 ~~~ $(patsubst pattern,replacement,text) ~~~ 下面的例子將文件名"x.c.c bar.c",替換成"x.c.o bar.o"。 ~~~ $(patsubst %.c,%.o,x.c.c bar.c) ~~~ **(5)替換后綴名** 替換后綴名函數的寫法是:變量名 + 冒號 + 后綴名替換規則。它實際上patsubst函數的一種簡寫形式。 ~~~ min: $(OUTPUT:.js=.min.js) ~~~ 上面代碼的意思是,將變量OUTPUT中的后綴名 .js 全部替換成 .min.js 。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看