This is an automated email from the ASF dual-hosted git repository. marcoabreu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push: new 6e4a50f [MXNET-472] ccache for docker builds (#11151) 6e4a50f is described below commit 6e4a50f96ff2da5ec1bf65e5458b60e6a085b17d Author: Marco de Abreu <marcoab...@users.noreply.github.com> AuthorDate: Fri Jun 8 03:12:30 2018 +0200 [MXNET-472] ccache for docker builds (#11151) * [MXNET-472] Add ccache support to docker builds * Added ccache stages to all containers * Refactored ccache installs in docker images * Reformatted build.py * Added ccache install to android docker builds * Improved setting ccache directory and max cache size * Added ccache to cmake based docker builds * Removed unnessesary yum install from centos7 ccache build * Added default compilers for ccache for docker builds * Added README comment about ccache mapping into docker builds * Reverted not working ccache configurations * Added comments about ccache installation * Move install scripts * Update ubuntu_r.sh --- .gitignore | 4 + Makefile | 2 +- ci/README.md | 8 +- ci/build.py | 61 +++++++---- ci/docker/Dockerfile.build.android_arm64 | 10 ++ ci/docker/Dockerfile.build.android_armv7 | 10 ++ ci/docker/Dockerfile.build.arm64 | 10 ++ ci/docker/Dockerfile.build.armv6 | 11 +- ci/docker/Dockerfile.build.armv7 | 10 ++ ci/docker/Dockerfile.build.centos7_cpu | 2 + ci/docker/Dockerfile.build.centos7_gpu | 2 + ci/docker/Dockerfile.build.jetson | 13 +++ ci/docker/Dockerfile.build.ubuntu_build_cuda | 2 + ci/docker/Dockerfile.build.ubuntu_cpu | 2 + ci/docker/Dockerfile.build.ubuntu_gpu | 2 + .../centos7_ccache.sh} | 37 ++++--- .../ubuntu_ccache.sh} | 40 +++++--- ci/docker/install/ubuntu_r.sh | 2 +- ci/docker/runtime_functions.sh | 111 ++++++++++++++++++--- make/config.mk | 6 ++ make/crosscompile.jetson.mk | 4 +- 21 files changed, 285 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index d585672..416741a 100644 --- a/.gitignore +++ b/.gitignore @@ -166,3 +166,7 @@ python/.eggs *DartConfiguration.tcl tests/Makefile tests/mxnet_unit_tests + +# generated wrappers for ccache +cc +cxx diff --git a/Makefile b/Makefile index 0321284..ff4446a 100644 --- a/Makefile +++ b/Makefile @@ -477,7 +477,7 @@ endif $(PS_PATH)/build/libps.a: PSLITE PSLITE: - $(MAKE) CXX=$(CXX) DEPS_PATH=$(DEPS_PATH) -C $(PS_PATH) ps + $(MAKE) CXX="$(CXX)" DEPS_PATH="$(DEPS_PATH)" -C $(PS_PATH) ps $(DMLC_CORE)/libdmlc.a: DMLCCORE diff --git a/ci/README.md b/ci/README.md index 1c59a3a..ca46434 100644 --- a/ci/README.md +++ b/ci/README.md @@ -54,7 +54,7 @@ The artifacts are located in the build/ directory in the project root. In case ## Add a platform -To add a platform, you should add the appropiate dockerfile in +To add a platform, you should add the appropriate dockerfile in docker/Dockerfile.build.<platform> and add a shell function named build_<platform> to the file docker/runtime_functions.sh with build instructions for that platform. @@ -63,3 +63,9 @@ instructions for that platform. Due to current limitations of the CMake build system creating artifacts in the source 3rdparty folder of the parent mxnet sources concurrent builds of different platforms is NOT SUPPORTED. + +## ccache +For all builds a directory from the host system is mapped where ccache will store cached +compiled object files (defaults to /tmp/ci_ccache). This will speed up rebuilds +significantly. You can set this directory explicitly by setting CCACHE_DIR environment +variable. All ccache instances are currently set to be 10 Gigabytes max in size. diff --git a/ci/build.py b/ci/build.py index 4fe76ee..c7e8431 100755 --- a/ci/build.py +++ b/ci/build.py @@ -33,13 +33,15 @@ import re import shutil import subprocess import sys +import tempfile from copy import deepcopy from itertools import chain from subprocess import call, check_call from typing import * +CCACHE_MAXSIZE = '10G' -def get_platforms(path: Optional[str]="docker"): +def get_platforms(path: Optional[str] = "docker"): """Get a list of architectures given our dockerfiles""" dockerfiles = glob.glob(os.path.join(path, "Dockerfile.build.*")) dockerfiles = list(filter(lambda x: x[-1] != '~', dockerfiles)) @@ -72,11 +74,11 @@ def build_docker(platform: str, docker_binary: str, registry: str) -> None: tag = get_docker_tag(platform=platform, registry=registry) logging.info("Building container tagged '%s' with %s", tag, docker_binary) cmd = [docker_binary, "build", - "-f", get_dockerfile(platform), - "--build-arg", "USER_ID={}".format(os.getuid()), - "--cache-from", tag, - "-t", tag, - "docker"] + "-f", get_dockerfile(platform), + "--build-arg", "USER_ID={}".format(os.getuid()), + "--cache-from", tag, + "-t", tag, + "docker"] logging.info("Running command: '%s'", ' '.join(cmd)) check_call(cmd) @@ -102,8 +104,10 @@ def _get_local_image_id(docker_binary, docker_tag): def get_mxnet_root() -> str: curpath = os.path.abspath(os.path.dirname(__file__)) + def is_mxnet_root(path: str) -> bool: return os.path.exists(os.path.join(path, ".mxnet_root")) + while not is_mxnet_root(curpath): parent = os.path.abspath(os.path.join(curpath, os.pardir)) if parent == curpath: @@ -116,10 +120,20 @@ def buildir() -> str: return os.path.join(get_mxnet_root(), "build") +def default_ccache_dir() -> str: + if 'CCACHE_DIR' in os.environ: + ccache_dir = os.path.realpath(os.environ['CCACHE_DIR']) + os.makedirs(ccache_dir, exist_ok=True) + return ccache_dirpython + # Share ccache across containers + return os.path.join(tempfile.gettempdir(), "ci_ccache") + + def container_run(platform: str, docker_binary: str, docker_registry: str, shared_memory_size: str, + local_ccache_dir: str, command: List[str], dry_run: bool = False, into_container: bool = False) -> str: @@ -128,12 +142,17 @@ def container_run(platform: str, local_build_folder = buildir() # We need to create it first, otherwise it will be created by the docker daemon with root only permissions os.makedirs(local_build_folder, exist_ok=True) + os.makedirs(local_ccache_dir, exist_ok=True) + logging.info("Using ccache directory: %s", local_ccache_dir) runlist = [docker_binary, 'run', '--rm', '-t', - '--shm-size={}'.format(shared_memory_size), - '-v', "{}:/work/mxnet".format(mx_root), # mount mxnet root - '-v', "{}:/work/build".format(local_build_folder), # mount mxnet/build for storing build artifacts - '-u', '{}:{}'.format(os.getuid(), os.getgid()), - tag] + '--shm-size={}'.format(shared_memory_size), + '-v', "{}:/work/mxnet".format(mx_root), # mount mxnet root + '-v', "{}:/work/build".format(local_build_folder), # mount mxnet/build for storing build artifacts + '-v', "{}:/work/ccache".format(local_ccache_dir), + '-u', '{}:{}'.format(os.getuid(), os.getgid()), + '-e', 'CCACHE_MAXSIZE={}'.format(CCACHE_MAXSIZE), + '-e', "CCACHE_DIR=/work/ccache", # this path is inside the container as /work/ccache is mounted + tag] runlist.extend(command) cmd = ' '.join(runlist) if not dry_run and not into_container: @@ -160,7 +179,6 @@ def container_run(platform: str, def list_platforms() -> str: print("\nSupported platforms:\n{}".format('\n'.join(get_platforms()))) - def load_docker_cache(tag, docker_registry) -> None: if docker_registry: try: @@ -172,7 +190,6 @@ def load_docker_cache(tag, docker_registry) -> None: else: logging.info('Distributed docker cache disabled') - def main() -> int: # We need to be in the same directory than the script so the commands in the dockerfiles work as # expected. But the script can be invoked from a different path @@ -187,7 +204,7 @@ def main() -> int: logging.basicConfig(format='{}: %(asctime)-15s %(message)s'.format(script_name())) parser = argparse.ArgumentParser(description="""Utility for building and testing MXNet on docker - containers""",epilog="") + containers""", epilog="") parser.add_argument("-p", "--platform", help="platform", type=str) @@ -233,6 +250,11 @@ def main() -> int: help="command to run in the container", nargs='*', action='append', type=str) + parser.add_argument("--ccache-dir", + default=default_ccache_dir(), + help="Ccache directory", + type=str) + args = parser.parse_args() def use_cache(): return args.cache or 'JOB_NAME' in os.environ # we are in Jenkins @@ -255,18 +277,19 @@ def main() -> int: if command: container_run(platform=platform, docker_binary=docker_binary, shared_memory_size=shared_memory_size, - command=command, docker_registry=args.docker_registry) + command=command, docker_registry=args.docker_registry, local_ccache_dir=args.ccache_dir) elif args.print_docker_run: print(container_run(platform=platform, docker_binary=docker_binary, shared_memory_size=shared_memory_size, - command=[], dry_run=True, docker_registry=args.docker_registry)) + command=[], dry_run=True, docker_registry=args.docker_registry, local_ccache_dir=args.ccache_dir)) elif args.into_container: container_run(platform=platform, docker_binary=docker_binary, shared_memory_size=shared_memory_size, - command=[], dry_run=False, into_container=True, docker_registry=args.docker_registry) + command=[], dry_run=False, into_container=True, docker_registry=args.docker_registry, + local_ccache_dir=args.ccache_dir) else: cmd = ["/work/mxnet/ci/docker/runtime_functions.sh", "build_{}".format(platform)] logging.info("No command specified, trying default build: %s", ' '.join(cmd)) container_run(platform=platform, docker_binary=docker_binary, shared_memory_size=shared_memory_size, - command=cmd, docker_registry=args.docker_registry) + command=cmd, docker_registry=args.docker_registry, local_ccache_dir=args.ccache_dir) elif args.all: platforms = get_platforms() @@ -283,7 +306,7 @@ def main() -> int: cmd = ["/work/mxnet/ci/docker/runtime_functions.sh", build_platform] shutil.rmtree(buildir(), ignore_errors=True) container_run(platform=platform, docker_binary=docker_binary, shared_memory_size=shared_memory_size, - command=cmd, docker_registry=args.docker_registry) + command=cmd, docker_registry=args.docker_registry, local_ccache_dir=args.ccache_dir) plat_buildir = os.path.join(get_mxnet_root(), build_platform) shutil.move(buildir(), plat_buildir) logging.info("Built files left in: %s", plat_buildir) diff --git a/ci/docker/Dockerfile.build.android_arm64 b/ci/docker/Dockerfile.build.android_arm64 index d768751..44d3692 100755 --- a/ci/docker/Dockerfile.build.android_arm64 +++ b/ci/docker/Dockerfile.build.android_arm64 @@ -18,9 +18,19 @@ # # Dockerfile to build MXNet for Android ARM64/ARMv8 +FROM ccache/build.ubuntu as ccachebuilder + +COPY install/ubuntu_core.sh /work/ +RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh + FROM dockcross/base:latest MAINTAINER Pedro Larroy "pllar...@amazon.com" +# extract ccache binary into latest context +COPY --from=ccachebuilder /usr/local/bin/ccache /usr/local/bin/ccache + # The cross-compiling emulator RUN apt-get update && apt-get install -y \ qemu-user \ diff --git a/ci/docker/Dockerfile.build.android_armv7 b/ci/docker/Dockerfile.build.android_armv7 index c22e000..28dc3fd 100755 --- a/ci/docker/Dockerfile.build.android_armv7 +++ b/ci/docker/Dockerfile.build.android_armv7 @@ -18,9 +18,19 @@ # # Dockerfile to build MXNet for Android ARMv7 +FROM ccache/build.ubuntu as ccachebuilder + +COPY install/ubuntu_core.sh /work/ +RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh + FROM dockcross/base:latest MAINTAINER Pedro Larroy "pllar...@amazon.com" +# extract ccache binary into latest context +COPY --from=ccachebuilder /usr/local/bin/ccache /usr/local/bin/ccache + # The cross-compiling emulator RUN apt-get update && apt-get install -y \ qemu-user \ diff --git a/ci/docker/Dockerfile.build.arm64 b/ci/docker/Dockerfile.build.arm64 index ec94960..a1f752b 100755 --- a/ci/docker/Dockerfile.build.arm64 +++ b/ci/docker/Dockerfile.build.arm64 @@ -18,10 +18,20 @@ # # Dockerfile to build MXNet for ARM64/ARMv8 +FROM ubuntu:16.04 as ccachebuilder + +COPY install/ubuntu_core.sh /work/ +RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh + # Temporary fix due to https://github.com/apache/incubator-mxnet/issues/10837 #FROM dockcross/linux-arm64 FROM mxnetci/dockcross-linux-arm64:05082018 +# extract ccache binary into latest context +COPY --from=ccachebuilder /usr/local/bin/ccache /usr/local/bin/ccache + ENV ARCH aarch64 ENV FC /usr/bin/${CROSS_TRIPLE}-gfortran ENV HOSTCC gcc diff --git a/ci/docker/Dockerfile.build.armv6 b/ci/docker/Dockerfile.build.armv6 index 20739da..c073992 100755 --- a/ci/docker/Dockerfile.build.armv6 +++ b/ci/docker/Dockerfile.build.armv6 @@ -18,10 +18,19 @@ # # Dockerfile to build MXNet for ARMv6 +FROM ubuntu:16.04 as ccachebuilder + +COPY install/ubuntu_core.sh /work/ +RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh + FROM dockcross/linux-armv6 +# extract ccache binary into latest context +COPY --from=ccachebuilder /usr/local/bin/ccache /usr/local/bin/ccache + ENV ARCH armv6l -ENV FC=/usr/bin/${CROSS_TRIPLE}-gfortran ENV HOSTCC gcc ENV TARGET ARMV6 diff --git a/ci/docker/Dockerfile.build.armv7 b/ci/docker/Dockerfile.build.armv7 index c249306..627486c 100755 --- a/ci/docker/Dockerfile.build.armv7 +++ b/ci/docker/Dockerfile.build.armv7 @@ -18,8 +18,18 @@ # # Dockerfile to build MXNet for Android ARMv7 +FROM ubuntu:16.04 as ccachebuilder + +COPY install/ubuntu_core.sh /work/ +RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh + FROM dockcross/linux-armv7 +# extract ccache binary into latest context +COPY --from=ccachebuilder /usr/local/bin/ccache /usr/local/bin/ccache + ENV ARCH armv71 ENV CC /usr/bin/arm-linux-gnueabihf-gcc ENV CXX /usr/bin/arm-linux-gnueabihf-g++ diff --git a/ci/docker/Dockerfile.build.centos7_cpu b/ci/docker/Dockerfile.build.centos7_cpu index 92314fa..076ef5d 100755 --- a/ci/docker/Dockerfile.build.centos7_cpu +++ b/ci/docker/Dockerfile.build.centos7_cpu @@ -24,6 +24,8 @@ WORKDIR /work/deps COPY install/centos7_core.sh /work/ RUN /work/centos7_core.sh +COPY install/centos7_ccache.sh /work/ +RUN /work/centos7_ccache.sh COPY install/centos7_python.sh /work/ RUN /work/centos7_python.sh COPY install/ubuntu_mklml.sh /work/ diff --git a/ci/docker/Dockerfile.build.centos7_gpu b/ci/docker/Dockerfile.build.centos7_gpu index 2d28170..8bf2442 100755 --- a/ci/docker/Dockerfile.build.centos7_gpu +++ b/ci/docker/Dockerfile.build.centos7_gpu @@ -24,6 +24,8 @@ WORKDIR /work/deps COPY install/centos7_core.sh /work/ RUN /work/centos7_core.sh +COPY install/centos7_ccache.sh /work/ +RUN /work/centos7_ccache.sh COPY install/centos7_python.sh /work/ RUN /work/centos7_python.sh diff --git a/ci/docker/Dockerfile.build.jetson b/ci/docker/Dockerfile.build.jetson index c358edb..8a8bb97 100755 --- a/ci/docker/Dockerfile.build.jetson +++ b/ci/docker/Dockerfile.build.jetson @@ -22,10 +22,20 @@ FROM nvidia/cuda:9.0-cudnn7-devel as cudabuilder +FROM ubuntu:16.04 as ccachebuilder + +COPY install/ubuntu_core.sh /work/ +RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh + # Temporary fix due to https://github.com/apache/incubator-mxnet/issues/10837 # FROM dockcross/linux-arm64 FROM mxnetci/dockcross-linux-arm64:05082018 +# extract ccache binary into latest context +COPY --from=ccachebuilder /usr/local/bin/ccache /usr/local/bin/ccache + ENV ARCH aarch64 ENV FC /usr/bin/${CROSS_TRIPLE}-gfortran ENV HOSTCC gcc @@ -39,6 +49,9 @@ RUN git clone --recursive -b v0.2.20 https://github.com/xianyi/OpenBLAS.git && \ make -j$(nproc) && \ PREFIX=${CROSS_ROOT} make install +ENV OpenBLAS_HOME=${CROSS_ROOT} +ENV OpenBLAS_DIR=${CROSS_ROOT} + # Setup CUDA build env (including configuring and copying nvcc) COPY --from=cudabuilder /usr/local/cuda /usr/local/cuda ENV TARGET_ARCH aarch64 diff --git a/ci/docker/Dockerfile.build.ubuntu_build_cuda b/ci/docker/Dockerfile.build.ubuntu_build_cuda index 4d3c466..a87651a 100755 --- a/ci/docker/Dockerfile.build.ubuntu_build_cuda +++ b/ci/docker/Dockerfile.build.ubuntu_build_cuda @@ -27,6 +27,8 @@ WORKDIR /work/deps COPY install/ubuntu_core.sh /work/ RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh COPY install/ubuntu_python.sh /work/ RUN /work/ubuntu_python.sh COPY install/ubuntu_scala.sh /work/ diff --git a/ci/docker/Dockerfile.build.ubuntu_cpu b/ci/docker/Dockerfile.build.ubuntu_cpu index 2dc7ef1..f82ee75 100755 --- a/ci/docker/Dockerfile.build.ubuntu_cpu +++ b/ci/docker/Dockerfile.build.ubuntu_cpu @@ -24,6 +24,8 @@ WORKDIR /work/deps COPY install/ubuntu_core.sh /work/ RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh COPY install/ubuntu_python.sh /work/ RUN /work/ubuntu_python.sh COPY install/ubuntu_scala.sh /work/ diff --git a/ci/docker/Dockerfile.build.ubuntu_gpu b/ci/docker/Dockerfile.build.ubuntu_gpu index 1097172..5f4bfc5 100755 --- a/ci/docker/Dockerfile.build.ubuntu_gpu +++ b/ci/docker/Dockerfile.build.ubuntu_gpu @@ -24,6 +24,8 @@ WORKDIR /work/deps COPY install/ubuntu_core.sh /work/ RUN /work/ubuntu_core.sh +COPY install/ubuntu_ccache.sh /work/ +RUN /work/ubuntu_ccache.sh COPY install/ubuntu_python.sh /work/ RUN /work/ubuntu_python.sh COPY install/ubuntu_scala.sh /work/ diff --git a/ci/docker/Dockerfile.build.armv7 b/ci/docker/install/centos7_ccache.sh similarity index 68% copy from ci/docker/Dockerfile.build.armv7 copy to ci/docker/install/centos7_ccache.sh index c249306..846a407 100755 --- a/ci/docker/Dockerfile.build.armv7 +++ b/ci/docker/install/centos7_ccache.sh @@ -1,4 +1,5 @@ -# -*- mode: dockerfile -*- +#!/bin/bash + # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -15,18 +16,30 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# -# Dockerfile to build MXNet for Android ARMv7 -FROM dockcross/linux-armv7 +# Script to build ccache for centos7 based images + +set -ex + +pushd . + +yum -y install autoconf +yum -y install asciidoc + +mkdir -p /work/deps +cd /work/deps + +git clone --recursive -b v3.4.2 https://github.com/ccache/ccache.git + +cd ccache + +./autogen.sh +./configure +make -j$(nproc) +make install -ENV ARCH armv71 -ENV CC /usr/bin/arm-linux-gnueabihf-gcc -ENV CXX /usr/bin/arm-linux-gnueabihf-g++ +cd /work/deps +rm -rf /work/deps/ccache -RUN apt-get update && \ - apt-get install -y libopenblas-dev:armhf && \ - rm -rf /var/lib/apt/lists/* +popd -COPY runtime_functions.sh /work/ -WORKDIR /work/build diff --git a/ci/docker/Dockerfile.build.armv7 b/ci/docker/install/ubuntu_ccache.sh similarity index 66% copy from ci/docker/Dockerfile.build.armv7 copy to ci/docker/install/ubuntu_ccache.sh index c249306..09838d2 100755 --- a/ci/docker/Dockerfile.build.armv7 +++ b/ci/docker/install/ubuntu_ccache.sh @@ -1,4 +1,5 @@ -# -*- mode: dockerfile -*- +#!/bin/bash + # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -15,18 +16,33 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# -# Dockerfile to build MXNet for Android ARMv7 -FROM dockcross/linux-armv7 +# Script to build ccache for ubuntu based images + +set -ex + +pushd . + +apt update +apt install -y --no-install-recommends \ + autoconf \ + asciidoc \ + xsltproc + +mkdir -p /work/deps +cd /work/deps + +git clone --recursive -b v3.4.2 https://github.com/ccache/ccache.git + +cd ccache + +./autogen.sh +./configure +make -j$(nproc) +make install -ENV ARCH armv71 -ENV CC /usr/bin/arm-linux-gnueabihf-gcc -ENV CXX /usr/bin/arm-linux-gnueabihf-g++ +cd /work/deps +rm -rf /work/deps/ccache -RUN apt-get update && \ - apt-get install -y libopenblas-dev:armhf && \ - rm -rf /var/lib/apt/lists/* +popd -COPY runtime_functions.sh /work/ -WORKDIR /work/build diff --git a/ci/docker/install/ubuntu_r.sh b/ci/docker/install/ubuntu_r.sh index e04e94d..4bf1a89 100755 --- a/ci/docker/install/ubuntu_r.sh +++ b/ci/docker/install/ubuntu_r.sh @@ -27,4 +27,4 @@ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9 gpg -a --export E084DAB9 | apt-key add - apt-get update -apt-get install -y r-base r-base-dev libxml2-dev libssl-dev libxt-dev \ No newline at end of file +apt-get install -y --allow-unauthenticated r-base r-base-dev libxml2-dev libssl-dev libxt-dev diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh index 79ac82d..36e2387 100755 --- a/ci/docker/runtime_functions.sh +++ b/ci/docker/runtime_functions.sh @@ -31,6 +31,37 @@ clean_repo() { git submodule update --init --recursive } +# wrap compiler calls with ccache +build_ccache_wrappers() { + set -ex + + rm -f cc + rm -f cxx + + touch cc + touch cxx + + if [ -z ${CC+x} ]; then + echo "No \$CC set, defaulting to gcc"; + export CC=gcc + fi + + if [ -z ${CXX+x} ]; then + echo "No \$CXX set, defaulting to g++"; + export CXX=g++ + fi + + # this function is nessesary for cuda enabled make based builds, since nvcc needs just an executable for -ccbin + + echo -e "#!/bin/sh\n/usr/local/bin/ccache ${CC} \"\$@\"\n" >> cc + echo -e "#!/bin/sh\n/usr/local/bin/ccache ${CXX} \"\$@\"\n" >> cxx + + chmod +x cc + chmod +x cxx + + export CC=`pwd`/cc + export CXX=`pwd`/cxx +} # Build commands: Every platform in docker/Dockerfile.build.<platform> should have a corresponding # function here with the same suffix: @@ -38,7 +69,11 @@ clean_repo() { build_jetson() { set -ex pushd . - mv make/crosscompile.jetson.mk make/config.mk + + build_ccache_wrappers + + cp -f make/crosscompile.jetson.mk ./config.mk + make -j$(nproc) export MXNET_LIBRARY_PATH=`pwd`/libmxnet.so @@ -73,6 +108,8 @@ build_armv6() { cmake \ -DCMAKE_TOOLCHAIN_FILE=$CROSS_ROOT/Toolchain.cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=OFF \ -DUSE_OPENCV=OFF \ -DUSE_OPENMP=OFF \ @@ -95,7 +132,9 @@ build_armv7() { set -ex pushd . cd /work/build - cmake\ + cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=OFF\ -DUSE_OPENCV=OFF\ -DUSE_OPENMP=OFF\ @@ -113,7 +152,9 @@ build_armv7() { build_amzn_linux_cpu() { cd /work/build - cmake\ + cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=OFF\ -DUSE_OPENCV=ON\ -DUSE_OPENMP=ON\ @@ -128,7 +169,9 @@ build_amzn_linux_cpu() { } build_arm64() { - cmake\ + cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=OFF\ -DUSE_OPENCV=OFF\ -DUSE_OPENMP=OFF\ @@ -146,7 +189,9 @@ build_arm64() { build_android_arm64() { set -ex cd /work/build - cmake\ + cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=OFF\ -DUSE_SSE=OFF\ -DUSE_LAPACK=OFF\ @@ -166,6 +211,8 @@ build_android_arm64() { build_centos7_cpu() { set -ex cd /work/mxnet + export CC="ccache gcc" + export CXX="ccache g++" make \ DEV=1 \ USE_LAPACK=1 \ @@ -178,6 +225,8 @@ build_centos7_cpu() { build_centos7_mkldnn() { set -ex cd /work/mxnet + export CC="ccache gcc" + export CXX="ccache g++" make \ DEV=1 \ USE_LAPACK=1 \ @@ -190,6 +239,8 @@ build_centos7_mkldnn() { build_centos7_gpu() { set -ex cd /work/mxnet + # unfortunately this build has problems in 3rdparty dependencies with ccache and make + # build_ccache_wrappers make \ DEV=1 \ USE_LAPACK=1 \ @@ -202,8 +253,14 @@ build_centos7_gpu() { -j$(nproc) } +build_ubuntu_cpu() { + build_ubuntu_cpu_openblas +} + build_ubuntu_cpu_openblas() { set -ex + export CC="ccache gcc" + export CXX="ccache g++" make \ DEV=1 \ USE_CPP_PACKAGE=1 \ @@ -214,54 +271,71 @@ build_ubuntu_cpu_openblas() { build_ubuntu_cpu_clang39() { set -ex + + export CXX=clang++-3.9 + export CC=clang-3.9 + + build_ccache_wrappers + make \ USE_CPP_PACKAGE=1 \ USE_BLAS=openblas \ USE_OPENMP=0 \ USE_DIST_KVSTORE=1 \ - CXX=clang++-3.9 \ - CC=clang-3.9 \ -j$(nproc) } build_ubuntu_cpu_clang50() { set -ex - make \ + + export CXX=clang++-5.0 + export CC=clang-5.0 + + build_ccache_wrappers + + make \ USE_CPP_PACKAGE=1 \ USE_BLAS=openblas \ USE_OPENMP=1 \ USE_DIST_KVSTORE=1 \ - CXX=clang++-5.0 \ - CC=clang-5.0 \ -j$(nproc) } build_ubuntu_cpu_clang39_mkldnn() { set -ex + + export CXX=clang++-3.9 + export CC=clang-3.9 + + build_ccache_wrappers + make \ USE_CPP_PACKAGE=1 \ USE_BLAS=openblas \ USE_MKLDNN=1 \ USE_OPENMP=0 \ - CXX=clang++-3.9 \ - CC=clang-3.9 \ -j$(nproc) } build_ubuntu_cpu_clang50_mkldnn() { set -ex + + export CXX=clang++-5.0 + export CC=clang-5.0 + + build_ccache_wrappers + make \ USE_CPP_PACKAGE=1 \ USE_BLAS=openblas \ USE_MKLDNN=1 \ USE_OPENMP=1 \ - CXX=clang++-5.0 \ - CC=clang-5.0 \ -j$(nproc) } build_ubuntu_cpu_mkldnn() { set -ex + build_ccache_wrappers make \ DEV=1 \ USE_CPP_PACKAGE=1 \ @@ -276,6 +350,7 @@ build_ubuntu_gpu() { build_ubuntu_gpu_mkldnn() { set -ex + build_ccache_wrappers make \ DEV=1 \ USE_CPP_PACKAGE=1 \ @@ -289,7 +364,9 @@ build_ubuntu_gpu_mkldnn() { build_ubuntu_gpu_cuda91_cudnn7() { set -ex - make \ + # unfortunately this build has problems in 3rdparty dependencies with ccache and make + # build_ccache_wrappers + make \ DEV=1 \ USE_BLAS=openblas \ USE_CUDA=1 \ @@ -318,6 +395,8 @@ build_ubuntu_gpu_cmake_mkldnn() { set -ex cd /work/build cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=1 \ -DUSE_CUDNN=1 \ -DUSE_MKLML_MKL=1 \ @@ -336,6 +415,8 @@ build_ubuntu_gpu_cmake() { set -ex cd /work/build cmake \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=1 \ -DUSE_CUDNN=1 \ -DUSE_MKLML_MKL=0 \ diff --git a/make/config.mk b/make/config.mk index dd67c33..b65f77c 100644 --- a/make/config.mk +++ b/make/config.mk @@ -37,9 +37,15 @@ # choice of compiler #-------------------- +ifndef CC export CC = gcc +endif +ifndef CXX export CXX = g++ +endif +ifndef NVCC export NVCC = nvcc +endif # whether compile with options for MXNet developer DEV = 0 diff --git a/make/crosscompile.jetson.mk b/make/crosscompile.jetson.mk index acc9c4a..5bb4961 100644 --- a/make/crosscompile.jetson.mk +++ b/make/crosscompile.jetson.mk @@ -57,10 +57,10 @@ DEBUG = 0 USE_SIGNAL_HANDLER = 1 # the additional link flags you want to add -ADD_LDFLAGS = +ADD_LDFLAGS = -L${CROSS_ROOT}/lib # the additional compile flags you want to add -ADD_CFLAGS = +ADD_CFLAGS = -I${CROSS_ROOT}/include #--------------------------------------------- # matrix computation libraries for CPU/GPU -- To stop receiving notification emails like this one, please contact marcoab...@apache.org.