apollo.sh 24.0 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
    BUILD_TARGETS=`bazel query //...`
  else
    info 'Skip building perception module!'
L
Lei Wang 已提交
99
    BUILD_TARGETS=`bazel query //... except //modules/perception/... except //modules/calibration/lidar_ex_checker/...`
100 101
  fi

C
Calvin Miao 已提交
102 103 104
  if [ $? -ne 0 ]; then
    fail 'Build failed!'
  fi
D
Dong Li 已提交
105
  if ! $USE_ESD_CAN; then
106
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "esd")
D
Dong Li 已提交
107
  fi
108
  #skip msf for non x86_64 platforms
109
  if [ ${MACHINE_ARCH} != "x86_64" ]; then
110 111
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "msf")
  fi
112 113 114
  #switch for building fuzz test
  if [ -z $BUILD_FUZZ_TEST ]; then
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "fuzz")
S
siyangy 已提交
115
  else
116 117
     BUILD_TARGETS=`bazel query //modules/tools/fuzz/...`
  fi
D
Dong Li 已提交
118 119 120 121 122 123
}

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

S
siyangy 已提交
124
function build() {
125 126 127 128 129
  if ${USE_GPU} ; then
    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
130
  info "Start building, please wait ..."
D
Dong Li 已提交
131
  generate_build_targets
132 133
  info "Building on $MACHINE_ARCH..."

134
  MACHINE_ARCH=$(uname -m)
135
  JOB_ARG="--jobs=$(nproc)"
136 137 138
  if [ "$MACHINE_ARCH" == 'aarch64' ]; then
    JOB_ARG="--jobs=3"
  fi
139
  info "Building with $JOB_ARG for $MACHINE_ARCH"
140

141
  # Switch for building fuzz test.
142
  if [ -z $BUILD_FUZZ_TEST ]; then
143 144 145 146 147 148 149 150 151 152 153 154 155
    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
156
    fi
157 158 159 160 161
    echo "$BUILD_TARGETS" | xargs bazel build \
    --crosstool_top=tools/clang-6.0:toolchain \
    $JOB_ARG $DEFINES -c $@ --compilation_mode=dbg
  fi

162
  if [ $? -ne 0 ]; then
D
Dong Li 已提交
163 164
    fail 'Build failed!'
  fi
S
siyangy 已提交
165 166

  # Build python proto
L
Lei Wang 已提交
167
  build_py_proto
168

169 170
  # Clear KV DB and update commit_id after compiling.
  rm -fr data/kv_db
171
  REVISION=$(get_revision)
172
  python modules/tools/common/kv_db.py put \
173
      "apollo:data:commit_id" "$REVISION"
174

175
  if [ -d /apollo-simulator ] && [ -e /apollo-simulator/build.sh ]; then
176 177 178 179
    cd /apollo-simulator && bash build.sh build
    if [ $? -ne 0 ]; then
      fail 'Build failed!'
    fi
180 181 182 183
  fi
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  fi
D
Dong Li 已提交
184 185
}

186 187 188
function cibuild() {
  echo "Start building, please wait ..."
  generate_build_targets
189 190 191 192 193 194 195

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

196 197
  echo "Building on $MACHINE_ARCH..."
  BUILD_TARGETS="
198
  //modules/common/...
199
  //modules/canbus:canbus_lib
200 201 202
  //modules/control/...
  //modules/dreamview/...
  //modules/drivers/gnss/...
203
  //modules/drivers/lidar_velodyne/...
204
  //modules/drivers/camera/...
205 206 207 208
  //modules/localization/...
  //modules/map/...
  //modules/perception/...
  //modules/planning/...
209
  //modules/prediction/...
210
  //modules/routing/...
211
  "
212
  bazel build $JOB_ARG $DEFINES $@ $BUILD_TARGETS
213 214 215 216 217 218 219

  # current velodyne drivers
  build_velodyne

  # future velodyne drivers
  build_velodyne_vls128

220 221 222 223 224 225 226
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  else
    fail 'Build failed!'
  fi
}

227
function apollo_build_dbg() {
228
  build "dbg" $@
S
siyangy 已提交
229 230
}

231
function apollo_build_opt() {
232
  build "opt" $@
S
siyangy 已提交
233 234
}

L
Lei Wang 已提交
235 236 237 238 239 240
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'
241
  find modules/ -name "*.proto" \
S
siyangy 已提交
242
      | grep -v node_modules \
243
      | xargs ${PROTOC} --python_out=py_proto
L
Lei Wang 已提交
244 245 246
  find py_proto/* -type d -exec touch "{}/__init__.py" \;
}

D
Dong Li 已提交
247
function check() {
D
Dong Li 已提交
248
  bash $0 build && bash $0 "test" && bash $0 lint
D
Dong Li 已提交
249 250 251 252 253 254 255 256 257 258 259

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

function warn_proprietary_sw() {
260 261 262 263 264 265
  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 已提交
266 267 268
}

function release() {
269 270
  RELEASE_DIR="${HOME}/.cache/apollo_release"
  if [ -d "${RELEASE_DIR}" ]; then
271
    rm -rf "${RELEASE_DIR}"
272
  fi
D
Dong Li 已提交
273 274
  APOLLO_RELEASE_DIR="${RELEASE_DIR}/apollo"
  mkdir -p "${APOLLO_RELEASE_DIR}"
275 276 277 278 279 280

  # 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 已提交
281
    DST_PATH="${APOLLO_RELEASE_DIR}/${BIN}"
282 283 284 285 286
    if [ -e "${SRC_PATH}" ]; then
      mkdir -p "$(dirname "${DST_PATH}")"
      cp "${SRC_PATH}" "${DST_PATH}"
    fi
  done
D
Dong Li 已提交
287

288
  # modules data and conf
289 290
  CONFS=$(find modules/ -name "conf")
  DATAS=$(find modules/ -name "data")
291 292
  OTHER=("modules/tools"
         "modules/perception/model")
293 294 295 296 297 298 299 300 301 302 303
  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
304
  # Other
305
  for path in "${OTHER[@]}"; do
306 307 308
    mkdir -p $APOLLO_RELEASE_DIR/$path
    rsync -a $path/* $APOLLO_RELEASE_DIR/$path
  done
309 310 311

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

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

S
siyangy 已提交
316
  # scripts
D
Dong Li 已提交
317
  cp -r scripts ${APOLLO_RELEASE_DIR}
S
siyangy 已提交
318

319 320 321
  # remove mounted models
  rm -rf ${APOLLO_RELEASE_DIR}/modules/perception/model/yolo_camera_detector/

D
Dong Li 已提交
322
  # lib
D
Dong Li 已提交
323
  LIB_DIR="${APOLLO_RELEASE_DIR}/lib"
324
  mkdir "${LIB_DIR}"
D
Dong Li 已提交
325
  if $USE_ESD_CAN; then
L
Lei Wang 已提交
326
    warn_proprietary_sw
D
Dong Li 已提交
327
  fi
328
  cp -r third_party/can_card_library/*/lib/* $LIB_DIR
L
Lei Wang 已提交
329 330
  cp -r bazel-genfiles/external $LIB_DIR
  cp -r py_proto/modules $LIB_DIR
331
  cp /apollo/bazel-apollo/bazel-out/local-opt/bin/modules/perception/cuda_util/libintegrated_cuda_util.so $LIB_DIR
332

D
Dong Li 已提交
333
  # doc
D
Dong Li 已提交
334 335
  cp LICENSE "${APOLLO_RELEASE_DIR}"
  cp third_party/ACKNOWLEDGEMENT.txt "${APOLLO_RELEASE_DIR}"
L
Lei Wang 已提交
336

S
siyangy 已提交
337
  # release info
D
Dong Li 已提交
338
  META="${APOLLO_RELEASE_DIR}/meta.ini"
339
  echo "git_commit: $(get_revision)" >> $META
340
  echo "git_branch: $(get_branch)" >> $META
341 342
  echo "car_type: LINCOLN.MKZ" >> $META
  echo "arch: ${MACHINE_ARCH}" >> $META
D
Dong Li 已提交
343 344 345 346
}

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

D
Dong Li 已提交
353 354 355 356 357 358 359 360
  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
361 362 363 364 365 366 367 368

  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 已提交
369
  lcov --rc lcov_branch_coverage=1 --capture --directory "$COV_DIR/objs" --output-file "$COV_DIR/conv.info"
D
Dong Li 已提交
370 371 372
  if [ $? -ne 0 ]; then
    fail 'lcov failed!'
  fi
J
Jiangtao Hu 已提交
373
  lcov --rc lcov_branch_coverage=1 --remove "$COV_DIR/conv.info" \
D
Dong Li 已提交
374 375 376 377 378 379 380 381 382 383 384
      "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() {
385
  generate_build_targets
386
  if [ "$USE_GPU" == "1" ]; then
387
    echo -e "${YELLOW}Running tests under GPU mode. GPU is required to run the tests.${NO_COLOR}"
L
Lei Wang 已提交
388
    echo "$BUILD_TARGETS" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
389
  else
390
    echo -e "${YELLOW}Running tests under CPU mode. No GPU is required to run the tests.${NO_COLOR}"
391
    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 $@
392
  fi
393 394 395 396 397
  if [ $? -ne 0 ]; then
    fail 'Test failed!'
    return 1
  fi

S
siyangy 已提交
398
  if [ $? -eq 0 ]; then
D
Dong Li 已提交
399 400 401 402 403
    success 'Test passed!'
    return 0
  fi
}

404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
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 已提交
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
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 已提交
438
  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 已提交
439 440 441 442 443 444 445 446 447 448 449

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

function citest_basic() {
450
  generate_build_targets
451

452 453 454 455 456 457 458 459 460 461 462 463
  # 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 $@

464 465 466 467 468 469 470 471 472
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

L
Liangliang Zhang 已提交
473 474 475 476 477 478 479 480 481 482 483 484 485 486
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 已提交
487
function run_cpp_lint() {
488 489
  generate_build_targets
  echo "$BUILD_TARGETS" | xargs bazel test --config=cpplint -c dbg
D
Dong Li 已提交
490 491 492
}

function run_bash_lint() {
S
siyangy 已提交
493
  FILES=$(find "${APOLLO_ROOT_DIR}" -type f -name "*.sh" | grep -v ros)
D
Dong Li 已提交
494 495 496 497
  echo "${FILES}" | xargs shellcheck
}

function run_lint() {
C
Calvin Miao 已提交
498
  # Add cpplint rule to BUILD files that do not contain it.
499
  for file in $(find modules -name BUILD |  grep -v gnss/third_party | \
C
Calvin Miao 已提交
500 501 502 503 504 505
    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 已提交
506 507
  run_cpp_lint

D
Dong Li 已提交
508 509 510 511 512 513 514 515
  if [ $? -eq 0 ]; then
    success 'Lint passed!'
  else
    fail 'Lint failed!'
  fi
}

function clean() {
516
  bazel clean --async
D
Dong Li 已提交
517 518 519
}

function buildify() {
520 521 522
  local buildifier_url=https://github.com/bazelbuild/buildtools/releases/download/0.4.5/buildifier
  wget $buildifier_url -O ~/.buildifier
  chmod +x ~/.buildifier
523
  find . -name '*BUILD' -type f -exec ~/.buildifier -showlog -mode=fix {} +
524 525 526 527 528 529
  if [ $? -eq 0 ]; then
    success 'Buildify worked!'
  else
    fail 'Buildify failed!'
  fi
  rm ~/.buildifier
D
Dong Li 已提交
530 531
}

S
siyangy 已提交
532 533 534 535 536
function build_fe() {
  cd modules/dreamview/frontend
  yarn build
}

D
Dong Li 已提交
537 538 539 540 541 542
function gen_doc() {
  rm -rf docs/doxygen
  doxygen apollo.doxygen
}

function version() {
543 544 545 546 547
  rev=$(get_revision)
  if [ "$rev" = "unknown" ];then
    echo "Version: $rev"
    return
  fi
D
Dong Li 已提交
548 549 550 551 552 553
  commit=$(git log -1 --pretty=%H)
  date=$(git log -1 --pretty=%cd)
  echo "Commit: ${commit}"
  echo "Date: ${date}"
}

554 555 556 557 558 559 560 561 562 563 564
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"
}

565 566 567 568 569 570 571 572 573 574 575
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 已提交
576 577
function build_velodyne() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
578 579
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
F
fengkaiwen01 已提交
580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
  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/
}

599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
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/
}


623 624 625 626 627 628 629 630 631 632 633 634 635

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
636
  catkin_make_isolated --install --source drivers/lslidar_apollo \
637 638 639 640 641 642 643 644 645 646
    --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 已提交
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670
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 已提交
671 672
function build_usbcam() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
673 674
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
Y
yibingl 已提交
675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
  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/
}

694
function config() {
695
  ${APOLLO_ROOT_DIR}/scripts/configurator.sh
696 697
}

698
function print_usage() {
C
Calvin Miao 已提交
699 700 701 702 703 704 705 706 707 708
  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
709
  ${BLUE}build_opt${NONE}: build optimized binary for the code
J
Jun Zhu 已提交
710
  ${BLUE}build_gpu${NONE}: run build only with Caffe GPU mode support
F
fengkaiwen01 已提交
711
  ${BLUE}build_velodyne${NONE}: build velodyne driver
712
  ${BLUE}build_velodyne_vls128${NONE}: build velodyne vls-128 driver
713
  ${BLUE}build_lslidar${NONE}: build lslidar driver
T
Tony Zhang 已提交
714
  ${BLUE}build_rslidar${NONE}: build rslidar driver
gengqx's avatar
gengqx 已提交
715
  ${BLUE}build_usbcam${NONE}: build usb camera driver
J
Jun Zhu 已提交
716
  ${BLUE}build_opt_gpu${NONE}: build optimized binary with Caffe GPU mode support
C
Calvin Miao 已提交
717
  ${BLUE}build_fe${NONE}: compile frontend javascript code, this requires all the node_modules to be installed already
718
  ${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.
719
  ${BLUE}build_prof${NONE}: build for gprof support.
720
  ${BLUE}build_fuzz_test${NONE}: build fuzz test cases.
C
Calvin Miao 已提交
721 722 723 724 725 726 727 728 729 730 731 732
  ${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
  "
733 734
}

S
siyangy 已提交
735 736 737
function main() {
  source_apollo_base
  check_machine_arch
738
  apollo_check_system_config
S
siyangy 已提交
739 740
  check_esd_files

741 742 743 744 745
  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 已提交
746

747 748 749
  local cmd=$1
  shift

S
siyangy 已提交
750
  START_TIME=$(get_now)
751
  case $cmd in
S
siyangy 已提交
752
    check)
753
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
754
      check $@
S
siyangy 已提交
755 756
      ;;
    build)
757 758 759 760
      DEFINES="${DEFINES} --define USE_GPU=true --cxxopt=-DUSE_GPU"
      apollo_build_dbg $@
      ;;
    build_cpu)
L
Lei Wang 已提交
761
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
762
      apollo_build_dbg $@
S
siyangy 已提交
763
      ;;
764
    build_prof)
D
Dong Li 已提交
765
      DEFINES="${DEFINES} --config=cpu_prof --cxxopt=-DCPU_ONLY"
766 767
      apollo_build_dbg $@
      ;;
768
    build_no_perception)
S
siyangy 已提交
769
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
770
      NOT_BUILD_PERCEPTION=true
771 772 773 774 775 776 777
      if [ "$1" == "opt" ]; then
        shift
        apollo_build_opt $@
      elif [ "$1" == "dbg" ]; then
        shift
        apollo_build_dbg $@
      fi
778
      ;;
779 780 781 782
    cibuild)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      cibuild $@
      ;;
783
    build_opt)
L
Lei Wang 已提交
784
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
785
      apollo_build_opt $@
S
siyangy 已提交
786
      ;;
787
    build_gpu)
788
      DEFINES="${DEFINES} --define USE_GPU=true --cxxopt=-DUSE_GPU"
789
      apollo_build_dbg $@
J
Jun Zhu 已提交
790
      ;;
J
Jun Zhu 已提交
791
    build_opt_gpu)
792
      DEFINES="${DEFINES} --define USE_GPU=true --cxxopt=-DUSE_GPU"
793
      apollo_build_opt $@
S
siyangy 已提交
794
      ;;
S
siyangy 已提交
795 796 797
    build_fe)
      build_fe
      ;;
S
siyangy 已提交
798 799 800
    buildify)
      buildify
      ;;
L
Lei Wang 已提交
801 802 803
    build_py)
      build_py_proto
      ;;
F
fengkaiwen01 已提交
804
    build_velodyne)
F
fengkaiwen01 已提交
805 806
      build_velodyne
      ;;
807 808 809
    build_velodyne_vls128)
      build_velodyne_vls128
      ;;
810 811 812
    build_lslidar)
      build_lslidar
      ;;
T
Tony Zhang 已提交
813 814 815
    build_rslidar)
      build_rslidar
      ;;
F
fengkaiwen01 已提交
816
    build_usbcam)
Y
yibingl 已提交
817 818
      build_usbcam
      ;;
819 820 821 822
    build_fuzz_test)
      BUILD_FUZZ_TEST=true
      apollo_build_dbg $@
    ;;
823 824 825
    config)
      config
      ;;
S
siyangy 已提交
826 827 828 829 830 831 832
    doc)
      gen_doc
      ;;
    lint)
      run_lint
      ;;
    test)
833 834 835 836 837
      DEFINES="${DEFINES} --cxxopt=-DUSE_GPU"
      USE_GPU="1"
      run_test $@
      ;;
    test_cpu)
838
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
L
Lei Wang 已提交
839
      run_test $@
S
siyangy 已提交
840
      ;;
L
Liangliang Zhang 已提交
841 842 843 844 845 846 847 848 849 850 851 852
    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 $@
      ;;
853 854 855 856
    citest_perception)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      citest_perception $@
      ;;
L
Liangliang Zhang 已提交
857
    citest_basic)
858
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
L
Liangliang Zhang 已提交
859
      citest_basic $@
860
      ;;
861
    test_gpu)
862
      DEFINES="${DEFINES} --cxxopt=-DUSE_GPU"
863
      USE_GPU="1"
L
Lei Wang 已提交
864
      run_test $@
865
      ;;
S
siyangy 已提交
866 867 868 869 870 871 872
    release)
      release 1
      ;;
    release_noproprietary)
      release 0
      ;;
    coverage)
L
Lei Wang 已提交
873
      gen_coverage $@
S
siyangy 已提交
874 875 876 877 878 879 880
      ;;
    clean)
      clean
      ;;
    version)
      version
      ;;
C
Calvin Miao 已提交
881 882 883
    usage)
      print_usage
      ;;
S
siyangy 已提交
884 885 886 887 888 889
    *)
      print_usage
      ;;
  esac
}

890
main $@