# 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}]"}
    470 views