這是本文件的舊版!
在源碼之外-編譯與安裝資訊的提供
葛冬梅/文 2009-08-22
依據 GPL 規定,散布 GPL 程式的人,必須要提供程式源碼給拿到 GPL 程式的人。按照字面意義,所謂的源碼就是程式修改源頭的原始碼 (Source Code),也就是其他開發者可以很方便接續修改這個程式的形式。不過 GPL 在定義源碼範圍的時候,特別提到、若是該專案為一個可執行程式的話,完整的源碼還包括了介面定義檔、控制編譯過程的腳本與安裝資訊,GPL-3.0 更進一步規定,這裡所謂的源碼包含可以讓程式編譯、安裝起來的所有原始資訊,按照這樣的規定,所有該程式相關的必要編譯工具組 (toolchain),也都包括在這個定義範圍之內,進入散布時必須提供的清單之列(註一)。可是有關程式元件相關的額外資訊,其實並不皆為程式運作時必要的附加物,甚至有些是使用者自己撰寫,完全沒有引用或包含到 GPL 元件的程式碼,在這樣的情況下,許多人常常便會產生疑問:此時使用者自行撰寫的額外資訊,也都必須要依照 GPL 的義務性規定提供出來嗎?
GPL 撰寫的目的是為了讓有能力的程式開發者,可以自行研究與修改程式,讓程式因此變得更好用,為了達到這個目的,除了讓使用者可以修改程式外,還必須要讓開發者可以編譯程式,並且安裝起來,這樣開發者才可以知道修改後的程式執行起來效果如何。在這樣的思維下,若一個可執行程式採用 GPL 授權的話,除了單純的原始碼,使用者在散布程式的時候必須一併提供相關的資訊,讓拿到程式的後手開發者,可以盡興地修改、研究 GPL 程式,編譯腳本與安裝資訊就是具有協助開發者研究與修改程式的功用(註二)。
不過這樣的規定不見得完全具有法律上的強制力。GPL 之所以可以要求其他開發者將原始碼提供出來,是因為開發者在自己撰寫的程式中用到了 GPL 程式碼,因此 GPL 程式著作權人可以要求這個後手開發者,所撰寫的所有程式碼全部採用 GPL 來授權,否則就請不要用 GPL 程式碼。這就是「拿人的手短、吃人的嘴軟」,否則就請自力更生,不要依賴 GPL 程式。但是編譯腳本、安裝資訊,甚至是相關的編譯與安裝工具組,其實並不屬於 GPL 程式本體,甚至有些是開發者自己開發的程式,針對這些並非衍生自 GPL 程式碼的工具組, GPL 這樣的規定並沒有完全的強制效力。
「既然沒有完全的強制效力,那就不需要遵守,省得麻煩了!」這樣的想法筆者並不贊同,因為自由軟體的本質就是開放、分享,透過開放、分享的過程,可以讓後人站在前人所創造的基礎上,縮短創造的時程,而當後手將自己所做修改也開放出來,讓其他人也可以研究、修改,從中獲益,這樣自由軟體的整體開發環境才會友善,從而進入一個良性的循環。雖然在缺少編譯與安裝的資訊或程式的情況下,開發者也可以透過自行研究與嘗試,而成功地編譯與安裝程式,但是這其中必須耗費許多時間自行發掘、整理這些資訊,若是可以將這些時間省下來,轉而投入在研究與改善程式本體功能之上,將會更有益於軟體的改善。
這樣的話,那麼所提供的資訊應該要到什麼樣的的詳細程度呢?最佳狀態,當然是附上一個步驟一個步驟的編譯與安裝資訊,甚至連相關的工具組也一併附上。而最低程度,筆者以為必須要做到,當一個擁有基本相關知識的開發者,可以循著所提供的資訊,將原始碼編譯、安裝並執行起來,而若是這樣的標準也沒有達到,那就表示所提供的資訊太過簡略。比喻來說,這些編譯與安裝資訊就好比是學生上課的筆記,有的學生筆記做得詳細,缺課同學借來看,如同親臨上課一般,詳盡的編譯與安裝資訊就像是這種筆記。有的上課筆記比較簡單,只有大綱與重點說明,缺課同學借來看雖然無法馬上就理解吸收,但是經過一番思考,與搜尋、參考相關資料之後,仍然可以理解老師上課的內容,若所附上的編譯與安裝資訊可以達到這樣的效果,筆者以為這就達到了最低標準。而有的上課筆記非常簡略,只有重點、大綱,甚至只有一些關鍵字,這樣的內容只有做筆記的同學自己可以看得懂,缺課同學拿到之後,除非詢問原來做筆記的同學,否則根本無法理解筆記的內容,若所提供的編譯與安裝資訊也是這樣簡略,對於其他開發者來說,有如無字天書,並無法達到協助他人安裝執行程式的目的,這是筆者所不建議的。
另外關於工具組的利用方式,筆者想要特別說明。有人以為所提供的工具組,僅是單純作為工具使用,所以有沒有提供原始碼都不重要,其實若所提供的工具組也是採用 GPL 授權的話,當然必須要依照 GPL 的規定,將原始碼也提供給後手開發者,這並不會因為工具組所帶有的工具特性而受到影響。若所提供的工具組不是採用自由軟體方式授權,那當然也必須遵守這個工具組的授權內容,授權內容不允許提供原始碼給他人的話,當然就不需要提供。
自由軟體強調的是開放、分享的精神,希望透過互相分享、討論的方式,來達到研究、修改,進而改善程式的目的,基於這樣的理念,許多開發者將自己的原始碼免費地提供給他人利用,所要求的回報不外乎就是尊重,而尊重的具體表現就是遵守授權條款的遊戲規則。雖然 GPL 的對於提供編譯與安裝資訊這方面的規定,不見得具有法律上的強制力,但是若從自由軟體整體的發展環境來說,筆者認為在提供原始碼的同時,也應該要提供這些資訊,甚至是相關的工具組給開發者,如此才可以將自由軟體的開發帶入良性、正面的循環中,讓自由軟體的開發整體朝向正面來推進。
註一:GPL2 第 3 條第 2 項:“The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.”。 GPL3 第 1 條第 4 項也有相對應的規定:“The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.”
註二:為了便利開發者研究、修改與改善程式,除了附上詳細清楚的編譯與安裝資訊之外,詳細的說明文件也是不可或缺的一環。透過這些文件與資訊的提供,自由軟體開放、共享的精神才能真正體現,將軟體的開發與改善帶進一個良性的循環。不過說明文件的提供與授權不在本文討論之列,因此文中並未提及,在此一併說明。對於這一議題有興趣者,可以參考:林珈宏,自由軟體說明文件的授權選擇,自由軟體鑄造場電子報第 127 期。