apollo.sh 24.6 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
    //modules/tools/prediction/fake_prediction/...
121
    //modules/tools/rosbag_to_record/...
122 123
    //modules/tools/visualizer/...
    //modules/transform/..."
124
    # //modules/calibration/...
125
    # //modules/data/...
126

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

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

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

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

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

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

  # Build python proto
L
Lei Wang 已提交
173
  build_py_proto
174

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

S
siyangy 已提交
181 182 183 184 185 186
  # 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
187 188
  if [ $? -eq 0 ]; then
    success 'Build passed!'
189 190
  else
    fail 'Build failed'
191
  fi
D
Dong Li 已提交
192 193
}

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

  cd /apollo
  info "Building modules ..."
201 202 203 204 205 206

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

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

229
  bazel build $JOB_ARG $DEFINES $@ $BUILD_TARGETS
230

231 232 233 234 235 236 237
  if [ $? -eq 0 ]; then
    success 'Build passed!'
  else
    fail 'Build failed!'
  fi
}

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

242
function apollo_build_opt() {
243
  build "opt" $@
S
siyangy 已提交
244 245
}

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

D
Dong Li 已提交
258
function check() {
D
Dong Li 已提交
259
  bash $0 build && bash $0 "test" && bash $0 lint
D
Dong Li 已提交
260 261 262 263 264 265 266 267 268 269 270

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

function warn_proprietary_sw() {
271 272 273 274 275 276
  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 已提交
277 278 279
}

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

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

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

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

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

S
siyangy 已提交
327
  # scripts
D
Dong Li 已提交
328
  cp -r scripts ${APOLLO_RELEASE_DIR}
S
siyangy 已提交
329

330 331 332
  # remove mounted models
  rm -rf ${APOLLO_RELEASE_DIR}/modules/perception/model/yolo_camera_detector/

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

D
Dong Li 已提交
344
  # doc
D
Dong Li 已提交
345 346
  cp LICENSE "${APOLLO_RELEASE_DIR}"
  cp third_party/ACKNOWLEDGEMENT.txt "${APOLLO_RELEASE_DIR}"
L
Lei Wang 已提交
347

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

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

D
Dong Li 已提交
364 365 366 367 368 369 370 371
  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
372 373 374 375 376 377 378 379

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

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

S
siyangy 已提交
410
  if [ $? -eq 0 ]; then
D
Dong Li 已提交
411 412 413 414 415
    success 'Test passed!'
    return 0
  fi
}

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

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

function citest_basic() {
462 463 464 465 466 467 468 469 470 471 472
  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/..."
473 474 475 476 477 478 479 480 481 482

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

483 484 485 486 487 488 489 490 491
  if [ $? -eq 0 ]; then
    success 'Test passed!'
    return 0
  else
    fail 'Test failed!'
    return 1
  fi
}

L
Liangliang Zhang 已提交
492
function citest() {
493 494 495 496 497
  info "Building framework ..."
  cd /apollo/framework
  bash cybertron.sh build_fast
  cd /apollo

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

D
Dong Li 已提交
508
function run_cpp_lint() {
509
  set -e
510
  # check /apollo/module
511
  generate_build_targets
512
  echo "$BUILD_TARGETS" | grep -v "tools/visualizer" | xargs bazel test --config=cpplint -c dbg
513 514 515 516

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

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

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

D
Dong Li 已提交
535 536 537 538 539 540 541 542
  if [ $? -eq 0 ]; then
    success 'Lint passed!'
  else
    fail 'Lint failed!'
  fi
}

function clean() {
A
Aaron Xiao 已提交
543
  # Remove bazel cache.
544
  bazel clean --async
A
Aaron Xiao 已提交
545 546
  # Remove cmake cache.
  rm -fr framework/build
D
Dong Li 已提交
547 548 549
}

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

S
siyangy 已提交
562 563 564 565 566
function build_fe() {
  cd modules/dreamview/frontend
  yarn build
}

D
Dong Li 已提交
567 568 569 570 571 572
function gen_doc() {
  rm -rf docs/doxygen
  doxygen apollo.doxygen
}

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

584 585 586 587 588 589 590 591 592 593 594
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"
}

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

629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
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/
}


653 654 655 656 657 658 659 660 661 662 663 664 665

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

724
function config() {
725
  ${APOLLO_ROOT_DIR}/scripts/configurator.sh
726 727
}

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

S
siyangy 已提交
764 765 766
function main() {
  source_apollo_base
  check_machine_arch
767
  apollo_check_system_config
S
siyangy 已提交
768 769
  check_esd_files

770 771 772 773 774
  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 已提交
775

776 777 778
  local cmd=$1
  shift

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

918
main $@