<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] > [參考網站](http://www.ruanyifeng.com/blog/2015/02/make.html) ## 語法 ### Makefile文件的格式 ``` <target> : <prerequisites> [tab] <commands> target : 目標,可以是文件或者偽文件(必須) prerequisites: 前置條件 tab :第二行 tab 起首 commands: 需要執行的命令 ``` ### 目標(target) 目標可以是一個文件名,也可以是多個文件名,之間用空格分隔 也可以是偽文件,為了被檢測到有文件生成,PHONY ``` .PHONY: clean clean: rm *.o ``` Make命令運行時沒有指定目標,默認會執行Makefile文件的第一個目標 ### 前置條件(prerequisites) * 前置條件通常是一組文件名,之間用空格分隔 * 只要有一個前置文件不存在,或者有過更新(前置文件的last-modification時間戳比目標的時間戳新),"目標"就需要重新構建 ``` result.txt: source.txt cp source.txt result.txt ``` 如果 source.txt 不存在,則需要先創建source.txt ### 命令(commands) 命令(commands)表示如何更新目標文件,由一行或多行的Shell命令組成。 它是構建"目標"的具體指令,它的運行結果通常就是生成目標文件 tab鍵可以`.RECIPEPREFIX`替換 ``` .RECIPEPREFIX = > all: > echo Hello, world ``` 每行命令在一個單獨的shell中執行,這些Shell之間沒有繼承關系 如: ``` var-lost: export foo=bar echo "foo=[$$foo]" //make var-lost,取不到foo的值 ``` 可以有三個方法取得 foo 方法一: ``` var-kept: export foo=bar; echo "foo=[$$foo]" ``` 方法二: ``` var-kept: export foo=bar; \ echo "foo=[$$foo]" ``` 方法三: ``` .ONESHELL: var-kept: export foo=bar; echo "foo=[$$foo]" ``` ### Makefile文件的語法 #### 注釋使用`#` #### 回聲(echoing) ``` test: # 這是測試 ``` 執行 ``` $ make test # 這是測試 ``` 在命令的前面加上@,就可以關閉回聲。 ``` test: @# 這是測試 ``` 現在再執行`make test`,就不會有任何輸出 #### 通配符 Makefile 的通配符與 Bash 一致. 主要有星號(*)、問號(?)和 [...] 。比如, `*.o` 表示所有后綴名為o的文件 ``` clean: rm -f *.o ``` #### 模式匹配 主要用到的匹配符是% `%.o: %.c` 等同于下面的寫法。 ``` f1.o: f1.c f2.o: f2.c ``` #### 變量和賦值符 Makefile 允許使用等號自定義變量。 設置 makefile 的變量 ``` txt = Hello World test: @echo $(txt) ``` 獲取 bash 的變量需要 兩個 `$$` ``` test: @echo $$HOME ``` ``` make test /home/ant ``` 變量賦值 ``` VARIABLE = value # 在執行時擴展,允許遞歸擴展。 VARIABLE := value # 在定義時擴展。 VARIABLE ?= value # 只有在該變量為空時才設置值。 VARIABLE += value # 將值追加到變量的尾端。 ``` #### 內置變量(Implicit Variables) Make命令提供一系列內置變量 比如,`$(CC)` 指向當前使用的編譯器,`$(MAKE)` 指向當前使用的Make工具 ``` output: $(CC) -o output input.c ``` #### 自動變量(Automatic Variables) 1. `$@` 指代當前目標,可指代多個目標 ``` a.txt b.txt: touch $@ ``` 等于 ``` a.txt: touch a.txt b.txt: touch b.txt ``` 2. `$<` 指代第一個前置條件 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)`分別指向 $< 的目錄名和文件名。 #### 判斷和循環 使用 Bash 語法,完成判斷和循環 ``` ifeq ($(CC),gcc) libs=$(libs_for_gcc) else libs=$(normal_libs) endif ``` ##### 函數 ``` $(function arguments) # 或者 ${function arguments} ``` 幾個常用的內置函數 1. shell 函數用來執行 shell 命令 `srcfiles := $(shell echo src/{00..99}.txt)` 2. wildcard 函數用來在 Makefile 中,替換 Bash 的通配符。 `srcfiles := $(wildcard src/*.txt)` 3. subst 函數用來文本替換 `$(subst from,to,text)` eg: `$(subst ee,EE,feet on the street) // fEEt on the strEEt` 4. 替換后綴名 變量名 + 冒號 + 后綴名替換規則。它實際上patsubst函數的一種簡寫形式。 `min: $(OUTPUT:.js=.min.js)` ## Makefile 的實例 #### 執行多個目標 ``` .PHONY: cleanall cleanobj cleandiff cleanall : cleanobj cleandiff rm program cleanobj : rm *.o cleandiff : rm *.diff ``` 上面代碼可以調用不同目標,刪除不同后綴名的文件,也可以調用一個目標(cleanall),刪除所有指定類型的文件 #### 編譯C語言項目 ``` edit : main.o kbd.o command.o display.o cc -o edit main.o kbd.o command.o display.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h cc -c display.c clean : rm edit main.o kbd.o command.o display.o .PHONY: edit clean ```
                  <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>

                              哎呀哎呀视频在线观看