Epoll を使用した C プロジェクトがあるが、普段メインで使用している Linux 開発マシンが手元にないので、macOS で開発とデバッグをしたいのですが、Linux 仮想マシンがありません。たまたま、JetBrains CLion のツールチェーン構成は、ローカル環境の使用に加えて SSH と Docker をサポートしています。
CLion + Docker Desktop を使用すると、筆者は 10 分以内に Linux クラス ライブラリを使用した C プロジェクトを開発できる開発環境を macOS 上に構築でき、開発経験も豊富です。
記事ディレクトリ
Docker環境を準備する
macOS の場合は、Docker Desktop を使用できますが、この記事では説明しません。
もちろん、Docker 環境はローカルではない可能性があり、TCP または SSH を介して非ローカルの Docker 環境に接続できます。
プロジェクトに必要な依存関係を含むイメージをビルドする
Dockerfileを準備し、必要な依存関係をインストールする
著者のメイン開発マシンは Ubuntu 22.04 で、ベース イメージと同じシステムを選択しています。
ミラーリングは、プロジェクトで必要な依存関係に応じて構築できます。以下は、基本的な C/C++ 環境を構築するための Dockerfile です。
FROM ubuntu:22.04
MAINTAINER [email protected]
RUN apt update && apt install -y cmake g++ gdb
ヒント: Ubuntu 公式 apt ソースへのアクセスを高速化できない環境の場合は、国内の apt ソースを使用することをお勧めします。
基本イメージ内の元のsources.listをsources.listで上書きします。
FROM ubuntu:22.04
MAINTAINER [email protected]
ARG TARGETARCH
COPY $TARGETARCH/sources.list /etc/apt/sources.list
RUN apt update && apt install -y cmake g++ gdb
x86/64 アーキテクチャを構築する環境では、以下のソースリストを使用できます。
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
aarch64 およびその他のアーキテクチャを構築するための環境では、次のソースリストを使用できます。
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
ビルドイメージ
>>> docker build -t teslacn/cmake:1.0 .
[+] Building 16.4s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:22.04 16.3s
=> [1/3] FROM docker.io/library/ubuntu:22.04@sha256:f154feaf13b51d16e 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 65B 0.0s
=> CACHED [2/3] COPY arm64/sources.list /etc/apt/sources.list 0.0s
=> CACHED [3/3] RUN apt update && apt install -y cmake g++ gdb 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:b4ad8d6c3284e79dedcf8c628b1a89c0bb59d29000 0.0s
=> => naming to docker.io/teslacn/cmake:1.0 0.0s
CLion ツールチェーンの構成
ツールチェーンにより Docker 環境が追加される
ビルドされたイメージを選択するだけで、CLion がビルド ツール、コンパイラー、GDB のバージョンを自動的に検出します。
CMake プロジェクトは、追加したばかりの Docker ツールチェーンを選択します
開発経験
ヘッダーファイルのナビゲーション
CLion は、Linux ヘッダー ファイルをローカルのコンテナーに自動的にキャッシュし、sys/epoll.h
コードからファイルに直接移動できます。これは、Linux 環境で直接開発する場合と変わりません。
直接実行する
普通にローカルで実行するのと全く違いはありません。
試運転
デバッグして実行してみると、プログラムログが標準出力に出力されないことを除けば、その他のデバッグ機能はローカルデバッグと全く同じであることがわかりました。
以上が環境構築の過程と結果です。
[更新] CLion デバッグ コンソールにログがありません
解決:
setbuf(stdout, 0);
https://stackoverflow.com/questions/47776094/clion-wont-show-output-in-debug