blob: fbe27daeac31bcc66e4bbc26111040da4e1304c1 [file] [log] [blame]
Damjan Marion88b2e362021-04-29 18:47:25 +02001#!/usr/bin/env bash
Damjan Mariond63360c2021-05-28 17:32:58 +02002set -o pipefail -o errtrace -o nounset -o errexit
Damjan Marion88b2e362021-04-29 18:47:25 +02003
4# Experimental script, please consult with dmarion@me.com before
5# submitting any changes
6
7# defaults
8build_dir=.
9install_dir=/usr/local
10build_type=release
Mohammed Hawari7d646312021-05-04 11:34:37 +020011src_dir="$(dirname "$(readlink -f "$0")")"
Damjan Mariona117c012021-10-31 19:47:23 +010012host_arch=$(uname -m)
13arch=${host_arch}
Damjan Marion45e05392022-04-25 12:38:40 +020014native_only=no
Damjan Mariona117c012021-10-31 19:47:23 +010015wipe=no
16args=()
Damjan Marion88b2e362021-04-29 18:47:25 +020017
18help()
19{
20 cat << __EOF__
21VPP Build Configuration Script
22
23USAGE: ${0} [options]
24
25OPTIONS:
26 --help, -h This help
Damjan Mariona117c012021-10-31 19:47:23 +010027 --arch, -a Cross-compile for specified target architecture (aarch64, riscv64, i386, ...)
Damjan Marion88b2e362021-04-29 18:47:25 +020028 --build-dir, -b Build directory
29 --install-dir, -i Install directory
Damjan Marion2e5544f2021-05-04 09:37:56 +020030 --build-type, -t Build type (release, debug, ...)
Damjan Marion45e05392022-04-25 12:38:40 +020031 --native-only, -n Only compile for Native CPU (no multiarch)
Damjan Marion88b2e362021-04-29 18:47:25 +020032 --wipe, -w Wipe whole repo (except startup.* files)
Benoît Ganne634873c2022-10-11 10:09:55 +020033 --sanitize, -s Enable sanitizer (mem)
Damjan Marion88b2e362021-04-29 18:47:25 +020034__EOF__
35}
36
37while (( "$#" )); do
38 case "$1" in
39 -h|--help)
40 help
41 exit 1
42 ;;
43 -b|--build-dir)
44 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
45 build_dir=$2
46 shift 2
47 else
48 echo "Error: Argument for $1 is missing" >&2
49 exit 1
50 fi
51 ;;
Damjan Mariona117c012021-10-31 19:47:23 +010052 -a|--arch)
53 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
54 arch=$2
55 shift 2
56 else
57 echo "Error: Argument for $1 is missing" >&2
58 exit 1
59 fi
60 ;;
Damjan Marion88b2e362021-04-29 18:47:25 +020061 -i|--install-dir)
62 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
63 install_dir=$2
64 shift 2
65 else
66 echo "Error: Argument for $1 is missing" >&2
67 exit 1
68 fi
69 ;;
70 -t|--build-type)
71 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
72 build_type=$2
73 shift 2
74 else
75 echo "Error: Argument for $1 is missing" >&2
76 exit 1
77 fi
78 ;;
Damjan Marion45e05392022-04-25 12:38:40 +020079 -n|--native-only)
80 native_only=yes
81 shift 1
82 ;;
Damjan Marion88b2e362021-04-29 18:47:25 +020083 -w|--wipe)
Damjan Mariona117c012021-10-31 19:47:23 +010084 wipe=yes
85 shift 1
Damjan Marion88b2e362021-04-29 18:47:25 +020086 ;;
Benoît Ganne634873c2022-10-11 10:09:55 +020087 -s|--sanitize)
88 shift 1
89 case "$1" in
90 mem)
91 shift 1
92 args+=("-DVPP_ENABLE_SANITIZE_ADDR=ON")
93 ;;
94 esac
95 ;;
Damjan Marion88b2e362021-04-29 18:47:25 +020096 -*|--*=) # unsupported flags
97 echo "Error: Unsupported flag $1" >&2
98 exit 1
99 ;;
100 *) # preserve positional arguments
101 PARAMS="$PARAMS $1"
102 shift
103 ;;
104 esac
105done
106
Damjan Mariona117c012021-10-31 19:47:23 +0100107if [ "${arch}" != "${host_arch}" ] ; then
108 args+=("-DCMAKE_SYSTEM_NAME=Linux")
109 args+=("-DCMAKE_SYSTEM_PROCESSOR=${arch}")
110 args+=("-DCMAKE_C_COMPILER=clang")
111 args+=("-DCMAKE_C_COMPILER_TARGET=${arch}-linux-gnu")
112 args+=("-DCMAKE_ASM_COMPILER_TARGET=${arch}-linux-gnu")
113 args+=("-DCMAKE_FIND_ROOT_PATH=/usr/${arch}-linux-gnu")
114 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER")
115 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH")
116 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH")
117 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY")
118fi
Damjan Marion88b2e362021-04-29 18:47:25 +0200119
Damjan Mariona117c012021-10-31 19:47:23 +0100120args+=("-DCMAKE_PREFIX_PATH=/opt/vpp/external/${arch}")
121args+=("-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON")
122args+=("-DCMAKE_INSTALL_PREFIX=${install_dir}")
123args+=("-DCMAKE_BUILD_TYPE:STRING=${build_type}")
Damjan Marion45e05392022-04-25 12:38:40 +0200124[ "${native_only}" == "yes" ] && args+=("-DVPP_BUILD_NATIVE_ONLY:BOOL=ON")
Damjan Mariona117c012021-10-31 19:47:23 +0100125
126[ "${wipe}" == "yes" ] && git clean -fdx --exclude=startup.\*
127
128cmake ${args[@]} -G Ninja -S ${src_dir}/src -B ${build_dir}
129
130cat << __EOF__
Damjan Marion88b2e362021-04-29 18:47:25 +0200131
132 Useful build commands:
133
Damjan Marion3a533cd2021-05-03 12:40:27 +0200134 ninja Build VPP
135 ninja set-build-type-* Change build type to <debug|release|gcov|...>
136 ninja config Start build configuration TUI
Damjan Marion3a533cd2021-05-03 12:40:27 +0200137 ninja run Runs VPP using startup.conf in the build directory
138 ninja debug Runs VPP inside GDB using startup.conf in the build directory
139 ninja pkg-deb Create .deb packages
140 ninja install Install VPP to $install_dir
Damjan Marion88b2e362021-04-29 18:47:25 +0200141
142__EOF__