1# Copyright 2019 Google Inc. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# 15################################################################################ 16 17FROM gcr.io/oss-fuzz-base/base-builder 18MAINTAINER mhl@fb.com 19 20# Install packages we need to build dependencies 21RUN apt-get update && \ 22 apt-get install -y \ 23 make \ 24 autoconf \ 25 automake \ 26 libtool \ 27 sudo \ 28 wget \ 29 gcc \ 30 g++ \ 31 python \ 32 python-dev 33 34# We need a newer version of CMake than is available in the base builder image 35RUN wget https://github.com/Kitware/CMake/releases/download/v3.15.2/cmake-3.15.2.tar.gz && \ 36 tar xzf cmake-3.15.2.tar.gz && \ 37 cd cmake-3.15.2 && \ 38 export CC=clang && \ 39 export CXX=clang++ && \ 40 CXXFLAGS="" && \ 41 CFLAGS="" && \ 42 ./bootstrap && \ 43 make -j$(nproc) && \ 44 make install && \ 45 cd .. && \ 46 rm -rf cmake-3.15.2 47 48# Install and build boost from source so we can have it use libc++ 49RUN wget https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz && \ 50 tar xzf boost_1_70_0.tar.gz && \ 51 cd boost_1_70_0 && \ 52 ./bootstrap.sh --with-toolset=clang && \ 53 ./b2 clean && \ 54 ./b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" -j$(nproc) install && \ 55 cd .. && \ 56 rm -rf boost_1_70_0 57 58# Build gflags/glog/gtest from source so we use libc++ and avoid incompatibilities with the std::string ABI breaking changes 59RUN sudo apt-get purge libgflags-dev 60 61RUN wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz && \ 62 tar xzf v2.2.2.tar.gz && \ 63 cd gflags-2.2.2 && \ 64 mkdir build && \ 65 cd build && \ 66 export CC=clang && \ 67 export CXX=clang++ && \ 68 export CXXFLAGS="-stdlib=libc++" && \ 69 cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. && \ 70 make -j$(nproc) && \ 71 sudo make install && \ 72 cd ../../ && \ 73 rm -rf gflags-2.2.2 74 75RUN wget https://github.com/google/glog/archive/v0.4.0.tar.gz && \ 76 tar xzf v0.4.0.tar.gz && \ 77 cd glog-0.4.0 && \ 78 export CC=clang && \ 79 export CXX=clang++ && \ 80 export CXXFLAGS="-stdlib=libc++" && \ 81 mkdir build && \ 82 cd build && \ 83 cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE=ON .. && \ 84 make -j$(nproc) && \ 85 sudo make install && \ 86 cd ../.. && \ 87 rm -rf glog-0.4.0 88 89RUN wget https://github.com/google/googletest/archive/release-1.8.1.tar.gz && \ 90 tar xzf release-1.8.1.tar.gz && \ 91 cd googletest-release-1.8.1 && \ 92 export CC=clang && \ 93 export CXX=clang++ && \ 94 export CXXFLAGS="-stdlib=libc++" && \ 95 mkdir build && \ 96 cd build && \ 97 cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE=ON .. && \ 98 make -j$(nproc) && \ 99 sudo make install && \ 100 cd ../.. && \ 101 rm -rf googletest-release-1.8.1 102 103# Build and install zstd from source so we have it available for proxygen 104RUN wget https://github.com/facebook/zstd/releases/download/v1.4.2/zstd-1.4.2.tar.gz && \ 105 tar xzf zstd-1.4.2.tar.gz && \ 106 cd zstd-1.4.2 && \ 107 export CC=clang && \ 108 export CXX=clang++ && \ 109 export CXXFLAGS="-stdlib=libc++" && \ 110 sudo make -j$(nproc) install && \ 111 cd .. && \ 112 rm -rf zstd-1.4.2 113 114# Build and install `fmt` needed by folly 115RUN wget https://github.com/fmtlib/fmt/archive/6.0.0.tar.gz && \ 116 tar xzf 6.0.0.tar.gz && \ 117 cd fmt-6.0.0 && \ 118 export CC=clang && \ 119 export CXX=clang++ && \ 120 export CXXFLAGS="-stdlib=libc++" && \ 121 mkdir build && \ 122 cd build && \ 123 cmake .. && \ 124 make -j$(nproc) && \ 125 sudo make install && \ 126 cd ../.. && \ 127 rm -rf fmt-6.0.0 128 129# Replicate `install-dependencies` from the proxygen `build.sh` script 130RUN apt-get install -y \ 131 git \ 132 flex \ 133 bison \ 134 libkrb5-dev \ 135 libsasl2-dev \ 136 libnuma-dev \ 137 pkg-config \ 138 libssl-dev \ 139 libcap-dev \ 140 gperf \ 141 libevent-dev \ 142 libtool \ 143 libjemalloc-dev \ 144 unzip \ 145 libiberty-dev \ 146 liblzma-dev \ 147 zlib1g-dev \ 148 binutils-dev \ 149 libsodium-dev \ 150 libdouble-conversion-dev \ 151 libunwind8-dev 152 153# Install patchelf so we can fix path to libunwind 154RUN apt-get install patchelf 155 156# Fetch source and copy over files 157RUN git clone --depth 1 https://github.com/facebook/proxygen.git proxygen 158WORKDIR proxygen 159COPY build.sh $SRC/