| #!/usr/bin/env bash |
| set -o pipefail -o errtrace -o nounset -o errexit |
| |
| # Experimental script, please consult with dmarion@me.com before |
| # submitting any changes |
| |
| # defaults |
| build_dir=. |
| install_dir=/usr/local |
| build_type=release |
| src_dir="$(dirname "$(readlink -f "$0")")" |
| host_arch=$(uname -m) |
| arch=${host_arch} |
| native_only=no |
| wipe=no |
| args=() |
| |
| help() |
| { |
| cat << __EOF__ |
| VPP Build Configuration Script |
| |
| USAGE: ${0} [options] |
| |
| OPTIONS: |
| --help, -h This help |
| --arch, -a Cross-compile for specified target architecture (aarch64, riscv64, i386, ...) |
| --build-dir, -b Build directory |
| --install-dir, -i Install directory |
| --build-type, -t Build type (release, debug, ...) |
| --native-only, -n Only compile for Native CPU (no multiarch) |
| --wipe, -w Wipe whole repo (except startup.* files) |
| __EOF__ |
| } |
| |
| while (( "$#" )); do |
| case "$1" in |
| -h|--help) |
| help |
| exit 1 |
| ;; |
| -b|--build-dir) |
| if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then |
| build_dir=$2 |
| shift 2 |
| else |
| echo "Error: Argument for $1 is missing" >&2 |
| exit 1 |
| fi |
| ;; |
| -a|--arch) |
| if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then |
| arch=$2 |
| shift 2 |
| else |
| echo "Error: Argument for $1 is missing" >&2 |
| exit 1 |
| fi |
| ;; |
| -i|--install-dir) |
| if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then |
| install_dir=$2 |
| shift 2 |
| else |
| echo "Error: Argument for $1 is missing" >&2 |
| exit 1 |
| fi |
| ;; |
| -t|--build-type) |
| if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then |
| build_type=$2 |
| shift 2 |
| else |
| echo "Error: Argument for $1 is missing" >&2 |
| exit 1 |
| fi |
| ;; |
| -n|--native-only) |
| native_only=yes |
| shift 1 |
| ;; |
| -w|--wipe) |
| wipe=yes |
| shift 1 |
| ;; |
| -*|--*=) # unsupported flags |
| echo "Error: Unsupported flag $1" >&2 |
| exit 1 |
| ;; |
| *) # preserve positional arguments |
| PARAMS="$PARAMS $1" |
| shift |
| ;; |
| esac |
| done |
| |
| if [ "${arch}" != "${host_arch}" ] ; then |
| args+=("-DCMAKE_SYSTEM_NAME=Linux") |
| args+=("-DCMAKE_SYSTEM_PROCESSOR=${arch}") |
| args+=("-DCMAKE_C_COMPILER=clang") |
| args+=("-DCMAKE_C_COMPILER_TARGET=${arch}-linux-gnu") |
| args+=("-DCMAKE_ASM_COMPILER_TARGET=${arch}-linux-gnu") |
| args+=("-DCMAKE_FIND_ROOT_PATH=/usr/${arch}-linux-gnu") |
| args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER") |
| args+=("-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH") |
| args+=("-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH") |
| args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY") |
| fi |
| |
| args+=("-DCMAKE_PREFIX_PATH=/opt/vpp/external/${arch}") |
| args+=("-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON") |
| args+=("-DCMAKE_INSTALL_PREFIX=${install_dir}") |
| args+=("-DCMAKE_BUILD_TYPE:STRING=${build_type}") |
| [ "${native_only}" == "yes" ] && args+=("-DVPP_BUILD_NATIVE_ONLY:BOOL=ON") |
| |
| [ "${wipe}" == "yes" ] && git clean -fdx --exclude=startup.\* |
| |
| cmake ${args[@]} -G Ninja -S ${src_dir}/src -B ${build_dir} |
| |
| cat << __EOF__ |
| |
| Useful build commands: |
| |
| ninja Build VPP |
| ninja set-build-type-* Change build type to <debug|release|gcov|...> |
| ninja config Start build configuration TUI |
| ninja run Runs VPP using startup.conf in the build directory |
| ninja debug Runs VPP inside GDB using startup.conf in the build directory |
| ninja pkg-deb Create .deb packages |
| ninja install Install VPP to $install_dir |
| |
| __EOF__ |