make/cmake/build/make installって?何ってなって困っていた昔(今もかもだけど)

Linux(Ubuntu)触りたての頃に、それまでWindowsしか触ってこなかった自分は、全くこのmakeとかinstallとかその他諸々がなんなのかイメージがつかなかった.

確かになんとなくはわかるけど、結局インストール(install)って何をする処理なんだよ!!っていうもやもやを抱えながら生きていた時間があって、調べてもなんか納得いかず、ずっと不満を抱えていた.

それを今日思い出したので、自分と同じ思いをしている人がいるかもと思い、概略を説明してみようと思います.別に超詳しい説明をするわけではないです.今でも詳しくはわかっていないと思いますので.

そして本当に超初心者向けな内容です.

また、コンパイルのいらないスクリプト言語ではなく、ここではCやC++といったコンパイルが必要なプログラミング言語を想定しています.

まず,プログラムを使うまでの流れ

プログラムを作ったり、他の人のプログラムを落としてきて使うには幾らかの方法があります.

それは

  • プログラムのソースコードを持ってきてそこでプログラム(ソフトウェア)を完成させる
  • 初めから完成したプログラム(ソフトウェア)を持って来る

のどちらかです.

ソースコードは人間でも読みやすく書かれたコードをここでは指しています.

しかし、その人間が読みやすい状態のコードではパソコンで動かすことはまだできません.
そのソースコードの状態から、パソコンに命令する形(機械語)に変換する必要があります.
その変換(コンパイル)によって、プログラムが完成します.

これが一つ目の持ってき方です.

では二つ目はというと、誰かが作った一つ目のものをそのまま自分のところに持って来るだけです.だいたいバージョンがつけられてて、自分に欲しいバージョンでインストールすることになります.

では、一つ目はいらないのではないか?と思うかもしれませんが、
一つ目のいいところは自分でプログラムを書き換えたら完成するプログラムも好き勝手変えられることなどが挙げられます.また、プログラムを書く側としては、どこでも動く完成したプログラムを書くのは面倒臭いけど、それぞれの環境で変換(コンパイル)してもらったほうが楽ってのもあります.そうはいってもちゃんとしたaptやnpmなどのパッケージマネージャー(プログラム同士の依存の仕方などを考慮してインストールしてくれるソフト)で管理できるようなパッケージにすればそれほど大変ではないと思いますが…

一つ目を使う場合に実用的に(初心者として)大変なところは、ソースコードが新しすぎると依存しているプログラムも新しくて、でも自分の環境にはその古いバージョンのプログラムがあって、でもその古いのはもっと変えられない古いプログラムも依存していて。。。。ってどうしようもなくなってしまったり、新しい変更が実はバグを含んでいるせいでコンパイルできても動かない!ってトラブルにはまったりします.つまり品質が低い状態かもしれません.ただそれに関してはソースコードをちょっと昔に戻すことが簡単にできるので(ソフトウェアの変更履歴を管理しているgitやsvnを使うと)、安定版さえ見つかれば問題ありません.ちょっと試したいくらいなら一つ目はおすすめできません.一つ目は「ガツガツプログラムを変更して使ってやるぜ!」というケースか、「どうしても使いたいプログラムがあるけどそれは最新すぎてまだ二つ目の状態になっていないから仕方なくソースコードからコンパイル」というケースの人用だと私は認識しています.

二つ目のいいところは、この形でみんなに配るってことはつまり品質が高いはずってことです.ver3.0.0とかという形でリリース(みんながダウンロードできるように)しているということは、ちゃんとある程度動作を確認していて問題ない状態だからver3.0.0として出すよと認められて出しているはずです.インストールしたいプログラムが依存している他のプログラムもあったら、それをインストールするかあらかじめプログラムに含んで置いてくれるので、そこらへんも楽なことが多いです.つまり、ただ使いだけだよって人は二つ目を使えば問題ありません.

上の二つのどちらかさえできてしまえば、ソフトウェアを使うことはできます.

プログラムをインストールする

コンパイル/makeの話に入る前に「インストールする」という話だけ先に説明してしまいます.

プログラムをインストールするっていったら何をするのか?

「インストールする」というのは非常に曖昧な言葉で広すぎるのですが、わかりやすく言えば

・プログラムを適切なフォルダに置いて

・他に必要なプログラムがあれば同様にインストールしたり

・パソコンの環境によって設定を自動的に変更したり(定期的に起動するようにしたり、起動時に起動するようにしたり等を設定)

するようなことをしています.

最も簡単なのは、本当に「プログラムを適切なフォルダに置く」だけです.それ以外に全く何もしないことがあります.

インストールというのは、その程度の話で特別な何らかの作業を指すものではありません.「実行するお膳立てをする」作業全てをインストールと言うだけです.何か特別な変換をしたりOSに登録してくれといったりといった特殊なことは通常やらなくていいので、簡単なインストールなら手動でできます(やる意味全くありませんが).

プログラムをmake/cmake/build/make insatllする

さて、前提になる事柄については概要というかイメージの説明になりましたが、終わったつもりです.
make, cmake, build, make installなどについて簡単に説明したいと思います.

これは基本的にソースコードからソフトウェアをコンパイルしなくてはならないときに出てくる単語です.ただ単にできものソフトウェアを使うだけならいわゆる「インストール」で全部やってくれます.

まず buildについて

buildはコマンドの名前等ではありません.ソースコードからソフトウェアを作る作業全部をさします.なのでmakeやcmakeを実行する作業も全てビルド作業の一貫になります.

簡単ですね.とかくソフトウェアをソースコードから作る作業全部ぐらいのイメージでいいと思います.

次にmake と cmake

make : MakeFileに必要な依存関係や実行すべきコマンドを記述しておくと他のユーザが簡単にコンパイル(ソースコードから機械語に変換する作業)などができる便利ツール.makeコマンドはLinuxで標準で付いて来ます.古くからある大事なコマンドです.CやC++はこれで書かれているものが昔から多いです.コマンドは make(やmake all)と打ちます.これらはMakeFileに書かれている最も上の実行を行うことが多いです.実際にビルドをするのはコンパイラですが、makeはそれらの実行する順番などを自動で決めてくれて、コンパイルや不要ファイルの削除、ディレクトリの作成などを行うように記述します.

cmake:CMakeLists.txtに必要な依存関係を書いておくことでMakeFileのときよりもより使いやすく記述できるようにしたものです.makeより後に作られました.より容易に他のライブラリへ依存を書くことができ、見つけることができるようになっています.

なので両方とも依存関係等を気にしながらコンパイル作業を補佐する作業になります.(本当にコンパイル作業はg++とかgccの仕事.その工程、順番を決めるのがmake,cmake)

最後にmake install.

make installはmakeコマンドで引数としてinstallを渡しているだけです.Makefileの中にどのような処理をinstallを渡された時に行うかが書かれているはずです.
そのため人それぞれで内容は異なります.

ただ、名前の通り先ほどのインストール作業をすることには変わりません.
ちゃんとコンパイルをしてそれを必要なディレクトリにコピーしたりファイル名を変えたり設定をするように指示するのが一般的です.

 

以上です…

なんだかんだ長くなってしまった…少しでもどなたかの助けになれれば幸いです.

 

 

About the author

Comments

  1. 初歩の初歩さらに極初歩です。linuxバージョンのDavinciResolveが使いたくてsentos7をcpuにinstallし、linux専用機としています。一応ネット検索やデーターのダウンロードはwin10並みに可能ですが、Davinciはgtxのlinuxバージョンをインストールできずに苦戦中。貴殿のページを見つけましたが未だ先に進めません。nvidiaのデヴァイスドライバーとDavinciのlinuxアプリはHDDのダウンロードに存在。
    このページのコマンドを少しずつ勉強しながらものにしたいと奮闘中。

コメントを残す