build_docker_image.sh 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #!/bin/bash
  2. #===- llvm/utils/docker/build_docker_image.sh ----------------------------===//
  3. #
  4. # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. # See https://llvm.org/LICENSE.txt for license information.
  6. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. #
  8. #===----------------------------------------------------------------------===//
  9. set -e
  10. IMAGE_SOURCE=""
  11. DOCKER_REPOSITORY=""
  12. DOCKER_TAG=""
  13. BUILDSCRIPT_ARGS=""
  14. CHECKOUT_ARGS=""
  15. CMAKE_ENABLED_PROJECTS=""
  16. function show_usage() {
  17. cat << EOF
  18. Usage: build_docker_image.sh [options] [-- [cmake_args]...]
  19. Available options:
  20. General:
  21. -h|--help show this help message
  22. Docker-specific:
  23. -s|--source image source dir (i.e. debian8, nvidia-cuda, etc)
  24. -d|--docker-repository docker repository for the image
  25. -t|--docker-tag docker tag for the image
  26. Checkout arguments:
  27. -b|--branch svn branch to checkout, i.e. 'trunk',
  28. 'branches/release_40'
  29. (default: 'trunk')
  30. -r|--revision svn revision to checkout
  31. -c|--cherrypick revision to cherry-pick. Can be specified multiple times.
  32. Cherry-picks are performed in the sorted order using the
  33. following command:
  34. 'svn patch <(svn diff -c \$rev)'.
  35. -p|--llvm-project name of an svn project to checkout. Will also add the
  36. project to a list LLVM_ENABLE_PROJECTS, passed to CMake.
  37. For clang, please use 'clang', not 'cfe'.
  38. Project 'llvm' is always included and ignored, if
  39. specified.
  40. Can be specified multiple times.
  41. -c|--checksums name of a file, containing checksums of llvm checkout.
  42. Script will fail if checksums of the checkout do not
  43. match.
  44. Build-specific:
  45. -i|--install-target name of a cmake install target to build and include in
  46. the resulting archive. Can be specified multiple times.
  47. Required options: --source and --docker-repository, at least one
  48. --install-target.
  49. All options after '--' are passed to CMake invocation.
  50. For example, running:
  51. $ build_docker_image.sh -s debian8 -d mydocker/debian8-clang -t latest \
  52. -p clang -i install-clang -i install-clang-resource-headers
  53. will produce two docker images:
  54. mydocker/debian8-clang-build:latest - an intermediate image used to compile
  55. clang.
  56. mydocker/clang-debian8:latest - a small image with preinstalled clang.
  57. Please note that this example produces a not very useful installation, since it
  58. doesn't override CMake defaults, which produces a Debug and non-boostrapped
  59. version of clang.
  60. To get a 2-stage clang build, you could use this command:
  61. $ ./build_docker_image.sh -s debian8 -d mydocker/clang-debian8 -t "latest" \
  62. -p clang -i stage2-install-clang -i stage2-install-clang-resource-headers \
  63. -- \
  64. -DLLVM_TARGETS_TO_BUILD=Native -DCMAKE_BUILD_TYPE=Release \
  65. -DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \
  66. -DCLANG_ENABLE_BOOTSTRAP=ON \
  67. -DCLANG_BOOTSTRAP_TARGETS="install-clang;install-clang-resource-headers"
  68. EOF
  69. }
  70. CHECKSUMS_FILE=""
  71. SEEN_INSTALL_TARGET=0
  72. SEEN_CMAKE_ARGS=0
  73. while [[ $# -gt 0 ]]; do
  74. case "$1" in
  75. -h|--help)
  76. show_usage
  77. exit 0
  78. ;;
  79. -s|--source)
  80. shift
  81. IMAGE_SOURCE="$1"
  82. shift
  83. ;;
  84. -d|--docker-repository)
  85. shift
  86. DOCKER_REPOSITORY="$1"
  87. shift
  88. ;;
  89. -t|--docker-tag)
  90. shift
  91. DOCKER_TAG="$1"
  92. shift
  93. ;;
  94. -r|--revision|-c|-cherrypick|-b|--branch)
  95. CHECKOUT_ARGS="$CHECKOUT_ARGS $1 $2"
  96. shift 2
  97. ;;
  98. -i|--install-target)
  99. SEEN_INSTALL_TARGET=1
  100. BUILDSCRIPT_ARGS="$BUILDSCRIPT_ARGS $1 $2"
  101. shift 2
  102. ;;
  103. -p|--llvm-project)
  104. PROJ="$2"
  105. if [ "$PROJ" == "cfe" ]; then
  106. PROJ="clang"
  107. fi
  108. CHECKOUT_ARGS="$CHECKOUT_ARGS $1 $PROJ"
  109. if [ "$PROJ" != "clang-tools-extra" ]; then
  110. CMAKE_ENABLED_PROJECTS="$CMAKE_ENABLED_PROJECTS;$PROJ"
  111. fi
  112. shift 2
  113. ;;
  114. -c|--checksums)
  115. shift
  116. CHECKSUMS_FILE="$1"
  117. shift
  118. ;;
  119. --)
  120. shift
  121. BUILDSCRIPT_ARGS="$BUILDSCRIPT_ARGS -- $*"
  122. SEEN_CMAKE_ARGS=1
  123. shift $#
  124. ;;
  125. *)
  126. echo "Unknown argument $1"
  127. exit 1
  128. ;;
  129. esac
  130. done
  131. if [ "$CMAKE_ENABLED_PROJECTS" != "" ]; then
  132. # Remove the leading ';' character.
  133. CMAKE_ENABLED_PROJECTS="${CMAKE_ENABLED_PROJECTS:1}"
  134. if [[ $SEEN_CMAKE_ARGS -eq 0 ]]; then
  135. BUILDSCRIPT_ARGS="$BUILDSCRIPT_ARGS --"
  136. fi
  137. BUILDSCRIPT_ARGS="$BUILDSCRIPT_ARGS -DLLVM_ENABLE_PROJECTS=$CMAKE_ENABLED_PROJECTS"
  138. fi
  139. command -v docker >/dev/null ||
  140. {
  141. echo "Docker binary cannot be found. Please install Docker to use this script."
  142. exit 1
  143. }
  144. if [ "$IMAGE_SOURCE" == "" ]; then
  145. echo "Required argument missing: --source"
  146. exit 1
  147. fi
  148. if [ "$DOCKER_REPOSITORY" == "" ]; then
  149. echo "Required argument missing: --docker-repository"
  150. exit 1
  151. fi
  152. if [ $SEEN_INSTALL_TARGET -eq 0 ]; then
  153. echo "Please provide at least one --install-target"
  154. exit 1
  155. fi
  156. SOURCE_DIR=$(dirname $0)
  157. if [ ! -d "$SOURCE_DIR/$IMAGE_SOURCE" ]; then
  158. echo "No sources for '$IMAGE_SOURCE' were found in $SOURCE_DIR"
  159. exit 1
  160. fi
  161. BUILD_DIR=$(mktemp -d)
  162. trap "rm -rf $BUILD_DIR" EXIT
  163. echo "Using a temporary directory for the build: $BUILD_DIR"
  164. cp -r "$SOURCE_DIR/$IMAGE_SOURCE" "$BUILD_DIR/$IMAGE_SOURCE"
  165. cp -r "$SOURCE_DIR/scripts" "$BUILD_DIR/scripts"
  166. mkdir "$BUILD_DIR/checksums"
  167. if [ "$CHECKSUMS_FILE" != "" ]; then
  168. cp "$CHECKSUMS_FILE" "$BUILD_DIR/checksums/checksums.txt"
  169. fi
  170. if [ "$DOCKER_TAG" != "" ]; then
  171. DOCKER_TAG=":$DOCKER_TAG"
  172. fi
  173. echo "Building ${DOCKER_REPOSITORY}${DOCKER_TAG} from $IMAGE_SOURCE"
  174. docker build -t "${DOCKER_REPOSITORY}${DOCKER_TAG}" \
  175. --build-arg "checkout_args=$CHECKOUT_ARGS" \
  176. --build-arg "buildscript_args=$BUILDSCRIPT_ARGS" \
  177. -f "$BUILD_DIR/$IMAGE_SOURCE/Dockerfile" \
  178. "$BUILD_DIR"
  179. echo "Done"