blob: 19b5ecd9d0d4fd07c3a9a01a1dd6d40dea1c7e4a [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
Damjan Marion01fe7ab2023-10-23 18:36:18 +02008platform=default
Damjan Marion88b2e362021-04-29 18:47:25 +02009build_dir=.
10install_dir=/usr/local
11build_type=release
Mohammed Hawari7d646312021-05-04 11:34:37 +020012src_dir="$(dirname "$(readlink -f "$0")")"
Damjan Mariona117c012021-10-31 19:47:23 +010013host_arch=$(uname -m)
14arch=${host_arch}
Damjan Marion45e05392022-04-25 12:38:40 +020015native_only=no
Damjan Mariona117c012021-10-31 19:47:23 +010016wipe=no
17args=()
Damjan Marion88b2e362021-04-29 18:47:25 +020018
19help()
20{
21 cat << __EOF__
22VPP Build Configuration Script
23
24USAGE: ${0} [options]
25
26OPTIONS:
27 --help, -h This help
Damjan Mariona117c012021-10-31 19:47:23 +010028 --arch, -a Cross-compile for specified target architecture (aarch64, riscv64, i386, ...)
Damjan Marion88b2e362021-04-29 18:47:25 +020029 --build-dir, -b Build directory
30 --install-dir, -i Install directory
Damjan Marion2e5544f2021-05-04 09:37:56 +020031 --build-type, -t Build type (release, debug, ...)
Damjan Marion45e05392022-04-25 12:38:40 +020032 --native-only, -n Only compile for Native CPU (no multiarch)
Damjan Marion88b2e362021-04-29 18:47:25 +020033 --wipe, -w Wipe whole repo (except startup.* files)
Benoît Ganne634873c2022-10-11 10:09:55 +020034 --sanitize, -s Enable sanitizer (mem)
Damjan Marion01fe7ab2023-10-23 18:36:18 +020035 --platform, -p Specify target platform
Benoît Gannea421d562024-02-08 17:06:22 +010036 --option, -o Enable specific VPP options (fib8, fib16)
Damjan Marion88b2e362021-04-29 18:47:25 +020037__EOF__
38}
39
40while (( "$#" )); do
41 case "$1" in
42 -h|--help)
43 help
44 exit 1
45 ;;
46 -b|--build-dir)
47 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
48 build_dir=$2
49 shift 2
50 else
51 echo "Error: Argument for $1 is missing" >&2
52 exit 1
53 fi
54 ;;
Damjan Mariona117c012021-10-31 19:47:23 +010055 -a|--arch)
56 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
57 arch=$2
58 shift 2
59 else
60 echo "Error: Argument for $1 is missing" >&2
61 exit 1
62 fi
63 ;;
Damjan Marion88b2e362021-04-29 18:47:25 +020064 -i|--install-dir)
65 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
66 install_dir=$2
67 shift 2
68 else
69 echo "Error: Argument for $1 is missing" >&2
70 exit 1
71 fi
72 ;;
73 -t|--build-type)
74 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
75 build_type=$2
76 shift 2
77 else
78 echo "Error: Argument for $1 is missing" >&2
79 exit 1
80 fi
81 ;;
Damjan Marion01fe7ab2023-10-23 18:36:18 +020082 -p|--platform)
83 if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
84 platform=$2
85 shift 2
86 else
87 echo "Error: Argument for $1 is missing" >&2
88 exit 1
89 fi
90 ;;
Damjan Marion45e05392022-04-25 12:38:40 +020091 -n|--native-only)
92 native_only=yes
93 shift 1
94 ;;
Damjan Marion88b2e362021-04-29 18:47:25 +020095 -w|--wipe)
Damjan Mariona117c012021-10-31 19:47:23 +010096 wipe=yes
97 shift 1
Damjan Marion88b2e362021-04-29 18:47:25 +020098 ;;
Benoît Ganne634873c2022-10-11 10:09:55 +020099 -s|--sanitize)
100 shift 1
101 case "$1" in
102 mem)
103 shift 1
104 args+=("-DVPP_ENABLE_SANITIZE_ADDR=ON")
105 ;;
106 esac
107 ;;
Benoît Gannea421d562024-02-08 17:06:22 +0100108 -o|--option)
109 shift 1
110 case "$1" in
111 fib8)
112 shift 1
113 args+=("-DVPP_IP_FIB_MTRIE_16=OFF")
114 ;;
115 fib16)
116 shift 1
117 args+=("-DVPP_IP_FIB_MTRIE_16=ON")
118 ;;
119 esac
120 ;;
Damjan Marion88b2e362021-04-29 18:47:25 +0200121 -*|--*=) # unsupported flags
122 echo "Error: Unsupported flag $1" >&2
123 exit 1
124 ;;
125 *) # preserve positional arguments
126 PARAMS="$PARAMS $1"
127 shift
128 ;;
129 esac
130done
131
Damjan Mariona117c012021-10-31 19:47:23 +0100132if [ "${arch}" != "${host_arch}" ] ; then
133 args+=("-DCMAKE_SYSTEM_NAME=Linux")
134 args+=("-DCMAKE_SYSTEM_PROCESSOR=${arch}")
135 args+=("-DCMAKE_C_COMPILER=clang")
136 args+=("-DCMAKE_C_COMPILER_TARGET=${arch}-linux-gnu")
137 args+=("-DCMAKE_ASM_COMPILER_TARGET=${arch}-linux-gnu")
138 args+=("-DCMAKE_FIND_ROOT_PATH=/usr/${arch}-linux-gnu")
139 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER")
140 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH")
141 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH")
142 args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY")
143fi
Damjan Marion88b2e362021-04-29 18:47:25 +0200144
Damjan Mariona117c012021-10-31 19:47:23 +0100145args+=("-DCMAKE_PREFIX_PATH=/opt/vpp/external/${arch}")
146args+=("-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON")
147args+=("-DCMAKE_INSTALL_PREFIX=${install_dir}")
148args+=("-DCMAKE_BUILD_TYPE:STRING=${build_type}")
Damjan Marion01fe7ab2023-10-23 18:36:18 +0200149args+=("-DVPP_PLATFORM=${platform}")
Damjan Marion45e05392022-04-25 12:38:40 +0200150[ "${native_only}" == "yes" ] && args+=("-DVPP_BUILD_NATIVE_ONLY:BOOL=ON")
Damjan Mariona117c012021-10-31 19:47:23 +0100151
152[ "${wipe}" == "yes" ] && git clean -fdx --exclude=startup.\*
153
154cmake ${args[@]} -G Ninja -S ${src_dir}/src -B ${build_dir}
155
156cat << __EOF__
Damjan Marion88b2e362021-04-29 18:47:25 +0200157
158 Useful build commands:
159
Damjan Marion3a533cd2021-05-03 12:40:27 +0200160 ninja Build VPP
161 ninja set-build-type-* Change build type to <debug|release|gcov|...>
162 ninja config Start build configuration TUI
Damjan Marion3a533cd2021-05-03 12:40:27 +0200163 ninja run Runs VPP using startup.conf in the build directory
164 ninja debug Runs VPP inside GDB using startup.conf in the build directory
165 ninja pkg-deb Create .deb packages
166 ninja install Install VPP to $install_dir
Damjan Marion88b2e362021-04-29 18:47:25 +0200167
168__EOF__