Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dockerized LLVM #1914

Merged
merged 8 commits into from
Nov 28, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions programs/bpf/c/sdk/bpf.mk
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,14 @@ SRC_DIR ?= ./src
TEST_DIR ?= ./test
OUT_DIR ?= ./out

ifeq ($(DOCKER),1)
LLVM_DIR = $(LOCAL_PATH)llvm/llvm-docker
else
OS=$(shell uname)
ifeq ($(OS),Darwin)
LLVM_DIR ?= $(shell brew --prefix llvm)
endif
endif

ifdef LLVM_DIR
CC := $(LLVM_DIR)/bin/clang
Expand All @@ -29,14 +33,14 @@ LLC := llc-7
OBJ_DUMP := llvm-objdump-7
endif

SYSTEM_INC_DIRS := -isystem $(LOCAL_PATH)inc
SYSTEM_INC_DIRS := $(LOCAL_PATH)inc

C_FLAGS := \
-Werror \
-O2 \
-fno-builtin \
-std=c17 \
$(SYSTEM_INC_DIRS) \
$(addprefix -isystem,$(SYSTEM_INC_DIRS)) \
$(addprefix -I,$(INC_DIRS))

CXX_FLAGS := \
Expand Down Expand Up @@ -88,6 +92,7 @@ TEST_CXX_FLAGS := \
$(TESTFRAMEWORK_FLAGS) \

help:
@echo ''
@echo 'BPF Program makefile'
@echo ''
@echo 'This makefile will build BPF Programs from C or C++ source files into ELFs'
Expand All @@ -102,8 +107,11 @@ help:
@echo ''
@echo 'User settings'
@echo ' - The following setting are overridable on the command line, default values shown:'
@echo ' - Show commands while building:'
@echo ' V=1'
@echo ' - Show commands while building: V=1'
@echo ' V=$(V)'
@echo ' - Use LLVM from docker: DOCKER=1'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably should document somewhere around here that the user needs to docker pull solanalabs/llvm

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't docker do that automagically if it does not find the docker locally?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nerp

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about pull as part of the script or is that just wasteful?

#!/usr/bin/env bash
set -ex
SDKPATH="$( cd "$(dirname "$0")" ; pwd -P )"/../../../..
docker pull solanalabs/llvm
docker run --workdir /solana_sdk --volume $SDKPATH:/solana_sdk --rm solanalabs/llvm `basename "$0"` "$@"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ci/docker-run.sh does this, but there's also cases when you don't want to pull (you're on an airplane with no uplink) so if we autopull then we'd also want to add a way to disable it. My vote for now is to just document that the user must pull

@echo ' Docker image must be pulled first: docker pull solanalabs/llvm'
@echo ' DOCKER=$(DOCKER)'
@echo ' - List of include directories:'
@echo ' INC_DIRS=$(INC_DIRS)'
@echo ' - List of system include directories:'
Expand All @@ -119,7 +127,7 @@ help:
@echo ''
@echo 'Usage:'
@echo ' - make help - This help message'
@echo ' - make all - Builds all the programs'
@echo ' - make all - Build all the programs'
@echo ' - make test - Build and run all tests'
@echo ' - make dump_<program name> - Dumps the contents of the program to stdout'
@echo ' - make <program name> - Build a single program by name'
Expand All @@ -133,6 +141,7 @@ help:
@echo ' - Assuming a programed named foo (src/foo.c)'
@echo ' - make foo'
@echo ' - make dump_foo'
@echo ''

.PRECIOUS: $(OUT_DIR)/%.bc
$(OUT_DIR)/%.bc: $(SRC_DIR)/%.c
Expand Down
4 changes: 4 additions & 0 deletions programs/bpf/c/sdk/llvm/llvm-docker/bin/clang
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -ex
SDKPATH="$( cd "$(dirname "$0")" ; pwd -P )"/../../../..
docker run --workdir /solana_sdk --volume $SDKPATH:/solana_sdk --rm solanalabs/llvm `basename "$0"` "$@"
4 changes: 4 additions & 0 deletions programs/bpf/c/sdk/llvm/llvm-docker/bin/clang++
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -ex
SDKPATH="$( cd "$(dirname "$0")" ; pwd -P )"/../../../..
docker run --workdir /solana_sdk --volume $SDKPATH:/solana_sdk --rm solanalabs/llvm `basename "$0"` "$@"
4 changes: 4 additions & 0 deletions programs/bpf/c/sdk/llvm/llvm-docker/bin/llc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -ex
SDKPATH="$( cd "$(dirname "$0")" ; pwd -P )"/../../../..
docker run --workdir /solana_sdk --volume $SDKPATH:/solana_sdk --rm solanalabs/llvm `basename "$0"` "$@"
4 changes: 4 additions & 0 deletions programs/bpf/c/sdk/llvm/llvm-docker/bin/llvm-objdump
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -ex
SDKPATH="$( cd "$(dirname "$0")" ; pwd -P )"/../../../..
docker run --workdir /solana_sdk --volume $SDKPATH:/solana_sdk --rm solanalabs/llvm `basename "$0"` "$@"
13 changes: 13 additions & 0 deletions programs/bpf/c/sdk/llvm/llvm-docker/generate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash

read -r -d '' SCRIPT << 'EOM'
#!/usr/bin/env bash
set -ex
SDKPATH="$( cd "$(dirname "$0")" ; pwd -P )"/../../../..
docker run --workdir /solana_sdk --volume $SDKPATH:/solana_sdk --rm solanalabs/llvm `basename "$0"` "$@"
EOM

echo "$SCRIPT" > bin/clang
echo "$SCRIPT" > bin/clang++
echo "$SCRIPT" > bin/llc
echo "$SCRIPT" > bin/llvm-objdump
68 changes: 68 additions & 0 deletions sdk/docker-llvm/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# This docker file is based on the llvm docker file example located here:
# https://github.com/llvm-mirror/llvm/blob/master/utils/docker/debian8/Dockerfile

FROM launcher.gcr.io/google/debian8:latest as builder
LABEL maintainer "Solana Maintainers"

# Install build dependencies of llvm.
# First, Update the apt's source list and include the sources of the packages.
RUN grep deb /etc/apt/sources.list | \
sed 's/^deb/deb-src /g' >> /etc/apt/sources.list

# Install compiler, python and subversion.
RUN apt-get update && \
apt-get install -y \
--no-install-recommends \
ca-certificates gnupg \
build-essential \
python \
wget \
unzip \
git \
ssh && \
rm -rf /var/lib/apt/lists/*

# Install a newer ninja release. It seems the older version in the debian repos
# randomly crashes when compiling llvm.
RUN wget "https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip" && \
echo "d2fea9ff33b3ef353161ed906f260d565ca55b8ca0568fa07b1d2cab90a84a07 ninja-linux.zip" \
| sha256sum -c && \
unzip ninja-linux.zip -d /usr/local/bin && \
rm ninja-linux.zip

# Import public key required for verifying signature of cmake download.
RUN gpg --no-tty --keyserver hkp://pgp.mit.edu --recv 0x2D2CEF1034921684

# Download, verify and install cmake version that can compile clang into /usr/local.
# (Version in debian8 repos is too old)
RUN mkdir /tmp/cmake-install && cd /tmp/cmake-install && \
wget "https://cmake.org/files/v3.7/cmake-3.7.2-SHA-256.txt.asc" && \
wget "https://cmake.org/files/v3.7/cmake-3.7.2-SHA-256.txt" && \
gpg --verify cmake-3.7.2-SHA-256.txt.asc cmake-3.7.2-SHA-256.txt && \
wget "https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz" && \
( grep "cmake-3.7.2-Linux-x86_64.tar.gz" cmake-3.7.2-SHA-256.txt | \
sha256sum -c - ) && \
tar xzf cmake-3.7.2-Linux-x86_64.tar.gz -C /usr/local --strip-components=1 && \
cd / && \
rm -rf /tmp/cmake-install

# ADD checksums /tmp/checksums
# ADD scripts /tmp/scripts

# Checkout the source code
RUN git clone https://github.com/solana-labs/llvm.git && \
git clone https://github.com/solana-labs/clang.git llvm/tools/clang && \
git clone https://github.com/solana-labs/clang-tools-extra.git llvm/tools/clang/tools/extra && \
git clone https://github.com/solana-labs/lld.git llvm/tools/lld && \
git clone https://github.com/solana-labs/compiler-rt.git llvm/projects/compiler-rt

RUN mkdir /llvm/build && \
cd /llvm/build && \
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_INSTALL_PREFIX=$HOME/local -G "Ninja" .. && \
ninja -j6 && \
ninja install

# Produce stage 2 docker with just the peices needed
FROM launcher.gcr.io/google/debian8:latest
LABEL maintainer "Solana Maintainers"
COPY --from=builder root/local/bin /usr/local/bin
16 changes: 16 additions & 0 deletions sdk/docker-llvm/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Solana Customized LLVM

This Docker contains LLVM binaries that incorporate customizations and fixes required
by Solana but not yet upstreamed into the LLVM mainline.

https://hub.docker.com/r/solanalabs/llvm/

### Usage:

This Docker is optionally used by the SDK BPF build system.

For more information:

```bash
$ make help
```
7 changes: 7 additions & 0 deletions sdk/docker-llvm/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -ex

cd "$(dirname "$0")"

docker build -t solanalabs/llvm .
docker push solanalabs/llvm
File renamed without changes.
File renamed without changes.
File renamed without changes.
6 changes: 3 additions & 3 deletions ci/docker-solana/build.sh → sdk/docker-solana/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ if [[ -z $CHANNEL ]]; then
fi

rm -rf usr/
../docker-run.sh solanalabs/rust:1.30.1 bash -c "
../../ci/docker-run.sh solanalabs/rust:1.30.1 bash -c "
set -ex
cargo install --path drone --root ci/docker-solana/usr
cargo install --path . --root ci/docker-solana/usr
cargo install --path drone --root sdk/docker-solana/usr
cargo install --path . --root sdk/docker-solana/usr
"
cp -f entrypoint.sh usr/bin/solana-entrypoint.sh
../../scripts/install-native-programs.sh usr/bin/
Expand Down
File renamed without changes.