wspkg - 用 cpp 管理工作站軟體清單 ================================= 217 工作站實驗室 <217ta@csie.ntu.edu.tw> 操作說明 -------- |=================================================================== | make readme | 產生這份文件 | make debian | 產生給 Debian 用的 meta-package | make freebsd | 產生給 FreeBSD 用的 meta-ports Makefile | make | 做完以上所有事情 |=================================================================== |=================================================================== | make clean | 清除產生的套件檔 | make clean-exe | 清除產生的可執行檔 | make clean-doc | 清除產生的文件 | make distclean | 做完以上所有事情 |=================================================================== 目標 ---- 我們系上的工作站使用了兩種以上的作業系統(目前是 Debian 和 FreeBSD),但是因為 不同系統安裝軟體的方法不同,且並非每個軟體都跨平臺,使得以往不同作業系統的軟體 清單不同步,累積了不少差異。 我們希望能藉由簡單的方法,讓不同作業系統的工作站上安裝的軟體能夠同步。 方法 ---- 產生一個簡單、已排序、不重複的清單。 統一的軟體列表 ~~~~~~~~~~~~~~ 現在我們只需要一個主要的軟體列表!當然,有些軟體只能在特定作業系統執行,也有些 軟體在不同系統使用了不同的名稱,因此我們需要一些對照表。也就是說,我們需要準備 這些檔案: . 主要的軟體列表:packages.h,由大家熟悉的 C 語言前處理器(cpp)指令組成。 如果軟體在各平臺的名稱相同,那麼就直接寫在這個檔案中;如果不同,那可以 定一個 macro,再到各平臺的對照表將這個 macro 對應到真正的軟體名稱。注意 這檔案有對軟體分類,新增或修改軟體清單時記得要寫在 #ifdef 和 #endif 中。 . 各平臺的對應表:*.pkg,同樣由 cpp 指令組成。這個檔案中要定義(#define) 在 packages.h 中的使用的 macro 所對應的真正軟體名稱。一般情況下,這個檔 案中只會出現 #define 指令。 不同的套件格式 ~~~~~~~~~~~~~~ 有了軟體列表,接著我們就能產生真正的軟體清單了。使用 cpp 處理 packages.h 和 *.pkg,再加上一些簡單的後續處理,我們就能得到一個每行只有一個軟體名稱,且排序 好、不重複的清單 *.list。我們只需要將清單檔轉換成最終管理用的 meta-package 就 行了! 目前看起來長這樣 ~~~~~~~~~~~~~~~~ ----------------------------------------------------------------------------- +--------------------------+ | 主要的清單與對應的對照表 | | packages.h | | debian.pkg | | freebsd.pkg | +--------------------------+ | | cpp 與其他簡單的處理 v +--------------------------+ | 不同系統的軟體清單 | | debian.list | | freebsd.list | +--------------------------+ / \ / \ 轉換成各平臺所需格式的 script / \ +---------------------+ +-----------------------------+ | Debian meta-package | | FreeBSD meta-ports Makefile | +---------------------+ +-----------------------------+ ----------------------------------------------------------------------------- 檔名 ---- - *.pkg - 各系統套件名稱不同時使用的對照表。 - *.list - 處理過後已排序、不重複的套件清單。 - *.sh - 用於產生其他檔案的 script,輸出檔名應該是把 shell script 檔名的 .sh 刪除後得到的名稱。例如 debian.control.sh 就是產生 debian.control 的 script。 - *.in - 用於生成 meta-package 使用的範本檔案,命名規則同上。 - *.out - 儲存輸出的 meta-package 檔案。 原則 ---- 因為軟體清單常常是用在剛安裝好,還缺少很多軟體的系統,所以我們希望使用這份清單 時,能盡量不依賴外部程式,以避免為了處理清單還需要安裝額外軟體的麻煩。我們認為 以下軟體是我們可以依賴並假設一定會存在的: . POSIX shell (/bin/sh) 與基本的系統指令。 . POSIX standard C compiler (/usr/bin/c99)。 . POSIX make (/usr/bin/make),我們的 Makefile 不依賴 GNU 或 BSD make。 . C / C\++ 編譯器與前處理器,請用 cc / cpp / c\++ 這類通用的名稱,不要使用 gcc / g\++ 或 clang / clang++ 這類與特定編譯器實作有關的名稱。 當然,如果你正在準備你正在寫 debian.\*.sh 或 freebsd.\*.sh 這類只使用在特定平臺 的 script,你可以使用只在特定平臺才有的程式。例如 debian.\*.sh 內可以使用 bash 和 perl,而 freebsd.*.sh 內可以使用 csh 和 bsdtar。 目前支援的平臺 -------------- 目前我們已經大致完成 link:debian.html[Debian] 與 link:freebsd.html[FreeBSD] 的支援。為了避免讓 README 內容太多導致重點太過混亂,所以我們將個別平臺的文件 放到獨立的檔案中。