xref: /openbmc/openbmc-build-scripts/scripts/build-unit-test-docker (revision 02871c9120ffcdafc42f636a9fbb271b1f5d03df)
1*02871c91SPatrick Williams#!/usr/bin/env python3
2*02871c91SPatrick Williams#
3*02871c91SPatrick Williams# Build the required docker image to run package unit tests
4*02871c91SPatrick Williams#
5*02871c91SPatrick Williams# Script Variables:
6*02871c91SPatrick Williams#   DOCKER_IMG_NAME:  <optional, the name of the docker image to generate>
7*02871c91SPatrick Williams#                     default is openbmc/ubuntu-unit-test
8*02871c91SPatrick Williams#   DISTRO:           <optional, the distro to build a docker image against>
9*02871c91SPatrick Williams#                     default is ubuntu:eoan
10*02871c91SPatrick Williams#   BRANCH:           <optional, branch to build from each of the openbmc/
11*02871c91SPatrick Williams#                     repositories>
12*02871c91SPatrick Williams#                     default is master, which will be used if input branch not
13*02871c91SPatrick Williams#                     provided or not found
14*02871c91SPatrick Williams#   UBUNTU_MIRROR:    <optional, the URL of a mirror of Ubuntu to override the
15*02871c91SPatrick Williams#                     default ones in /etc/apt/sources.list>
16*02871c91SPatrick Williams#                     default is empty, and no mirror is used.
17*02871c91SPatrick Williams#   http_proxy        The HTTP address of the proxy server to connect to.
18*02871c91SPatrick Williams#                     Default: "", proxy is not setup if this is not set
19*02871c91SPatrick Williams
20*02871c91SPatrick Williamsimport os
21*02871c91SPatrick Williamsimport sys
22*02871c91SPatrick Williamsfrom sh import docker, git, nproc, uname
23*02871c91SPatrick Williams
24*02871c91SPatrick Williams# Read a bunch of environment variables.
25*02871c91SPatrick Williamsdocker_image_name = os.environ.get("DOCKER_IMAGE_NAME", "openbmc/ubuntu-unit-test")
26*02871c91SPatrick Williamsdistro = os.environ.get("DISTRO", "ubuntu:focal")
27*02871c91SPatrick Williamsbranch = os.environ.get("BRANCH", "master")
28*02871c91SPatrick Williamsubuntu_mirror = os.environ.get("UBUNTU_MIRROR")
29*02871c91SPatrick Williamshttp_proxy = os.environ.get("http_proxy")
30*02871c91SPatrick Williams
31*02871c91SPatrick Williams# Set up some common variables.
32*02871c91SPatrick Williamsproc_count = nproc().strip()
33*02871c91SPatrick Williamsusername = os.environ.get("USER")
34*02871c91SPatrick Williamshomedir = os.environ.get("HOME")
35*02871c91SPatrick Williamsgid = os.getgid()
36*02871c91SPatrick Williamsuid = os.getuid()
37*02871c91SPatrick Williams
38*02871c91SPatrick Williams# Determine the architecture for Docker.
39*02871c91SPatrick Williamsarch = uname("-m").strip()
40*02871c91SPatrick Williamsif arch == "ppc64le":
41*02871c91SPatrick Williams    docker_base = "ppc64le/"
42*02871c91SPatrick Williamselif arch == "x86_64":
43*02871c91SPatrick Williams    docker_base = ""
44*02871c91SPatrick Williamselse:
45*02871c91SPatrick Williams    print(f"Unsupported system architecture({arch}) found for docker image")
46*02871c91SPatrick Williams    sys.exit(1)
47*02871c91SPatrick Williams
48*02871c91SPatrick Williams# These packages we use 'HEAD' for.
49*02871c91SPatrick Williamshead_pkgs = [
50*02871c91SPatrick Williams    "openbmc/phosphor-objmgr",
51*02871c91SPatrick Williams    "openbmc/sdbusplus",
52*02871c91SPatrick Williams    "openbmc/sdeventplus",
53*02871c91SPatrick Williams    "openbmc/stdplus",
54*02871c91SPatrick Williams    "openbmc/gpioplus",
55*02871c91SPatrick Williams    "openbmc/phosphor-logging",
56*02871c91SPatrick Williams    "openbmc/phosphor-dbus-interfaces",
57*02871c91SPatrick Williams    "open-power/pdbg",
58*02871c91SPatrick Williams    "openbmc/pldm",
59*02871c91SPatrick Williams]
60*02871c91SPatrick Williams
61*02871c91SPatrick Williams# Packages with fixed revisions.
62*02871c91SPatrick Williamspkg_rev = {
63*02871c91SPatrick Williams    "boost": "1.74.0",
64*02871c91SPatrick Williams    "cereal": "v1.3.0",
65*02871c91SPatrick Williams    "catch2": "v2.12.2",
66*02871c91SPatrick Williams    "CLI11": "v1.9.0",
67*02871c91SPatrick Williams    "fmt": "6.2.1",
68*02871c91SPatrick Williams    # Snapshot from 2020-01-03
69*02871c91SPatrick Williams    "function2": "3a0746bf5f601dfed05330aefcb6854354fce07d",
70*02871c91SPatrick Williams    # Snapshot from 2020-02-13
71*02871c91SPatrick Williams    "googletest": "23b2a3b1cf803999fb38175f6e9e038a4495c8a5",
72*02871c91SPatrick Williams    # Release 2020-08-06
73*02871c91SPatrick Williams    "json": "v3.9.1",
74*02871c91SPatrick Williams    # Snapshot from 2019-05-24
75*02871c91SPatrick Williams    "lcov": "75fbae1cfc5027f818a0bb865bf6f96fab3202da",
76*02871c91SPatrick Williams    # dev-5.0 2019-05-03
77*02871c91SPatrick Williams    "linux-headers": "8bf6567e77f7aa68975b7c9c6d044bba690bf327",
78*02871c91SPatrick Williams    # Snapshot from 2019-09-03
79*02871c91SPatrick Williams    "libvncserver": "1354f7f1bb6962dab209eddb9d6aac1f03408110",
80*02871c91SPatrick Williams    "span-lite": "v0.7.0",
81*02871c91SPatrick Williams    # version from meta-openembedded/meta-oe/recipes-support/libtinyxml2/libtinyxml2_5.0.1.bb
82*02871c91SPatrick Williams    "tinyxml2": "37bc3aca429f0164adf68c23444540b4a24b5778",
83*02871c91SPatrick Williams    # version from /meta-openembedded/meta-oe/recipes-devtools/boost-url/boost-url_git.bb
84*02871c91SPatrick Williams    "boost-url": "a56ae0df6d3078319755fbaa67822b4fa7fd352b",
85*02871c91SPatrick Williams    # version from meta-openembedded/meta-oe/recipes-devtools/valijson/valijson_git.bb
86*02871c91SPatrick Williams    "valijson": "c2f22fddf599d04dc33fcd7ed257c698a05345d9",
87*02871c91SPatrick Williams    # version from meta-openembedded/meta-oe/recipes-devtools/nlohmann-fifo/nlohmann-fifo_git.bb
88*02871c91SPatrick Williams    "fifo_map": "0dfbf5dacbb15a32c43f912a7e66a54aae39d0f9",
89*02871c91SPatrick Williams}
90*02871c91SPatrick Williams
91*02871c91SPatrick Williams# Look up the HEAD for 'head_pkgs' and insert them into 'pkg_rev'.
92*02871c91SPatrick Williamspkg_lookups = {}
93*02871c91SPatrick Williamsfor pkg in head_pkgs:
94*02871c91SPatrick Williams    pkg_lookups[pkg] = git(
95*02871c91SPatrick Williams        "ls-remote", "--heads", f"https://github.com/{pkg}", _bg=True
96*02871c91SPatrick Williams    )
97*02871c91SPatrick Williamsfor pkg, result in pkg_lookups.items():
98*02871c91SPatrick Williams    for line in result.stdout.decode().split("\n"):
99*02871c91SPatrick Williams        if f"refs/heads/{branch}" in line:
100*02871c91SPatrick Williams            pkg_rev[pkg] = line.strip().split()[0]
101*02871c91SPatrick Williams        elif "refs/heads/master" in line and p not in pkg_rev:
102*02871c91SPatrick Williams            pkg_rev[pkg] = line.strip().split()[0]
103*02871c91SPatrick Williams
104*02871c91SPatrick Williams# Create the contents of the '/tmp/depcache'.
105*02871c91SPatrick Williams# This needs to be sorted for consistency.
106*02871c91SPatrick Williamsdepcache = ""
107*02871c91SPatrick Williamsfor pkg in sorted(head_pkgs):
108*02871c91SPatrick Williams    if pkg in pkg_rev:
109*02871c91SPatrick Williams        depcache += "%s:%s," % (pkg, pkg_rev[pkg])
110*02871c91SPatrick Williams
111*02871c91SPatrick Williams# Define common flags used for builds
112*02871c91SPatrick Williamsprefix = "/usr/local"
113*02871c91SPatrick Williamsconfigure_flags = " ".join(
114*02871c91SPatrick Williams    [
115*02871c91SPatrick Williams        f"--prefix={prefix}",
116*02871c91SPatrick Williams    ]
117*02871c91SPatrick Williams)
118*02871c91SPatrick Williamscmake_flags = " ".join(
119*02871c91SPatrick Williams    [
120*02871c91SPatrick Williams        "-DCMAKE_BUILD_TYPE=RelWithDebInfo",
121*02871c91SPatrick Williams        "-DBUILD_SHARED_LIBS=ON",
122*02871c91SPatrick Williams        f"-DCMAKE_INSTALL_PREFIX:PATH={prefix}",
123*02871c91SPatrick Williams    ]
124*02871c91SPatrick Williams)
125*02871c91SPatrick Williamsmeson_flags = " ".join(
126*02871c91SPatrick Williams    [
127*02871c91SPatrick Williams        "--wrap-mode=nodownload",
128*02871c91SPatrick Williams        f"-Dprefix={prefix}",
129*02871c91SPatrick Williams    ]
130*02871c91SPatrick Williams)
131*02871c91SPatrick Williams
132*02871c91SPatrick Williams
133*02871c91SPatrick Williamsdef stagename(name):
134*02871c91SPatrick Williams    if not name.startswith("openbmc/"):
135*02871c91SPatrick Williams        name = "openbmc/" + name
136*02871c91SPatrick Williams    return name.replace("/", "-")
137*02871c91SPatrick Williams
138*02871c91SPatrick Williams
139*02871c91SPatrick Williams# Build the commands needed to compose our final image
140*02871c91SPatrick Williams# We must sort the packages, otherwise we might produce an unstable
141*02871c91SPatrick Williams# docker file and rebuild the image unnecessarily
142*02871c91SPatrick Williamscopy_cmds = ""
143*02871c91SPatrick Williamsfor pkg in sorted(pkg_rev.keys()):
144*02871c91SPatrick Williams    copy_cmds += f"COPY --from={stagename(pkg)} {prefix} {prefix}\n"
145*02871c91SPatrick Williams    # Workaround for upstream docker bug and multiple COPY cmds
146*02871c91SPatrick Williams    # https://github.com/moby/moby/issues/37965
147*02871c91SPatrick Williams    copy_cmds += "RUN true\n"
148*02871c91SPatrick Williams
149*02871c91SPatrick Williams# Special flags if setting up a deb mirror.
150*02871c91SPatrick Williamsmirror = ""
151*02871c91SPatrick Williamsif "ubuntu" in distro and ubuntu_mirror:
152*02871c91SPatrick Williams    mirror = f"""
153*02871c91SPatrick WilliamsRUN echo "deb {ubuntu_mirror} $(. /etc/os-release && echo $VERSION_CODENAME) main restricted universe multiverse" > /etc/apt/sources.list && \\
154*02871c91SPatrick Williams    echo "deb {ubuntu_mirror} $(. /etc/os-release && echo $VERSION_CODENAME)-updates main restricted universe multiverse" >> /etc/apt/sources.list && \\
155*02871c91SPatrick Williams    echo "deb {ubuntu_mirror} $(. /etc/os-release && echo $VERSION_CODENAME)-security main restricted universe multiverse" >> /etc/apt/sources.list && \\
156*02871c91SPatrick Williams    echo "deb {ubuntu_mirror} $(. /etc/os-release && echo $VERSION_CODENAME)-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \\
157*02871c91SPatrick Williams    echo "deb {ubuntu_mirror} $(. /etc/os-release && echo $VERSION_CODENAME)-backports main restricted universe multiverse" >> /etc/apt/sources.list
158*02871c91SPatrick Williams"""
159*02871c91SPatrick Williams
160*02871c91SPatrick Williams# Special flags for proxying.
161*02871c91SPatrick Williamsproxy_cmd = ""
162*02871c91SPatrick Williamsproxy_args = []
163*02871c91SPatrick Williamsif http_proxy:
164*02871c91SPatrick Williams    proxy_cmd = f"""
165*02871c91SPatrick WilliamsRUN echo "[http]" >> {homedir}/.gitconfig && \
166*02871c91SPatrick Williams    echo "proxy = {http_proxy}" >> {homedir}/.gitconfig
167*02871c91SPatrick Williams"""
168*02871c91SPatrick Williams    proxy_args.extend(
169*02871c91SPatrick Williams        [
170*02871c91SPatrick Williams            "--build-arg",
171*02871c91SPatrick Williams            f"http_proxy={http_proxy}",
172*02871c91SPatrick Williams            "--build-arg",
173*02871c91SPatrick Williams            "https_proxy={https_proxy}",
174*02871c91SPatrick Williams        ]
175*02871c91SPatrick Williams    )
176*02871c91SPatrick Williams
177*02871c91SPatrick Williams# Create docker image that can run package unit tests
178*02871c91SPatrick Williamsdockerfile = f"""
179*02871c91SPatrick WilliamsFROM {docker_base}{distro} as openbmc-base
180*02871c91SPatrick Williams
181*02871c91SPatrick Williams{mirror}
182*02871c91SPatrick Williams
183*02871c91SPatrick WilliamsENV DEBIAN_FRONTEND noninteractive
184*02871c91SPatrick Williams
185*02871c91SPatrick WilliamsENV PYTHONPATH "/usr/local/lib/python3.8/site-packages/"
186*02871c91SPatrick Williams
187*02871c91SPatrick Williams# We need the keys to be imported for dbgsym repos
188*02871c91SPatrick Williams# New releases have a package, older ones fall back to manual fetching
189*02871c91SPatrick Williams# https://wiki.ubuntu.com/Debug%20Symbol%20Packages
190*02871c91SPatrick WilliamsRUN apt-get update && ( apt-get install ubuntu-dbgsym-keyring || ( apt-get install -yy dirmngr && \
191*02871c91SPatrick Williams    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622 ) )
192*02871c91SPatrick Williams
193*02871c91SPatrick Williams# Parse the current repo list into a debug repo list
194*02871c91SPatrick WilliamsRUN sed -n '/^deb /s,^deb [^ ]* ,deb http://ddebs.ubuntu.com ,p' /etc/apt/sources.list >/etc/apt/sources.list.d/debug.list
195*02871c91SPatrick Williams
196*02871c91SPatrick Williams# Remove non-existent debug repos
197*02871c91SPatrick WilliamsRUN sed -i '/-\(backports\|security\) /d' /etc/apt/sources.list.d/debug.list
198*02871c91SPatrick Williams
199*02871c91SPatrick WilliamsRUN cat /etc/apt/sources.list.d/debug.list
200*02871c91SPatrick Williams
201*02871c91SPatrick WilliamsRUN apt-get update && apt-get dist-upgrade -yy && apt-get install -yy \
202*02871c91SPatrick Williams    gcc-10 \
203*02871c91SPatrick Williams    g++-10 \
204*02871c91SPatrick Williams    libc6-dbg \
205*02871c91SPatrick Williams    libc6-dev \
206*02871c91SPatrick Williams    libtool \
207*02871c91SPatrick Williams    bison \
208*02871c91SPatrick Williams    libdbus-1-dev \
209*02871c91SPatrick Williams    flex \
210*02871c91SPatrick Williams    cmake \
211*02871c91SPatrick Williams    python3 \
212*02871c91SPatrick Williams    python3-dev\
213*02871c91SPatrick Williams    python3-yaml \
214*02871c91SPatrick Williams    python3-mako \
215*02871c91SPatrick Williams    python3-pip \
216*02871c91SPatrick Williams    python3-setuptools \
217*02871c91SPatrick Williams    python3-git \
218*02871c91SPatrick Williams    python3-socks \
219*02871c91SPatrick Williams    pkg-config \
220*02871c91SPatrick Williams    autoconf \
221*02871c91SPatrick Williams    autoconf-archive \
222*02871c91SPatrick Williams    libsystemd-dev \
223*02871c91SPatrick Williams    systemd \
224*02871c91SPatrick Williams    libssl-dev \
225*02871c91SPatrick Williams    libevdev-dev \
226*02871c91SPatrick Williams    libevdev2-dbgsym \
227*02871c91SPatrick Williams    libjpeg-dev \
228*02871c91SPatrick Williams    libpng-dev \
229*02871c91SPatrick Williams    ninja-build \
230*02871c91SPatrick Williams    sudo \
231*02871c91SPatrick Williams    curl \
232*02871c91SPatrick Williams    git \
233*02871c91SPatrick Williams    dbus \
234*02871c91SPatrick Williams    iputils-ping \
235*02871c91SPatrick Williams    clang-10 \
236*02871c91SPatrick Williams    clang-format-10 \
237*02871c91SPatrick Williams    clang-tidy-10 \
238*02871c91SPatrick Williams    clang-tools-10 \
239*02871c91SPatrick Williams    shellcheck \
240*02871c91SPatrick Williams    npm \
241*02871c91SPatrick Williams    iproute2 \
242*02871c91SPatrick Williams    libnl-3-dev \
243*02871c91SPatrick Williams    libnl-genl-3-dev \
244*02871c91SPatrick Williams    libconfig++-dev \
245*02871c91SPatrick Williams    libsnmp-dev \
246*02871c91SPatrick Williams    valgrind \
247*02871c91SPatrick Williams    valgrind-dbg \
248*02871c91SPatrick Williams    libpam0g-dev \
249*02871c91SPatrick Williams    xxd \
250*02871c91SPatrick Williams    libi2c-dev \
251*02871c91SPatrick Williams    wget \
252*02871c91SPatrick Williams    libldap2-dev \
253*02871c91SPatrick Williams    libprotobuf-dev \
254*02871c91SPatrick Williams    libperlio-gzip-perl \
255*02871c91SPatrick Williams    libjson-perl \
256*02871c91SPatrick Williams    protobuf-compiler \
257*02871c91SPatrick Williams    libgpiod-dev \
258*02871c91SPatrick Williams    device-tree-compiler \
259*02871c91SPatrick Williams    cppcheck \
260*02871c91SPatrick Williams    libpciaccess-dev \
261*02871c91SPatrick Williams    libmimetic-dev \
262*02871c91SPatrick Williams    libxml2-utils \
263*02871c91SPatrick Williams    libxml-simple-perl
264*02871c91SPatrick Williams
265*02871c91SPatrick WilliamsRUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 1000 \
266*02871c91SPatrick Williams  --slave /usr/bin/g++ g++ /usr/bin/g++-10 \
267*02871c91SPatrick Williams  --slave /usr/bin/gcov gcov /usr/bin/gcov-10 \
268*02871c91SPatrick Williams  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-10 \
269*02871c91SPatrick Williams  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-10
270*02871c91SPatrick Williams
271*02871c91SPatrick Williams
272*02871c91SPatrick WilliamsRUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 1000 \
273*02871c91SPatrick Williams  --slave /usr/bin/clang++ clang++ /usr/bin/clang++-10 \
274*02871c91SPatrick Williams  --slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-10 \
275*02871c91SPatrick Williams  --slave /usr/bin/clang-format clang-format /usr/bin/clang-format-10 \
276*02871c91SPatrick Williams  --slave /usr/bin/run-clang-tidy.py run-clang-tidy.py /usr/bin/run-clang-tidy-10.py
277*02871c91SPatrick Williams
278*02871c91SPatrick WilliamsRUN pip3 install inflection
279*02871c91SPatrick WilliamsRUN pip3 install pycodestyle
280*02871c91SPatrick WilliamsRUN pip3 install jsonschema
281*02871c91SPatrick WilliamsRUN pip3 install meson==0.54.3
282*02871c91SPatrick WilliamsRUN pip3 install protobuf
283*02871c91SPatrick Williams
284*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-lcov
285*02871c91SPatrick WilliamsRUN curl -L https://github.com/linux-test-project/lcov/archive/{pkg_rev['lcov']}.tar.gz | tar -xz && \
286*02871c91SPatrick Williamscd lcov-* && \
287*02871c91SPatrick Williamsmake -j{proc_count} && \
288*02871c91SPatrick Williamsmake install
289*02871c91SPatrick Williams
290*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-function2
291*02871c91SPatrick WilliamsRUN mkdir {prefix}/include/function2 && \
292*02871c91SPatrick Williamscurl -L -o {prefix}/include/function2/function2.hpp https://raw.githubusercontent.com/Naios/function2/{pkg_rev['function2']}/include/function2/function2.hpp
293*02871c91SPatrick Williams
294*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-googletest
295*02871c91SPatrick WilliamsRUN curl -L https://github.com/google/googletest/archive/{pkg_rev['googletest']}.tar.gz | tar -xz && \
296*02871c91SPatrick Williamscd googletest-* && \
297*02871c91SPatrick Williamsmkdir build && \
298*02871c91SPatrick Williamscd build && \
299*02871c91SPatrick WilliamsCXXFLAGS=-std=c++17 cmake {cmake_flags} -DTHREADS_PREFER_PTHREAD_FLAG=ON .. && \
300*02871c91SPatrick Williamsmake -j{proc_count} && \
301*02871c91SPatrick Williamsmake install
302*02871c91SPatrick Williams
303*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-catch2
304*02871c91SPatrick WilliamsRUN curl -L https://github.com/catchorg/Catch2/archive/{pkg_rev['catch2']}.tar.gz | tar -xz && \
305*02871c91SPatrick Williamscd Catch2-* && \
306*02871c91SPatrick Williamsmkdir build && \
307*02871c91SPatrick Williamscd build && \
308*02871c91SPatrick Williamscmake {cmake_flags} -DBUILD_TESTING=OFF -DCATCH_INSTALL_DOCS=OFF .. && \
309*02871c91SPatrick Williamsmake -j{proc_count} && \
310*02871c91SPatrick Williamsmake install
311*02871c91SPatrick Williams
312*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-cereal
313*02871c91SPatrick WilliamsRUN curl -L https://github.com/USCiLab/cereal/archive/{pkg_rev['cereal']}.tar.gz | tar -xz && \
314*02871c91SPatrick Williamscp -a cereal-*/include/cereal/ {prefix}/include/
315*02871c91SPatrick Williams
316*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-CLI11
317*02871c91SPatrick WilliamsRUN curl -L https://github.com/CLIUtils/CLI11/archive/{pkg_rev['CLI11']}.tar.gz | tar -xz && \
318*02871c91SPatrick Williamscd CLI11-* && \
319*02871c91SPatrick Williamsmkdir build && \
320*02871c91SPatrick Williamscd build && \
321*02871c91SPatrick Williamscmake {cmake_flags} -DCLI11_BUILD_DOCS=OFF -DBUILD_TESTING=OFF -DCLI11_BUILD_EXAMPLES=OFF .. && \
322*02871c91SPatrick Williamsmake -j{proc_count} && \
323*02871c91SPatrick Williamsmake install
324*02871c91SPatrick Williams
325*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-fmt
326*02871c91SPatrick WilliamsRUN curl -L https://github.com/fmtlib/fmt/archive/{pkg_rev['fmt']}.tar.gz | tar -xz && \
327*02871c91SPatrick Williamscd fmt-* && \
328*02871c91SPatrick Williamsmkdir build && \
329*02871c91SPatrick Williamscd build && \
330*02871c91SPatrick Williamscmake {cmake_flags} -DFMT_DOC=OFF -DFMT_TEST=OFF .. && \
331*02871c91SPatrick Williamsmake -j{proc_count} && \
332*02871c91SPatrick Williamsmake install
333*02871c91SPatrick Williams
334*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-json
335*02871c91SPatrick WilliamsRUN mkdir {prefix}/include/nlohmann/ && \
336*02871c91SPatrick Williamscurl -L -o {prefix}/include/nlohmann/json.hpp https://github.com/nlohmann/json/releases/download/{pkg_rev['json']}/json.hpp && \
337*02871c91SPatrick Williamsln -s nlohmann/json.hpp {prefix}/include/json.hpp
338*02871c91SPatrick Williams
339*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-fifo_map
340*02871c91SPatrick WilliamsRUN curl -L https://github.com/nlohmann/fifo_map/archive/{pkg_rev['fifo_map']}.tar.gz | tar -xz && \
341*02871c91SPatrick Williamscd fifo_map-*/src && cp fifo_map.hpp {prefix}/include/
342*02871c91SPatrick Williams
343*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-span-lite
344*02871c91SPatrick WilliamsRUN curl -L https://github.com/martinmoene/span-lite/archive/{pkg_rev['span-lite']}.tar.gz | tar -xz && \
345*02871c91SPatrick Williamscd span-lite-* && \
346*02871c91SPatrick Williamsmkdir build && \
347*02871c91SPatrick Williamscd build && \
348*02871c91SPatrick Williamscmake {cmake_flags} -DSPAN_LITE_OPT_BUILD_TESTS=OFF .. && \
349*02871c91SPatrick Williamsmake -j{proc_count} && \
350*02871c91SPatrick Williamsmake install
351*02871c91SPatrick Williams
352*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-linux-headers
353*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/linux/archive/{pkg_rev['linux-headers']}.tar.gz | tar -xz && \
354*02871c91SPatrick Williamscd linux-* && \
355*02871c91SPatrick Williamsmake -j{proc_count} defconfig && \
356*02871c91SPatrick Williamsmake INSTALL_HDR_PATH=/usr/local headers_install
357*02871c91SPatrick Williams
358*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-boost
359*02871c91SPatrick WilliamsRUN curl -L https://dl.bintray.com/boostorg/release/{pkg_rev['boost']}/source/boost_$(echo "{pkg_rev['boost']}" | tr '.' '_').tar.bz2 | tar -xj && \
360*02871c91SPatrick Williamscd boost_*/ && \
361*02871c91SPatrick Williams./bootstrap.sh --prefix={prefix} --with-libraries=context,coroutine && \
362*02871c91SPatrick Williams./b2 && ./b2 install --prefix={prefix}
363*02871c91SPatrick Williams
364*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-tinyxml2
365*02871c91SPatrick WilliamsRUN curl -L https://github.com/leethomason/tinyxml2/archive/{pkg_rev['tinyxml2']}.tar.gz | tar -xz && \
366*02871c91SPatrick Williamscd tinyxml2-* && \
367*02871c91SPatrick Williamsmkdir build && \
368*02871c91SPatrick Williamscd build && \
369*02871c91SPatrick Williamscmake {cmake_flags} .. && \
370*02871c91SPatrick Williamsmake -j{proc_count} && \
371*02871c91SPatrick Williamsmake install
372*02871c91SPatrick Williams
373*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-boost-url
374*02871c91SPatrick WilliamsRUN curl -L https://github.com/CPPAlliance/url/archive/{pkg_rev['boost-url']}.tar.gz | tar -xz && \
375*02871c91SPatrick Williamscd url-* && \
376*02871c91SPatrick Williamsmkdir buildir && \
377*02871c91SPatrick Williamscd buildir && \
378*02871c91SPatrick Williamscmake {cmake_flags} -DBOOST_URL_STANDALONE=ON -DBOOST_URL_BUILD_TESTS=OFF -DBOOST_URL_BUILD_EXAMPLES=OFF .. && \
379*02871c91SPatrick Williamsmake -j{proc_count} && \
380*02871c91SPatrick Williamsmake install
381*02871c91SPatrick Williams
382*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-valijson
383*02871c91SPatrick WilliamsRUN curl -L https://github.com/tristanpenman/valijson/archive/{pkg_rev['valijson']}.tar.gz | tar -xz && \
384*02871c91SPatrick Williamscd valijson-* && \
385*02871c91SPatrick Williamsmkdir build && \
386*02871c91SPatrick Williamscd build && \
387*02871c91SPatrick Williamscmake {cmake_flags} -DINSTALL_HEADERS=1 -DBUILD_TESTS=0 .. && \
388*02871c91SPatrick Williamsmake -j{proc_count} && \
389*02871c91SPatrick Williamsmake install
390*02871c91SPatrick Williams
391*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-libvncserver
392*02871c91SPatrick WilliamsRUN curl -L https://github.com/LibVNC/libvncserver/archive/{pkg_rev['libvncserver']}.tar.gz | tar -xz && \
393*02871c91SPatrick Williamscd libvncserver-* && \
394*02871c91SPatrick Williamsmkdir build && \
395*02871c91SPatrick Williamscd build && \
396*02871c91SPatrick Williamscmake {cmake_flags} .. && \
397*02871c91SPatrick Williamsmake -j{proc_count} && \
398*02871c91SPatrick Williamsmake install
399*02871c91SPatrick Williams
400*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-stdplus
401*02871c91SPatrick WilliamsCOPY --from=openbmc-fmt {prefix} {prefix}
402*02871c91SPatrick WilliamsCOPY --from=openbmc-span-lite {prefix} {prefix}
403*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/stdplus/archive/{pkg_rev['openbmc/stdplus']}.tar.gz | tar -xz && \
404*02871c91SPatrick Williamscd stdplus-* && \
405*02871c91SPatrick Williamsmeson build {meson_flags} -Dtests=disabled -Dexamples=false && \
406*02871c91SPatrick Williamsninja -C build && \
407*02871c91SPatrick Williamsninja -C build install
408*02871c91SPatrick Williams
409*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-sdbusplus
410*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/sdbusplus/archive/{pkg_rev['openbmc/sdbusplus']}.tar.gz | tar -xz && \
411*02871c91SPatrick Williamscd sdbusplus-* && \
412*02871c91SPatrick Williamscd tools && ./setup.py install --root=/ --prefix={prefix} && \
413*02871c91SPatrick Williamscd .. && meson build {meson_flags} -Dtests=disabled -Dexamples=disabled && \
414*02871c91SPatrick Williamsninja -C build && \
415*02871c91SPatrick Williamsninja -C build install
416*02871c91SPatrick Williams
417*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-sdeventplus
418*02871c91SPatrick WilliamsCOPY --from=openbmc-function2 {prefix} {prefix}
419*02871c91SPatrick WilliamsCOPY --from=openbmc-stdplus {prefix} {prefix}
420*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/sdeventplus/archive/{pkg_rev['openbmc/sdeventplus']}.tar.gz | tar -xz && \
421*02871c91SPatrick Williamscd sdeventplus-* && \
422*02871c91SPatrick Williamsmeson build {meson_flags} -Dtests=disabled -Dexamples=false && \
423*02871c91SPatrick Williamsninja -C build && \
424*02871c91SPatrick Williamsninja -C build install
425*02871c91SPatrick Williams
426*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-gpioplus
427*02871c91SPatrick WilliamsCOPY --from=openbmc-stdplus {prefix} {prefix}
428*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/gpioplus/archive/{pkg_rev['openbmc/gpioplus']}.tar.gz | tar -xz && \
429*02871c91SPatrick Williamscd gpioplus-* && \
430*02871c91SPatrick Williamsmeson build {meson_flags} -Dtests=disabled -Dexamples=false && \
431*02871c91SPatrick Williamsninja -C build && \
432*02871c91SPatrick Williamsninja -C build install
433*02871c91SPatrick Williams
434*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-phosphor-dbus-interfaces
435*02871c91SPatrick WilliamsCOPY --from=openbmc-sdbusplus {prefix} {prefix}
436*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/phosphor-dbus-interfaces/archive/{pkg_rev['openbmc/phosphor-dbus-interfaces']}.tar.gz | tar -xz && \
437*02871c91SPatrick Williamscd phosphor-dbus-interfaces-* && \
438*02871c91SPatrick Williamsmeson build {meson_flags} -Ddata_org_open_power=true -Ddata_com_ibm=true && \
439*02871c91SPatrick Williamsninja -C build && \
440*02871c91SPatrick Williamsninja -C build install
441*02871c91SPatrick Williams
442*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-phosphor-logging
443*02871c91SPatrick WilliamsCOPY --from=openbmc-cereal {prefix} {prefix}
444*02871c91SPatrick WilliamsCOPY --from=openbmc-sdbusplus {prefix} {prefix}
445*02871c91SPatrick WilliamsCOPY --from=openbmc-sdeventplus {prefix} {prefix}
446*02871c91SPatrick WilliamsCOPY --from=openbmc-phosphor-dbus-interfaces {prefix} {prefix}
447*02871c91SPatrick WilliamsCOPY --from=openbmc-fifo_map {prefix} {prefix}
448*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/phosphor-logging/archive/{pkg_rev['openbmc/phosphor-logging']}.tar.gz | tar -xz && \
449*02871c91SPatrick Williamscd phosphor-logging-* && \
450*02871c91SPatrick Williams./bootstrap.sh && \
451*02871c91SPatrick Williams./configure {configure_flags} --enable-metadata-processing YAML_DIR={prefix}/share/phosphor-dbus-yaml/yaml && \
452*02871c91SPatrick Williamsmake -j{proc_count} && \
453*02871c91SPatrick Williamsmake install
454*02871c91SPatrick Williams
455*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-phosphor-objmgr
456*02871c91SPatrick WilliamsCOPY --from=openbmc-boost {prefix} {prefix}
457*02871c91SPatrick WilliamsCOPY --from=openbmc-sdbusplus {prefix} {prefix}
458*02871c91SPatrick WilliamsCOPY --from=openbmc-tinyxml2 {prefix} {prefix}
459*02871c91SPatrick WilliamsCOPY --from=openbmc-phosphor-logging {prefix} {prefix}
460*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/phosphor-objmgr/archive/{pkg_rev['openbmc/phosphor-objmgr']}.tar.gz | tar -xz && \
461*02871c91SPatrick Williamscd phosphor-objmgr-* && \
462*02871c91SPatrick Williams./bootstrap.sh && \
463*02871c91SPatrick Williams./configure {configure_flags} && \
464*02871c91SPatrick Williamsmake -j{proc_count} && \
465*02871c91SPatrick Williamsmake install
466*02871c91SPatrick Williams
467*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-open-power-pdbg
468*02871c91SPatrick WilliamsRUN curl -L https://github.com/open-power/pdbg/archive/{pkg_rev['open-power/pdbg']}.tar.gz | tar -xz && \
469*02871c91SPatrick Williamscd pdbg-* && \
470*02871c91SPatrick Williams./bootstrap.sh && \
471*02871c91SPatrick Williams./configure {configure_flags} && \
472*02871c91SPatrick Williamsmake -j{proc_count} && \
473*02871c91SPatrick Williamsmake install
474*02871c91SPatrick Williams
475*02871c91SPatrick WilliamsFROM openbmc-base as openbmc-pldm
476*02871c91SPatrick WilliamsCOPY --from=openbmc-sdbusplus {prefix} {prefix}
477*02871c91SPatrick WilliamsCOPY --from=openbmc-sdeventplus {prefix} {prefix}
478*02871c91SPatrick WilliamsCOPY --from=openbmc-boost {prefix} {prefix}
479*02871c91SPatrick WilliamsCOPY --from=openbmc-phosphor-dbus-interfaces {prefix} {prefix}
480*02871c91SPatrick WilliamsCOPY --from=openbmc-phosphor-logging {prefix} {prefix}
481*02871c91SPatrick WilliamsCOPY --from=openbmc-json {prefix} {prefix}
482*02871c91SPatrick WilliamsCOPY --from=openbmc-CLI11 {prefix} {prefix}
483*02871c91SPatrick WilliamsRUN curl -L https://github.com/openbmc/pldm/archive/{pkg_rev['openbmc/pldm']}.tar.gz | tar -xz && \
484*02871c91SPatrick Williamscd pldm-* && \
485*02871c91SPatrick Williamsmeson build {meson_flags} -Dlibpldm-only=enabled -Doem-ibm=enabled -Dtests=disabled && \
486*02871c91SPatrick Williamsninja -C build && \
487*02871c91SPatrick Williamsninja -C build install
488*02871c91SPatrick Williams
489*02871c91SPatrick Williams# Build the final output image
490*02871c91SPatrick WilliamsFROM openbmc-base
491*02871c91SPatrick Williams{copy_cmds}
492*02871c91SPatrick Williams
493*02871c91SPatrick Williams# Some of our infrastructure still relies on the presence of this file
494*02871c91SPatrick Williams# even though it is no longer needed to rebuild the docker environment
495*02871c91SPatrick Williams# NOTE: The file is sorted to ensure the ordering is stable.
496*02871c91SPatrick WilliamsRUN echo '{depcache}' > /tmp/depcache
497*02871c91SPatrick Williams
498*02871c91SPatrick Williams# Final configuration for the workspace
499*02871c91SPatrick WilliamsRUN grep -q {gid} /etc/group || groupadd -g {gid} {username}
500*02871c91SPatrick WilliamsRUN mkdir -p "{os.path.dirname(homedir)}"
501*02871c91SPatrick WilliamsRUN grep -q {uid} /etc/passwd || useradd -d {homedir} -m -u {uid} -g {gid} {username}
502*02871c91SPatrick WilliamsRUN sed -i '1iDefaults umask=000' /etc/sudoers
503*02871c91SPatrick WilliamsRUN echo "{username} ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
504*02871c91SPatrick Williams
505*02871c91SPatrick Williams{proxy_cmd}
506*02871c91SPatrick Williams
507*02871c91SPatrick WilliamsRUN /bin/bash
508*02871c91SPatrick Williams"""
509*02871c91SPatrick Williams
510*02871c91SPatrick Williams# Do the docker build.
511*02871c91SPatrick Williamsfor line in docker.build(
512*02871c91SPatrick Williams    proxy_args,
513*02871c91SPatrick Williams    "--network=host",
514*02871c91SPatrick Williams    "-t",
515*02871c91SPatrick Williams    docker_image_name,
516*02871c91SPatrick Williams    "-",
517*02871c91SPatrick Williams    _in=dockerfile,
518*02871c91SPatrick Williams    _iter=True,
519*02871c91SPatrick Williams):
520*02871c91SPatrick Williams    print(line, end="", flush=True)
521