7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

llvm-clang環境のDockerを作ってDocker Hubにpushした。

Last updated at Posted at 2017-02-11

#TL;DR

bash
$ docker run -v"$PWD":/myapp -w /myapp naktak/clang

でbashが走るので

naktak/clang
$ clang -v
clang version 5.0.0 (trunk 294803)

でclangやclang++が使えます。

#きっかけ
某所で見た問題の解答をプログラムした結果をgccとclangでコンパイルして比較したくなったのだが、gccは公式Dockerがあるのにllvm-clangは公式Dockerが見つからなかったので、どうせならソースから自作してみようかと。

##問題
//┏┳┳┳┳┓
//┣╋╋╋╋┫
//┣╋╋╋╋┫
//┣╋╋╋╋┫
//┣╋╋╋╋┫
//┗┻┻┻┻┛
//上記の6X6の通路を左上から右下へ到達する時に
//同じ道を通らずにたどり着くルートは何通りあるか?
//ただし、同じ交差点は何度通ってもいい

##回答
解答はこれで、深さ優先探索と軽い枝切りで実装してます。

#llvm-clang環境の作成
環境構築の手順は以下の通りです。

  • Dockerfileを作成して
  • Docker imageを構築して
  • DockerHubにpushする

##Dockerfile作成
###llvm-clangのビルド&インストール方法
Ubuntu 16.04: リポジトリのLLVM/Clangをビルドしてインストールする
をほぼ踏襲しました。

###Dockerfile作成方法
効率的に安全な Dockerfile を作るにはが大変参考になりました。

###作成したDockerfile

Dockerfile
FROM ubuntu

RUN set -x && \
    apt-get update && \
    apt-get install -y make cmake gcc g++ python libtool zlib1g zlib1g-dev subversion && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    cd / && \
    mkdir llvm && \
    cd /llvm && \
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm && \
    cd /llvm/llvm/tools && \
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang && \
    cd /llvm/llvm/tools/clang/tools && \
    svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra && \
    cd /llvm/llvm/projects && \
    svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt && \
    cd /llvm && \
    mkdir build && \
    cd build && \
    cmake -G "Unix Makefiles" ../llvm/ -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release && \
    make -j$(grep processor /proc/cpuinfo | wc -l) REQUIRES_RTTI=1 && \
    make install && \
    cd / && \
    rm -rf llvm

ENTRYPOINT ["/bin/bash"]

ファイル自体はここに置いておきます。
必要パッケージがネタ元と違う以外は全く一緒です。

##Docker image構築
DockerfileのあるDirに降りてbuildするだけです。

docker-template/clang
$ docker build -t naktak/clang .

参考サイトではRAMが2GB必要と書いてありましたが、2GBだと97%まで来て最後のlinkerで落ちました。最高に切ない。
メモリ割り当てを3GBまで増やしたら通ったので、もし自分でbuildするときは余裕をみて4GBくらい用意しましょう。

私のハードウェアは以下の通りです。

/proc/cpuinfo
model name      : Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz
cpu cores       : 2
processor       : 1
/proc/meminfo
MemTotal:        3057012 kB

これでbuild時間は30分くらいでした。

##Docker push

###Docker Hub アカウント作成
まずはDockerHub上にアカウントを作ります。下の必要事項を書いてSignUpします。
キャプチャ.PNG

するとメールに確認アドレスが届くのでclickすれば登録完了です。

###DockerHubにログイン
loginコマンドでDockerHubにログインします。

bash
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: naktak
Password:
Login Succeeded

###Dockerイメージをpush
一番上の8c6c5a1d33e4が今回作成した層です。その下はubuntuのものなのでpushされませんでした。

bash
$ docker push naktak/clang
The push refers to a repository [docker.io/naktak/clang]
8c6c5a1d33e4: Pushed
5eb5bd4c5014: Mounted from library/ubuntu
d195a7a18c70: Mounted from library/ubuntu
af605e724c5a: Mounted from library/ubuntu
59f161c3069d: Mounted from library/ubuntu
4f03495a4d7d: Mounted from library/ubuntu
latest: digest: sha256:ce63be3a47a9ad6a3b683cf883be2655340d5905654189db13c95c792814a567 size: 1570

###Dockerイメージを確認

https://hub.docker.com/ にアクセスしてsign inしてからDashboardやMy Profileからpushしたimageが存在するかを確認できます。
キャプチャ2.PNG

###Dockerイメージを使用

bash
$ docker run -v"$PWD":/myapp -w /myapp naktak/clang

/bin/bashが動きますので、中でclangを使用できます。

naktak/clang
$ clang -v
clang version 5.0.0 (trunk 294803)

#最後に
軽い気持ちで始めて、特に問題もなく環境構築出来てしまった。
dockerは非常に簡単でした。
ちなみに冒頭の問題の答えは以下の通りで1086297184回、約33秒でGCCとほとんど同じでした。

naktak/clang
$ clang -Ofast -o myapp hogeb1.c
$ ./myapp
start 3f00000003f:820820820
total=1086297184: time=33.632360[sec]
7
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?