2012年7月31日火曜日

Qtのライセンス

さて、すっかりご無沙汰しておりました隠者でございます。
ネタにしたい話題は多いものの、忙しさに負けてすっかり放置でした。

そんなところに、Qt良いよって熱心に勧誘してみた友人が、Qtのお勉強を始めてみてくれたようです。そんな中で、友人もまた職業プログラマですから、気になるのはライセンスのようでして、どのようになってるのかなぁとの質問を受けました。

ま、そんなわけで、少しばかりライセンスを中心にQtネタを書いて見ます。ただ、僕は著作権法にはあまり詳しくないので、一般論レベルでしかかけませんので、ご容赦ください。

Qtとは

Qtとは、Haavard Nord と Eirik Chambe-Engの二人が1991年頃から開発をはじめた、C++ベースのGUIフレームワークです。元々はTrolltech社(旧Quasar Technologies社)として開発・サポートを続けておりましたが、2008年にNokia社にTrolltech社が買収され、現在、Nokia社にCopyrightが移っています。

Nokia社は、Qtをベースにした携帯電話向けフレームワークの作成を行っておりましたが、現在はWindowsベースのOSにビジネスをシフト、昨年からQt自体の開発はオープンなコミュニティに、商用的なサポートはDigia社へと移管されました。

クロスプラットフォームが大きな売りの一つで、同じコードで、Windows、Linux、Macをはじめ、現在では、VxWorksや、Androidといった組込みOSでも、同じコードからアプリを生成できます(もちろん、機種依存のコードを入れないように注意が必要なのですが)

現在でもコミュニティにより熱心な開発が続けられており、GUIフレームワークの枠を超え、アプリケーション開発プラットフォームに近いものになってきています(専用のIDE,エディタ、モバイル端末向けシミュレータ、独自実装の開発言語とスクリプトエンジン等も含まれています)。

ライセンス

Qtのライセンスはバージョンを経る毎に変遷してきましたが、現在のライセンスは、大きくわけでオープンソースのGPL、LGPL.と、商用ライセンスの3種類からなります。

コミュニティによる開発にシフトはしましたが、Qt自体の開発に貢献する場合は、Nokia社との間にLeagl Acceptを締結することになります。このため、提供されたコードは、商用ライセンス版にも反映されることになります。

GPLv3

GPL自体は著名なライセンスなので、改めて語るまでもないかもしれません。
The GNU General Public License で、GPLとリンクするアプリケーション、ライブラリのすべては、GPLもしくはGPLと同等のライセンスにしなくてはならないと定められています。
つまり、Qtへの改変はもちろん、リンクしたプログラムのソースコードも配布する義務が生じますので、仕事で使う場合にはかなり慎重に検討する必要が生じてしまいます。

LGPL 2.1+ Nokia Qt LGPL Exception version 1.0

もともとオープンソース版ライセンスとしてはGPLが使われてきたのですが、Nokia社により買収された後、より多くの開発者を取り込むためか、GPLよりも緩い、The GNU Lesser General Public Licenseが適用されました。

GPLの場合、Qtを使ったアプリケーションもまたGPLにする必要がありましたが、LGPLの下では、LGPLと緩い結合ーダイナミックリンクするプログラムに関してはLGPLを適用する必要はないとされています。つまり、ダイナミックリンクしている自分のアプリケーションについては、ソースコードの公開義務はありません。
ただし、QtのライブラリはLGPLですので、ライブラリ自体に変更を加えた場合はソースコードの開示義務が生じますし、改変を加えていなくても、ソースコードの提供を求められた場合、何らかの方法で提供する義務が生じます。

なお、Qtはライブラリであるため、ユーザーのアプリケーションには一部ヘッダファイルに定義されているコードをincludeしなくてはなりませんが、例外規定が用意されていて、ヘッダファイルのincludeによりLGPLの適用は必要ないとされているため、インクルードによりLGPLにしなくてはならないといった事態は避けることが可能です。

ただし、LGPLの場合は、以下を担保しなくてはなりません。
  • LGPLの部分は、利用者が置き換えられなくてはならない(スタティックリンク禁止)
  • 利用者が置き換えるために、リバースエンジニアリングを許可しなくてはならない
つまり、スタティックリンクや、リバースエンジニアリング禁止条項は入れられないことになります。そのほかに、著作権表示の必要性や、もろもろありますので、詳しくはLGPLのライセンスファイルを参照してください。

Qt Commercial License

上記2つが無償で利用できるオープンソースのライセンスだったのに対し、商用ライセンスは、ライセンス費用を支払う代わりに、すべてのソースコードを非公開で改変可能、リバースエンジニアリングも禁止することができるライセンスです。
日本では、SRA社さんと、ISB社さんが代理店を行っており、グローバルではDigiaがサポートする企業となっています。

ただし、これも条件が一つあって、商用ライセンスユーザーは、商用ライセンスとオープンソースライセンスの選択的な利用が可能ですが、ソースコードを共用するプロジェクトで、商用ライセンス開発者とオープンソース開発者の混在は不可能なようです。

つまり隠蔽したい部分のライブラリだけ商用ライセンス保持のAさんが作って、全体的な部分は、B,C,DさんがLGPLで作るという使い方はできないようです。

まぁ、独立したプログラムはライセンスの影響を及ぼさないとされていますので、CUIで作った商用ライセンスエンジンにオープンソース版で作ったGUIラッパーをかぶせるなんてほは、可能だとは思いますけど。

なお、SRA社さんに確認した限りにおいて、保守契約がある間に取得したQtの最終版と、保守契約期間中に行った改変に関しては、保守契約満了後も商用ライセンスの保護下にあり、満了時点までのQtで開発を行う限りは、保守の更新は必要ないとのことです。

*ただ、Qtのライブラリを変更できなくなるようなので、脆弱性が見つかるとアウトですね

また、開発を一切行わない、商用版とのリンクを行うビルドだけの作業においては、商用ライセンスを必要としないそうで、開発者のライセンスファイルを使って、第三者が変わりにビルドすることは可能との事でした。たとえば、ビルドサーバーとそのメンテナの分までライセンスを購入する必要はないようでした。

なお、ここまでは、Qt自体のライセンスでしたが、実はQtがさらに呼び出すライブラリなども存在しており、それらには、それぞれに別のライセンスと著作権が存在しています。

リンクするQtモジュールによっては、それらも確認し、著作権表示等が必要になるケースがありますので、注意が必要です。

詳しくは、Qtのライセンスに関するドキュメントを参照することをお勧めします。


えー、めんどくさいって声が聞こえそうでなりませんが、まぁ、Qtやその利用するライブラリ郡の機能を全部自分で実装することを思えば、ずいぶん安上がりな対策だと思いますよ。

2012/12/27追記 Qtの商用ライセンスには、携帯電話、タブレットの開発に重大な制限がありますのでご注意ください。詳しくはこちら

3 件のコメント:

  1. 「より多くの開発者を取り込むためか」無料で使えるようにして、開発者を取り込みたかったというのが一番の目的でしょう。MeeGo がベンダーでサポートされないようでは、広まらないと MeeGo が出た当時に、Nokia Japanの営業に言いましたが、その通りになりました。その結果、Qt を放り出すことになってしまって、開発者の取り込みすらできなかった。

    LGPL でスタティックリンクの場合には、Qt以外の独自部分のオブジェクト (.oや.obj) かソースコードを配布すればよいです。

    返信削除
    返信
    1. picky様

      コメントありがとうございます。NokiaといってもQtメインの方々は、後から買収されて入った人たちですし、今回の売却の件は、辛い結果だろうなと思います。

      もっとも、商用ユーザーとしては、Digia社に移管されてからオープンソース版よりも安定したバイナリを出してくれるので、Nokiaじゃなくなってからも結構満足いってますけど。

      ところで、LGPLの件、ライセンスの文面やFAQに一通り目を通した限り、スタティックリンクするとLGPLが独自オブジェクトにも波及すると読めます。当然、オブジェクトだけの配布は不可で、求められたらソースコードを出す必要があると読み取ったのですが、誤りだったでしょうか?

      削除
  2. Qtメインの方々はTrolltechからで買収前からの人が多いのではないでしょうか。辛い結果でしょう。経営者の失策です。Nokiaに買収されたのが間違いだったのです。自社製品に利用するのが主目的なのは明白だったのですから。

    同じく開発で使っていたときからの商用ユーザです。Digiaの方がNokiaよりもよくなっていて、サポートの質もよくなりました。

    スタティックリンクでは、独自部分はソースコードかオブジェクトのどちらかであればよいです。要点は、LGPL部分をユーザがバグ修正などをして、動的あるいは静的に再リンクをして差し替えられることが必要なのです。

    返信削除