紅帽員工展示了目標組裝系統。 GNU Make 4.2 發布

理查德·WM·瓊斯,作家 libguestfs,在紅帽工作, 引進 新的裝配實用程式 目標,旨在消除 make 實用程式中的缺點和問題,同時保持腳本的整體簡單性和可理解性。 make 實用程式設計於 1976 年,有許多概念上的缺陷;Goals 計劃在不改變整體概念的情況下消除這些缺陷。
目標原始碼 分發者 根據 GPLv2+ 許可。

需要解決的問題:

  • 僅支援一種依賴項解析策略 - “如果目標檔案遺失或早於依賴項之一,則執行組譯指令。” 目標計劃實施其他策略,例如檢查 URL 是否存在、將修改時間與任何文件進行比較、評估包構建 廣治,比較校驗和,運行測試案例並選擇性地跳過測試。
  • 在處理建置目標時,make 不會分隔檔案和規則名稱,因此,不會檢查執行規則時是否會實際建立它聲稱要建立的檔案。 例如,如果您有一個名為“test”的規則,它運行帶有測試的腳本,則意外創建了一個名為“test”的文件,那麼測試將停止被調用,因為make 會認為目標已構建並且不需要任何操作(要解決 make 中的問題,您可以指定「.PHONY: test」指令)。 目標明確分隔文件和規則名稱。

    紅帽員工展示了目標組裝系統。 GNU Make 4.2 發布

  • 只為彙編指令提供一個參數時出現問題。

    紅帽員工展示了目標組裝系統。 GNU Make 4.2 發布

    目標可讓您使用任意數量的命名參數。 例如,您可以從名稱中單獨提取偵錯檔案的符號:

    紅帽員工展示了目標組裝系統。 GNU Make 4.2 發布

  • 與 shell 解釋器互動時出現問題。 例如,需要控製檔案名稱和目錄名稱中的空格轉義、執行每個指令時啟動單獨的 shell 解釋器所造成的資源浪費、「$」字元的雙重解釋(在 shell 和 make 中都使用),考慮到縮排。

    這些問題在目標中透過使用“%”符號代替“$”作為彙編變數(“$”僅保留用於 shell)並使用解析器來解決 拉魯爾(1),這要求您用引號將路徑和檔案名稱括起來,並用花括號突出顯示程式碼區塊。 整個命令區塊在命令 shell 的一個實例中啟動,並且在命令區塊內,允許任意程式碼格式,無需引用特殊空格。

    曾是:
    目標:foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    變成:
    “目標”:“foo.o”,“bar.o”{
    %CC %CFLAGS %< -o %@
    }

目標的其他功能:

  • 指定任意名稱和參數的可選支援:

    全部目標=:“目標”

    目標連結 =
    “目標”:“foo.o”,“bar.o”{...}

    目標編譯(名稱)=
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • 兩種啟動模式:將建構目標與檔案名稱相符的 make 模式(例如,檔案「foo.o」匹配目標「%name.o」),以及直接編譯模式:

    全部目標 = : 鏈接

    目標連結 =
    “目標”:“foo.o”,編譯(“酒吧”){...}

    目標編譯(名稱)=
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • 組裝策略由特殊規則決定,可用於確定是否需要重新組裝組裝目標。 如果連結到檔案的存在,則透過對應的符號(規則名稱的「目標」和檢查檔案的*檔案(「目標」))明確確定。

    “目標”:“foo.o”,“bar.o”{...}

    *檔案(「目標」):*檔案(「foo.o」),*檔案(「bar.o」){...}

  • 開發人員可以定義組裝策略的任意屬性。 「*file」標誌是預設定義的(@{...} 表示抑制輸出,「exit 99」表示需要重建):

    策略*檔案(檔案名稱)= @{
    測試 -f %檔名 || 99號出口
    對於 f,以 % 表示

    來源: opennet.ru

添加評論