# TLCL 輪読会
### 23 – Compiling Programs
2023/07/04 [@kdnakt](https://twitter.com/kdnakt)
---
## 今日の範囲
### 23 – Compiling Programs
- What is Compiling?
- Compiling a C Program
----
#### ソースコードをコンパイルする
- ソースコードこそLinuxの本質的自由
- 最近はコンパイル済バイナリが主流
- Debianのリポジトリ:6万8千パッケージ
- なぜコンパイルするか?
- 可用性と適時性
- シンプルなパッケージを`make`でビルドしよう
---
## What is Compiling?
- コンパイル:
- ソースコードをCPUのマシン語に変換
- マシン語は01のバイナリで小さな処理を記述
- このバイトを加算
- メモリのこの場所を指定
- このバイトをコピー
- アセンブリ言語:CPY,MOV等
- アセンブラでマシン語に変換
- 今でもドライバ,組込システム等に利用
- 高水準言語:FORTRANやCOBOL
- コンパイラでアセンブリに変換
----
### リンク
- ライブラリが共通処理を提供
- 例)ファイルを開く
- /libや/usr/libにルーチンがある
- リンカ
- コンパイラの出力とライブラリをリンク
- 実行可能なプログラムファイルを作成
----
### 全てがコンパイルされているか?
- NO:シェルスクリプトはコンパイル不要
- 直接実行可能
- スクリプト言語/インタプリタ言語
- Python, Perl, PHP, Ruby等
- インタプリタがファイルを読み実行する
- 一般にコンパイル言語より遅い
- 一般的タスクでは十分に速い
- ゆえに開発も簡単 (ほんとか?)
- 長いコンパイル時間も不要
---
## Compiling a C Program
- 事前準備
- gccコマンド
- makeコマンド
----
### ソースコードを取得する
- GNUプロジェクトのdictionをコンパイル
- 文章の品質をチェックするコマンド
- まずはftp/wgetでソースコードを取得
```shell!
# ftpの例は省略...
$ mkdir src && cd src
$ wget https://ftp.gnu.org/gnu/diction/diction-1.11.tar.gz
```
----
### ソースコードを解凍する
- tarball:ソースツリーを含む圧縮ファイル
```
$ tar xzf diction-1.11.tar.gz
$ ls
diction-1.11 diction-1.11.tar.gz
```
----
#### メモ:ソースコードの場所
- `~/src`
- ユーザが自分用にコンパイルするソース
- `/usr/src`
- OSがインストールするソース
- `/usr/local/src`
- 複数ユーザが使うソース
----
#### パッケージのルート
- Linux/GNUの標準的パッケージ
- projext-x.xxディレクトリがルート
- 複数バージョンのインストールが容易
- まれにルートにファイルを含むパッケージも
- 以下のコマンドでチェック可能
- `tar tzvf tarfile | head`
----
### ソースツリーを調べる
##### diction-1.11の場合
- ドキュメント:README, INSTALLなど
- .cファイル:C言語のモジュール
- .hファイル:ヘッダファイル
- コンパイラがモジュールの接続に利用
```
// diction.cファイルの中身
// システムが提供するルーチン
#include <regex.h>
#include <stdio.h>
...(略)...
// dictionの共通ルーチン
#include "getopt.h"
```
----
### プログラムをビルドする
```
# ソースツリーが提供するプログラム
# ビルド環境をチェックし、必要なファイルを生成
$ ./configure
# ビルド手順が書かれたMakefileが作成される
```
----
#### Makefileの中身
- Cコンパイラの定義
- `CC= gcc`
- 成果物と依存ファイル、コマンド
```
# $(CC)がgccに置換される
diction: diction.o sentence.o misc.o getopt1.o
$(CC) -o $@ $(LDFLAGS) diction.o sentence.o ...(略)
diction.o: ditcion.c config.h getopt.h misc.h sentence.h
(略)
# .oファイルのビルド方法
.c.o: $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
```
----
#### Makefileを利用してビルドする
```
$ make
# dictionプログラムがビルドされている
# もう一度makeを実行しても何も起きない
# プログラムが依存するファイルが更新されているとリビルド
```
----
### プログラムをインストールする
```
$ sudo make install
# /usr/local/binにビルド成果物をコピー
# 通常ユーザーでは書き込みできないのでsudo
$ which diction
/usr/local/bin/diction
```
---
## まとめ
- ソースコードからビルド&インストール
- `./configure`
- `make`
- `make install`
- `make`は依存関係の管理にも利用可
{"title":"TLCL 輪読会","slideOptions":"{\"transition\":\"slide\"}","description":"2023/03/28 @kdnakt","contributors":"[{\"id\":\"df36d0f0-b67e-41ac-96b3-f3988326d230\",\"add\":2985,\"del\":202}]"}