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

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

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

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

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

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

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

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

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

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

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

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

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

function generate_build_targets() {
S
siyangy 已提交
95
  if [ -z $NOT_BUILD_PERCEPTION ] ; then
96 97 98 99 100 101
    BUILD_TARGETS=""
  else
    info 'Skip building perception module!'
    # BUILD_TARGETS=`bazel query //... except //modules/perception/... except //modules/calibration/lidar_ex_checker/...`
    BUILD_TARGETS=""
  fi
102

L
Liangliang Zhang 已提交
103
    BUILD_TARGETS="
104
    //modules/canbus/...
105
    //modules/common/...
106
    //modules/control/...
107
    //modules/dreamview/...
L
Liangliang Zhang 已提交
108
    //modules/drivers/...
109
    //modules/guardian/...
110
    //modules/integration_test/...
111
    //modules/localization/...
112
    //modules/map/...
A
Aaron Xiao 已提交
113
    //modules/monitor/...
L
Liangliang Zhang 已提交
114
    //modules/perception/...
J
JasonZhou404 已提交
115
    //modules/planning/...
116 117
    //modules/prediction/...
    //modules/routing/...
D
Dong Li 已提交
118
    //modules/third_party_perception/...
119
    //modules/tools/manual_traffic_light/...
120 121
    //modules/tools/prediction/fake_prediction/...
    //modules/tools/visualizer/..."
122
    # //modules/calibration/...
123
    # //modules/data/...
124

C
Calvin Miao 已提交
125 126 127
  if [ $? -ne 0 ]; then
    fail 'Build failed!'
  fi
D
Dong Li 已提交
128
  if ! $USE_ESD_CAN; then
129
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "esd")
D
Dong Li 已提交
130
  fi
131
  #skip msf for non x86_64 platforms
132
  if [ ${MACHINE_ARCH} != "x86_64" ]; then
133 134
     BUILD_TARGETS=$(echo $BUILD_TARGETS |tr ' ' '\n' | grep -v "msf")
  fi
D
Dong Li 已提交
135 136 137 138 139 140
}

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

S
siyangy 已提交
141
function build() {
142
  if [ "${USE_GPU}" = "1" ] ; then
143 144 145 146
    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
147
  info "Start building, please wait ..."
148 149 150 151 152
  info "Building framework ..."
  cd /apollo/framework
  bash cybertron.sh build_fast
  cd /apollo
  info "Building modules ..."
153
  source framework/install/setup.bash
D
Dong Li 已提交
154
  generate_build_targets
155 156
  info "Building on $MACHINE_ARCH..."

157
  MACHINE_ARCH=$(uname -m)
158
  JOB_ARG="--jobs=$(nproc) --ram_utilization_factor 80"
159 160 161
  if [ "$MACHINE_ARCH" == 'aarch64' ]; then
    JOB_ARG="--jobs=3"
  fi
162
  info "Building with $JOB_ARG for $MACHINE_ARCH"
163

J
jiayunhan 已提交
164
  echo "$BUILD_TARGETS" | xargs bazel build $JOB_ARG $DEFINES -c $@
165

166
  if [ $? -ne 0 ]; then
D
Dong Li 已提交
167 168
    fail 'Build failed!'
  fi
S
siyangy 已提交
169 170

  # Build python proto
L
Lei Wang 已提交
171
  build_py_proto
172

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

S
siyangy 已提交
179 180 181 182 183 184
  # if [ -d /apollo-simulator ] && [ -e /apollo-simulator/build.sh ]; then
  #   cd /apollo-simulator && bash build.sh build
  #   if [ $? -ne 0 ]; then
  #     fail 'Build failed!'
  #   fi
  # fi
185 186
  if [ $? -eq 0 ]; then
    success 'Build passed!'
187 188
  else
    fail 'Build failed'
189
  fi
D
Dong Li 已提交
190 191
}

192
function cibuild() {
193 194 195 196 197 198
  info "Building framework ..."
  cd /apollo/framework
  bash cybertron.sh build_fast

  cd /apollo
  info "Building modules ..."
199 200 201 202 203 204

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

A
Aaron Xiao 已提交
205
  info "Building with $JOB_ARG for $MACHINE_ARCH"
206
  BUILD_TARGETS="
207
    //modules/canbus/...
208 209
    //modules/common/...
    //modules/control/...
210
    //modules/dreamview/...
L
Liangliang Zhang 已提交
211 212 213 214 215
    //modules/drivers/radar/conti_radar/...
    //modules/drivers/radar/racobit_radar/...
    //modules/drivers/radar/ultrasonic_radar/...
    //modules/drivers/gnss/...
    //modules/drivers/velodyne/...
216
    //modules/guardian/...
217
    //modules/localization/...
218
    //modules/map/...
L
Liangliang Zhang 已提交
219
    //modules/perception/...
220 221
    //modules/planning/...
    //modules/prediction/...
222 223
    //modules/routing/...
    //modules/third_party_perception/..."
224

225
  bazel build $JOB_ARG $DEFINES $@ $BUILD_TARGETS
226

227 228 229 230 231 232 233
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  else
    fail 'Build failed!'
  fi
}

234
function apollo_build_dbg() {
235
  build "dbg" $@
S
siyangy 已提交
236 237
}

238
function apollo_build_opt() {
239
  build "opt" $@
S
siyangy 已提交
240 241
}

L
Lei Wang 已提交
242 243 244 245 246 247
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'
248
  find modules/ -name "*.proto" \
S
siyangy 已提交
249
      | grep -v node_modules \
250
      | xargs ${PROTOC} --python_out=py_proto
L
Lei Wang 已提交
251 252 253
  find py_proto/* -type d -exec touch "{}/__init__.py" \;
}

D
Dong Li 已提交
254
function check() {
D
Dong Li 已提交
255
  bash $0 build && bash $0 "test" && bash $0 lint
D
Dong Li 已提交
256 257 258 259 260 261 262 263 264 265 266

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

function warn_proprietary_sw() {
267 268 269 270 271 272
  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 已提交
273 274 275
}

function release() {
276 277
  RELEASE_DIR="${HOME}/.cache/apollo_release"
  if [ -d "${RELEASE_DIR}" ]; then
278
    rm -rf "${RELEASE_DIR}"
279
  fi
D
Dong Li 已提交
280 281
  APOLLO_RELEASE_DIR="${RELEASE_DIR}/apollo"
  mkdir -p "${APOLLO_RELEASE_DIR}"
282 283 284 285 286 287

  # 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 已提交
288
    DST_PATH="${APOLLO_RELEASE_DIR}/${BIN}"
289 290 291 292 293
    if [ -e "${SRC_PATH}" ]; then
      mkdir -p "$(dirname "${DST_PATH}")"
      cp "${SRC_PATH}" "${DST_PATH}"
    fi
  done
D
Dong Li 已提交
294

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

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

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

S
siyangy 已提交
323
  # scripts
D
Dong Li 已提交
324
  cp -r scripts ${APOLLO_RELEASE_DIR}
S
siyangy 已提交
325

326 327 328
  # remove mounted models
  rm -rf ${APOLLO_RELEASE_DIR}/modules/perception/model/yolo_camera_detector/

D
Dong Li 已提交
329
  # lib
D
Dong Li 已提交
330
  LIB_DIR="${APOLLO_RELEASE_DIR}/lib"
331
  mkdir "${LIB_DIR}"
D
Dong Li 已提交
332
  if $USE_ESD_CAN; then
L
Lei Wang 已提交
333
    warn_proprietary_sw
D
Dong Li 已提交
334
  fi
335
  cp -r third_party/can_card_library/*/lib/* $LIB_DIR
L
Lei Wang 已提交
336 337
  cp -r bazel-genfiles/external $LIB_DIR
  cp -r py_proto/modules $LIB_DIR
338
  cp /apollo/bazel-apollo/bazel-out/local-opt/bin/modules/perception/cuda_util/libintegrated_cuda_util.so $LIB_DIR
339

D
Dong Li 已提交
340
  # doc
D
Dong Li 已提交
341 342
  cp LICENSE "${APOLLO_RELEASE_DIR}"
  cp third_party/ACKNOWLEDGEMENT.txt "${APOLLO_RELEASE_DIR}"
L
Lei Wang 已提交
343

S
siyangy 已提交
344
  # release info
D
Dong Li 已提交
345
  META="${APOLLO_RELEASE_DIR}/meta.ini"
346
  echo "git_commit: $(get_revision)" >> $META
347
  echo "git_branch: $(get_branch)" >> $META
348 349
  echo "car_type: LINCOLN.MKZ" >> $META
  echo "arch: ${MACHINE_ARCH}" >> $META
D
Dong Li 已提交
350 351 352 353
}

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

D
Dong Li 已提交
360 361 362 363 364 365 366 367
  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
368 369 370 371 372 373 374 375

  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 已提交
376
  lcov --rc lcov_branch_coverage=1 --capture --directory "$COV_DIR/objs" --output-file "$COV_DIR/conv.info"
D
Dong Li 已提交
377 378 379
  if [ $? -ne 0 ]; then
    fail 'lcov failed!'
  fi
J
Jiangtao Hu 已提交
380
  lcov --rc lcov_branch_coverage=1 --remove "$COV_DIR/conv.info" \
D
Dong Li 已提交
381 382 383 384 385 386 387 388 389 390 391
      "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() {
392

393
  generate_build_targets
394
  if [ "$USE_GPU" == "1" ]; then
395
    echo -e "${YELLOW}Running tests under GPU mode. GPU is required to run the tests.${NO_COLOR}"
L
Lei Wang 已提交
396
    echo "$BUILD_TARGETS" | xargs bazel test $DEFINES --config=unit_test -c dbg --test_verbose_timeout_warnings $@
397
  else
398
    echo -e "${YELLOW}Running tests under CPU mode. No GPU is required to run the tests.${NO_COLOR}"
399
    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 $@
400
  fi
401 402 403 404 405
  if [ $? -ne 0 ]; then
    fail 'Test failed!'
    return 1
  fi

S
siyangy 已提交
406
  if [ $? -eq 0 ]; then
D
Dong Li 已提交
407 408 409 410 411
    success 'Test passed!'
    return 0
  fi
}

412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
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 已提交
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
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 已提交
446
  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 已提交
447 448 449 450 451 452 453 454 455 456 457

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

function citest_basic() {
458 459 460 461 462 463 464 465 466 467 468
  BUILD_TARGETS="
    //modules/common/...
    //modules/control/...
    //modules/localization/proto/...
    //modules/localization/rtk/...
    `bazel query //modules/localization/msf/... except //modules/localization/msf/local_tool/...`
    `bazel query //modules/localization/msf/local_tool/local_visualization/...`
    //modules/perception/proto/...
    //modules/planning/...
    //modules/prediction/...
    //modules/routing/..."
469 470 471 472 473 474 475 476 477 478

  # 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 $@

479 480 481 482 483 484 485 486 487
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

L
Liangliang Zhang 已提交
488
function citest() {
489 490 491 492 493
  info "Building framework ..."
  cd /apollo/framework
  bash cybertron.sh build_fast
  cd /apollo

494
  run_test
L
Liangliang Zhang 已提交
495 496 497 498 499 500 501 502 503
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

D
Dong Li 已提交
504
function run_cpp_lint() {
505
  set -e
506
  # check /apollo/module
507 508
  generate_build_targets
  echo "$BUILD_TARGETS" | xargs bazel test --config=cpplint -c dbg
509 510 511 512

  # check /apollo/framework
  BUILD_TARGETS="//framework/cybertron/..."
  echo "$BUILD_TARGETS" | xargs bazel test --config=cpplint -c dbg
D
Dong Li 已提交
513 514 515
}

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

function run_lint() {
C
Calvin Miao 已提交
521
  # Add cpplint rule to BUILD files that do not contain it.
522
  for file in $(find framework modules -name BUILD |  grep -v gnss/third_party | \
C
Calvin Miao 已提交
523 524 525 526 527 528
    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 已提交
529 530
  run_cpp_lint

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

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

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

S
siyangy 已提交
558 559 560 561 562
function build_fe() {
  cd modules/dreamview/frontend
  yarn build
}

D
Dong Li 已提交
563 564 565 566 567 568
function gen_doc() {
  rm -rf docs/doxygen
  doxygen apollo.doxygen
}

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

580 581 582 583 584 585 586 587 588 589 590
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"
}

591 592 593 594 595 596 597 598 599 600 601
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 已提交
602 603
function build_velodyne() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
604 605
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
F
fengkaiwen01 已提交
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
  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/
}

625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
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/
}


649 650 651 652 653 654 655 656 657 658 659 660 661

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
662
  catkin_make_isolated --install --source drivers/lslidar_apollo \
663 664 665 666 667 668 669 670 671 672
    --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 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
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 已提交
697 698
function build_usbcam() {
  CURRENT_PATH=$(pwd)
F
fengkaiwen01 已提交
699 700
  if [ -d "${ROS_ROOT}" ]; then
    ROS_PATH="${ROS_ROOT}/../.."
Y
yibingl 已提交
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
  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/
}

720
function config() {
721
  ${APOLLO_ROOT_DIR}/scripts/configurator.sh
722 723
}

724
function print_usage() {
C
Calvin Miao 已提交
725 726 727 728 729 730 731 732 733 734
  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
735
  ${BLUE}build_opt${NONE}: build optimized binary for the code
J
Jun Zhu 已提交
736
  ${BLUE}build_gpu${NONE}: run build only with Caffe GPU mode support
F
fengkaiwen01 已提交
737
  ${BLUE}build_velodyne${NONE}: build velodyne driver
738
  ${BLUE}build_velodyne_vls128${NONE}: build velodyne vls-128 driver
739
  ${BLUE}build_lslidar${NONE}: build lslidar driver
T
Tony Zhang 已提交
740
  ${BLUE}build_rslidar${NONE}: build rslidar driver
gengqx's avatar
gengqx 已提交
741
  ${BLUE}build_usbcam${NONE}: build usb camera driver
J
Jun Zhu 已提交
742
  ${BLUE}build_opt_gpu${NONE}: build optimized binary with Caffe GPU mode support
C
Calvin Miao 已提交
743
  ${BLUE}build_fe${NONE}: compile frontend javascript code, this requires all the node_modules to be installed already
744
  ${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.
745
  ${BLUE}build_prof${NONE}: build for gprof support.
C
Calvin Miao 已提交
746 747 748 749 750 751 752 753 754 755 756 757
  ${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
  "
758 759
}

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

766 767 768 769 770
  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 已提交
771

772 773 774
  local cmd=$1
  shift

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

914
main $@