😗

Docker 上で Git をビルドしてみた話

2023/11/11に公開

はじめに

これまで、ライブラリをインストールするときはパッケージ管理システムにお世話になっていましたが、ある時に git からソースコードを直接取得して管理するという機会がありました。
そこで、ライブラリを直接ビルドしてみるということに興味を持ち docker 上でやってみることにしました。

備忘録として起こったエラーとエラー対処法も併せて残しています🚒

環境

macOS 14.0 (23A344)
Docker version 24.0.6, build ed223bc

手順

1. Docker のコンテナを用意

とりあえず、 ubuntu のイメージを引っ張ってきます

docker pull ubuntu:latest

引っ張ってきた ubuntu イメージをもとに、コンテナを作成します

docker run -it --name git-build ubuntu

curl でソースファイルを落としたいので、まず curl を使えるようにします。
あと、この状態ではビルド時に必要なパッケージが入っていないので build-essential もインストールしておきます。

$ apt-get update
$ apt-get install curl
$ apt-get install build-essential

2. コンテナ内で git をビルドする

公式に書かれているソースからのインストールの手順をもとに行います。

はじめに、ソースファイルをダウンロードします。

$ curl -LO https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
$ tar zxvf git-2.9.5.tar.gz
$ cd git-2.9.5/

ここからビルドしていきます。

$ make configure
GIT_VERSION = 2.9.5
    GEN configure
/bin/sh: 1: autoconf: not found
make: *** [Makefile:1874: configure] Error 127

autoconf をインストールして、もう一度 make configure します

$ apt-get install autoconf
$ ./configure --prefix=/usr/local
$ make all doc info
    * new build flags
    CC credential-store.o
In file included from credential-store.c:1:
cache.h:40:10: fatal error: zlib.h: No such file or directory
   40 | #include <zlib.h>
      |          ^~~~~~~~
compilation terminated.
make: *** [Makefile:1944: credential-store.o] Error 1

libz を入れます

$ apt-get install libz-dev
$ make all doc info

...

    BUILTIN git-whatchanged
    SUBDIR git-gui
GITGUI_VERSION = 0.20.GITGUI
    * new locations or Tcl/Tk interpreter
    GEN git-gui
    INDEX lib/
    * tclsh failed; using unoptimized loading
    MSGFMT    po/bg.msg make[1]: *** [Makefile:250: po/bg.msg] Error 127
make: *** [Makefile:1663: all] Error 2

gettext を追加します

$ apt-get install gettext

残りの対応

$ make install install-doc install-html install-info

ここまで進めることができると、 git コマンドを参照することができるかと思います!🎉

$ cd ..
$ git --version
$ git version 2.9.5

ソースからインストールした場合は、Gitを使ってGitそのものをアップデートすることができるみたいです

git clone git://git.kernel.org/pub/scm/git/git.git

参考

Discussion