「ビルド (ソフトウェア)」の版間の差分
m編集の要約なし |
|||
6行目: | 6行目: | ||
単純なプログラムでは、単一のソースファイルをコンパイルするだけで済むが、複雑なソフトウェアでは通例メンテナンス性向上の観点からソースコードはモジュールごとに分類・分割された多数のファイルによって構成されており、各ファイルを個別にコンパイル(分割コンパイル)した後で、リンク時に実体の依存関係を解決する。 |
単純なプログラムでは、単一のソースファイルをコンパイルするだけで済むが、複雑なソフトウェアでは通例メンテナンス性向上の観点からソースコードはモジュールごとに分類・分割された多数のファイルによって構成されており、各ファイルを個別にコンパイル(分割コンパイル)した後で、リンク時に実体の依存関係を解決する。 |
||
[[プログラム (コンピュータ)|コンピュータプログラム]]のビルドは、一般に'''ビルドツール'''と呼ばれるプログラムを使い、他のプログラムを制御・統合して行う。ビルドツールの例としては、[[make]]、[[Apache Ant|ant]]、[[Apache Maven|maven]]、[[SCons]]、[[MSBuild]]、[[Gradle]]などがある。[[統合開発環境]]には通例何らかのビルドツールが内蔵されており、直感的かつシームレスにプログラミングとビルド作業のサイクルを行なえるようになっている。ビルドユーティリティは、各種ファイル群を正しい順序で[[コンパイラ|コンパイル]]し[[リンケージエディタ|リンク]]する必要がある。また、開発時には何度もビルドを繰り返すが、前回のビルドから何も変更されていないファイルは[[コンパイラ|コンパイル]]する必要がない(ただし、[[ヘッダファイル]]などの依存関係も考慮する必要がある)。洗練されたビルドユーティリティは無駄な再コンパイルをしないようにして、ビルドに要する時間を短縮している。[[Apache Subversion|Subversion]]などの[[バージョン管理システム]]はビルドユーティリティの機能を内蔵している。さらに複雑なプロセスになると、ビルド中に他のプログラムを使ってコードやデータを生成することもある。 |
[[プログラム (コンピュータ)|コンピュータプログラム]]のビルドは、一般に'''ビルドツール'''と呼ばれるプログラムを使い、他のプログラムを制御・統合して行う。ビルドツールの例としては、[[make (UNIX)|make]]、[[Apache Ant|ant]]、[[Apache Maven|maven]]、[[SCons]]、[[MSBuild]]、[[Gradle]]などがある。[[統合開発環境]]には通例何らかのビルドツールが内蔵されており、直感的かつシームレスにプログラミングとビルド作業のサイクルを行なえるようになっている。ビルドユーティリティは、各種ファイル群を正しい順序で[[コンパイラ|コンパイル]]し[[リンケージエディタ|リンク]]する必要がある。また、開発時には何度もビルドを繰り返すが、前回のビルドから何も変更されていないファイルは[[コンパイラ|コンパイル]]する必要がない(ただし、[[ヘッダファイル]]などの依存関係も考慮する必要がある)。洗練されたビルドユーティリティは無駄な再コンパイルをしないようにして、ビルドに要する時間を短縮している。[[Apache Subversion|Subversion]]などの[[バージョン管理システム]]はビルドユーティリティの機能を内蔵している。さらに複雑なプロセスになると、ビルド中に他のプログラムを使ってコードやデータを生成することもある。 |
||
== ビルドの自動化 == |
== ビルドの自動化 == |
||
30行目: | 30行目: | ||
== 歴史 == |
== 歴史 == |
||
一般に、プログラムはソースファイルをコンパイルしリンクすることで、実行ファイルとなる。ソースファイルが1つしかないなら、それらの作業をコマンドラインから実行するのも簡単だが、ソースファイルが多数存在するプロジェクトでは、正しい順序とオプションで手作業するのは至難の業である。この問題を解決する手段として[[make]]のようなスクリプト言語が登場した。それにより、コンパイルやリンクを正しい順序で行うスクリプトを書くことができる。GNU Make<ref>[http://www.gnu.org/software/make/ GNU Make]</ref>では更にソースコードの依存関係を管理でき、変更された部分だけをコンパイルするインクリメンタルビルドが可能になった。これがビルドの自動化の始まりである。その第一の目的はコンパイラやリンカの呼び出しを自動化することだった。ビルドプロセスが複雑化するに従い、コンパイラ呼び出しの前後に様々な作業(バージョン管理システムからのチェックアウトや生成した実行ファイルのテスト環境への投入など)を追加するようになった。 |
一般に、プログラムはソースファイルをコンパイルしリンクすることで、実行ファイルとなる。ソースファイルが1つしかないなら、それらの作業をコマンドラインから実行するのも簡単だが、ソースファイルが多数存在するプロジェクトでは、正しい順序とオプションで手作業するのは至難の業である。この問題を解決する手段として[[make (UNIX)|make]]のようなスクリプト言語が登場した。それにより、コンパイルやリンクを正しい順序で行うスクリプトを書くことができる。GNU Make<ref>[http://www.gnu.org/software/make/ GNU Make]</ref>では更にソースコードの依存関係を管理でき、変更された部分だけをコンパイルするインクリメンタルビルドが可能になった。これがビルドの自動化の始まりである。その第一の目的はコンパイラやリンカの呼び出しを自動化することだった。ビルドプロセスが複雑化するに従い、コンパイラ呼び出しの前後に様々な作業(バージョン管理システムからのチェックアウトや生成した実行ファイルのテスト環境への投入など)を追加するようになった。 |
||
さらに、ビルドツールは進化し、スクリプト(Makefile)自体を生成するものが登場した。これらツールは、頻繁にビルドを行う[[継続的インテグレーション]]で特に便利である。 |
さらに、ビルドツールは進化し、スクリプト(Makefile)自体を生成するものが登場した。これらツールは、頻繁にビルドを行う[[継続的インテグレーション]]で特に便利である。 |
||
39行目: | 39行目: | ||
== Makefile生成 == |
== Makefile生成 == |
||
ビルド自動化の一形態として、[[ |
ビルド自動化の一形態として、[[Makefile]]の自動生成がある。例えば、次のようなツールがMakefileを自動生成する。 |
||
* [[Autotools|GNU Automake]] |
* [[Autotools|GNU Automake]] |
||
* [[CMake]] |
* [[CMake]] |
2020年11月24日 (火) 15:40時点における版
ソフトウェアのビルド(英: build)は、プログラミング言語で書かれたソースコードファイルや各種リソースファイルを独立したソフトウェア生成物に変換するコンピュータ上で実行されるプロセス、またはその結果を指す。ビルドの最終生成物はバイナリ形式の実行ファイルであったり、再利用可能なライブラリであったり、バイトコードあるいはそれらをまとめたアーカイブであったりすることもある[1]。
概要
ビルドにはいくつかのステップがあり、その内容はプログラミング言語やビルドツール、開発環境や実行環境(ターゲットアーキテクチャ、オペレーティングシステムあるいは仮想マシン)によっても異なる。例えばC言語あるいはC++の場合、ソースファイルをコンパイラによってオブジェクトコードに翻訳(コンパイル)した後、リンカによってオブジェクトコードを結合し、実行ファイルを生成する。プログラムから実行時に参照される各種アイコン画像やローカライズされた文字列などを実行ファイル内に「リソース」として含めることもあり、ビルドプロセスでリソースのコンパイルとリンクを実行する。
単純なプログラムでは、単一のソースファイルをコンパイルするだけで済むが、複雑なソフトウェアでは通例メンテナンス性向上の観点からソースコードはモジュールごとに分類・分割された多数のファイルによって構成されており、各ファイルを個別にコンパイル(分割コンパイル)した後で、リンク時に実体の依存関係を解決する。
コンピュータプログラムのビルドは、一般にビルドツールと呼ばれるプログラムを使い、他のプログラムを制御・統合して行う。ビルドツールの例としては、make、ant、maven、SCons、MSBuild、Gradleなどがある。統合開発環境には通例何らかのビルドツールが内蔵されており、直感的かつシームレスにプログラミングとビルド作業のサイクルを行なえるようになっている。ビルドユーティリティは、各種ファイル群を正しい順序でコンパイルしリンクする必要がある。また、開発時には何度もビルドを繰り返すが、前回のビルドから何も変更されていないファイルはコンパイルする必要がない(ただし、ヘッダファイルなどの依存関係も考慮する必要がある)。洗練されたビルドユーティリティは無駄な再コンパイルをしないようにして、ビルドに要する時間を短縮している。Subversionなどのバージョン管理システムはビルドユーティリティの機能を内蔵している。さらに複雑なプロセスになると、ビルド中に他のプログラムを使ってコードやデータを生成することもある。
ビルドの自動化
ビルドの自動化とは、以下のような開発作業をスクリプト化または自動化することを指す。
ビルドを自動化する利点は次の通り。
- 製品品質を向上させる。
- コンパイルとリンクの所要時間短縮
- 冗長なタスクの排除
- 手順ミスの排除
- 特定のエキスパートに依存しなくて済む。
- 履歴を保持することで、問題発生時に原因を究明しやすい。
- 時間と金を節約できる[2]。
ビルドツールはユーザーが手動で起動することもできるが、時間を決めて毎日実行する場合(夜間に行うことが多いのでナイトリービルド (Nightly Build) などと呼ぶ)、バージョン管理システムがソースファイルの変更がコミットされるたびに自動的に実行する場合などもある。
歴史
一般に、プログラムはソースファイルをコンパイルしリンクすることで、実行ファイルとなる。ソースファイルが1つしかないなら、それらの作業をコマンドラインから実行するのも簡単だが、ソースファイルが多数存在するプロジェクトでは、正しい順序とオプションで手作業するのは至難の業である。この問題を解決する手段としてmakeのようなスクリプト言語が登場した。それにより、コンパイルやリンクを正しい順序で行うスクリプトを書くことができる。GNU Make[3]では更にソースコードの依存関係を管理でき、変更された部分だけをコンパイルするインクリメンタルビルドが可能になった。これがビルドの自動化の始まりである。その第一の目的はコンパイラやリンカの呼び出しを自動化することだった。ビルドプロセスが複雑化するに従い、コンパイラ呼び出しの前後に様々な作業(バージョン管理システムからのチェックアウトや生成した実行ファイルのテスト環境への投入など)を追加するようになった。
さらに、ビルドツールは進化し、スクリプト(Makefile)自体を生成するものが登場した。これらツールは、頻繁にビルドを行う継続的インテグレーションで特に便利である。
高度なビルドツールは分散ビルドや分散処理が可能である。「分散ビルド」とは、実際のコンパイルやリンクをそれぞれ別々のマシン上で行い、ビルドを高速化する手法である。一方、分散処理とは例えば、テスト用スクリプトを複数のマシンに配置し、新たな実行ファイルのテストを分散環境で自動的に行うことなどを指す。分散ビルドを行うには、ソースコードの依存関係を自動的に把握することが必須である。一部のビルドツールは依存関係を自動的に発見でき(Rational ClearMake[4]、Electric Cloud ElectricAccelerator[5]など)、別のビルドツールではユーザーが定義した依存関係のみを扱う(Platform LSF lsmake[6]など)。ソースコードの依存関係を把握できるビルドツールは、コンパイルおよびリンクを並行モードで実行するよう設定できる。すなわち、コンパイラやリンカを複数コアのマシン上でマルチスレッドモードで実行することができる。全てのビルドツールが分散ビルドを実施できるわけではない。
分散ビルドの例として Xoreax の IncrediBuild[7]がある。
Makefile生成
ビルド自動化の一形態として、Makefileの自動生成がある。例えば、次のようなツールがMakefileを自動生成する。
脚注
- ^ 例えばJavaではJARを、AndroidではAPKをアーカイブ形式としている。
- ^ Pragmatic Project Automation Archived 2008年11月23日, at the Wayback Machine. Mike Clark、2004年
- ^ GNU Make
- ^ Dr. Dobb's Distributed Loadbuilds 2009年4月13日閲覧。
- ^ Dr. Dobb's Take My Build, Please
- ^ LSF User's Guide - Using lsmake 2009年4月13日閲覧。
- ^ 高速分散コンパイル環境ソリューション 2009年6月16日閲覧。
参考文献
- Mike Clark: Pragmatic Project Automation, The Pragmatic Programmers ISBN 0-9745140-3-9