marcoabreu closed pull request #10202: [MXNET-131] Refine build.py, misc fixes, tweak commandline, add help URL: https://github.com/apache/incubator-mxnet/pull/10202
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/Jenkinsfile b/Jenkinsfile index 560829a8f70..45b86fbdafe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -94,14 +94,14 @@ echo ${libs} | sed -e 's/,/ /g' | xargs md5sum // Python 2 def python2_ut(docker_container_name) { timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python2_cpu" + sh "ci/build.py --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python2_cpu" } } // Python 3 def python3_ut(docker_container_name) { timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python3_cpu" + sh "ci/build.py --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python3_cpu" } } @@ -110,14 +110,14 @@ def python3_ut(docker_container_name) { // Python 2 def python2_gpu_ut(docker_container_name) { timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python2_gpu" + sh "ci/build.py --nvidiadocker --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python2_gpu" } } // Python 3 def python3_gpu_ut(docker_container_name) { timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python3_gpu" + sh "ci/build.py --nvidiadocker --platform ${docker_container_name} /work/runtime_functions.sh unittest_ubuntu_python3_gpu" } } @@ -126,7 +126,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/sanity') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh sanity_check" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh sanity_check" } } } @@ -136,7 +136,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-centos7-cpu') { init_git() - sh "ci/build.py --build --platform centos7_cpu /work/runtime_functions.sh build_centos7_cpu" + sh "ci/build.py --platform centos7_cpu /work/runtime_functions.sh build_centos7_cpu" pack_lib('centos7_cpu') } } @@ -145,7 +145,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-centos7-mkldnn') { init_git() - sh "ci/build.py --build --platform centos7_cpu /work/runtime_functions.sh build_centos7_mkldnn" + sh "ci/build.py --platform centos7_cpu /work/runtime_functions.sh build_centos7_mkldnn" pack_lib('centos7_mkldnn') } } @@ -154,7 +154,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-centos7-gpu') { init_git() - sh "ci/build.py --build --platform centos7_gpu /work/runtime_functions.sh build_centos7_gpu" + sh "ci/build.py --platform centos7_gpu /work/runtime_functions.sh build_centos7_gpu" pack_lib('centos7_gpu') } } @@ -163,7 +163,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cpu-openblas') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_openblas" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_openblas" pack_lib('cpu') } } @@ -172,7 +172,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cpu-clang39') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang39" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang39" } } }, @@ -180,7 +180,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cpu-clang50') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang50" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang50" } } }, @@ -188,7 +188,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cpu-mkldnn-clang39') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang39_mkldnn" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang39_mkldnn" pack_lib('mkldnn_cpu_clang3', mx_mkldnn_lib) } } @@ -197,7 +197,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cpu-mkldnn-clang50') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang50_mkldnn" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_clang50_mkldnn" pack_lib('mkldnn_cpu_clang5', mx_mkldnn_lib) } } @@ -206,7 +206,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-mkldnn-cpu') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_mkldnn" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_cpu_mkldnn" pack_lib('mkldnn_cpu', mx_mkldnn_lib) } } @@ -215,7 +215,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-mkldnn-gpu') { init_git() - sh "ci/build.py --build --platform ubuntu_build_cuda /work/runtime_functions.sh build_ubuntu_gpu_mkldnn" + sh "ci/build.py --platform ubuntu_build_cuda /work/runtime_functions.sh build_ubuntu_gpu_mkldnn" pack_lib('mkldnn_gpu', mx_mkldnn_lib) } } @@ -224,7 +224,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-gpu') { init_git() - sh "ci/build.py --build --platform ubuntu_build_cuda /work/runtime_functions.sh build_ubuntu_gpu_cuda91_cudnn7" + sh "ci/build.py --platform ubuntu_build_cuda /work/runtime_functions.sh build_ubuntu_gpu_cuda91_cudnn7" pack_lib('gpu') stash includes: 'build/cpp-package/example/test_score', name: 'cpp_test_score' stash includes: 'build/cpp-package/example/test_optimizer', name: 'cpp_test_optimizer' @@ -235,7 +235,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/amalgamationmin') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_amalgamation_min" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_amalgamation_min" } } }, @@ -243,7 +243,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/amalgamation') { init_git() - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_amalgamation" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh build_ubuntu_amalgamation" } } }, @@ -252,7 +252,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cmake-mkldnn-gpu') { init_git() - sh "ci/build.py --build --platform ubuntu_gpu /work/runtime_functions.sh build_ubuntu_gpu_cmake_mkldnn" //build_cuda + sh "ci/build.py --platform ubuntu_gpu /work/runtime_functions.sh build_ubuntu_gpu_cmake_mkldnn" //build_cuda pack_lib('cmake_mkldnn_gpu', mx_cmake_mkldnn_lib) } } @@ -261,7 +261,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-cmake-gpu') { init_git() - sh "ci/build.py --build --platform ubuntu_gpu /work/runtime_functions.sh build_ubuntu_gpu_cmake" //build_cuda + sh "ci/build.py --platform ubuntu_gpu /work/runtime_functions.sh build_ubuntu_gpu_cmake" //build_cuda pack_lib('cmake_gpu', mx_cmake_lib) } } @@ -336,7 +336,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-jetson-armv8') { init_git() - sh "ci/build.py --build --platform jetson /work/runtime_functions.sh build_jetson" + sh "ci/build.py --platform jetson /work/runtime_functions.sh build_jetson" } } }, @@ -344,7 +344,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-raspberry-armv7') { init_git() - sh "ci/build.py --build --platform armv7 /work/runtime_functions.sh build_armv7" + sh "ci/build.py --platform armv7 /work/runtime_functions.sh build_armv7" } } }, @@ -352,7 +352,7 @@ try { node('mxnetlinux-cpu') { ws('workspace/build-raspberry-armv6') { init_git() - sh "ci/build.py --build --platform armv6 /work/runtime_functions.sh build_armv6" + sh "ci/build.py --platform armv6 /work/runtime_functions.sh build_armv6" } } } @@ -400,7 +400,7 @@ try { ws('workspace/ut-python2-quantize-gpu') { init_git() unpack_lib('gpu', mx_lib) - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_python2_quantization_gpu" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_python2_quantization_gpu" } } }, @@ -409,7 +409,7 @@ try { ws('workspace/ut-python3-quantize-gpu') { init_git() unpack_lib('gpu', mx_lib) - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_python3_quantization_gpu" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_python3_quantization_gpu" } } }, @@ -455,7 +455,7 @@ try { init_git() unpack_lib('centos7_cpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform centos7_cpu /work/runtime_functions.sh unittest_centos7_cpu" + sh "ci/build.py --platform centos7_cpu /work/runtime_functions.sh unittest_centos7_cpu" } } } @@ -466,7 +466,7 @@ try { init_git() unpack_lib('centos7_gpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform centos7_gpu /work/runtime_functions.sh unittest_centos7_gpu" + sh "ci/build.py --nvidiadocker --platform centos7_gpu /work/runtime_functions.sh unittest_centos7_gpu" } } } @@ -477,7 +477,7 @@ try { init_git() unpack_lib('cpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh unittest_ubuntu_cpu_scala" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh unittest_ubuntu_cpu_scala" } } } @@ -488,7 +488,7 @@ try { init_git() unpack_lib('gpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_gpu_scala" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_gpu_scala" } } } @@ -499,7 +499,7 @@ try { init_git() unpack_lib('cpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh unittest_ubuntu_cpugpu_perl" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh unittest_ubuntu_cpugpu_perl" } } } @@ -510,7 +510,7 @@ try { init_git() unpack_lib('gpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_cpugpu_perl" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_cpugpu_perl" } } } @@ -521,7 +521,7 @@ try { init_git() unpack_lib('cmake_gpu', mx_cmake_lib) timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_gpu_cpp" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_gpu_cpp" } } } @@ -532,7 +532,7 @@ try { init_git() unpack_lib('cpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh unittest_ubuntu_cpu_R" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh unittest_ubuntu_cpu_R" } } } @@ -543,7 +543,7 @@ try { init_git() unpack_lib('gpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_gpu_R" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh unittest_ubuntu_gpu_R" } } } @@ -630,7 +630,7 @@ try { init_git() unpack_lib('cpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh integrationtest_ubuntu_cpu_onnx" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh integrationtest_ubuntu_cpu_onnx" } } } @@ -641,7 +641,7 @@ try { init_git() unpack_lib('gpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh integrationtest_ubuntu_gpu_python" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh integrationtest_ubuntu_gpu_python" } } } @@ -652,7 +652,7 @@ try { init_git() unpack_lib('gpu') timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh integrationtest_ubuntu_gpu_caffe" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh integrationtest_ubuntu_gpu_caffe" } } } @@ -665,7 +665,7 @@ try { unstash 'cpp_test_score' unstash 'cpp_test_optimizer' timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --nvidiadocker --build --platform ubuntu_gpu /work/runtime_functions.sh integrationtest_ubuntu_gpu_cpp_package" + sh "ci/build.py --nvidiadocker --platform ubuntu_gpu /work/runtime_functions.sh integrationtest_ubuntu_gpu_cpp_package" } } } @@ -677,7 +677,7 @@ try { ws('workspace/docs') { init_git() timeout(time: max_time, unit: 'MINUTES') { - sh "ci/build.py --build --platform ubuntu_cpu /work/runtime_functions.sh deploy_docs" + sh "ci/build.py --platform ubuntu_cpu /work/runtime_functions.sh deploy_docs" sh "tests/ci_build/deploy/ci_deploy_doc.sh ${env.BRANCH_NAME} ${env.BUILD_NUMBER}" } } diff --git a/ci/README.md b/ci/README.md index 98c74e31d87..1c59a3af7c8 100644 --- a/ci/README.md +++ b/ci/README.md @@ -1,10 +1,12 @@ # Containerized build & test utilities -This folder contains scripts and dockerfiles used to build and test MXNet using Docker containers +This folder contains scripts and dockerfiles used to build and test MXNet using +Docker containers You need docker and nvidia docker if you have a GPU. -If you are in ubuntu an easy way to install Docker CE is executing the following script: +If you are in ubuntu an easy way to install Docker CE is executing the +following script: ``` @@ -29,22 +31,35 @@ For detailed instructions go to the docker documentation. ## build.py -The main utility to build is build.py which will run docker and mount the mxnet folder as a volume -to do in-place builds. +The main utility to build is build.py which will run docker and mount the mxnet +folder as a volume to do in-place builds. -The build.py script does two functions, build the docker image, and it can be also used to run -commands inside this image with the propper mounts and paraphernalia required to build mxnet inside -docker from the sources on the parent folder. +The build.py script does two functions, build the docker image, and it can be +also used to run commands inside this image with the propper mounts and +paraphernalia required to build mxnet inside docker from the sources on the +parent folder. -A set of helper shell functions are in `functions.sh`. `build.py --help` will display usage +A set of helper shell functions are in `docker/runtime_functions.sh`. +`build.py` without arguments or `build.py --help` will display usage information about the tool. To build for armv7 for example: ``` -./build.py -p armv7 /work/functions.sh build_armv7 +./build.py -p armv7 ``` +The artifacts are located in the build/ directory in the project root. In case +`build.py -a` is invoked, the artifacts are located in build.<platform>/ + +## Add a platform + +To add a platform, you should add the appropiate 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. + ## Warning -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. +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. diff --git a/ci/build.py b/ci/build.py index 8caf52b90bd..e1e4560d947 100755 --- a/ci/build.py +++ b/ci/build.py @@ -36,6 +36,7 @@ from typing import * from itertools import chain from copy import deepcopy +import shutil def get_platforms(path: Optional[str]="docker"): @@ -48,7 +49,7 @@ def get_platforms(path: Optional[str]="docker"): return platforms -def get_docker_tag(platform: str) -> None: +def get_docker_tag(platform: str) -> str: return "mxnet/build.{0}".format(platform) @@ -84,14 +85,15 @@ def is_mxnet_root(path: str) -> bool: curpath = parent return curpath +def buildir() -> str: + return os.path.join(get_mxnet_root(), "build") -def container_run(platform: str, docker_binary: str, command: List[str]) -> None: +def container_run(platform: str, docker_binary: str, command: List[str], dry_run: bool = False, into_container: bool = False) -> str: tag = get_docker_tag(platform) mx_root = get_mxnet_root() - local_build_folder = '{}/build'.format(mx_root) + 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) - logging.info("Running %s in container %s", command, tag) runlist = [docker_binary, 'run', '--rm', '-v', "{}:/work/mxnet".format(mx_root), # mount mxnet root '-v', "{}:/work/build".format(local_build_folder), # mount mxnet/build for storing build artifacts @@ -99,16 +101,32 @@ def container_run(platform: str, docker_binary: str, command: List[str]) -> None tag] runlist.extend(command) cmd = ' '.join(runlist) - logging.info("Executing: %s", cmd) - ret = call(runlist) - if ret != 0: - logging.error("Running of command in container failed: %s", cmd) - into_cmd = deepcopy(runlist) - idx = into_cmd.index('-u') + 2 - into_cmd[idx:idx] = ['-ti', '--entrypoint', 'bash'] - logging.error("You can try to get into the container by using the following command: %s", ' '.join(into_cmd)) + if not dry_run and not into_container: + logging.info("Running %s in container %s", command, tag) + logging.info("Executing: %s", cmd) + ret = call(runlist) + + into_cmd = deepcopy(runlist) + idx = into_cmd.index('-u') + 2 + into_cmd[idx:idx] = ['-ti', '--entrypoint', '/bin/bash'] + docker_run_cmd = ' '.join(into_cmd) + if not dry_run and into_container: + check_call(into_cmd) + + if not dry_run and ret != 0: + logging.error("Running of command in container failed (%s): %s", ret, cmd) + logging.error("You can try to get into the container by using the following command: %s", docker_run_cmd) raise subprocess.CalledProcessError(ret, cmd) + return docker_run_cmd + +def list_platforms(): + platforms = get_platforms() + print("\nSupported platforms:\n") + print('\n'.join(platforms)) + print() + + 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 @@ -121,13 +139,18 @@ def script_name() -> str: logging.basicConfig(format='{}: %(asctime)-15s %(message)s'.format(script_name())) - parser = argparse.ArgumentParser() + parser = argparse.ArgumentParser(description="""Utility for building and testing MXNet on docker + containers""",epilog="") parser.add_argument("-p", "--platform", help="platform", type=str) - parser.add_argument("-b", "--build", - help="Build the container", + parser.add_argument("--build-only", + help="Only build the container, don't build the project", + action='store_true') + + parser.add_argument("-a", "--all", + help="build for all platforms", action='store_true') parser.add_argument("-n", "--nvidiadocker", @@ -138,6 +161,14 @@ def script_name() -> str: help="List platforms", action='store_true') + parser.add_argument("--print-docker-run", + help="print docker run command for manual inspection", + action='store_true') + + parser.add_argument("-i", "--into-container", + help="go in a shell inside the container", + action='store_true') + parser.add_argument("command", help="command to run in the container", nargs='*', action='append', type=str) @@ -146,31 +177,74 @@ def script_name() -> str: command = list(chain(*args.command)) docker_binary = get_docker_binary(args.nvidiadocker) + print("into container: {}".format(args.into_container)) if args.list: - platforms = get_platforms() - print(platforms) + list_platforms() elif args.platform: platform = args.platform - if args.build: - build_docker(platform, docker_binary) + build_docker(platform, docker_binary) + if args.build_only: + logging.warn("Container was just built. Exiting due to build-only.") + return 0 + tag = get_docker_tag(platform) if command: container_run(platform, docker_binary, command) + elif args.print_docker_run: + print(container_run(platform, docker_binary, [], True)) + elif args.into_container: + container_run(platform, docker_binary, [], False, True) 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, docker_binary, cmd) - else: + elif args.all: platforms = get_platforms() logging.info("Building for all architectures: {}".format(platforms)) logging.info("Artifacts will be produced in the build/ directory.") for platform in platforms: build_docker(platform, docker_binary) + if args.build_only: + continue cmd = ["/work/mxnet/ci/docker/runtime_functions.sh", "build_{}".format(platform)] - logging.info("No command specified, trying default build: %s", ' '.join(cmd)) + shutil.rmtree(buildir(), ignore_errors=True) container_run(platform, docker_binary, cmd) + plat_buildir = os.path.join(get_mxnet_root(), "build_{}".format(platform)) + shutil.move(buildir(), plat_buildir) + logging.info("Built files left in: %s", plat_buildir) + + + else: + parser.print_help() + list_platforms() + print(""" +Examples: + +./build.py -p armv7 + + Will build a docker container with cross compilation tools and build MXNet for armv7 by + running: ci/docker/runtime_functions.sh build_armv7 inside the container. + +./build.py -p armv7 ls + + Will execute the given command inside the armv7 container + +./build.py -p armv7 --print-docker-run + + Will print a docker run command to get inside the container in an interactive shell + +./build.py -p armv7 --into-container + + Will execute a shell into the container + +./build.py -a + + Builds for all platforms and leaves artifacts in build_<platform> + + """) + return 0 ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services