こちらの記事の 1-1 です。
makeとは
make(メイク)は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイル(メイクファイルと呼ばれます)に従って、これらの作業を自動的に行います。
非常に古くからある自動ビルドツールの元祖のような存在です。make が誕生して以降、C言語用にカスタマイズされた CMake や、Ruby の rake、Python では setup.py などが作成されました。
記事では make についての基礎を学び、Ant や Maven、Gradle といった自動ビルドツールに自然に入門するための基礎を身に着けます。
(Windowsで開発作業を行っていきます。インストーラの種類とかは自分の環境に合わせてください。)
インストール作業
以下のサイトにアクセスしてインストーラを入手します。(序盤の画像はガビガビなっちゃった...(。-人-。) )
上の画像の赤く囲んだ部分をクリックするとインストールが始まります。
ダウンロードしたexeファイルをダブルクリックすると、不気味な絵が描かれたインストーラが起動します。【next】をクリック。
「License Agreement」ウィンドウで “I accept the agreement” にチェックをつけて【next】をクリック。
「Select Destination Location」でパスを変更します。デフォルトでは下図左のように C:\Program Files (x86)\GnuWin32 となっていますがこれを C:\tools\GnuWin32 に変更します。
(画像では C直下 C:\GnuWin32 になっていますがtoolsフォルダを新規作成してそのフォルダ内を指定してください)
toolsフォルダの名前は自由に変更しても構わないですが、半角スペースなどがあるとうまく動作しない可能性がありますので注意してください。
パスを C:\tools\GnuWin32 に変更したら【next】。
「Select Components」では ”Full Installation” で【next】。
「Select Start Menu Folder」はそのまま【next】をクリックします。
「Select Additional Tasks」も変更なしで【next】をクリック。
「Ready to Install」で【Install】をクリック。
下の画面が出てきたら正常にインストールできています。【Finish】をクリックしてウィンドウを閉じます。
次に環境変数の追加を行います。そんなの余裕じゃって人は動作確認までSkip。
Windowsのタスクバーにある検索メニューに「環境変数」と入力して、【システム環境変数を編集】をクリックします。
”システムのプロパティ” ウィンドウで【環境変数】をクリック。
”環境変数”ウィンドウで、今ログインしているユーザのみに適用したい場合は下の画像の①の「Path」をクリック。全ユーザに適用したい場合は②の「Path」をクリックして【編集】をクリックします。
(ユーザの環境変数①の方は無い場合があります。その場合は【新規】をクリックして変数名を「Path」にして変数値をこの次のステップで示すものにしてください)
”環境変数名の編集”ウィンドウで【新規】をクリックして C:\tools\GnuWin32\bin を入力します。
(【新規】をクリックして文字を打つのが面倒な人は【参照】をクリックして「PC」→「Windows(C:)」→「tools」→「GnuWin32」→「bin」を選択して【OK】をクリックしてください。)
今開いたウィンドウたちを【OK】をクリックして閉じます。
以上で環境構築は終了です。
動作確認
まずはコマンドプロンプトで次のコマンドを入力します。
make --version
コマンドプロンプトで以下のような表示が得られたら成功です。
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
これはフリーソフトウェアです. 利用許諾についてはソースを
ご覧ください.
商業性や特定の目的への適合性の如何に関わらず, 無保証です.
This program built for i386-pc-mingw32
もしうまく結果が現れなかった場合、再度「インストール手順」を実施してください。大体の場合、環境変数の設定ミスです。
javaプロジェクトを作成する
make による自動ビルドでは、ディレクトリ構成についての言及がありません。今回はわかりやすくするためにデスクトップに make 用の Java プロジェクトを作成します。デスクトップで右クリックして makeTestProject というフォルダを新規作成してください。
Windows のメモ帳以外の任意のエディタ(VSCode や Eclipse など)を用いて、下記に示すソースコードを入力してください。
public class Human{
private String name;
private int age;
public Human(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public void grow(){
this.age++;
}
}
public class HumanTester{
public static void main(String[] args){
Human h = new Human("名無しの権兵衛", 20);
System.out.println("名前:" + h.getName());
System.out.println("年齢:" + h.getAge());
System.out.println("-----歳をとりました-----");
h.grow();
System.out.println("名前:" + h.getName());
System.out.println("年齢:" + h.getAge());
}
}
クラス作成後、エクスプローラーでは次のように表示されます。
これからJavaファイルのコンパイルと実行を行います。そんなん余裕じゃ!って人は下記の折りたたみを開かないでください
。
Java ファイルのコンパイルと実行
コマンドプロンプトを起動し、カレントディレクトリを上記の Java ファイルがある場所に変更します。プロジェクトをデスクトップに作成した場合は次のようになります。
cd C:\Users\[ユーザ名]\Desktop\makeTestProject
Javaプログラムの実行には、
. 関連するすべての Java ファイルを javac コマンドでコンパイルして .class ファイル(バイナリファイル)を生成する
. 次に java コマンドで実行する
という流れが必要になります。一旦普通に Java ファイルの実行まで行います。次のコマンドを実行して作成した Java ファイルを実行してみます。(実行にあたって、Path の追加と JAVA_HOME の設定をしておきましょう)
javac Human.java
javac HumanTester.java
上記の二つの javac コマンド実行後、dir コマンドでフォルダの中を確認すると Human.class と HumanTester.class が生成されていることが確認できます。(コマンドプロンプトで dir と入力しましょう)
同じことですが、Windowsのファイルエクスプローラからも確認することができます。
.classファイルが確認出来たら、次のコマンドを入力して実行結果を確認します。
java HumanTester
名前:名無しの権兵衛
年齢: 20
-----歳をとりました-----
名前:名無しの権兵衛
年齢: 21
ここまでが Java の実行方法の説明になります。ではここで Human クラスの grow メソッドに変更があったとします。
public void grow(){
System.out.println("1年後..."); // 追記
this.age++;
}
Human クラスの grow メソッドを上記のように変更したら、再度コマンドプロンプトで java HumanTester を実行します。
すると、実行結果が変わらないことが確認できると思います。これは元の Java ファイルを変更してもコンパイルしていなければ、作成済みの .class ファイルが勝手に更新されることはないためです。
Java ファイルの変更を行った場合、再度 Java ファイルのコンパイルを行ってから java コマンドで実行する必要があります。
javac *.java
java HumanTester
名前:名無しの権兵衛
年齢: 20
-----歳をとりました-----
1年後...
名前:名無しの権兵衛
年齢: 21
* は「任意の文字列」という意味で、ワイルドカードと呼ばれます。*.java と書くと拡張子部分が .java のすべてのファイルという意味になります。
実際に実行されるコマンドは javac *.java の * が展開された javac Human.java HumanTester.java です。
正しく実行することができました。しかしクラスの修正の度に「コンパイル(javac)→ 実行(java)」とするのは面倒ですね。依存する外部ライブラリが増えた場合などはさらに面倒なことになりそうです。そこで便利なのが自動ビルドツールですぁ!
makeプロジェクト
作成した Java プロジェクトを make 用に変更します。
といっても作業自体は簡単で メイクファイル と呼ばれるファイルを作成するだけです。まずは make そのものについて説明します。
makeは [複数のファイルが関係してできたプロジェクト] を楽にコンパイルするために作られました。makeコマンドを実行すると「Makefile」という名前のファイルの中身通りにコンパイルを行ってくれます。頭を小文字にした「makefile」でも認識しますが、Makefileとmakefileの2つがある場合には先頭大文字のMakefileが優先して実行されます。今回は先頭大文字のMakefileという名前を採用します。
次にMakefileの記述ルールです。Makefileにはコンパイルの手順などを記述します。記述するのは次の3要素です。
. 作成するものの名前(ターゲット)
. 作成するのに必要なものの名前(コンポーネント)
. 作成の仕方(コマンド)
これら3要素を次の通りに書いていきます。
ターゲット : コンポーネント群
[TAB文字] コマンド群
ひな型となる上記の構文をまとめてタスクといいます。 +
Makefileは複数のタスクが集まって構成されます。 +
では、下記を参考にMakefileの作成を行いましょう。
Makefileに拡張子はないので注意
HumanTester.class: HumanTester.java Human.class
javac HumanTester.java
Human.class: Human.java
javac Human.java
各タスクの説明をします。↓
HumanTester.class: HumanTester.java Human.class
javac HumanTester.java
このタスクは「HumanTester.class」というターゲットを生成するためのタスクです。 +
HumanTester.class を生成するために、HumanTester.java と Human.class というファイルが関係してくると宣言しています(:以降のコンポーネントを確認してください)。 +
また、改行後に HumanTester.class を生成するために必要なコマンドを記述しています。コマンドの記述はTAB文字を入れてから行います。
Human.class: Human.java
javac Human.java
このタスクは「Human.class」というターゲットを生成するためのタスクです。 +
Human.class 生成するために Human.java というファイルが関係することを、:以降のコンポーネントで示しています。 +
改行後のコマンドでは Human.class を生成するためのコマンドを記述しています。 +
以上で Makefile を作ることができました。動作を確認するために makeTestProject フォルダの中身の .class ファイルを削除しておきます。(普通にDELETEしてください)
コマンドプロンプトでカレントディレクトリを MakeTestProject にして、makeコマンドを入力します。フォルダの中を確認すると.classファイルが生成されていることが確認できます。
makeコマンドは本来 make [ターゲット名] という実行方法をとります。ターゲット名を指定しない場合は Makefile の一番上のタスクを実行します。
makeコマンドを実行すると、対象とするタスクのコンポーネントのタイムスタンプ(作成日時)と、ターゲットのタイムスタンプの比較が行われます。ターゲットがコンポーネントより古い場合は、ターゲットを生成するためのコマンドが実行されます。コンポーネントの中に別のタスクのターゲットになっているファイルがある場合、それもタイムスタンプか調べられ連鎖的にタスクが実行されていきます。
次に Human.java に任意の変更を加えて、再度makeを実行してみましょう。自動コンパイルが行われたことが確認できるはずです。ついでにターゲットが最新状態でもmakeを実行してみましょう。コマンドが実行されないことが確認できます。
次の記事
参考URL
- make (UNIX)
https://ja.wikipedia.org/wiki/Make_(UNIX) - Windowsへのmakeインストーラ
https://gnuwin32.sourceforge.net/packages/make.htm - Windows10環境でmakeコマンドを使用する方法【ハマリ回避】
https://qiita.com/BARANCE_TW/items/c7ffdb311df84d47bddd - ビルドツール make / ant / maven / gradle ざっくり理解メモ
https://qiita.com/MahoTakara/items/ff73338e218b656bedfa














