apollo.sh 24.7 KB
Newer Older
D
Dong Li 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#!/usr/bin/env bash

###############################################################################
# Copyright 2017 The Apollo Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
###############################################################################

#=================================================
#                   Utils
#=================================================

S
siyangy 已提交
23 24 25
function source_apollo_base() {
  DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  cd "${DIR}"
D
Dong Li 已提交
26

S
siyangy 已提交
27 28
  source "${DIR}/scripts/apollo_base.sh"
}
29 30

function apollo_check_system_config() {
31
  # check docker environment
32
  if [ ${MACHINE_ARCH} == "x86_64" ] && [ ${APOLLO_IN_DOCKER} != "true" ]; then
33 34 35 36
    echo -e "${RED}Must run $0 in dev docker or release docker${NO_COLOR}"
    exit 0
  fi

37
  # check operating system
38
  OP_SYSTEM=$(uname -s)
39
  case $OP_SYSTEM in
40 41
    "Linux")
      echo "System check passed. Build continue ..."
42 43 44 45 46 47 48

      # check system configuration
      DEFAULT_MEM_SIZE="2.0"
      MEM_SIZE=$(free | grep Mem | awk '{printf("%0.2f", $2 / 1024.0 / 1024.0)}')
      if (( $(echo "$MEM_SIZE < $DEFAULT_MEM_SIZE" | bc -l) )); then
         warning "System memory [${MEM_SIZE}G] is lower than minimum required memory size [2.0G]. Apollo build could fail."
      fi
49 50 51 52
      ;;
    "Darwin")
      warning "Mac OS is not officially supported in the current version. Build could fail. We recommend using Ubuntu 14.04."
      ;;
53
    *)
54 55 56 57
      error "Unsupported system: ${OP_SYSTEM}."
      error "Please use Linux, we recommend Ubuntu 14.04."
      exit 1
      ;;
58 59 60
  esac
}

S
siyangy 已提交
61 62 63
function check_machine_arch() {
  # the machine type, currently support x86_64, aarch64
  MACHINE_ARCH=$(uname -m)
D
Dong Li 已提交
64

S
siyangy 已提交
65 66 67 68 69 70 71 72 73
  # Generate WORKSPACE file based on marchine architecture
  if [ "$MACHINE_ARCH" == 'x86_64' ]; then
    sed "s/MACHINE_ARCH/x86_64/g" WORKSPACE.in > WORKSPACE
  elif [ "$MACHINE_ARCH" == 'aarch64' ]; then
    sed "s/MACHINE_ARCH/aarch64/g" WORKSPACE.in > WORKSPACE
  else
    fail "Unknown machine architecture $MACHINE_ARCH"
    exit 1
  fi
74 75

  #setup vtk folder name for different systems.
76
  VTK_VERSION=$(find /usr/include/ -type d  -name "vtk-*" | tail -n1 | cut -d '-' -f 2)
77
  sed -i "s/VTK_VERSION/${VTK_VERSION}/g" WORKSPACE
S
siyangy 已提交
78
}
D
Dong Li 已提交
79 80

function check_esd_files() {
S
siyangy 已提交
81 82
  CAN_CARD="fake_can"

D
Dong Li 已提交
83 84 85 86
  if [ -f ./third_party/can_card_library/esd_can/include/ntcan.h \
      -a -f ./third_party/can_card_library/esd_can/lib/libntcan.so.4 \
      -a -f ./third_party/can_card_library/esd_can/lib/libntcan.so.4.0.1 ]; then
      USE_ESD_CAN=true
L
Lei Wang 已提交
87
      CAN_CARD="esd_can"
D
Dong Li 已提交
88
  else
89
      warning "ESD CAN library supplied by ESD Electronics does not exist. If you need ESD CAN, please refer to third_party/can_card_library/esd_can/README.md."
D
Dong Li 已提交
90 91 92 93 94
      USE_ESD_CAN=false
  fi
}

function generate_build_targets() {
S
siyangy 已提交
95
  if [ -z $NOT_BUILD_PERCEPTION ] ; then
96 97 98 99 100 101
    BUILD_TARGETS=""
  else
    info 'Skip building perception module!'
    # BUILD_TARGETS=`bazel query //... except //modules/perception/... except //modules/calibration/lidar_ex_checker/...`
    BUILD_TARGETS=""
  fi
L
Liangliang Zhang 已提交
102
    BUILD_TARGETS="
103
    //modules/guardian/...
104
    //modules/routing/...
105
    //modules/common/...
106 107 108 109
    //modules/prediction/proto/...
    //modules/control/proto/...
    //modules/localization/proto/...
    //modules/perception/proto/...
110
    //modules/planning/common/...
111 112
    //modules/planning/proto/..."
  # //modules/planning:planning_component_lib
Z
zhuangli1987 已提交
113 114 115
  # //modules/drivers/radar/conti_radar/...
  # //modules/drivers/gnss/...
  # //modules/monitor/...
116

C
Calvin Miao 已提交
117 118 119
  if [ $? -ne 0 ]; then
    fail 'Build failed!'
  fi
D
Dong Li 已提交
120
  if ! $USE_ESD_CAN; then
121
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "esd")
D
Dong Li 已提交
122
  fi
123
  #skip msf for non x86_64 platforms
124
  if [ ${MACHINE_ARCH} != "x86_64" ]; then
125 126
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "msf")
  fi
127 128 129
  #switch for building fuzz test
  if [ -z $BUILD_FUZZ_TEST ]; then
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "fuzz")
S
siyangy 已提交
130
  else
131 132
     BUILD_TARGETS=`bazel query //modules/tools/fuzz/...`
  fi
D
Dong Li 已提交
133 134 135 136 137 138
}

#=================================================
#              Build functions
#=================================================

S
siyangy 已提交
139
function build() {
140
  if [ "${USE_GPU}" = "1" ] ; then
141 142 143 144
    echo -e "${YELLOW}Running build under GPU mode. GPU is required to run the build.${NO_COLOR}"
  else
    echo -e "${YELLOW}Running build under CPU mode. No GPU is required to run the build.${NO_COLOR}"
  fi
145
  info "Start building, please wait ..."
146 147 148 149 150
  info "Building framework ..."
  cd /apollo/framework
  bash cybertron.sh build_fast
  cd /apollo
  info "Building modules ..."
D
Dong Li 已提交
151
  generate_build_targets
152 153
  info "Building on $MACHINE_ARCH..."

154
  MACHINE_ARCH=$(uname -m)
155
  JOB_ARG="--ram_utilization_factor 50"
156 157 158
  if [ "$MACHINE_ARCH" == 'aarch64' ]; then
    JOB_ARG="--jobs=3"
  fi
159
  info "Building with $JOB_ARG for $MACHINE_ARCH"
160

161
  # Switch for building fuzz test.
162
  if [ -z $BUILD_FUZZ_TEST ]; then
163 164 165 166 167 168 169 170 171 172 173 174 175
    echo "$BUILD_TARGETS" | xargs bazel build $JOB_ARG $DEFINES -c $@
  else
    if [ -z "$(command -v clang-6.0)" ]; then
      # Install clang-6.0 if it doesn't exist.
      info "Installing clang-6.0 which is required by the fuzz test ..."
      sudo apt-add-repository \
      "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-6.0 main"
      wget -O - http://apt.llvm.org/llvm-snapshot.gpg.key \
      | sudo apt-key add -
      sudo apt-get update
      sudo apt-get install -y clang-6.0 lldb-6.0 lld-6.0
      sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 \
      /usr/lib/libgfortran.so
176
    fi
177 178 179 180 181
    echo "$BUILD_TARGETS" | xargs bazel build \
    --crosstool_top=tools/clang-6.0:toolchain \
    $JOB_ARG $DEFINES -c $@ --compilation_mode=dbg
  fi

182
  if [ $? -ne 0 ]; then
D
Dong Li 已提交
183 184
    fail 'Build failed!'
  fi
S
siyangy 已提交
185 186

  # Build python proto
L
Lei Wang 已提交
187
  build_py_proto
188

189 190
  # Clear KV DB and update commit_id after compiling.
  rm -fr data/kv_db
191
  REVISION=$(get_revision)
192
  python modules/tools/common/kv_db.py put \
193
      "apollo:data:commit_id" "$REVISION"
194

S
siyangy 已提交
195 196 197 198 199 200
  # if [ -d /apollo-simulator ] && [ -e /apollo-simulator/build.sh ]; then
  #   cd /apollo-simulator && bash build.sh build
  #   if [ $? -ne 0 ]; then
  #     fail 'Build failed!'
  #   fi
  # fi
201 202 203
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  fi
D
Dong Li 已提交
204 205
}

206 207 208
function cibuild() {
  echo "Start building, please wait ..."
  generate_build_targets
209 210 211 212 213 214

  JOB_ARG="--jobs=$(nproc)"
  if [ "$MACHINE_ARCH" == 'aarch64' ]; then
    JOB_ARG="--jobs=3"
  fi

A
Aaron Xiao 已提交
215
  info "Building with $JOB_ARG for $MACHINE_ARCH"
216
  BUILD_TARGETS="
217
  //modules/common/...
218
  //modules/canbus:canbus_lib
219 220 221
  //modules/control/...
  //modules/dreamview/...
  //modules/drivers/gnss/...
222
  //modules/drivers/lidar_velodyne/...
223
  //modules/drivers/camera/...
224 225
  //modules/localization/...
  //modules/map/...
A
Aaron Xiao 已提交
226
  //modules/monitor/...
227 228
  //modules/perception/...
  //modules/planning/...
229
  //modules/prediction/...
230
  //modules/routing/...
231
  "
232
  bazel build $JOB_ARG $DEFINES $@ $BUILD_TARGETS
233 234 235 236 237 238 239

  # current velodyne drivers
  build_velodyne

  # future velodyne drivers
  build_velodyne_vls128

240 241 242 243 244 245 246
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  else
    fail 'Build failed!'
  fi
}

247
function apollo_build_dbg() {
248
  build "dbg" $@
S
siyangy 已提交
249 250
}

251
function apollo_build_opt() {
252
  build "opt" $@
S
siyangy 已提交
253 254
}

L
Lei Wang 已提交
255 256 257 258 259 260
function build_py_proto() {
  if [ -d "./py_proto" ];then
    rm -rf py_proto
  fi
  mkdir py_proto
  PROTOC='./bazel-out/host/bin/external/com_google_protobuf/protoc'
261
  find modules/ -name "*.proto" \
S
siyangy 已提交
262
      | grep -v node_modules \
263
      | xargs ${PROTOC} --python_out=py_proto
L
Lei Wang 已提交
264 265 266
  find py_proto/* -type d -exec touch "{}/__init__.py" \;
}

D
Dong Li 已提交
267
function check() {
D
Dong Li 已提交
268
  bash $0 build && bash $0 "test" && bash $0 lint
D
Dong Li 已提交
269 270 271 272 273 274 275 276 277 278 279

  if [ $? -eq 0 ]; then
    success 'Check passed!'
    return 0
  else
    fail 'Check failed!'
    return 1
  fi
}

function warn_proprietary_sw() {
280 281 282 283 284 285
  echo -e "${RED}The release built contains proprietary software provided by other parties.${NO_COLOR}"
  echo -e "${RED}Make sure you have obtained proper licensing agreement for redistribution${NO_COLOR}"
  echo -e "${RED}if you intend to publish the release package built.${NO_COLOR}"
  echo -e "${RED}Such licensing agreement is solely between you and the other parties,${NO_COLOR}"
  echo -e "${RED}and is not covered by the license terms of the apollo project${NO_COLOR}"
  echo -e "${RED}(see file license).${NO_COLOR}"
D
Dong Li 已提交
286 287 288
}

function release() {
289 290
  RELEASE_DIR="${HOME}/.cache/apollo_release"
  if [ -d "${RELEASE_DIR}" ]; then
291
    rm -rf "${RELEASE_DIR}"
292
  fi
D
Dong Li 已提交
293 294
  APOLLO_RELEASE_DIR="${RELEASE_DIR}/apollo"
  mkdir -p "${APOLLO_RELEASE_DIR}"
295 296 297 298 299 300

  # Find binaries and convert from //path:target to path/target
  BINARIES=$(bazel query "kind(cc_binary, //...)" | sed 's/^\/\///' | sed 's/:/\//')
  # Copy binaries to release dir.
  for BIN in ${BINARIES}; do
    SRC_PATH="bazel-bin/${BIN}"
D
Dong Li 已提交
301
    DST_PATH="${APOLLO_RELEASE_DIR}/${BIN}"
302 303 304 305 306
    if [ -e "${SRC_PATH}" ]; then
      mkdir -p "$(dirname "${DST_PATH}")"
      cp "${SRC_PATH}" "${DST_PATH}"
    fi
  done
D
Dong Li 已提交
307

308
  # modules data and conf
309 310
  CONFS=$(find modules/ -name "conf")
  DATAS=$(find modules/ -name "data")
311 312
  OTHER=("modules/tools"
         "modules/perception/model")
313 314 315 316 317 318 319 320 321 322 323
  rm -rf test/*
  for conf in $CONFS; do
    mkdir -p $APOLLO_RELEASE_DIR/$conf
    rsync -a $conf/* $APOLLO_RELEASE_DIR/$conf
  done
  for data in $DATAS; do
    mkdir -p $APOLLO_RELEASE_DIR/$data
    if [ $data != "modules/map/data" ]; then
      rsync -a $data/* $APOLLO_RELEASE_DIR/$data
    fi
  done
324
  # Other
325
  for path in "${OTHER[@]}"; do
326 327 328
    mkdir -p $APOLLO_RELEASE_DIR/$path
    rsync -a $path/* $APOLLO_RELEASE_DIR/$path
  done
329 330 331

  # dreamview frontend
  cp -a modules/dreamview/frontend $APOLLO_RELEASE_DIR/modules/dreamview
S
siyangy 已提交
332

333
  # remove all pyc file in modules/
D
Dong Li 已提交
334
  find modules/ -name "*.pyc" | xargs -I {} rm {}
335

S
siyangy 已提交
336
  # scripts
D
Dong Li 已提交
337
  cp -r scripts ${APOLLO_RELEASE_DIR}
S
siyangy 已提交
338

339 340 341
  # remove mounted models
  rm -rf ${APOLLO_RELEASE_DIR}/modules/perception/model/yolo_camera_detector/

D
Dong Li 已提交
342
  # lib
D
Dong Li 已提交
343
  LIB_DIR="${APOLLO_RELEASE_DIR}/lib"
344
  mkdir "${LIB_DIR}"
D
Dong Li 已提交
345
  if $USE_ESD_CAN; then
L
Lei Wang 已提交
346
    warn_proprietary_sw
D
Dong Li 已提交
347
  fi
348
  cp -r third_party/can_card_library/*/lib/* $LIB_DIR
L
Lei Wang 已提交
349 350
  cp -r bazel-genfiles/external $LIB_DIR
  cp -r py_proto/modules $LIB_DIR
351
  cp /apollo/bazel-apollo/bazel-out/local-opt/bin/modules/perception/cuda_util/libintegrated_cuda_util.so $LIB_DIR
352

D
Dong Li 已提交
353
  # doc
D
Dong Li 已提交
354 355
  cp LICENSE "${APOLLO_RELEASE_DIR}"
  cp third_party/ACKNOWLEDGEMENT.txt "${APOLLO_RELEASE_DIR}"
L
Lei Wang 已提交
356

S
siyangy 已提交
357
  # release info
D
Dong Li 已提交
358
  META="${APOLLO_RELEASE_DIR}/meta.ini"
359
  echo "git_commit: $(get_revision)" >> $META
360
  echo "git_branch: $(get_branch)" >> $META
361 362
  echo "car_type: LINCOLN.MKZ" >> $META
  echo "arch: ${MACHINE_ARCH}" >> $META
D
Dong Li 已提交
363 364 365 366
}

function gen_coverage() {
  bazel clean
367
  generate_build_targets
L
Lei Wang 已提交
368
  echo "$BUILD_TARGETS" | grep -v "cnn_segmentation_test" | xargs bazel test $DEFINES -c dbg --config=coverage $@
D
Dong Li 已提交
369 370 371
  if [ $? -ne 0 ]; then
    fail 'run test failed!'
  fi
S
siyangy 已提交
372

D
Dong Li 已提交
373 374 375 376 377 378 379 380
  COV_DIR=data/cov
  rm -rf $COV_DIR
  files=$(find bazel-out/local-dbg/bin/modules/ -iname "*.gcda" -o -iname "*.gcno" | grep -v external)
  for f in $files; do
    target="$COV_DIR/objs/modules/${f##*modules}"
    mkdir -p "$(dirname "$target")"
    cp "$f" "$target"
  done
381 382 383 384 385 386 387 388

  files=$(find bazel-out/local-opt/bin/modules/ -iname "*.gcda" -o -iname "*.gcno" | grep -v external)
  for f in $files; do
    target="$COV_DIR/objs/modules/${f##*modules}"
    mkdir -p "$(dirname "$target")"
    cp "$f" "$target"
  done

J
Jiangtao Hu 已提交
389
  lcov --rc lcov_branch_coverage=1 --capture --directory "$COV_DIR/objs" --output-file "$COV_DIR/conv.info"
D
Dong Li 已提交
390 391 392
  if [ $? -ne 0 ]; then
    fail 'lcov failed!'
  fi
J
Jiangtao Hu 已提交
393
  lcov --rc lcov_branch_coverage=1 --remove "$COV_DIR/conv.info" \
D
Dong Li 已提交
394 395 396 397 398 399 400 401 402 403 404
      "external/*" \
      "/usr/*" \
      "bazel-out/*" \
      "*third_party/*" \
      "tools/*" \
      -o $COV_DIR/stripped_conv.info
  genhtml $COV_DIR/stripped_conv.info --output-directory $COV_DIR/report
  echo "Generated coverage report in $COV_DIR/report/index.html"
}

function run_test() {
405
  generate_build_targets
406
  if [ "$USE_GPU" == "1" ]; then
407
    echo -e "${YELLOW}Running tests under GPU mode. GPU is required to run the tests.${NO_COLOR}"
L
Lei Wang 已提交
408
    echo "$BUILD_TARGETS" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
409
  else
410
    echo -e "${YELLOW}Running tests under CPU mode. No GPU is required to run the tests.${NO_COLOR}"
411
    echo "$BUILD_TARGETS" | grep -v "cnn_segmentation_test\|yolo_camera_detector_test\|unity_recognize_test\|perception_traffic_light_rectify_test\|cuda_util_test" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
412
  fi
413 414 415 416 417
  if [ $? -ne 0 ]; then
    fail 'Test failed!'
    return 1
  fi

S
siyangy 已提交
418
  if [ $? -eq 0 ]; then
D
Dong Li 已提交
419 420 421 422 423
    success 'Test passed!'
    return 0
  fi
}

424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
function citest_perception() {
  generate_build_targets

  # common related test
  echo "$BUILD_TARGETS" | grep "perception\/" | grep -v "sunnyvale_big_loop\|cnn_segmentation_test\|yolo_camera_detector_test\|unity_recognize_test\|perception_traffic_light_rectify_test\|cuda_util_test" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@

  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

L
Liangliang Zhang 已提交
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457
function citest_dreamview() {
  generate_build_targets

  # common related test
  echo "$BUILD_TARGETS" | grep "dreamview\/" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@

  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

function citest_map() {
  generate_build_targets

  # common related test
L
Liangliang Zhang 已提交
458
  echo "$BUILD_TARGETS" | grep "map\/" | grep -v "cuda_util_test" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
L
Liangliang Zhang 已提交
459 460 461 462 463 464 465 466 467 468 469

  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

function citest_basic() {
470
  generate_build_targets
471

472 473 474 475 476 477 478 479 480 481 482 483
  # common related test
  echo "$BUILD_TARGETS" | grep "common\/" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@

  # control related test
  echo "$BUILD_TARGETS" | grep "control\/" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@

  # prediction related test
  echo "$BUILD_TARGETS" | grep "prediction\/" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@

  # planning related test
  echo "$BUILD_TARGETS" | grep "planning\/" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@

484 485 486 487 488 489 490 491 492
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

L
Liangliang Zhang 已提交
493 494 495 496 497 498 499 500 501 502 503 504 505 506
function citest() {
  citest_basic
  citest_perception
  citest_map
  citest_dreamview
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

D
Dong Li 已提交
507
function run_cpp_lint() {
508 509
  generate_build_targets
  echo "$BUILD_TARGETS" | xargs bazel test --config=cpplint -c dbg
D
Dong Li 已提交
510 511 512
}

function run_bash_lint() {
S
siyangy 已提交
513
  FILES=$(find "${APOLLO_ROOT_DIR}" -type f -name "*.sh" | grep -v ros)
D
Dong Li 已提交
514 515 516 517
  echo "${FILES}" | xargs shellcheck
}

function run_lint() {
C
Calvin Miao 已提交
518
  # Add cpplint rule to BUILD files that do not contain it.
519
  for file in $(find modules -name BUILD |  grep -v gnss/third_party | \
C
Calvin Miao 已提交
520 521 522 523 524 525
    xargs grep -l -E 'cc_library|cc_test|cc_binary' | xargs grep -L 'cpplint()')
  do
    sed -i '1i\load("//tools:cpplint.bzl", "cpplint")\n' $file
    sed -i -e '$a\\ncpplint()' $file
  done

S
siyangy 已提交
526 527
  run_cpp_lint

D
Dong Li 已提交
528 529 530 531 532 533 534 535
  if [ $? -eq 0 ]; then
    success 'Lint passed!'
  else
    fail 'Lint failed!'
  fi
}

function clean() {
A
Aaron Xiao 已提交
536
  # Remove bazel cache.
537
  bazel clean --async
A
Aaron Xiao 已提交
538 539
  # Remove cmake cache.
  rm -fr framework/build
D
Dong Li 已提交
540 541 542
}

function buildify() {
543 544 545
  local buildifier_url=https://github.com/bazelbuild/buildtools/releases/download/0.4.5/buildifier
  wget $buildifier_url -O ~/.buildifier
  chmod +x ~/.buildifier
546
  find . -name '*BUILD' -type f -exec ~/.buildifier -showlog -mode=fix {} +
547 548 549 550 551 552
  if [ $? -eq 0 ]; then
    success 'Buildify worked!'
  else
    fail 'Buildify failed!'
  fi
  rm ~/.buildifier
D
Dong Li 已提交
553 554
}

S
siyangy 已提交
555 556 557 558 559
function build_fe() {
  cd modules/dreamview/frontend
  yarn build
}

D
Dong Li 已提交
560 561 562 563 564 565
function gen_doc() {
  rm -rf docs/doxygen
  doxygen apollo.doxygen
}

function version() {
566 567 568 569 570
  rev=$(get_revision)
  if [ "$rev" = "unknown" ];then
    echo "Version: $rev"
    return
  fi
D
Dong Li 已提交
571 572 573 574 575 576
  commit=$(git log -1 --pretty=%H)
  date=$(git log -1 --pretty=%cd)
  echo "Commit: ${commit}"
  echo "Date: ${date}"
}

577 578 579 580 581 582 583 584 585 586 587
function get_revision() {
  git rev-parse --is-inside-work-tree &> /dev/null
  if [ $? = 0 ];then
    REVISION=$(git rev-parse HEAD)
  else
    warning "Could not get the version number, maybe this is not a git work tree." >&2
    REVISION="unknown"
  fi
  echo "$REVISION"
}

588 589 590 591 592 593 594 595 596 597 598
function get_branch() {
  git branch &> /dev/null
  if [ $? = 0 ];then
    BRANCH=$(git rev-parse --abbrev-ref HEAD)
  else
    warning "Could not get the branch name, maybe this is not a git work tree." >&2
    BRANCH="unknown"
  fi
  echo "$BRANCH"
}

F
fengkaiwen01 已提交
599 600
function build_velodyne() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
601 602
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
F
fengkaiwen01 已提交
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi

  source "${ROS_PATH}/setup.bash"

  cd modules
  catkin_make_isolated --install --source drivers/velodyne \
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
    --cmake-args --no-warn-unused-cli
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
  cd -

  rm -rf modules/.catkin_workspace
  rm -rf modules/build_isolated/
  rm -rf modules/devel_isolated/
}

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
function build_velodyne_vls128() {
  CURRENT_PATH=$(pwd)
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi

  source "${ROS_PATH}/setup.bash"

  cd modules
  catkin_make_isolated --install --source drivers/velodyne_vls \
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
    --cmake-args --no-warn-unused-cli
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
  cd -

  rm -rf modules/.catkin_workspace
  rm -rf modules/build_isolated/
  rm -rf modules/devel_isolated/
}


646 647 648 649 650 651 652 653 654 655 656 657 658

function build_lslidar() {
  CURRENT_PATH=$(pwd)
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi

  source "${ROS_PATH}/setup.bash"

  cd modules
659
  catkin_make_isolated --install --source drivers/lslidar_apollo \
660 661 662 663 664 665 666 667 668 669
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
    --cmake-args --no-warn-unused-cli
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
  cd -

  rm -rf modules/.catkin_workspace
  rm -rf modules/build_isolated/
  rm -rf modules/devel_isolated/
}

T
Tony Zhang 已提交
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
function build_rslidar() {
  CURRENT_PATH=$(pwd)
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi

  source "${ROS_PATH}/setup.bash"

  cd modules
  catkin_make_isolated --install --source drivers/rslidar \
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
    --cmake-args --no-warn-unused-cli
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
  cd -

  rm -rf modules/.catkin_workspace
  rm -rf modules/build_isolated/
  rm -rf modules/devel_isolated/
}


Y
yibingl 已提交
694 695
function build_usbcam() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
696 697
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
Y
yibingl 已提交
698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi

  source "${ROS_PATH}/setup.bash"

  cd modules
  catkin_make_isolated --install --source drivers/usb_cam \
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
    --cmake-args --no-warn-unused-cli
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
  cd -

  rm -rf modules/.catkin_workspace
  rm -rf modules/build_isolated/
  rm -rf modules/devel_isolated/
}

717
function config() {
718
  ${APOLLO_ROOT_DIR}/scripts/configurator.sh
719 720
}

721
function print_usage() {
C
Calvin Miao 已提交
722 723 724 725 726 727 728 729 730 731
  RED='\033[0;31m'
  BLUE='\033[0;34m'
  BOLD='\033[1m'
  NONE='\033[0m'

  echo -e "\n${RED}Usage${NONE}:
  .${BOLD}/apollo.sh${NONE} [OPTION]"

  echo -e "\n${RED}Options${NONE}:
  ${BLUE}build${NONE}: run build only
732
  ${BLUE}build_opt${NONE}: build optimized binary for the code
J
Jun Zhu 已提交
733
  ${BLUE}build_gpu${NONE}: run build only with Caffe GPU mode support
F
fengkaiwen01 已提交
734
  ${BLUE}build_velodyne${NONE}: build velodyne driver
735
  ${BLUE}build_velodyne_vls128${NONE}: build velodyne vls-128 driver
736
  ${BLUE}build_lslidar${NONE}: build lslidar driver
T
Tony Zhang 已提交
737
  ${BLUE}build_rslidar${NONE}: build rslidar driver
gengqx's avatar
gengqx 已提交
738
  ${BLUE}build_usbcam${NONE}: build usb camera driver
J
Jun Zhu 已提交
739
  ${BLUE}build_opt_gpu${NONE}: build optimized binary with Caffe GPU mode support
C
Calvin Miao 已提交
740
  ${BLUE}build_fe${NONE}: compile frontend javascript code, this requires all the node_modules to be installed already
741
  ${BLUE}build_no_perception [dbg|opt]${NONE}: run build build skip building perception module, useful when some perception dependencies are not satisified, e.g., CUDA, CUDNN, LIDAR, etc.
742
  ${BLUE}build_prof${NONE}: build for gprof support.
743
  ${BLUE}build_fuzz_test${NONE}: build fuzz test cases.
C
Calvin Miao 已提交
744 745 746 747 748 749 750 751 752 753 754 755
  ${BLUE}buildify${NONE}: fix style of BUILD files
  ${BLUE}check${NONE}: run build/lint/test, please make sure it passes before checking in new code
  ${BLUE}clean${NONE}: run Bazel clean
  ${BLUE}config${NONE}: run configurator tool
  ${BLUE}coverage${NONE}: generate test coverage report
  ${BLUE}doc${NONE}: generate doxygen document
  ${BLUE}lint${NONE}: run code style check
  ${BLUE}usage${NONE}: print this menu
  ${BLUE}release${NONE}: build release version
  ${BLUE}test${NONE}: run all unit tests
  ${BLUE}version${NONE}: display current commit and date
  "
756 757
}

S
siyangy 已提交
758 759 760
function main() {
  source_apollo_base
  check_machine_arch
761
  apollo_check_system_config
S
siyangy 已提交
762 763
  check_esd_files

764 765 766 767 768
  DEFINES="--define ARCH=${MACHINE_ARCH} --define CAN_CARD=${CAN_CARD} --cxxopt=-DUSE_ESD_CAN=${USE_ESD_CAN}"

  if [ ${MACHINE_ARCH} == "x86_64" ]; then
    DEFINES="${DEFINES} --copt=-mavx2"
  fi
S
siyangy 已提交
769

770 771 772
  local cmd=$1
  shift

S
siyangy 已提交
773
  START_TIME=$(get_now)
774
  case $cmd in
S
siyangy 已提交
775
    check)
776
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
777
      check $@
S
siyangy 已提交
778 779
      ;;
    build)
780
      DEFINES="${DEFINES} --define USE_GPU=true --cxxopt=-DUSE_GPU"
781
      USE_GPU="1"
782 783 784
      apollo_build_dbg $@
      ;;
    build_cpu)
L
Lei Wang 已提交
785
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
786
      apollo_build_dbg $@
S
siyangy 已提交
787
      ;;
788
    build_prof)
D
Dong Li 已提交
789
      DEFINES="${DEFINES} --config=cpu_prof --cxxopt=-DCPU_ONLY"
790 791
      apollo_build_dbg $@
      ;;
792
    build_no_perception)
S
siyangy 已提交
793
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
794
      NOT_BUILD_PERCEPTION=true
795 796 797
      if [ "$1" == "opt" ]; then
        shift
        apollo_build_opt $@
798
      else
799 800 801
        shift
        apollo_build_dbg $@
      fi
802
      ;;
803 804 805 806
    cibuild)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      cibuild $@
      ;;
807
    build_opt)
L
Lei Wang 已提交
808
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
809
      apollo_build_opt $@
S
siyangy 已提交
810
      ;;
811
    build_gpu)
812
      DEFINES="${DEFINES} --define USE_GPU=true --cxxopt=-DUSE_GPU"
813
      USE_GPU="1"
814
      apollo_build_dbg $@
J
Jun Zhu 已提交
815
      ;;
J
Jun Zhu 已提交
816
    build_opt_gpu)
817
      DEFINES="${DEFINES} --define USE_GPU=true --cxxopt=-DUSE_GPU"
818
      USE_GPU="1"
819
      apollo_build_opt $@
S
siyangy 已提交
820
      ;;
S
siyangy 已提交
821 822 823
    build_fe)
      build_fe
      ;;
S
siyangy 已提交
824 825 826
    buildify)
      buildify
      ;;
L
Lei Wang 已提交
827 828 829
    build_py)
      build_py_proto
      ;;
F
fengkaiwen01 已提交
830
    build_velodyne)
F
fengkaiwen01 已提交
831 832
      build_velodyne
      ;;
833 834 835
    build_velodyne_vls128)
      build_velodyne_vls128
      ;;
836 837 838
    build_lslidar)
      build_lslidar
      ;;
T
Tony Zhang 已提交
839 840 841
    build_rslidar)
      build_rslidar
      ;;
F
fengkaiwen01 已提交
842
    build_usbcam)
Y
yibingl 已提交
843 844
      build_usbcam
      ;;
845 846 847 848
    build_fuzz_test)
      BUILD_FUZZ_TEST=true
      apollo_build_dbg $@
    ;;
849 850 851
    config)
      config
      ;;
S
siyangy 已提交
852 853 854 855 856 857 858
    doc)
      gen_doc
      ;;
    lint)
      run_lint
      ;;
    test)
859 860 861 862 863
      DEFINES="${DEFINES} --cxxopt=-DUSE_GPU"
      USE_GPU="1"
      run_test $@
      ;;
    test_cpu)
864
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
L
Lei Wang 已提交
865
      run_test $@
S
siyangy 已提交
866
      ;;
L
Liangliang Zhang 已提交
867 868 869 870 871 872 873 874 875 876 877 878
    citest)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      citest $@
      ;;
    citest_map)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      citest_map $@
      ;;
    citest_dreamview)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      citest_dreamview $@
      ;;
879 880 881 882
    citest_perception)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      citest_perception $@
      ;;
L
Liangliang Zhang 已提交
883
    citest_basic)
884
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
L
Liangliang Zhang 已提交
885
      citest_basic $@
886
      ;;
887
    test_gpu)
888
      DEFINES="${DEFINES} --cxxopt=-DUSE_GPU"
889
      USE_GPU="1"
L
Lei Wang 已提交
890
      run_test $@
891
      ;;
S
siyangy 已提交
892 893 894 895 896 897 898
    release)
      release 1
      ;;
    release_noproprietary)
      release 0
      ;;
    coverage)
L
Lei Wang 已提交
899
      gen_coverage $@
S
siyangy 已提交
900 901 902 903 904 905 906
      ;;
    clean)
      clean
      ;;
    version)
      version
      ;;
C
Calvin Miao 已提交
907 908 909
    usage)
      print_usage
      ;;
S
siyangy 已提交
910 911 912 913 914 915
    *)
      print_usage
      ;;
  esac
}

916
main $@