apollo.sh 19.2 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 31

function apollo_check_system_config() {
  # check operating system
32
  OP_SYSTEM=$(uname -s)
33
  case $OP_SYSTEM in
34 35
    "Linux")
      echo "System check passed. Build continue ..."
36 37 38 39 40 41 42

      # 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
43 44 45 46
      ;;
    "Darwin")
      warning "Mac OS is not officially supported in the current version. Build could fail. We recommend using Ubuntu 14.04."
      ;;
47
    *)
48 49 50 51
      error "Unsupported system: ${OP_SYSTEM}."
      error "Please use Linux, we recommend Ubuntu 14.04."
      exit 1
      ;;
52 53 54
  esac
}

S
siyangy 已提交
55 56 57
function check_machine_arch() {
  # the machine type, currently support x86_64, aarch64
  MACHINE_ARCH=$(uname -m)
D
Dong Li 已提交
58

S
siyangy 已提交
59 60 61 62 63 64 65 66 67
  # 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
68 69 70

  #setup vtk folder name for different systems.
  VTK_VERSION=$(find /usr/include/ -type d  -name "vtk-*" | cut -d '-' -f 2)
71
  sed -i "s/VTK_VERSION/${VTK_VERSION}/g" WORKSPACE
S
siyangy 已提交
72
}
D
Dong Li 已提交
73 74

function check_esd_files() {
S
siyangy 已提交
75 76
  CAN_CARD="fake_can"

D
Dong Li 已提交
77 78 79 80
  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 已提交
81
      CAN_CARD="esd_can"
D
Dong Li 已提交
82
  else
83
      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 已提交
84 85 86 87 88
      USE_ESD_CAN=false
  fi
}

function generate_build_targets() {
S
siyangy 已提交
89
  if [ -z $NOT_BUILD_PERCEPTION ] ; then
90 91 92
    BUILD_TARGETS=`bazel query //...`
  else
    info 'Skip building perception module!'
L
Lei Wang 已提交
93
    BUILD_TARGETS=`bazel query //... except //modules/perception/... except //modules/calibration/lidar_ex_checker/...`
94 95
  fi

C
Calvin Miao 已提交
96 97 98
  if [ $? -ne 0 ]; then
    fail 'Build failed!'
  fi
D
Dong Li 已提交
99
  if ! $USE_ESD_CAN; then
100
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "esd")
D
Dong Li 已提交
101 102 103 104 105 106 107
  fi
}

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

S
siyangy 已提交
108
function build() {
S
siyangy 已提交
109
  START_TIME=$(get_now)
D
Dong Li 已提交
110

111
  info "Start building, please wait ..."
D
Dong Li 已提交
112
  generate_build_targets
113 114
  info "Building on $MACHINE_ARCH..."

115 116 117 118 119 120
  MACHINE_ARCH=$(uname -m)
  JOB_ARG=""
  if [ "$MACHINE_ARCH" == 'aarch64' ]; then
    JOB_ARG="--jobs=3"
  fi
  echo "$BUILD_TARGETS" | xargs bazel build $JOB_ARG $DEFINES -c $@
121
  if [ $? -ne 0 ]; then
D
Dong Li 已提交
122 123
    fail 'Build failed!'
  fi
S
siyangy 已提交
124 125

  # Build python proto
L
Lei Wang 已提交
126
  build_py_proto
127

128 129
  # Clear KV DB and update commit_id after compiling.
  rm -fr data/kv_db
130 131
  python modules/tools/common/kv_db.py put \
      "apollo:data:commit_id" "$(git rev-parse HEAD)"
132

133
  if [ -d /apollo-simulator ] && [ -e /apollo-simulator/build.sh ]; then
134 135 136 137
    cd /apollo-simulator && bash build.sh build
    if [ $? -ne 0 ]; then
      fail 'Build failed!'
    fi
138 139 140 141
  fi
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  fi
D
Dong Li 已提交
142 143
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
function cibuild() {
  START_TIME=$(get_now)

  echo "Start building, please wait ..."
  generate_build_targets
  echo "Building on $MACHINE_ARCH..."
  BUILD_TARGETS="
  //modules/control
  //modules/dreamview
  //modules/localization
  //modules/perception
  //modules/planning
  //modules/prediction
  //modules/routing
  "
A
Aaron Xiao 已提交
159
  bazel build $DEFINES $@ $BUILD_TARGETS
160 161 162 163 164 165 166
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  else
    fail 'Build failed!'
  fi
}

167
function apollo_build_dbg() {
168
  build "dbg" $@
S
siyangy 已提交
169 170
}

171
function apollo_build_opt() {
172
  build "opt" $@
S
siyangy 已提交
173 174
}

L
Lei Wang 已提交
175 176 177 178 179 180
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'
181
  find modules/ -name "*.proto" \
S
siyangy 已提交
182
      | grep -v node_modules \
183 184
      | grep -v modules/drivers/gnss \
      | xargs ${PROTOC} --python_out=py_proto
L
Lei Wang 已提交
185 186 187
  find py_proto/* -type d -exec touch "{}/__init__.py" \;
}

D
Dong Li 已提交
188
function check() {
S
siyangy 已提交
189
  local check_start_time=$(get_now)
D
Dong Li 已提交
190 191

  bash $0 build && bash $0 "test" && bash $0 lint
D
Dong Li 已提交
192 193 194 195 196 197 198 199 200 201 202 203

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

function warn_proprietary_sw() {
204 205 206 207 208 209
  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 已提交
210 211 212
}

function release() {
213 214 215
  RELEASE_DIR="${HOME}/.cache/apollo_release"
  if [ -d "${RELEASE_DIR}" ]; then
    rm -fr "${RELEASE_DIR}"
216
  fi
217 218 219 220 221 222 223 224 225 226 227 228 229 230
  APOLLO_DIR="${RELEASE_DIR}/apollo"
  mkdir -p "${APOLLO_DIR}"

  # 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}"
    DST_PATH="${APOLLO_DIR}/${BIN}"
    if [ -e "${SRC_PATH}" ]; then
      mkdir -p "$(dirname "${DST_PATH}")"
      cp "${SRC_PATH}" "${DST_PATH}"
    fi
  done
D
Dong Li 已提交
231

232 233
  # modules data and conf
  MODULES_DIR="${APOLLO_DIR}/modules"
D
Dong Li 已提交
234
  mkdir -p $MODULES_DIR
235
  for m in common control canbus localization decision perception dreamview \
236
       prediction planning routing calibration third_party_perception monitor data \
237 238
       drivers/delphi_esr \
       drivers/gnss \
239
       drivers/conti_radar \
L
Lei Wang 已提交
240
       drivers/mobileye \
241 242
       calibration/republish_msg \
       calibration/lidar_ex_checker
D
Dong Li 已提交
243 244 245
  do
    TARGET_DIR=$MODULES_DIR/$m
    mkdir -p $TARGET_DIR
246 247
    if [ -d modules/$m/conf ]; then
      cp -r modules/$m/conf $TARGET_DIR
D
Dong Li 已提交
248
    fi
249 250
    if [ -d modules/$m/data ]; then
      cp -r modules/$m/data $TARGET_DIR
D
Dong Li 已提交
251 252
    fi
  done
S
siyangy 已提交
253

254
  # remove all pyc file in modules/
D
Dong Li 已提交
255
  find modules/ -name "*.pyc" | xargs -I {} rm {}
256 257

  # tools
D
Dong Li 已提交
258
  cp -r modules/tools $MODULES_DIR
S
siyangy 已提交
259 260

  # scripts
261
  cp -r scripts ${APOLLO_DIR}
S
siyangy 已提交
262

263 264
  # dreamview runfiles
  cp -Lr bazel-bin/modules/dreamview/dreamview.runfiles/apollo/modules/dreamview/frontend $MODULES_DIR/dreamview
265

266
  # perception model
L
Lei Wang 已提交
267 268
  cp -r modules/perception/model/ $MODULES_DIR/perception

L
Lei Wang 已提交
269 270 271 272
  # velodyne launch
  mkdir -p $MODULES_DIR/drivers/velodyne/velodyne
  cp -r modules/drivers/velodyne/velodyne/launch $MODULES_DIR/drivers/velodyne/velodyne

Y
yibingl 已提交
273 274 275 276
  # usb_cam launch
  mkdir -p $MODULES_DIR/drivers/usb_cam
  cp -r modules/drivers/usb_cam/launch $MODULES_DIR/drivers/usb_cam

D
Dong Li 已提交
277
  # lib
278 279
  LIB_DIR="${APOLLO_DIR}/lib"
  mkdir "${LIB_DIR}"
D
Dong Li 已提交
280
  if $USE_ESD_CAN; then
L
Lei Wang 已提交
281
    warn_proprietary_sw
D
Dong Li 已提交
282 283
    for m in esd_can
    do
284
      cp third_party/can_card_library/$m/lib/* $LIB_DIR
D
Dong Li 已提交
285 286
    done
  fi
L
Lei Wang 已提交
287 288
  cp -r bazel-genfiles/external $LIB_DIR
  cp -r py_proto/modules $LIB_DIR
289

D
Dong Li 已提交
290
  # doc
291 292 293
  cp -r docs "${APOLLO_DIR}"
  cp LICENSE "${APOLLO_DIR}"
  cp third_party/ACKNOWLEDGEMENT.txt "${APOLLO_DIR}"
L
Lei Wang 已提交
294

S
siyangy 已提交
295
  # release info
296
  META="${APOLLO_DIR}/meta.ini"
L
Lei Wang 已提交
297 298 299 300
  echo "[Release]" > $META
  echo "git_commit: $(git rev-parse HEAD)" >> $META
  echo "car_type : LINCOLN.MKZ" >> $META
  echo "arch : ${MACHINE_ARCH}" >> $META
D
Dong Li 已提交
301 302 303 304
}

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

D
Dong Li 已提交
311 312 313 314 315 316 317 318
  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
319 320 321 322 323 324 325 326

  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

D
Dong Li 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
  lcov --capture --directory "$COV_DIR/objs" --output-file "$COV_DIR/conv.info"
  if [ $? -ne 0 ]; then
    fail 'lcov failed!'
  fi
  lcov --remove "$COV_DIR/conv.info" \
      "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() {
S
siyangy 已提交
343
  START_TIME=$(get_now)
D
Dong Li 已提交
344

345
  generate_build_targets
346 347
  if [ "$USE_GPU" == "1" ]; then
    echo -e "${RED}Need GPU to run the tests.${NO_COLOR}"
L
Lei Wang 已提交
348
    echo "$BUILD_TARGETS" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
349
  else
L
Lei Wang 已提交
350
    echo "$BUILD_TARGETS" | grep -v "cnn_segmentation_test" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
351
  fi
352 353 354 355 356
  if [ $? -ne 0 ]; then
    fail 'Test failed!'
    return 1
  fi

357
  if [ -d /apollo-simulator ] && [ -e /apollo-simulator/build.sh ]; then
358 359 360 361 362 363 364
      cd /apollo-simulator && bash build.sh test
      if [ $? -ne 0 ]; then
        fail 'Test failed!'
        return 1
      fi
  fi

S
siyangy 已提交
365
  if [ $? -eq 0 ]; then
D
Dong Li 已提交
366 367 368 369 370
    success 'Test passed!'
    return 0
  fi
}

371 372 373 374 375 376 377
function citest() {
  START_TIME=$(get_now)
  BUILD_TARGETS="
  //modules/planning/integration_tests:garage_test
  //modules/planning/integration_tests:sunnyvale_loop_test
  //modules/control/integration_tests:simple_control_test
  //modules/prediction/container/obstacles:obstacle_test
378
  //modules/dreamview/backend/simulation_world:simulation_world_service_test
379
  "
A
Aaron Xiao 已提交
380
  bazel test $DEFINES --config=unit_test --test_verbose_timeout_warnings $@ $BUILD_TARGETS
381 382 383 384 385 386 387 388 389
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

D
Dong Li 已提交
390
function run_cpp_lint() {
391 392
  generate_build_targets
  echo "$BUILD_TARGETS" | xargs bazel test --config=cpplint -c dbg
D
Dong Li 已提交
393 394 395
}

function run_bash_lint() {
S
siyangy 已提交
396
  FILES=$(find "${APOLLO_ROOT_DIR}" -type f -name "*.sh" | grep -v ros)
D
Dong Li 已提交
397 398 399 400
  echo "${FILES}" | xargs shellcheck
}

function run_lint() {
S
siyangy 已提交
401
  START_TIME=$(get_now)
D
Dong Li 已提交
402

C
Calvin Miao 已提交
403 404 405 406 407 408 409 410
  # Add cpplint rule to BUILD files that do not contain it.
  for file in $(find modules -name BUILD | \
    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 已提交
411 412
  run_cpp_lint

D
Dong Li 已提交
413 414 415 416 417 418 419 420
  if [ $? -eq 0 ]; then
    success 'Lint passed!'
  else
    fail 'Lint failed!'
  fi
}

function clean() {
421
  bazel clean --async
D
Dong Li 已提交
422 423 424
}

function buildify() {
425 426 427 428 429
  START_TIME=$(get_now)

  local buildifier_url=https://github.com/bazelbuild/buildtools/releases/download/0.4.5/buildifier
  wget $buildifier_url -O ~/.buildifier
  chmod +x ~/.buildifier
430
  find . -name '*BUILD' -type f -exec ~/.buildifier -showlog -mode=fix {} +
431 432 433 434 435 436
  if [ $? -eq 0 ]; then
    success 'Buildify worked!'
  else
    fail 'Buildify failed!'
  fi
  rm ~/.buildifier
D
Dong Li 已提交
437 438
}

S
siyangy 已提交
439 440 441 442 443
function build_fe() {
  cd modules/dreamview/frontend
  yarn build
}

D
Dong Li 已提交
444 445 446 447 448 449 450 451 452 453 454 455
function gen_doc() {
  rm -rf docs/doxygen
  doxygen apollo.doxygen
}

function version() {
  commit=$(git log -1 --pretty=%H)
  date=$(git log -1 --pretty=%cd)
  echo "Commit: ${commit}"
  echo "Date: ${date}"
}

S
siyangy 已提交
456
function build_gnss() {
457
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
458 459
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
L
Lei Wang 已提交
460 461 462 463
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi
464

L
Lei Wang 已提交
465
  source "${ROS_PATH}/setup.bash"
466 467 468 469 470 471 472 473 474 475 476

  protoc modules/common/proto/error_code.proto --cpp_out=./
  protoc modules/common/proto/header.proto --cpp_out=./
  protoc modules/common/proto/geometry.proto --cpp_out=./

  protoc modules/localization/proto/imu.proto --cpp_out=./
  protoc modules/localization/proto/gps.proto --cpp_out=./
  protoc modules/localization/proto/pose.proto --cpp_out=./

  protoc modules/drivers/gnss/proto/gnss.proto --cpp_out=./
  protoc modules/drivers/gnss/proto/imu.proto --cpp_out=./
F
fengkaiwen01 已提交
477
  protoc modules/drivers/gnss/proto/ins.proto --cpp_out=./ --python_out=./
478
  protoc modules/drivers/gnss/proto/config.proto --cpp_out=./
F
fengkaiwen01 已提交
479
  protoc modules/drivers/gnss/proto/gnss_status.proto --cpp_out=./ --python_out=./
480
  protoc modules/drivers/gnss/proto/gpgga.proto --cpp_out=./
481 482
  protoc modules/drivers/gnss/proto/gnss_raw_observation.proto --cpp_out=./ --python_out=./
  protoc modules/drivers/gnss/proto/gnss_best_pose.proto --cpp_out=./ --python_out=./
483 484

  cd modules
F
fengkaiwen01 已提交
485
  catkin_make_isolated --install --source drivers/gnss \
L
Lei Wang 已提交
486
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
487
    --cmake-args --no-warn-unused-cli
L
Lei Wang 已提交
488
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
489 490 491 492 493 494
  cd -

  rm -rf modules/common/proto/*.pb.cc
  rm -rf modules/common/proto/*.pb.h
  rm -rf modules/drivers/gnss/proto/*.pb.cc
  rm -rf modules/drivers/gnss/proto/*.pb.h
F
fengkaiwen01 已提交
495
  rm -rf modules/drivers/gnss/proto/*_pb2.py
496 497 498 499 500 501
  rm -rf modules/localization/proto/*.pb.cc
  rm -rf modules/localization/proto/*.pb.h

  rm -rf modules/.catkin_workspace
  rm -rf modules/build_isolated/
  rm -rf modules/devel_isolated/
D
Dong Li 已提交
502 503
}

F
fengkaiwen01 已提交
504 505
function build_velodyne() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
506 507
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
F
fengkaiwen01 已提交
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
  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/
}

Y
yibingl 已提交
527 528
function build_usbcam() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
529 530
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
Y
yibingl 已提交
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
  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/
}

550
function config() {
551
  ${APOLLO_ROOT_DIR}/scripts/configurator.sh
552 553
}

554
function print_usage() {
C
Calvin Miao 已提交
555 556 557 558 559 560 561 562 563 564
  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
565
  ${BLUE}build_opt${NONE}: build optimized binary for the code
J
Jun Zhu 已提交
566
  ${BLUE}build_gpu${NONE}: run build only with Caffe GPU mode support
F
fengkaiwen01 已提交
567 568 569
  ${BLUE}build_gnss${NONE}: build gnss driver
  ${BLUE}build_velodyne${NONE}: build velodyne driver
  ${BLUE}build_usbcam${NONE}: build velodyne driver
J
Jun Zhu 已提交
570
  ${BLUE}build_opt_gpu${NONE}: build optimized binary with Caffe GPU mode support
C
Calvin Miao 已提交
571
  ${BLUE}build_fe${NONE}: compile frontend javascript code, this requires all the node_modules to be installed already
572
  ${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.
573
  ${BLUE}build_prof${NONE}: build for gprof support.
C
Calvin Miao 已提交
574 575 576 577 578 579 580 581 582 583 584 585
  ${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
  "
586 587
}

S
siyangy 已提交
588 589 590 591 592 593
function main() {
  source_apollo_base
  apollo_check_system_config
  check_machine_arch
  check_esd_files

594 595 596 597 598
  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 已提交
599

600 601 602 603
  local cmd=$1
  shift

  case $cmd in
S
siyangy 已提交
604
    check)
605
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
606
      check $@
S
siyangy 已提交
607 608
      ;;
    build)
L
Lei Wang 已提交
609
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
610
      apollo_build_dbg $@
S
siyangy 已提交
611
      ;;
612
    build_prof)
D
Dong Li 已提交
613
      DEFINES="${DEFINES} --config=cpu_prof --cxxopt=-DCPU_ONLY"
614 615
      apollo_build_dbg $@
      ;;
616
    build_no_perception)
S
siyangy 已提交
617
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
618
      NOT_BUILD_PERCEPTION=true
619 620 621 622 623 624 625
      if [ "$1" == "opt" ]; then
        shift
        apollo_build_opt $@
      elif [ "$1" == "dbg" ]; then
        shift
        apollo_build_dbg $@
      fi
626
      ;;
627 628 629 630
    cibuild)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      cibuild $@
      ;;
631
    build_opt)
L
Lei Wang 已提交
632
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
633
      apollo_build_opt $@
S
siyangy 已提交
634
      ;;
635
    build_gpu)
636
      DEFINES="${DEFINES} --cxxopt=-DUSE_CAFFE_GPU"
637
      apollo_build_dbg $@
J
Jun Zhu 已提交
638
      ;;
J
Jun Zhu 已提交
639
    build_opt_gpu)
640
      DEFINES="${DEFINES} --cxxopt=-DUSE_CAFFE_GPU"
641
      apollo_build_opt $@
S
siyangy 已提交
642
      ;;
S
siyangy 已提交
643 644 645
    build_fe)
      build_fe
      ;;
S
siyangy 已提交
646 647 648
    buildify)
      buildify
      ;;
F
fengkaiwen01 已提交
649
    build_gnss)
S
siyangy 已提交
650 651
      build_gnss
      ;;
L
Lei Wang 已提交
652 653 654
    build_py)
      build_py_proto
      ;;
F
fengkaiwen01 已提交
655
    build_velodyne)
F
fengkaiwen01 已提交
656 657
      build_velodyne
      ;;
F
fengkaiwen01 已提交
658
    build_usbcam)
Y
yibingl 已提交
659 660
      build_usbcam
      ;;
661 662 663
    config)
      config
      ;;
S
siyangy 已提交
664 665 666 667 668 669 670
    doc)
      gen_doc
      ;;
    lint)
      run_lint
      ;;
    test)
671
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
L
Lei Wang 已提交
672
      run_test $@
S
siyangy 已提交
673
      ;;
674 675 676 677
    citest)
      DEFINES="${DEFINES} --cxxopt=-DCPU_ONLY"
      citest $@
      ;;
678 679 680
    test_gpu)
      DEFINES="${DEFINES} --cxxopt=-DUSE_CAFFE_GPU"
      USE_GPU="1"
L
Lei Wang 已提交
681
      run_test $@
682
      ;;
S
siyangy 已提交
683 684 685 686 687 688 689
    release)
      release 1
      ;;
    release_noproprietary)
      release 0
      ;;
    coverage)
L
Lei Wang 已提交
690
      gen_coverage $@
S
siyangy 已提交
691 692 693 694 695 696 697
      ;;
    clean)
      clean
      ;;
    version)
      version
      ;;
C
Calvin Miao 已提交
698 699 700
    usage)
      print_usage
      ;;
S
siyangy 已提交
701 702 703 704 705 706 707
    *)
      print_usage
      ;;
  esac
}

main $@