apollo.sh 19.4 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
  #skip msf for non x86_64 platforms
103
  if [ ${MACHINE_ARCH} != "x86_64" ]; then
104 105
     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
263 264
  mkdir -p $MODULES_DIR/data/tools
  cp -r modules/data/tools/recorder $MODULES_DIR/data/tools/
S
siyangy 已提交
265 266

  # scripts
267
  cp -r scripts ${APOLLO_DIR}
S
siyangy 已提交
268

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

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

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

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

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

S
siyangy 已提交
301
  # release info
302
  META="${APOLLO_DIR}/meta.ini"
L
Lei Wang 已提交
303
  echo "git_commit: $(git rev-parse HEAD)" >> $META
304 305
  echo "car_type: LINCOLN.MKZ" >> $META
  echo "arch: ${MACHINE_ARCH}" >> $META
D
Dong Li 已提交
306 307 308 309
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

605 606 607 608
  local cmd=$1
  shift

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

main $@