Skip to content

Commit e3f3c6d

Browse files
committed
use ubuntu 22.04 with clang-14 and asan hacks
1 parent 1be3959 commit e3f3c6d

File tree

2 files changed

+108
-77
lines changed

2 files changed

+108
-77
lines changed

.dockerignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
.github
22
.gitlab-ci.yml
3+
.git
34
Dockerfile
5+
.dockerignore
46
.vscode
57
.idea
68
README.md
79
CODEOWNERS
10+

Dockerfile

Lines changed: 105 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,70 @@
11
# syntax = docker/dockerfile:experimental
2-
FROM ubuntu:20.04 AS build-base-stage
2+
FROM ubuntu:22.04 AS build-base-stage
33

44
WORKDIR /
55

6-
ENV BUILDKIT_VERSION "v0.8.2"
7-
ENV BUILDCTL_SHA256 "b64aec46fb438ea844616b3205c33b01a3a49ea7de1f8539abd0daeb4f07b9f9"
8-
ENV INDENT_SHA256 "12185be748db620f8f7799ea839f0d10ce643b9f5ab1805c960e56eb27941236"
9-
ENV LIBC_SHA256 "9a8caf9f33448a8f2f526e94d00c70cdbdd735caec510df57b3283413df7882a"
10-
# Go version in ppa:longsleep/golang-backports
11-
ENV GO_PACKAGE "golang-1.22-go"
12-
13-
COPY vpp/Makefile /vpp-src/Makefile
14-
COPY vpp/build/external /vpp-src/build/external
15-
16-
RUN echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections
17-
18-
# netbase is needed for Scapy
196
RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
207
--mount=target=/var/cache/apt,type=cache,sharing=private \
8+
echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections && \
9+
echo "debconf debconf/frontend select Noninteractive" | debconf-set-selections && \
2110
apt-get update && \
11+
apt-get install -y software-properties-common && \
2212
apt-get dist-upgrade -yy && \
23-
apt-get install -y software-properties-common ccache && \
13+
# add reporistory for newer golang releases
2414
add-apt-repository ppa:longsleep/golang-backports && \
2515
apt-get update && \
26-
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
27-
build-essential sudo git netbase curl ca-certificates \
28-
${GO_PACKAGE} iproute2 gdb tcpdump iputils-ping libpcap-dev \
29-
dumb-init gdbserver clang-11 libasan6 && \
30-
curl -sSL "https://github.com/moby/buildkit/releases/download/${BUILDKIT_VERSION}/buildkit-${BUILDKIT_VERSION}.linux-amd64.tar.gz" | \
31-
tar -xvz -C /usr/local bin/buildctl && \
32-
echo "${BUILDCTL_SHA256} /usr/local/bin/buildctl" | sha256sum -c && \
16+
apt-get install -y --no-install-recommends \
17+
software-properties-common build-essential sudo git \
18+
# netbase is needed for Scapy
19+
netbase curl ca-certificates iproute2 gdb tcpdump iputils-ping \
20+
# use ccache for clang object files caching
21+
ccache libpcap-dev dumb-init gdbserver \
22+
# golang installed from ppa
23+
golang-1.23-go \
24+
# clang also installed in vpp Makefile, make sure to match versions
25+
clang \
26+
# llvm provides llc for xdp-tools build
27+
llvm \
28+
# golang installs gcc-12 which clang uses via auto-detection for stdc++ library.
29+
# But gcc-12 omits c++ stuff, so we add it manually. libstdc++-12-dev should be enough, but entire g++ is not that heavy to add.
30+
g++-12 \
31+
&& \
32+
ln -s /usr/lib/go-1.23/bin/go /usr/bin/go && \
33+
ln -s /usr/lib/go-1.23/bin/gofmt /usr/bin/gofmt && \
34+
# set clang as default C and C++ compiler
35+
update-alternatives --set c++ /usr/bin/clang++ && \
36+
update-alternatives --set cc /usr/bin/clang &&\
37+
apt-get clean
38+
39+
ENV PATH="/usr/lib/ccache:$PATH" \
40+
CCACHE_DIR=/ccache \
41+
CCACHE_MAXSIZE=400M \
42+
CCACHE_COMPRESS=true \
43+
CCACHE_COMPRESSLEVEL=6 \
44+
GOPATH=/go
45+
46+
RUN go install github.com/onsi/ginkgo/[email protected] && \
47+
mv /go/bin/ginkgo /usr/local/bin && \
48+
go install golang.org/x/tools/[email protected] && \
49+
mv /go/bin/gopls /usr/local/bin
50+
51+
COPY vpp/Makefile /vpp-src/Makefile
52+
COPY vpp/build/external /vpp-src/build/external
53+
54+
RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
55+
--mount=target=/var/cache/apt,type=cache,sharing=private \
56+
--mount=target=/ccache,type=cache \
3357
cd /vpp-src && \
34-
curl -sSL -O http://mirrors.kernel.org/ubuntu/pool/main/i/indent/indent_2.2.12-1_amd64.deb && \
35-
echo "${INDENT_SHA256} /vpp-src/indent_2.2.12-1_amd64.deb" | sha256sum -c && \
36-
apt-get install -y --no-install-recommends \
37-
/vpp-src/indent_2.2.12-1_amd64.deb && \
38-
rm /vpp-src/indent_2.2.12-1_amd64.deb && \
3958
git config --global user.email "[email protected]" && \
4059
git config --global user.name "dummy user" && \
4160
git init && \
4261
git add Makefile && \
4362
git commit -m "dummy commit" && \
44-
git tag -a v20.05-rc0 -m "dummy tag" && \
63+
# version requred to have this format
64+
git tag -a v24.02-rc0 -m "dummy tag" && \
4565
make UNATTENDED=yes install-dep install-ext-dep && \
46-
apt-get clean && \
4766
rm -rf /vpp-src && \
48-
ln -s /usr/lib/go-1.22/bin/go /usr/bin/go && \
49-
ln -s /usr/lib/go-1.22/bin/gofmt /usr/bin/gofmt
50-
51-
ENV PATH="/usr/lib/ccache:$PATH"
52-
ENV CCACHE_DIR=/ccache
53-
ENV CCACHE_MAXSIZE=400M
54-
ENV CCACHE_COMPRESS=true
55-
ENV CCACHE_COMPRESSLEVEL=6
56-
57-
ENV GOPATH /go
58-
59-
RUN go install github.com/onsi/ginkgo/[email protected] && \
60-
mv /go/bin/ginkgo /usr/local/bin
61-
62-
RUN go install golang.org/x/tools/[email protected] && \
63-
mv /go/bin/gopls /usr/local/bin
67+
apt-get clean
6468

6569
FROM build-base-stage AS build-stage
6670

@@ -72,11 +76,19 @@ ARG BUILD_TYPE
7276
RUN --mount=target=/vpp-src/build-root/.ccache,type=cache \
7377
--mount=target=/ccache,type=cache \
7478
case ${BUILD_TYPE} in \
75-
debug) target="pkg-deb-debug"; args="-DVPP_ENABLE_TRAJECTORY_TRACE=1 -DVPP_ENABLE_SANITIZE_ADDR=ON";; \
76-
release) target="pkg-deb"; args="";; \
77-
*) echo >&2 "Bad BUILD_TYPE: ${BUILD_TYPE}";; \
79+
debug) \
80+
target="pkg-deb-debug"; \
81+
args="-DVPP_ENABLE_TRAJECTORY_TRACE=1 -DVPP_ENABLE_SANITIZE_ADDR=ON"; \
82+
;; \
83+
release) \
84+
target="pkg-deb"; \
85+
args=""; \
86+
;; \
87+
*) \
88+
echo >&2 "Bad BUILD_TYPE: ${BUILD_TYPE}"; \
89+
;; \
7890
esac; \
79-
echo "TARGET: ${target}" && \
91+
echo "Building target: ${target} with flags ${args}" && \
8092
make -C /vpp-src "${target}" V=1 VPP_EXTRA_CMAKE_ARGS="${args}" && \
8193
ccache -s && \
8294
mkdir -p /out/debs && \
@@ -89,62 +101,78 @@ COPY --from=build-stage /out/debs .
89101

90102
# dev image starts here
91103
FROM build-base-stage AS dev-stage
104+
ARG BUILD_TYPE
92105

93106
RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
94107
--mount=target=/var/cache/apt,type=cache,sharing=private \
95108
--mount=target=/debs,source=/out/debs,from=build-stage,type=bind \
96109
apt-get install --no-install-recommends -yy \
97-
/debs/vpp_*.deb \
98-
/debs/vpp-dbg_*.deb \
99-
/debs/vpp-plugin-core_*.deb \
100-
/debs/vpp-plugin-devtools_*.deb \
101-
/debs/vpp-plugin-dpdk*.deb \
102-
/debs/libvppinfra_*.deb \
103-
/debs/python3-vpp-api_*.deb \
104-
/debs/vpp-dev_*.deb \
105-
/debs/libvppinfra-dev_*.deb && \
110+
/debs/vpp_*.deb \
111+
/debs/vpp-dbg_*.deb \
112+
/debs/vpp-plugin-core_*.deb \
113+
/debs/vpp-plugin-devtools_*.deb \
114+
/debs/vpp-plugin-dpdk*.deb \
115+
/debs/libvppinfra_*.deb \
116+
/debs/python3-vpp-api_*.deb \
117+
/debs/vpp-dev_*.deb \
118+
/debs/libvppinfra-dev_*.deb && \
119+
if [ "${BUILD_TYPE}" = "debug" ]; then \
120+
# Add stdc++ as dependency to vpp, so ASAN can intercept c++ stuff
121+
apt-get install --no-install-recommends -yy patchelf && \
122+
patchelf --add-needed $(realpath -s $(clang -print-file-name=libstdc++.so)) $(which vpp) && true; \
123+
fi && \
106124
apt-get clean
107125

108126
# use clean vpp source so as not to make the image too bloated
109127
ADD vpp /vpp-src
110128
# provide symlinks needed for running the Pythonic integration tests
111129
RUN mkdir -p /vpp-src/build-root/build-test/src && \
112-
ln -fs /vpp-src/test/* /vpp-src/build-root/build-test/src/
113-
# fix git repo ownership issue
114-
RUN git config --global --add safe.directory /src
130+
ln -fs /vpp-src/test/* /vpp-src/build-root/build-test/src/ && \
131+
# fix git repo ownership issue
132+
git config --global --add safe.directory /src
115133

116134
# final image starts here
117-
FROM ubuntu:20.04 AS final-stage
135+
FROM ubuntu:22.04 AS final-stage
118136
ARG BUILD_TYPE
119137
WORKDIR /
120138

121139
ENV VPP_INSTALL_SKIP_SYSCTL=1
122140
RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
123141
--mount=target=/var/cache/apt,type=cache,sharing=private \
124142
apt-get update && apt-get dist-upgrade -yy && \
125-
apt-get install --no-install-recommends -yy liblz4-tool tar gdb gdbserver strace \
126-
libhyperscan5 libmbedcrypto3 libmbedtls12 libmbedx509-0 apt-utils \
127-
libpython3-stdlib libasan6 \
128-
python3 python3-minimal python3.6 python3-minimal \
129-
python3-cffi python3-cffi-backend libnuma1 \
130-
libnl-3-200 libnl-route-3-200 libpcap0.8
143+
apt-get install --no-install-recommends -yy \
144+
liblz4-tool tar gdb gdbserver strace apt-utils \
145+
libhyperscan5 libmbedcrypto7 libmbedtls-dev libmbedx509-1 \
146+
python3 python3-minimal libpython3-stdlib \
147+
python3-cffi python3-cffi-backend libnuma1 \
148+
libnl-3-200 libnl-route-3-200 libpcap0.8
131149

132150
RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
133151
--mount=target=/var/cache/apt,type=cache,sharing=private \
134152
--mount=target=/debs,source=/out/debs,from=build-stage,type=bind \
135153
extra_debs=; \
136154
if [ "${BUILD_TYPE}" = "debug" ]; then \
137-
extra_debs="/debs/vpp-dev_*.deb /debs/libvppinfra-dev_*.deb"; \
155+
extra_debs="${extra_debs} /debs/vpp-dev_*.deb"; \
156+
extra_debs="${extra_debs} /debs/libvppinfra-dev_*.deb"; \
157+
# libasan8 compatible with clang-14/gcc-12
158+
extra_debs="${extra_debs} libasan8"; \
159+
# Add stdc++ as dependency to vpp, so ASAN can intercept c++ stuff
160+
extra_debs="${extra_debs} patchelf"; \
161+
extra_debs="${extra_debs} libstdc++6"; \
138162
fi && \
139163
apt-get install --no-install-recommends -yy \
140-
/debs/vpp_*.deb \
141-
/debs/vpp-dbg_*.deb \
142-
/debs/vpp-plugin-core_*.deb \
143-
/debs/vpp-plugin-devtools_*.deb \
144-
/debs/vpp-plugin-dpdk*.deb \
145-
/debs/libvppinfra_*.deb \
146-
/debs/python3-vpp-api_*.deb \
147-
${extra_debs} && \
164+
/debs/vpp_*.deb \
165+
/debs/vpp-dbg_*.deb \
166+
/debs/vpp-plugin-core_*.deb \
167+
/debs/vpp-plugin-devtools_*.deb \
168+
/debs/vpp-plugin-dpdk*.deb \
169+
/debs/libvppinfra_*.deb \
170+
/debs/python3-vpp-api_*.deb \
171+
${extra_debs} && \
172+
if [ "${BUILD_TYPE}" = "debug" ]; then \
173+
# Add stdc++ as dependency to vpp, so ASAN can intercept c++ stuff
174+
patchelf --add-needed /usr/lib/gcc/x86_64-linux-gnu/12/libstdc++.so $(which vpp) && true; \
175+
fi && \
148176
apt-get clean
149177

150178
ENTRYPOINT /usr/bin/vpp

0 commit comments

Comments
 (0)