aboutsummaryrefslogblamecommitdiffstats
path: root/README.txt
blob: 3979d6443a84f10b728d7bf95892f1d530c333bc (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                                                                                     


                                                                                                                  


























                                                                                                                     




                                                                                   


                    



                                                                                   





                                                                                                           
























                                                                                                                     





                                                                                                              
wspkg - 用 cpp 管理工作站軟體清單
=================================
217 工作站實驗室 <217ta@csie.ntu.edu.tw>

目標
----
我們系上的工作站使用了兩種以上的作業系統(目前是 Debian 和 FreeBSD),但是因為
不同系統安裝軟體的方法不同,也不是每個軟體都跨平臺,因而使得以往不同作業系統的
軟體清單不同步,甚至有很大的差異。我們希望能藉由簡單的方法,讓不同作業系統的工
作站上安裝的軟體能夠同步。

方法
----
我們希望能用最容易操作、擴充、可攜的方法來達成目標。也許看起來可能有些複雜,
但我們的想法中最重要的目標就是:產生一個簡單、已排序、不重複的清單。

統一的軟體列表
~~~~~~~~~~~~~~
現在我們只需要一個主要的軟體列表!當然,有些軟體只能在特定作業系統執行,也有些
軟體在不同系統使用了不同的名稱,因此我們需要一些對照表。也就是說,我們需要準備
這些檔案:

 . 主要的軟體列表:packages.h,由大家熟悉的 C 語言前處理器(cpp)指令組成。
   如果軟體在各平臺的名稱相同,那麼就直接寫在這個檔案中;如果不同,那可以
   定一個 macro,再到各平臺的對照表將這個 macro 對應到真正的軟體名稱。注意
   這檔案有對軟體分類,新增或修改軟體清單時記得要寫在 #ifdef 和 #endif 中。

 . 各平臺的對應表:*.pkg,同樣由 cpp 指令組成。這個檔案中要定義(#define)
   在 packages.h 中的使用的 macro 所對應的真正軟體名稱。一般情況下,這個檔
   案中只會出現 #define 指令。

不同的套件格式
~~~~~~~~~~~~~~
有了軟體列表,接著我們就能產生真正的軟體清單了。使用 cpp 處理 packages.h 和
*.pkg,再加上一些簡單的後續處理,我們就能得到一個每行只有一個軟體名稱,且排序
好、不重複的清單 *.list。我們只需要將清單檔轉換成最終管理用的 meta-package 就
行了!

目前看起來長這樣
~~~~~~~~~~~~~~~~

-----------------------------------------------------------------------------

                +----------------------+    <2>       +-----------------+
          <1>   | 給 Debian 用的對照表 |    cpp       | Debian 軟體清單 |
       #include +      debian.pkg      |----------->>>|   debian.list   |
               /+----------------------+ 其他簡單處理 +-----------------+
 +------------+                             <3>
 | 主要的清單 |
 | packages.h |
 +------------+
               \+----------------------+              +-----------------+
       #include + 給 FreeBSD 用的對照表|    cpp       | FreeBSD 軟體清單|
                |      freebsd.pkg     |----------->>>|   freebsd.list  |
                +----------------------+ 其他簡單處理 +-----------------+

-----------------------------------------------------------------------------

<1> 這步驟由 cpp 直接處理,我們不用寫 script。
<2> 執行 cpp,執行檔名可由 CPP 環境變數設定。
<3> 因為 packages.h 和 *.pkg 格式自由,需要一些處理才能產生整齊、有規律的清單。

檔名慣例
--------
 - *.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 內容太多導致重點太過混亂,所以我們將個別平臺的文件
放到獨立的檔案中。