C, 码头工人

Docker容器中的C构建环境

这个容器是我用于编译C程序的基本构建环境。它产生彩色输出,并缓存编译工件,从而大大加快了后续的重新编译速度。

它位于我的顶部 人妖 容器,通常我会根据项目进一步扩展它。看到 这个例子.

产品特点

  • GCC 6
  • 缓存 快速重新编译
  • colorgcc 用于彩色输出
  • 支持与外部工具链进行交叉编译
  • 很小:240 MB,包括基本ownyourbits / 人妖(〜50 MB)

CCache是​​一个编译器缓存,可大大缩短重新编译时间。有时我会花费数小时等待构建完成,因此这在我的工具箱中是必须的。

colorGCC也是不错的补充。它有助于使编译输出变得有意义,并且’在较长的时间内捕获警告真的很不错(“eh!那彩色输出是什么?” )。

我有没有提到 我爱色彩 已经?

最初,我创建此容器是因为我厌倦了使用 缓存colorgcc 再三,一而再再而三。

我曾经不得不去 拱形维基 每一次,为了记住确切的设置以及该颇为棘手的设置所需的符号链接的位置。现在我将其编写脚本并打包… much better!

用法

汇编

建议使用此别名

alias ake='docker run --rm -v "$(pwd):/src" -t ownyourbits/mmake'

然后,像使用一样使用它 使

cd test
mmake

您可以按常规方式传递Makefile目标和变量

ake alltargets CFLAGS=-g -j5

A .ccache 目录将在执行目录中生成,以加快后续编译速度。

请注意,容器仅包含通用库,因此,如果您需要为项目使用一些外部库,则需要扩展容器。

例如,如果您需要链接到 诅咒 库自然会失败

$ ake
cc 主要.c -lncurses -o 主要
main.c:5:1: warning: return type defaults to `int' [-Wimplicit-int]
main()
^~~~
/usr/bin/ld: cannot find -lncurses
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'world' failed
make: *** [world] Error 1

您需要先安装它。只需在...之上创建另一层 ake

FROM ownyourbits/mmake

RUN sudo apt-get update; sudo apt-get install -y libncurses5-dev
交叉编译

此方法支持指定外部工具链,例如 臂交叉编译器工具链.

为了交叉编译为不同的体系结构,可以使用以下别名

alias xmake='docker run --rm -v "$(pwd):/src" -v "/toolchain/path:/toolchain" -t ownyourbits/xmake'

再说一次,就像使用一样使用它 使

cd test
xmake

如果现在检查文件,我们可以看到仅通过调用就可以在同一文件夹中交叉编译相同的C代码。 xmake 代替 ake。真好!

$ file 主要
main: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-mips-sf.so.1, with debug_info, not stripped

我们现在有一个MIPS版本 主要.

输出仍将是彩色的,但如果要使用 缓存,您必须将其包含在工具链中,并针对特定情况进行设置。

查看来自以下准备使用的工具链的集合 自由电子.

高级用法

为了避免延迟创建和删除容器,可以使容器运行以加快执行速度。

使用这些别名

alias runmake='docker run --rm -d -v "$(pwd):/src" --entrypoint /bg.sh -t --name ake ownyourbits/mmake'
alias ake='docker exec -t ake /run.sh'

每当我开发一个项目时,我都会这样做,并且我处于频繁重新编译和整理代码的阶段。

用途

即使最初我只是简单地使用它 使 包装器,我发现它有很多用途:

  • 为了获得不依赖开发团队每个成员运行哪个系统的可复制构建,拥有稳定的构建环境非常重要。例如,在gcc版本中,Arch通常领先于Debian。
  • 从docker提取映像可以非常轻松地与您的团队共享开发环境。
  • 理想的是将其链接到 持续集成 支持docker的系统,例如 亚搏体育app CI.
  • 您可以 泊坞窗运行–entrypoint bash 放入容器并工作 以良好的陈旧方式发展环境 chroot 构建环境。
  • 它是创建适用于不同项目的衍生容器,重用通用基础并节省磁盘空间的良好基础。例如,您可能想用一个库,一个项目的CUnit和另一个项目的Doxygen来构建一个容器。

和往常一样,您可以在 Github.

# Make wrapper with GCC 6, colorgcc 和 缓存
#
# Copyleft 2017 通过 Ignacio Nunez Hernanz <nacho _a_t_ ownyourbits _d_o_t_ com>
# GPL licensed (see end of file) * Use at your own risk!
#
# 用法:
#
#   建议使用此别名
#
#     alias ake='docker run --rm -v "$(pwd):/src" -t ownyourbits/mmake'
#
#   然后,像使用一样使用它 'make'
#
# Note: a '.ccache' directory will be generated in the directory of execution
#
# Note: you can leave the container running for faster execution. 使用这些别名
#
#     alias runmmake='docker run --rm -d -v "$(pwd):/src" --name ake -t ownyourbits/mmake /bg'
#     alias ake='docker exec -t ake /run.sh'
#
# Details at ownyourbits.com

FROM ownyourbits/minidebian

LABEL description="Make wrapper with GCC 6, colorgcc 和 缓存"
MAINTAINER Ignacio Núñez Hernanz <nacho@ownyourbits.com>

# Install toolchain 
RUN   apt-get update;\
      DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends gcc 使 libc6-dev;\
      DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends 缓存 colorgcc; \
      dpkg -L binutils | grep -v  "^/usr/bin\|^/usr/lib" | while read f; do test -f $f && rm $f; done; \
      dpkg -L gcc-6    | grep -v  "^/usr/bin\|^/usr/lib" | while read f; do test -f $f && rm $f; done; \
      apt-get autoremove -y; apt-get clean; rm /var/lib/apt/lists/* -r; rm -rf /usr/share/man/*

# Set colorgcc 和 缓存
COPY colorgccrc /etc/colorgcc/colorgccrc

RUN mkdir  /usr/lib/colorgcc; \
    ln -s /usr/bin/colorgcc /usr/lib/colorgcc/c++; \
    ln -s /usr/bin/colorgcc /usr/lib/colorgcc/cc ; \
    ln -s /usr/bin/colorgcc /usr/lib/colorgcc/gcc; \
    ln -s /usr/bin/colorgcc /usr/lib/colorgcc/g++; 

# Builder user
RUN apt-get update; \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends adduser; \
    adduser builder --disabled-password --gecos ""; \
    echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; \
    apt-get purge -y adduser passwd; \
    apt-get autoremove -y; apt-get clean; rm /var/lib/apt/lists/* -r; rm -rf /usr/share/man/*

RUN echo 'export PATH="/usr/lib/colorgcc/:$PATH"' >> /home/builder/.bashrc; \
    echo 'export CCACHE_DIR=/src/.ccache'         >> /home/builder/.bashrc; \
    echo 'export TERM="xterm"'                    >> /home/builder/.bashrc; 

USER builder

# Run
CMD ["/run.sh"]

COPY run.sh /
COPY bg.sh /bg

# License
#
# This script is free 软件; you can redistribute it 和/or modify it
# under the terms of the GNU General Public License as published 通过
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this script; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
# Boston, MA  02111-1307  USA

作者: 纳乔帕克

谦虚地分享我认为有用的东西 [ 的github 码头工人hub ]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *