關於 ebuild 腳本的系列問題。給定來自 devrel 和問題的原始段落
範圍
每當獲取 ebuild 時,腳本解釋器會將其中的函式和變數載入到記憶體中。然而,只有不屬於函式的變數和指令會被解釋——諸如 src_compile() 之類的函式只有在 ebuild 到達編譯階段時才由 Portage 執行。
這些函式中的程式碼被認為是在“本地範圍”中,而函式之外的所有內容都在“全域範圍”中,這意味著每次獲取 ebuild 時都會執行它們。
出於性能原因,不應在全域範圍內呼叫外部應用程序(例如 grep、sed 或 awk),而應使用諸如使用內置 bash 替換等替代方法。可以在 Advanced Bash Scripting Guide 中找到有用的替代方案。
此外,任何可能在全域範圍內呼叫的外部應用程序都不能保證在系統上存在。如果命令放置在本地範圍內(例如,在
pkg_setup()
函式中),我們可以通過將其放置在 ebuild 的${DEPEND}
.
- ebuild 是什麼意思?它可以是源命令嗎(順便說一句,我不明白,它來自和書,它沒有“人源”。
- 好的,變數 - 如何解釋它們?我以某種方式理解函式如何。函式可能屬於某種類型的程式。它是編譯一個或解釋一個。如果 ebuild 語言是腳本(可能是 bash)——比如在 Gentoo Portage 中廣泛使用的 Pearl 或 python,那麼 ebuild 是如何包含編譯功能的(我記得一些來自學校的 pascal)。
- 因此什麼是
src_compile()
功能 - revdel 中沒有提到它。- “編譯階段” - 這個術語是什麼意思?哪些是 ebuild 階段或 ebuild 階段?
- 關於本地/全域範圍也是如此。我完全不明白,連同一些內部應用程序 - 也沒有提到相反的想法(awk ..)。
pkg_setup()
功能,$DEPEND
-那些只是範例還是暗示隱含含義?
Ebuild 是 shell 腳本(實際上是 bash 腳本)。所以它們像 shell 腳本一樣工作,有變數並定義函式。但是 ebuild 不是直接執行的——您通過
emerge
(或ebuild
有時直接)通過按所需順序從 ebuild 呼叫適當的函式來驅動準備、建構和安裝過程來執行它們。Q1 : ebuild 是什麼意思?
Q2:變數 - 如何解釋它們?
Q5:範圍
與 shell 腳本相同,使用
source
內置命令(參見man bash
)。這意味著腳本(在本例中為 ebuild)由目前 shell(由 驅動)讀取emerge
並像呼叫腳本的一部分一樣進行處理。這將處理所有變數定義,將它們添加到呼叫腳本的環境中,並解析 ebuild 中定義的所有函式 - 但不執行這些函式。
變數可以非常簡單,例如:
DEPEND=">=dev-foo/bar-42"
不需要解釋,或者可以包含對其他變數的引用,例如:
DEPEND=">=some-cat/related-${PV}"
這需要變數插值,或者可以使用需要執行 bash 內置命令或外部程序來解釋的更複雜的定義。這不是特定於 ebuild 的,而是普通的腳本。
在 ebuild 中沒有什麼特別的範圍,它和普通腳本是一樣的。
Q4 : 階段
Q3 和 6 :
src_compile
,pkg_setup
,${DEPEND}
從源安裝包的過程分解為多個步驟,大致準備(下載、解包和配置源)、編譯、然後安裝和安裝後任務。Ebuild 維護者可以提供在每個不同階段執行的功能來定制建構。您可以在開發人員的EAPI 使用和描述中找到階段列表。手動的。
預定義和 ebuild 變數在同一手冊的變數部分中進行了描述。
${DEPEND}
是其中之一。
src_compile
如果需要在安裝包之前編譯原始碼,則 ebuild 必須(直接或間接)提供的功能之一。並非所有的 ebuild 都需要這個(例如,可以只安裝不需要編譯的圖示/主題/圖像),但它們通常會這樣做。創建函式以正確建構源包是 ebuild 維護者的工作。
pkg_setup
是將在安裝的早期階段呼叫的函式之一。