GPL 授權條款制定的目的,是希望人人都可以研究、修改與散佈程式,為了要達到這個目的,取得程式源碼 (Source Code) 是不可或缺的前提要件。因為雖然一位有能力的開發者在拿到目的碼的狀況下,也有可能透過逆向工程來將程式還原到源碼的形式,但這畢竟非常不便,也不是常態,很多情形下也有違法侵權之虞。因此在 GPL 授權條款的規定中,提供程式源碼是一項非常重要的義務,針對程式的研究與修改,透過源碼形式來進行是最為便捷的。而為了讓任何一位拿到程式的後手使用者,都可以順利取得相對應的程式源碼,GPL 設有一套規定散佈者如何提供程式源碼的規定,來保障這些源碼可以持續地被後手取得。
綜合 GPL 二版與三版的規定(註一),筆者歸納出五種散佈者提供程式源碼的方式,這是因為 GPL 規定,「散佈」程式目的碼的人,有同時或是嗣後「提供」程式源碼的義務。此篇文章將給予每一種方式簡短的名稱,用以方便記憶與即時運用。這五種方式在二版與三版有些細部的差異,不過基本上非常相近,因此筆者將以 GPL-2.0 為基礎,來說明兩個版本在提供程式源碼的共通之處,而針對相異之處,將會擇其要者加以解說(註二)。
原則上,任何一位 GPL 元件目的碼的散佈者,若是可以同時散佈相對應程式源碼的話,是自由軟體基金會 (Free Software Foundation) 建議的最佳狀況。在這種情況之下,後手同時取得程式源碼,自然可以直接瀏覽與修改程式,接著進行後續的編譯、執行等等動作。因此 GPL 所規定第一種提供 GPL 元件源碼的方式,是指將程式源碼儲存在常用的軟體交換媒介與載體 (customarily used for software interchange) 上,然後與目的碼一併散佈。目前常見的實踐方式,就是將程式源碼燒錄在同一張實體光碟上,然後在散佈目的碼的同時提供這張光碟。因為將程式源碼「燒在光碟中」來提供,是這種方式的典型代表,因此這種方式簡稱之為「燒出去」。
舉例來說:公司甲在開發多媒體機上盒 A 的時候,有利用到 GPL 元件作為其中韌體的一部份,在販賣產品 A 的時候,就可以將 A 中所有 GPL 元件的程式源碼都燒在光碟上,讓購買產品 A 的使用者,在獲得機上盒的同時,也就一併取得了 GPL 元件的程式源碼。
不過,在現在這個資訊硬體技術發達的年代,光碟並不是唯一的儲存媒介,因此隨身碟、記憶卡等也是可以作為提供程式源碼的儲存媒介與載體。
此外,要特別提醒的是,這裡所謂的儲存媒介必須是交換軟體「常用」的儲存媒介,例如若是散佈者將 GPL 元件的程式源碼印在紙張上提供給後手,這樣的方式並非一般習見的常態,因此這種提供方式很有可能會被認定為是違反 GPL 規定的。
除了隨目的碼提供之外,GPL 元件的散佈者,還可以在散佈目的碼的同時,附隨提供一份書面文件 (written offer),這份文件的主要內容,便是向取得程式目的碼的後手,說明可以透過什麼樣的方式來取得程式源碼。由於是將如何取得的方式「寫成文字」,因此這個方式稱之為「寫下來」。GPL 規定這份文件必須滿足以下兩個主要條件:
這邊所謂的「三年」是指,從後手拿到目的碼開始起算持續三年。不過這個三年期間在 GPL-3.0 的規定中,只是一個最低的義務期間,若是 GPL-3.0 元件的散佈者,持續針對該元件的相關產品來提供服務或者配件,此時,這個散佈者還是必須要維持書面文件內容的有效,直到此一產品不再提供這些服務或配件為止。
舉例來說,若是一間公司乙將 GPL-3.0 元件應用到產品 B 中,而在販賣 B 的同時附隨一份書面文件,向消費者說明可以寫信到 This e-mail address is being protected from spambots. You need JavaScript enabled to view it ,來索取 B 中所有 GPL-3.0 元件程式源碼的光碟一張,消費者丙於 2005 年 1 月,購買了產品 B,那麼乙對於丙這個消費者,便在 2008 年 1 月之前,都有提供該產品程式源碼的義務,然而若是丙在產品購買四年後的 2009 年 1 月,才寫信到 This e-mail address is being protected from spambots. You need JavaScript enabled to view it 索取 GPL-3.0 元件的程式源碼,此時乙還有沒有提供的義務,則端視該產品是否還在販售中,若該產品仍在販售,則雖已逾三年期間,則乙還是有持續提供的義務,反之,若該產品已不再販售,則乙便可以該產品已不再維護且文件約定效期已過三年的理由,而不再提供該 GPL-3.0 元件的程式源碼。
由以上的說明內容,可以瞭解到,「寫下來」這個方式比較是針對透過商業產品散佈 GPL 元件的狀況,因為在商業習慣上,隨著產品大多會有紙本說明文字,讓消費者可以瞭解產品特性、使用方法與保固範圍等等資訊,順著這樣的商業習慣,商業散佈者只需要在原有的產品說明中,加上消費者如何取得程式源碼的說明,就可以符合 GPL 提供程式源碼的義務性規定。
這個方式是承襲第二種而來,然而僅能運用在非商業性的散佈行為上!若是 GPL 元件的使用者在取得 GPL 元件目的碼的同時,也獲得了一份向後手說明如何取得 GPL 元件源碼的書面文件,此後該使用者要將這個 GPL 元件再散佈給其他人的時候,只要後續的散佈行為不是商業目的也沒有價金的交換,那麼散佈者原則上只需要將這份書面文件交付給後手即可,讓後手可以遵照此份書面文件內容的指示,來自行取得程式源碼。而由於此時散佈者只需要將書面文件內容傳遞給後手就可以,所以這個方式稱之為「傳出去」。
這樣的方式主要是針對一般的商品消費者所做的規定,因為一般消費者有可能購買到包含有 GPL 元件的產品,但是產品公司有時並不會一併提供產品中的程式源碼,所以不是所有的消費者都會同時持有該 GPL 產品的程式目的碼與程式源碼,不過這樣的一般消費者卻非常有可能會將產品與其中包含的程式碼再轉讓給其他人,為了配合這樣的社會常態,所以 GPL 規定當使用者是在非商業利用的前提下,來進行 GPL 程式目的碼的散佈行為,便只需要轉交後手其本來持有的書面文件即可。
第四種方式是指,若散佈者將程式目的碼儲放在一個特定的位置 (a designated place),那麼也應該在相同的位置上儲放相對應的程式源碼,並讓後手可以進入這個特定位置來下載原始碼。這種方式的典型,就是將程式目的碼與程式源碼均儲放在網站同一網址的頁面上,然後供後手自行下載。而因為這個方法是將程式源碼儲放在特定位置,因此稱之為「放下來」。
不過採用這種方式的散佈者,並不需要勒令後手在下載目的碼的同時,也非得一併下載程式源碼,散佈者原則上僅需要提供一個選項,讓後手在下載目的碼的時候,瞭解到如果他需要的話,亦可以一併下載相對應的程式源碼。然而,需要特別注意的是, GPL-3.0 規定若採用這種網際網路的散佈方式,散佈者是不能再收取散佈工本費用的。
此外,考量到許多網站內容可能過於龐雜,為了避免後手進入網站後有如進入五里霧中,不容易找到正確的程式源碼下載連結,因此 GPL-3.0 還進一步要求,此種方式的散佈者必須在目的碼旁邊加上簡要說明,讓下載者可以依循說明便捷地下載到對應的程式源碼。而若是一個網頁上散佈了多個 GPL-3.0 元件的話,則建議可以製作表格來進行呈現,將目的碼與說明分別清楚地列在表上,如此將可避免後手下載到錯誤的程式源碼。
由於現在點對點 (peer-to-peer, p2p) 的傳輸方式很普遍,各種製作種子 (torrent) 的軟體也相當普及,因此 GPL-3.0 特別補充說明,若是透過點對點的方式散佈目的碼的話,亦可採將程式源碼傳輸資訊一併寫入 torrent 的方式為之,讓使用者透過 p2p 下載該 GPL 授權元件時,可以自行透過圖形介面勾選的方式,決定是要單獨進行程式目的碼的下載,亦或是一併勾選程式源碼,讓目的碼與源碼一起透過 p2p 的互流機制下載到自己的儲存裝置裡。而由於利用點對點散佈方式,必須要將程式元件的 torrent 先「丟」出去,放置到網路論壇或其他平台上讓他人取得,所以這個方式稱為「丟出去」。
這個方式跟上述第四個方式,都是拜近年網路科技發達所賜,而成為提供程式源碼的可行散佈方式,因此 GPL-3.0 也規定散佈者透過此一方式提供程式源碼的話,不可以收取任何額外的費用。
以上這五個方式,原則上散佈者只需要選擇其中一項來實行就可以了,但若是同時採用二種以上的方式來併行散佈,當然更是沒有問題,例如:承接上面產品 B 的例子,公司乙除了透過書面文件提供程式源碼光碟之外,還可以同時提供下載程式源碼的 torrent,以及將程式源碼放到網站頁面上,供後手與他人自由下載。因此,GPL 元件的散佈者可衡量自身的狀況,從以上所介紹的方式中,選出最適合的方法來提供 GPL 授權元件的程式源碼,以在享受 GPL 程式自由修改便利性的同時,也能夠善盡提供程式源碼的重要義務,將上述的必須資訊回饋給 GPL 專案開發社群,以維持使用者與開發者良性互動的循環。
註一:GPL-2.0 的相關規定在第 3 條,GPL-3.0 的相關規定則是在第 6 條。
註二:GPL-2.0 的內容完成於 1991 年,在經過十多年的應用,這中間產生不少問題,為瞭解決這些問題,自由軟體基金會於是啟動了改版程序,於 2007 年中正式公佈新一版的 GPL-3.0 內容。因此整體來說,GPL-3.0 是 GPL-2.0 的補充與再細緻化版本,許多 GPL-2.0 漏未規定或用語不清之處,在 GPL-3.0 裡面均有強化與較為清楚的規定,也因為這樣的歷史脈絡,所以在規定散佈者提供程式源碼的部份,兩個版本基本的內容是一樣的,雖有若干不同之處,但大多是 GPL-3.0 補充或更為清楚說明前一個版本不足的內容。因此本文便以 GPL-2.0 為基礎、GPL-3.0 為輔,來說明 GPL 授權條款整體關於提供程式源碼這一項義務的內容。