blob: d12e1a75b199e79bf981f819501c73b3bdf55d18 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
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 內容太多導致重點太過混亂,所以我們將個別平臺的文件
放到獨立的檔案中。
|