apollo.sh 19.3 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
  fi
102 103 104 105
  #skip msf for non x86_64 platforms
  if [ ${MACHINE_ARCH} == "x86_64" ]; then
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "msf")
  fi
D
Dong Li 已提交
106 107 108 109 110 111
}

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

S
siyangy 已提交
112
function build() {
S
siyangy 已提交
113
  START_TIME=$(get_now)
D
Dong Li 已提交
114

115
  info "Start building, please wait ..."
D
Dong Li 已提交
116
  generate_build_targets
117 118
  info "Building on $MACHINE_ARCH..."

119 120 121 122 123 124
  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 $@
125
  if [ $? -ne 0 ]; then
D
Dong Li 已提交
126 127
    fail 'Build failed!'
  fi
S
siyangy 已提交
128 129

  # Build python proto
L
Lei Wang 已提交
130
  build_py_proto
131

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

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

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
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 已提交
163
  bazel build $DEFINES $@ $BUILD_TARGETS
164 165 166 167 168 169 170
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  else
    fail 'Build failed!'
  fi
}

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

175
function apollo_build_opt() {
176
  build "opt" $@
S
siyangy 已提交
177 178
}

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

D
Dong Li 已提交
192
function check() {
S
siyangy 已提交
193
  local check_start_time=$(get_now)
D
Dong Li 已提交
194 195

  bash $0 build && bash $0 "test" && bash $0 lint
D
Dong Li 已提交
196 197 198 199 200 201 202 203 204 205 206 207

  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() {
208 209 210 211 212 213
  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 已提交
214 215 216
}

function release() {
217 218 219
  RELEASE_DIR="${HOME}/.cache/apollo_release"
  if [ -d "${RELEASE_DIR}" ]; then
    rm -fr "${RELEASE_DIR}"
220
  fi
221 222 223 224 225 226 227 228 229 230 231 232 233 234
  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 已提交
235

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

258
  # remove all pyc file in modules/
D
Dong Li 已提交
259
  find modules/ -name "*.pyc" | xargs -I {} rm {}
260 261

  # tools
D
Dong Li 已提交
262
  cp -r modules/tools $MODULES_DIR
S
siyangy 已提交
263 264

  # scripts
265
  cp -r scripts ${APOLLO_DIR}
S
siyangy 已提交
266

267 268
  # dreamview runfiles
  cp -Lr bazel-bin/modules/dreamview/dreamview.runfiles/apollo/modules/dreamview/frontend $MODULES_DIR/dreamview
269

270
  # perception model
L
Lei Wang 已提交
271 272
  cp -r modules/perception/model/ $MODULES_DIR/perception

L
Lei Wang 已提交
273 274 275 276
  # velodyne launch
  mkdir -p $MODULES_DIR/drivers/velodyne/velodyne
  cp -r modules/drivers/velodyne/velodyne/launch $MODULES_DIR/drivers/velodyne/velodyne

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

D
Dong Li 已提交
294
  # doc
295 296 297
  cp -r docs "${APOLLO_DIR}"
  cp LICENSE "${APOLLO_DIR}"
  cp third_party/ACKNOWLEDGEMENT.txt "${APOLLO_DIR}"
L
Lei Wang 已提交
298

S
siyangy 已提交
299
  # release info
300
  META="${APOLLO_DIR}/meta.ini"
L
Lei Wang 已提交
301 302 303 304
  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 已提交
305 306 307 308
}

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

D
Dong Li 已提交
315 316 317 318 319 320 321 322
  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
323 324 325 326 327 328 329 330

  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 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
  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 已提交
347
  START_TIME=$(get_now)
D
Dong Li 已提交
348

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

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

S
siyangy 已提交
369
  if [ $? -eq 0 ]; then
D
Dong Li 已提交
370 371 372 373 374
    success 'Test passed!'
    return 0
  fi
}

375 376 377 378 379 380 381
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
382
  //modules/dreamview/backend/simulation_world:simulation_world_service_test
383
  "
A
Aaron Xiao 已提交
384
  bazel test $DEFINES --config=unit_test --test_verbose_timeout_warnings $@ $BUILD_TARGETS
385 386 387 388 389 390 391 392 393
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

D
Dong Li 已提交
394
function run_cpp_lint() {
395 396
  generate_build_targets
  echo "$BUILD_TARGETS" | xargs bazel test --config=cpplint -c dbg
D
Dong Li 已提交
397 398 399
}

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

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

C
Calvin Miao 已提交
407 408 409 410 411 412 413 414
  # 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 已提交
415 416
  run_cpp_lint

D
Dong Li 已提交
417 418 419 420 421 422 423 424
  if [ $? -eq 0 ]; then
    success 'Lint passed!'
  else
    fail 'Lint failed!'
  fi
}

function clean() {
425
  bazel clean --async
D
Dong Li 已提交
426 427 428
}

function buildify() {
429 430 431 432 433
  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
434
  find . -name '*BUILD' -type f -exec ~/.buildifier -showlog -mode=fix {} +
435 436 437 438 439 440
  if [ $? -eq 0 ]; then
    success 'Buildify worked!'
  else
    fail 'Buildify failed!'
  fi
  rm ~/.buildifier
D
Dong Li 已提交
441 442
}

S
siyangy 已提交
443 444 445 446 447
function build_fe() {
  cd modules/dreamview/frontend
  yarn build
}

D
Dong Li 已提交
448 449 450 451 452 453 454 455 456 457 458 459
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 已提交
460
function build_gnss() {
461
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
462 463
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
L
Lei Wang 已提交
464 465 466 467
  else
    warning "ROS not found. Run apolllo.sh build first."
    exit 1
  fi
468

L
Lei Wang 已提交
469
  source "${ROS_PATH}/setup.bash"
470 471 472 473 474 475 476 477 478 479 480

  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 已提交
481
  protoc modules/drivers/gnss/proto/ins.proto --cpp_out=./ --python_out=./
482
  protoc modules/drivers/gnss/proto/config.proto --cpp_out=./
F
fengkaiwen01 已提交
483
  protoc modules/drivers/gnss/proto/gnss_status.proto --cpp_out=./ --python_out=./
484
  protoc modules/drivers/gnss/proto/gpgga.proto --cpp_out=./
485 486
  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=./
487 488

  cd modules
F
fengkaiwen01 已提交
489
  catkin_make_isolated --install --source drivers/gnss \
L
Lei Wang 已提交
490
    --install-space "${ROS_PATH}" -DCMAKE_BUILD_TYPE=Release \
491
    --cmake-args --no-warn-unused-cli
L
Lei Wang 已提交
492
  find "${ROS_PATH}" -name "*.pyc" -print0 | xargs -0 rm -rf
493 494 495 496 497 498
  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 已提交
499
  rm -rf modules/drivers/gnss/proto/*_pb2.py
500 501 502 503 504 505
  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 已提交
506 507
}

F
fengkaiwen01 已提交
508 509
function build_velodyne() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
510 511
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
F
fengkaiwen01 已提交
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
  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 已提交
531 532
function build_usbcam() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
533 534
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
Y
yibingl 已提交
535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
  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/
}

554
function config() {
555
  ${APOLLO_ROOT_DIR}/scripts/configurator.sh
556 557
}

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

S
siyangy 已提交
592 593 594 595 596 597
function main() {
  source_apollo_base
  apollo_check_system_config
  check_machine_arch
  check_esd_files

598 599 600 601 602
  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 已提交
603

604 605 606 607
  local cmd=$1
  shift

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

main $@