2018年9月9日日曜日

7: このサイトのサンプルプロジェクトをビルドする

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

このサイトからサンプルプロジェクトを入手しましたか?そのプロジェクトをビルドする方法がここにあります。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: Java programming language
About: C++
About: .NET Framework
About: Python programming language
About: LibreOffice Basic
About: Apache OpenOffice Basic
About: BeanShell
About: JavaScript

この記事の目次


開始コンテキスト


  • 読者は、UNOプログラムをLinuxまたはWindowsで開発する環境を過去の記事(Linux用はこちらで Windows用はこちら)にしたがって構築した。
  • 読者は、自身のオペレーティングシステムにおける基本的操作(テキストエディタを使う、ターミナルを使う)についての知識を持っている。

ターゲットコンテキスト



  • 読者は、このサイトに挙げられている任意のサンプルプロジェクトをビルドする方法を知る。
ト書き
Hypothesizer 7、Objector 1C、Objector 7A、Objector 7Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
この記事では、このサイトから入手したサンプルプロジェクトをビルドする方法を学びます。

Objector 1C
「このサイトから入手したサンプルプロジェクト」だと?どのサンプルプロジェクトだ?サンプルプロジェクトなど全然入手していないぞ...

Hypothesizer 7
サー、実際には、サンプルプロジェクトは、将来の記事で紹介されます。

Objector 1C
はあ?存在してもいないサンプルをビルドする方法を聞いてもどうすりゃいいか分からん...

Hypothesizer 7
なるほど。そうお感じでしたら、なにかサンプルをご入手後にこの記事にお戻りください。この記事を先に掲載するのは、共通の定型操作の 説明を先に済ませ、その後は、各種サンプルの内容に集中したいからです。

Objector 1C
とにかく、お前の指示にしたがって環境を作ったんだから、コマンドを1つ実行すればサンプルをビルドできるんだろう?

Hypothesizer 7
あるGradleビルドスクリプトで、1つのプロパティ値をご調整いただく必要があるかもしれません。それは、LibreOfficeまたはApache OpenOfficeのインストールベースディレクトリであって、他のいくつかのプロパティ値をご調整いただく必要もあるかもしれません。

Objector 1C
なぜそんなことをしなければならん?

Hypothesizer 7
サンプルプロジェクトをビルドするには、ツール、Jarファイル、C++のヘッダーファイルやライブラリ、.NET Frameworkのライブラリが必要であって、そうしたファイル群の位置をプロパティ値群で指定します。

Objector 1C
すると、お前のビルドシステムは、そうした位置を自動検知できないほど頭が悪いわけだ...

Hypothesizer 7
一般的に言って、それらを自動的に決定することはできません。複数の候補があるかもしれませんから。しかし、はい、候補を探しもしないという程度において頭が悪いビルドシステムではあります。実際のところ、その知能を実装することがその労力に値するとは 私は考えませんでした。

Objector 1C
なぜそう考えなかったのだ?

Hypothesizer 7
プロパティ値はプロジェクト群に共通の1つのGradleビルドスクリプトでセットされます(それらは1度セットすればよいだけです、基本的には)し、セットするのはプログラマーであって、彼らにとって、そのように1個または数個のプロパティ値をセットするのは、大騒ぎするほどの手間でもないでしょう。

Objector 1C
...

Objector 7B
私は、Java、C++、.NET frameworkのどのコードもコンパイルしないから、Jarファイルとか必要ないし、何もセットしなくていいんでしょ?

Hypothesizer 7
マダム、すると、あなたがビルドしようとするのは...

Objector 7B
Basicのコードだけを含むUNO拡張機能です。

Hypothesizer 7
なるほど。そういうサンプルプロジェクトも紹介される予定です。しかし、UNO拡張機能をLibreOfficeまたはApache OpenOfficeに登録するツールの位置を指定する必要はあるでしょう。

Objector 7B
別に、あなたのビルドシステムに私のUNO拡張機能を登録してほしいとは思ってないのよね。LibreOfficeのメニュー項目で登録できるんだから。

Hypothesizer 7
なるほど。それでは、どのプロパティ値もセットする必要はありません(以下に記載されているとおり、1つのファイル名を変更する必要はあります)。しかし、プロジェクトをビルドする際に、あるGradleタスクを指定(方法は本体で知ることができます)したいかもしれません。

Objector 7B
...

Objector 7A
あんたの過去の記事で指定されてる環境を使わなくてもいいんだろう?

Hypothesizer 7
あの、前2記事で私が紹介した環境(Linux用はこちらで Windows用はこちら)は、Gradleを使用するという点を除き、特に特別なものではありません(必要なソフトウェアを入れ、必要な設定をしただけです)。実際、あれらの環境と比べて、あなたの環境はどう違えるのでしょうか?

Objector 7A
答えられないな、あんたの記事なんか読んでないんだから。

Hypothesizer 7
勿論です...。えー、必要なものをインストールして、必要な設定をしたのであれば、多分、あなたの環境は、Gradleを除いて問題ないでしょう。

Objector 7A
Gradleについては?

Hypothesizer 7
サンプルプロジェクトにはGradleプロジェクトのファイル群が付属されるので、Gradleをインストール・設定してあれば、サンプルプロジェクトをそのままビルドすることができるでしょう。もしそうでなければ、サンプルプロジェクトの扱いをあなたにお任せするしかありません。

Objector 7A
...


本体


1: ZIPファイルをダウンロードし、展開する


Hypothesizer 7
記事がサンプルプログラムを提供する場合、サンプルプログラムは、ZIPファイルとして提供され、記事のページからダウンロードできます。

Objector 1C
どこへ?

Hypothesizer 7
どこでもダウンロードされたいところへ。後で展開して削除できるアーカイブファイルなので、ZIPファイルの位置は重要ではありません。展開する場所が重要です。

Objector 1C
どこへ展開すればいいんだ?

Hypothesizer 7
ディレクトリ名にスペースを使う習慣が私にはないので、...

Objector 1C
お前の習慣なんかに興味など全然ない!

Hypothesizer 7
ビルドシステムは基本的に、スペースを含まないディレクトリパスに対してのみテストされており、ZIPファイルをそういうディレクトリに展開されればトラブルを省けるでしょうと言いたかったのです。

Objector 1C
テストしろよ!

Hypothesizer 7
一度したのですが、それ以後Gradleビルドスクリプトを大きく変更したので、今はどうか分かりません。

Objector 1C
それじゃ、もう一度テストしろ!

Hypothesizer 7
これからもGradleビルドスクリプトを変更するつもりなので、スペースが含まれる、可能なディレクトリパスに対して毎度テストするのは大変なのですと言いたかったのです。特に、ディレクトリ名にスペースを使う必要を私は全然感じないものですから。そういう名前は扱いが面倒なだけで...

Objector 1C
...Windowsではいくつかの標準的なディレクトリの名前にスペースが含まれているから、...

Hypothesizer 7
知っています。しかし、Cドライブを使い果したくないので、そうしたディレクトリを私は可能な限り避けています。

Objector 1C
お前のそんな趣味に興味はないんだよ...

Hypothesizer 7
分かります。しかし、現時点では、スペースが含まれるディレクトリパスに対して私たちのビルドシステムがテストされていないことを 謙虚に認めるしかありません。ビルドシステムがもっと安定してからテストしますが。

Objector 1C
...

Hypothesizer 7
このサイトの全てのサンプルZIPファイルは、同一のディレクトリへ展開されるように意図されており、このディレクトリを「開発ディレクトリ」とよびましょう。プロジェクト群に共通な一群のGradleビルドスクリプトがあり、そのようにすれば、設定をただの一度で済ませることができます。しかし、...

Objector 1C
「しかし」?

Hypothesizer 7
そうした共通Gradleビルドスクリプトは頻繁に変更される(しばしば、以前のバージョンと非互換に)ので、それらのファイルを上書きすると、古いプロジェクトがビルドできなくなってしまいます。

Objector 1C
それは問題だろう?

Hypothesizer 7
その場合、ビルドできなくなったプロジェクトの新バージョンをこのサイトからダウンロードすることもできますし、サンプルプログラム毎に開発ディレクトリを作ることもできます(その場合、勿論、開発ディレクトリ毎に設定を行なうことが必要になります)。

Objector 1C
そういう場合にはZIPファイルを更新するということか?

Hypothesizer 7
そのように意図しています。

Objector 1C
なぜ、互換性があるように変更しないのか?

Hypothesizer 7
ビルドシステムを根本的に変更するのが望ましいと感じることがしばしばあるからです。

Objector 1C
...

Hypothesizer 7
共通プロジェクト群についても同じことが言えます。

Objector 1C
「共通プロジェクト群」とは何だ?

Hypothesizer 7
いくつかのサンプルプロジェクトで共通に使用されるそうしたプロジェクトをいくつか導入します。

Objector 1C
複数のサンプルが一部のコードを共通に含むから、そうしたコードをそういう共通プロジェクト群に入れるということか?

Hypothesizer 7
はい、そうです。

Objector 1C
それで、そういう共通プロジェクト群が非互換に変更されるかもしれないと?

Hypothesizer 7
はい、そうです。

Objector 1C
ふーむ...

Hypothesizer 7
それに応じて全てのサンプルプロジェクトを更新するつもりですが、それらを再ダウンロードしていただく必要があります。


2: 開発ディレクトリの構造を理解する


Hypothesizer 7
開発ディレクトリには、いくつかの、プロジェクトに共通なGradleスクリプトがあります。

また、'commonVolatileProperties.gradle_Template'もありますが、これは、環境毎に変更される傾向のある設定群の設定ファイルのテンプレートです。

Objector 7A
「Volatile(揮発性)」?

Hypothesizer 7
何を揮発性(変わりやすい)とみなすかは実際には趣味の問題ですが、私は自分の趣味にしたがっていくつかの設定をこのファイルに分離しました。それは、既存の開発ディレクトリへZIPファイルが展開される際に、そうした変わりやすい設定が上書きされないようにするためです。

Objector 7A
ははあ。

Hypothesizer 7
あなたは、そのファイル名、'commonVolatileProperties.gradle_Template'を 'commonVolatileProperties.gradle'に変更し、設定をそのファイルに書かなければなりません。

実際には、以下が、セットされるよう想定されているプロパティ群です。

パラメータ名
c_javaCompilerJavaコンパイラ('c_jdkCompiler')またはnull(使用しないならば、nullをセットしなければならない、さもなければ、プロジェクトがJavaソースファイルを含んでいる際に、ビルドが失敗する可能性がある)
c_cplusplusCompilerC++コンパイラ('c_gccCompiler'または'c_visualStudioCplusplusCompiler')またはnull(使用しないならば、nullをセットしなければならない、さもなければ、プロジェクトがC++ソースファイルを含んでいる際に、ビルドが失敗する可能性がある)
c_csharpCompilerC#コンパイラ('c_dotnetCsharpCompiler')またはnull(使用しないならば、nullをセットしなければならない、さもなければ、プロジェクトがC#ソースファイルを含んでいる際に、ビルドが失敗する可能性がある)
c_additionalLibrariesDirectoryPath付加的ライブラリ群のディレクトリ(一部のプロジェクトがそうしたライブラリ群を必要とするとき)
c_javaFxDirectoryPathOpenJFXのディレクトリまたはnull(使用しないならば、nullをセットしなければならない、さもなければ、プロジェクトがJavaソースファイルを含んでいる際に、ビルドが失敗する可能性がある)
c_officeDirectoryPathLibreOfficeまたはApache OpenOfficeのベースディレクトリ
c_officeAdditionalHeaderFilesBaseDirectoryPathLibreOfficeまたはApache OpenOfficeの付加的ヘッダーファイル群のベースディレクトリ(C++コードを開発するならば)
c_visualStudioDirectoryPathVisual Studioのベースディレクトリ
c_visualStudioVersionVisual Studioのバージョン(Visual Studioのベースディレクトリの下のあるサブディレクトリの名前)
c_windowsSdkDirectoryPathWindows SDKのベースディレクトリ
c_windowsSdkVersionWindows SDKのバージョン(Windows SDKのベースディレクトリの下のあるサブディレクトリの名前)
c_wxWidgetsDirectoryPathwxWidgetsのベースディレクトリ
c_wxWidgetsLibrariesSubDirectoryNamewxWidgetsのベースディレクトリの下のライブラリ群サブディレクトリの名前

ファイル内で使われているプロパティ群は以下の値を保持しています。

プロパティ名
c_operatingSystemNamePropertyNameオペレーティングシステム名Javaプロパティの名前
c_operatingSystemNameLinux"Linux"
c_projectDirectoryPathプロジェクトディレクトリのパス
c_operatingSystemDirectoriesSeparatorオペレーティングシステムのディレクトリ区切り文字('/'または'\')
c_parentDirectoryName親ディレクトリ特殊名('..')

勿論、リテラルを使用することもできます。

Objector 7A
変わりやすいかどうかの判断はあんたの趣味にしたがったとあんたは言ったな。

Hypothesizer 7
はい。LibreOffice SDKまたはApache OpenOffice SDKを、LibreOfficeまたはApache OpenOfficeのベースディレクトリでないディレクトリにインストールされたなら、あなたは、'commonProperties.gradle'の'c_officeSdkDirectoryPath'を変更しなければならないでしょう。

Objector 7A
それで全てか?

Hypothesizer 7
多分、サンプルプロジェクトをビルドするためには。あなた自身のプロジェクト用に他に変更したいことがあるのであれば、'commonProperties.gradle'に、変更できるパラメータがいくつかあります。例えば、ソースファイル、中間ファイル、ターゲットファイルの位置などですが、それらについては、将来の記事で話しましょう。

Objector 7A
いいだろう。

Hypothesizer 7
開発ディレクトリにある'build.gradle'は、開発ディレクトリにある全てのプロジェクトをビルドするGradleビルドスクリプトです。

開発ディレクトリ直下にあるディレクトリ群(名前が'.'で始まるディレクトリを除く)は、プロジェクトディレクトリ群であり、各ディレクトリにはGradleプロジェクトファイルである'build.gradle'があります。

ソースファイル群は、'source'ディレクトリ配下にあり、プログラミング言語別のディレクトリ('unoIdl'、'java'、'cplusplus'など)および'resource'ディレクトリに分けて置かれています。

Objector 7A
「'resource'ディレクトリ」?

Hypothesizer 7
それには、Jarマニフェストファイル、UNO拡張機能マニフェストファイルと関連設定ファイル、等が置かれます。

Objector 7A
ははあ。

Hypothesizer 7
初めは存在しませんが、'intermediate' および 'target'というディレクトリがビルドプロセスによって作られます。'target'ディレクトリには、ターゲットファイル(例えば、UNO拡張機能ファイル(そのプロジェクトがUNO拡張機能である場合))が置かれます。'intermediate'ディレクトリには、中間ファイル群(例えば、クラスファイル(そのプロジェクトがJavaコードを含む場合))が置かれます。


3: 1プロジェクトまたは全プロジェクトをビルドする


Hypothesizer 7
あるプロジェクトをビルドしたい時は、ターミナルを開き、カレントディレクトリをプロジェクトディレクトリに移動し、以下のコマンドを実行します('Gradleが容赦なくシンボリックリンクを展開する'問題に直面していなければ)。

@bash ソースコード
gradle

Objector 7A
その長ったらしい名前の問題に直面していたらどうなんだ?

Hypothesizer 7
開発ディレクトリにある'Gradle.sh'が使えます。

Objector 7A
ああ。

Hypothesizer 7
そのプロジェクトがUNO拡張機能プロジェクトであれば、ビルドプロセスは、全てのLibreOfficeプロセスおよびApache OpenOffice プロセスをシャットダウンし、UNO拡張機能を登録し、LibreOfficeまたはApache OpenOfficeのプロセスを1つ起動しようとします。

Objector 7B
'オリエンテーション'で言ったように、それは余計なお世話です。

Hypothesizer 7
分かりました。その場合、以下のコマンドを実行すればよいのです。

@bash ソースコード
gradle i_makeUnoExtensionTask

Objector 7B
そんな長いコマンドを毎度実行するのは面倒なんだけど...

Hypothesizer 7
もしくは、プロジェクトの'build.gradle'でデフォルトタスクを'c_makeUnoExtensionTaskName'(シングルクウォーテーションは書かない)に変更し、それ以後、ただの'gradle'コマンドを実行することができます。

Objector 7B
ふーん...

Hypothesizer 7
プロジェクトがビルドされる際、そのプロジェクトに参照されているプロジェクト群が自動的にビルドされます。

また、開発ディレクトリにあるプロジェクト全てをビルドすることもできます。その際は、カレントディレクトリを開発ディレクトリへ移動し、'gradle'コマンドを実行します。


4: 結びとその先


Hypothesizer 7
これで、このサイトのサンプルプロジェクトをどれでもビルドできます。

Gradleビルドスクリプトのコードには深く立ち入りませんでしたが、将来の記事でそうします。

このビルドシステムでビルドできる様々なサンプルプロジェクトを、将来の記事で見ていきます。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>