1*8b26181fSAndroid Build Coastguard Worker#!/bin/sh -e 2*8b26181fSAndroid Build Coastguard Worker 3*8b26181fSAndroid Build Coastguard Worker# The only purpose of the above shebang is to orient shellcheck right. 4*8b26181fSAndroid Build Coastguard Worker# To make CI scripts maintenance simpler, copies of this file in the 5*8b26181fSAndroid Build Coastguard Worker# libpcap, tcpdump and tcpslice git repositories should be identical. 6*8b26181fSAndroid Build Coastguard Worker# Please mind that Solaris /bin/sh before 11 does not support the $() 7*8b26181fSAndroid Build Coastguard Worker# command substitution syntax, hence the "-e SC2006" flag in Makefile. 8*8b26181fSAndroid Build Coastguard Worker 9*8b26181fSAndroid Build Coastguard Worker# A poor man's mktemp(1) for OSes that don't have one (e.g. AIX 7, Solaris 9). 10*8b26181fSAndroid Build Coastguard Workermktempdir_diy() { 11*8b26181fSAndroid Build Coastguard Worker while true; do 12*8b26181fSAndroid Build Coastguard Worker # /bin/sh implements $RANDOM in AIX 7, but not in Solaris before 11, 13*8b26181fSAndroid Build Coastguard Worker # thus use dd and od instead. 14*8b26181fSAndroid Build Coastguard Worker mktempdir_diy_suffix=`dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -t x -A n | head -1 | tr -d '\t '` 15*8b26181fSAndroid Build Coastguard Worker [ -z "$mktempdir_diy_suffix" ] && return 1 16*8b26181fSAndroid Build Coastguard Worker mktempdir_diy_path="${TMPDIR:-/tmp}/${1:?}.${mktempdir_diy_suffix}" 17*8b26181fSAndroid Build Coastguard Worker # "test -e" would be more appropriate, but it is not available in 18*8b26181fSAndroid Build Coastguard Worker # Solaris /bin/sh before 11. 19*8b26181fSAndroid Build Coastguard Worker if [ ! -d "$mktempdir_diy_path" ]; then 20*8b26181fSAndroid Build Coastguard Worker mkdir "$mktempdir_diy_path" 21*8b26181fSAndroid Build Coastguard Worker chmod go= "$mktempdir_diy_path" 22*8b26181fSAndroid Build Coastguard Worker echo "$mktempdir_diy_path" 23*8b26181fSAndroid Build Coastguard Worker break 24*8b26181fSAndroid Build Coastguard Worker fi 25*8b26181fSAndroid Build Coastguard Worker # Try again (very unlikely, just in case). 26*8b26181fSAndroid Build Coastguard Worker done 27*8b26181fSAndroid Build Coastguard Worker} 28*8b26181fSAndroid Build Coastguard Worker 29*8b26181fSAndroid Build Coastguard Workermktempdir() { 30*8b26181fSAndroid Build Coastguard Worker mktempdir_prefix=${1:-tmp} 31*8b26181fSAndroid Build Coastguard Worker case `os_id` in 32*8b26181fSAndroid Build Coastguard Worker Darwin-*|FreeBSD-*|NetBSD-*) 33*8b26181fSAndroid Build Coastguard Worker # In these operating systems mktemp(1) always appends an implicit 34*8b26181fSAndroid Build Coastguard Worker # ".XXXXXXXX" suffix to the requested template when creating a 35*8b26181fSAndroid Build Coastguard Worker # temporary directory. 36*8b26181fSAndroid Build Coastguard Worker mktemp -d -t "$mktempdir_prefix" 37*8b26181fSAndroid Build Coastguard Worker ;; 38*8b26181fSAndroid Build Coastguard Worker SunOS-5.10|SunOS-5.11) 39*8b26181fSAndroid Build Coastguard Worker # Although the suffix is optional, specify it for consistent results. 40*8b26181fSAndroid Build Coastguard Worker mktemp -d -t "${mktempdir_prefix}.XXXXXXXX" 41*8b26181fSAndroid Build Coastguard Worker ;; 42*8b26181fSAndroid Build Coastguard Worker SunOS-*|AIX-*) 43*8b26181fSAndroid Build Coastguard Worker mktempdir_diy "$mktempdir_prefix" 44*8b26181fSAndroid Build Coastguard Worker ;; 45*8b26181fSAndroid Build Coastguard Worker *) 46*8b26181fSAndroid Build Coastguard Worker # At least Haiku, Linux and OpenBSD implementations require explicit 47*8b26181fSAndroid Build Coastguard Worker # trailing X'es in the template, so make it the same suffix as above. 48*8b26181fSAndroid Build Coastguard Worker mktemp -d -t "${mktempdir_prefix}.XXXXXXXX" 49*8b26181fSAndroid Build Coastguard Worker ;; 50*8b26181fSAndroid Build Coastguard Worker esac 51*8b26181fSAndroid Build Coastguard Worker} 52*8b26181fSAndroid Build Coastguard Worker 53*8b26181fSAndroid Build Coastguard Workerprint_sysinfo() { 54*8b26181fSAndroid Build Coastguard Worker uname -a 55*8b26181fSAndroid Build Coastguard Worker printf 'OS identification: ' 56*8b26181fSAndroid Build Coastguard Worker os_id 57*8b26181fSAndroid Build Coastguard Worker date 58*8b26181fSAndroid Build Coastguard Worker} 59*8b26181fSAndroid Build Coastguard Worker 60*8b26181fSAndroid Build Coastguard Worker# Try to make the current C compiler print its version information (usually 61*8b26181fSAndroid Build Coastguard Worker# multi-line) to stdout. 62*8b26181fSAndroid Build Coastguard Workercc_version_nocache() { 63*8b26181fSAndroid Build Coastguard Worker : "${CC:?}" 64*8b26181fSAndroid Build Coastguard Worker case `basename "$CC"` in 65*8b26181fSAndroid Build Coastguard Worker gcc*|egcc*|clang*) 66*8b26181fSAndroid Build Coastguard Worker # GCC and Clang recognize --version, print to stdout and exit with 0. 67*8b26181fSAndroid Build Coastguard Worker "$CC" --version 68*8b26181fSAndroid Build Coastguard Worker ;; 69*8b26181fSAndroid Build Coastguard Worker xl*) 70*8b26181fSAndroid Build Coastguard Worker # XL C 12.1 and 13.1 recognize "-qversion", print to stdout and exit 71*8b26181fSAndroid Build Coastguard Worker # with 0. XL C 12.1 on an unknown command-line flag displays its man 72*8b26181fSAndroid Build Coastguard Worker # page and waits. 73*8b26181fSAndroid Build Coastguard Worker # XL C 16.1 recognizes "-qversion" and "--version", prints to stdout 74*8b26181fSAndroid Build Coastguard Worker # and exits with 0. Community Edition also prints a banner to stderr. 75*8b26181fSAndroid Build Coastguard Worker "$CC" -qversion 2>/dev/null 76*8b26181fSAndroid Build Coastguard Worker ;; 77*8b26181fSAndroid Build Coastguard Worker sun*) 78*8b26181fSAndroid Build Coastguard Worker # Sun compilers recognize -V, print to stderr and exit with an error. 79*8b26181fSAndroid Build Coastguard Worker "$CC" -V 2>&1 || : 80*8b26181fSAndroid Build Coastguard Worker ;; 81*8b26181fSAndroid Build Coastguard Worker cc) 82*8b26181fSAndroid Build Coastguard Worker case `os_id` in 83*8b26181fSAndroid Build Coastguard Worker SunOS-*) 84*8b26181fSAndroid Build Coastguard Worker # Most likely Sun C. 85*8b26181fSAndroid Build Coastguard Worker "$CC" -V 2>&1 || : 86*8b26181fSAndroid Build Coastguard Worker ;; 87*8b26181fSAndroid Build Coastguard Worker Darwin-*) 88*8b26181fSAndroid Build Coastguard Worker # Most likely Clang. 89*8b26181fSAndroid Build Coastguard Worker "$CC" --version 90*8b26181fSAndroid Build Coastguard Worker ;; 91*8b26181fSAndroid Build Coastguard Worker Linux-*|FreeBSD-*|NetBSD-*|OpenBSD-*) 92*8b26181fSAndroid Build Coastguard Worker # Most likely Clang or GCC. 93*8b26181fSAndroid Build Coastguard Worker "$CC" --version 94*8b26181fSAndroid Build Coastguard Worker ;; 95*8b26181fSAndroid Build Coastguard Worker esac 96*8b26181fSAndroid Build Coastguard Worker ;; 97*8b26181fSAndroid Build Coastguard Worker *) 98*8b26181fSAndroid Build Coastguard Worker "$CC" --version || "$CC" -V || : 99*8b26181fSAndroid Build Coastguard Worker ;; 100*8b26181fSAndroid Build Coastguard Worker esac 101*8b26181fSAndroid Build Coastguard Worker} 102*8b26181fSAndroid Build Coastguard Worker 103*8b26181fSAndroid Build Coastguard Workercc_version() { 104*8b26181fSAndroid Build Coastguard Worker echo "${cc_version_cached:=`cc_version_nocache`}" 105*8b26181fSAndroid Build Coastguard Worker} 106*8b26181fSAndroid Build Coastguard Worker 107*8b26181fSAndroid Build Coastguard Workerprint_cc_version() { 108*8b26181fSAndroid Build Coastguard Worker cc_version 109*8b26181fSAndroid Build Coastguard Worker printf 'Compiler identification: ' 110*8b26181fSAndroid Build Coastguard Worker cc_id 111*8b26181fSAndroid Build Coastguard Worker} 112*8b26181fSAndroid Build Coastguard Worker 113*8b26181fSAndroid Build Coastguard Worker# For the current C compiler try to print a short and uniform identification 114*8b26181fSAndroid Build Coastguard Worker# string (such as "gcc-9.3.0") that is convenient to use in a case statement. 115*8b26181fSAndroid Build Coastguard Workercc_id_nocache() { 116*8b26181fSAndroid Build Coastguard Worker cc_id_firstline=`cc_version | head -1` 117*8b26181fSAndroid Build Coastguard Worker : "${cc_id_firstline:?}" 118*8b26181fSAndroid Build Coastguard Worker 119*8b26181fSAndroid Build Coastguard Worker cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.*clang version \([0-9\.]*\).*$/clang-\1/'` 120*8b26181fSAndroid Build Coastguard Worker if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then 121*8b26181fSAndroid Build Coastguard Worker echo "$cc_id_guessed" 122*8b26181fSAndroid Build Coastguard Worker return 123*8b26181fSAndroid Build Coastguard Worker fi 124*8b26181fSAndroid Build Coastguard Worker 125*8b26181fSAndroid Build Coastguard Worker cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^IBM XL C.*, V\([0-9\.]*\).*$/xlc-\1/'` 126*8b26181fSAndroid Build Coastguard Worker if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then 127*8b26181fSAndroid Build Coastguard Worker echo "$cc_id_guessed" 128*8b26181fSAndroid Build Coastguard Worker return 129*8b26181fSAndroid Build Coastguard Worker fi 130*8b26181fSAndroid Build Coastguard Worker 131*8b26181fSAndroid Build Coastguard Worker cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.* Sun C \([0-9\.]*\) .*$/suncc-\1/'` 132*8b26181fSAndroid Build Coastguard Worker if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then 133*8b26181fSAndroid Build Coastguard Worker echo "$cc_id_guessed" 134*8b26181fSAndroid Build Coastguard Worker return 135*8b26181fSAndroid Build Coastguard Worker fi 136*8b26181fSAndroid Build Coastguard Worker 137*8b26181fSAndroid Build Coastguard Worker # OpenBSD default GCC: 138*8b26181fSAndroid Build Coastguard Worker # "gcc (GCC) 4.2.1 20070719" 139*8b26181fSAndroid Build Coastguard Worker # RedHat GCC: 140*8b26181fSAndroid Build Coastguard Worker # "gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)" 141*8b26181fSAndroid Build Coastguard Worker # "gcc (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1)" 142*8b26181fSAndroid Build Coastguard Worker # other GCC packages: 143*8b26181fSAndroid Build Coastguard Worker # "sparc-sun-solaris2.9-gcc (GCC) 4.2.0 (gccfss)" 144*8b26181fSAndroid Build Coastguard Worker # "gcc (GCC) 5.5.0" 145*8b26181fSAndroid Build Coastguard Worker # "gcc (nb4 20200810) 7.5.0" 146*8b26181fSAndroid Build Coastguard Worker # "gcc (OpenIndiana 7.5.0-il-0) 7.5.0" 147*8b26181fSAndroid Build Coastguard Worker # "gcc (Debian 8.3.0-6) 8.3.0" 148*8b26181fSAndroid Build Coastguard Worker # "gcc (Raspbian 8.3.0-6+rpi1) 8.3.0" 149*8b26181fSAndroid Build Coastguard Worker # "egcc (GCC) 8.4.0" 150*8b26181fSAndroid Build Coastguard Worker # "gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0" 151*8b26181fSAndroid Build Coastguard Worker # "gcc (FreeBSD Ports Collection) 10.3.0" 152*8b26181fSAndroid Build Coastguard Worker cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.* (.*) \([0-9\.]*\).*$/gcc-\1/'` 153*8b26181fSAndroid Build Coastguard Worker if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then 154*8b26181fSAndroid Build Coastguard Worker echo "$cc_id_guessed" 155*8b26181fSAndroid Build Coastguard Worker return 156*8b26181fSAndroid Build Coastguard Worker fi 157*8b26181fSAndroid Build Coastguard Worker} 158*8b26181fSAndroid Build Coastguard Worker 159*8b26181fSAndroid Build Coastguard Workercc_id() { 160*8b26181fSAndroid Build Coastguard Worker echo "${cc_id_cached:=`cc_id_nocache`}" 161*8b26181fSAndroid Build Coastguard Worker} 162*8b26181fSAndroid Build Coastguard Worker 163*8b26181fSAndroid Build Coastguard Worker# Call this function each time CC has changed. 164*8b26181fSAndroid Build Coastguard Workerdiscard_cc_cache() { 165*8b26181fSAndroid Build Coastguard Worker cc_version_cached= 166*8b26181fSAndroid Build Coastguard Worker cc_id_cached= 167*8b26181fSAndroid Build Coastguard Worker} 168*8b26181fSAndroid Build Coastguard Worker 169*8b26181fSAndroid Build Coastguard Worker# For the current C compiler try to print CFLAGS value that tells to treat 170*8b26181fSAndroid Build Coastguard Worker# warnings as errors. 171*8b26181fSAndroid Build Coastguard Workercc_werr_cflags() { 172*8b26181fSAndroid Build Coastguard Worker case `cc_id` in 173*8b26181fSAndroid Build Coastguard Worker gcc-*|clang-*) 174*8b26181fSAndroid Build Coastguard Worker echo '-Werror' 175*8b26181fSAndroid Build Coastguard Worker ;; 176*8b26181fSAndroid Build Coastguard Worker xlc-*) 177*8b26181fSAndroid Build Coastguard Worker # XL C 12.1 and 13.1 recognize "-qhalt=w". XL C 16.1 recognizes that 178*8b26181fSAndroid Build Coastguard Worker # and "-Werror". 179*8b26181fSAndroid Build Coastguard Worker echo '-qhalt=w' 180*8b26181fSAndroid Build Coastguard Worker ;; 181*8b26181fSAndroid Build Coastguard Worker suncc-*) 182*8b26181fSAndroid Build Coastguard Worker echo '-errwarn=%all' 183*8b26181fSAndroid Build Coastguard Worker ;; 184*8b26181fSAndroid Build Coastguard Worker esac 185*8b26181fSAndroid Build Coastguard Worker} 186*8b26181fSAndroid Build Coastguard Worker 187*8b26181fSAndroid Build Coastguard Worker# Tell whether "gcc" is a symlink to Clang (this is the case on macOS). 188*8b26181fSAndroid Build Coastguard Workergcc_is_clang_in_disguise() { 189*8b26181fSAndroid Build Coastguard Worker case `cc_id`/`basename "${CC:?}"` in 190*8b26181fSAndroid Build Coastguard Worker clang-*/gcc) 191*8b26181fSAndroid Build Coastguard Worker return 0 192*8b26181fSAndroid Build Coastguard Worker ;; 193*8b26181fSAndroid Build Coastguard Worker esac 194*8b26181fSAndroid Build Coastguard Worker return 1 195*8b26181fSAndroid Build Coastguard Worker} 196*8b26181fSAndroid Build Coastguard Worker 197*8b26181fSAndroid Build Coastguard Workeros_id() { 198*8b26181fSAndroid Build Coastguard Worker # OS does not change between builds or in the middle of a build, so it is 199*8b26181fSAndroid Build Coastguard Worker # fine to cache uname output. 200*8b26181fSAndroid Build Coastguard Worker : "${os_id_sysname:=`uname -s`}" 201*8b26181fSAndroid Build Coastguard Worker printf '%s-' "$os_id_sysname" 202*8b26181fSAndroid Build Coastguard Worker : "${os_id_release:=`uname -r`}" 203*8b26181fSAndroid Build Coastguard Worker case "$os_id_sysname" in 204*8b26181fSAndroid Build Coastguard Worker AIX) 205*8b26181fSAndroid Build Coastguard Worker : "${os_id_version:=`uname -v`}" 206*8b26181fSAndroid Build Coastguard Worker echo "${os_id_version}.${os_id_release}" 207*8b26181fSAndroid Build Coastguard Worker ;; 208*8b26181fSAndroid Build Coastguard Worker Darwin|NetBSD|OpenBSD|SunOS) 209*8b26181fSAndroid Build Coastguard Worker echo "$os_id_release" 210*8b26181fSAndroid Build Coastguard Worker ;; 211*8b26181fSAndroid Build Coastguard Worker FreeBSD|Linux) 212*8b26181fSAndroid Build Coastguard Worker # Meaningful version is usually the substring before the first dash. 213*8b26181fSAndroid Build Coastguard Worker echo "$os_id_release" | sed 's/^\([0-9\.]*\).*$/\1/' 214*8b26181fSAndroid Build Coastguard Worker ;; 215*8b26181fSAndroid Build Coastguard Worker Haiku) 216*8b26181fSAndroid Build Coastguard Worker # Meaningful version is the substring before the plus sign. 217*8b26181fSAndroid Build Coastguard Worker # "hrev55181" stands for "R1/beta3". 218*8b26181fSAndroid Build Coastguard Worker # "hrev54154" stands for "R1/beta2". 219*8b26181fSAndroid Build Coastguard Worker : "${os_id_version:=`uname -v`}" 220*8b26181fSAndroid Build Coastguard Worker echo "$os_id_version" | sed 's/^\(hrev.*\)+.*$/\1/' 221*8b26181fSAndroid Build Coastguard Worker ;; 222*8b26181fSAndroid Build Coastguard Worker *) 223*8b26181fSAndroid Build Coastguard Worker echo 'UNKNOWN' 224*8b26181fSAndroid Build Coastguard Worker ;; 225*8b26181fSAndroid Build Coastguard Worker esac 226*8b26181fSAndroid Build Coastguard Worker} 227*8b26181fSAndroid Build Coastguard Worker 228*8b26181fSAndroid Build Coastguard Workerincrement() { 229*8b26181fSAndroid Build Coastguard Worker # No arithmetic expansion in Solaris /bin/sh before 11. 230*8b26181fSAndroid Build Coastguard Worker echo "${1:?} + 1" | bc 231*8b26181fSAndroid Build Coastguard Worker} 232*8b26181fSAndroid Build Coastguard Worker 233*8b26181fSAndroid Build Coastguard Worker# Display text in magenta. 234*8b26181fSAndroid Build Coastguard Workerecho_magenta() { 235*8b26181fSAndroid Build Coastguard Worker # ANSI magenta, the imploded text, ANSI reset, newline. 236*8b26181fSAndroid Build Coastguard Worker printf '\033[35;1m%s\033[0m\n' "$*" 237*8b26181fSAndroid Build Coastguard Worker} 238*8b26181fSAndroid Build Coastguard Worker 239*8b26181fSAndroid Build Coastguard Worker# Run a command after displaying it. 240*8b26181fSAndroid Build Coastguard Workerrun_after_echo() { 241*8b26181fSAndroid Build Coastguard Worker : "${1:?}" # Require at least one argument. 242*8b26181fSAndroid Build Coastguard Worker printf '$ %s\n' "$*" 243*8b26181fSAndroid Build Coastguard Worker "$@" 244*8b26181fSAndroid Build Coastguard Worker} 245*8b26181fSAndroid Build Coastguard Worker 246*8b26181fSAndroid Build Coastguard Workerprint_so_deps() { 247*8b26181fSAndroid Build Coastguard Worker case `os_id` in 248*8b26181fSAndroid Build Coastguard Worker Darwin-*) 249*8b26181fSAndroid Build Coastguard Worker run_after_echo otool -L "${1:?}" 250*8b26181fSAndroid Build Coastguard Worker ;; 251*8b26181fSAndroid Build Coastguard Worker *) 252*8b26181fSAndroid Build Coastguard Worker run_after_echo ldd "${1:?}" 253*8b26181fSAndroid Build Coastguard Worker ;; 254*8b26181fSAndroid Build Coastguard Worker esac 255*8b26181fSAndroid Build Coastguard Worker} 256*8b26181fSAndroid Build Coastguard Worker 257*8b26181fSAndroid Build Coastguard Worker# Beware that setting MATRIX_DEBUG for tcpdump or tcpslice will produce A LOT 258*8b26181fSAndroid Build Coastguard Worker# of additional output there and in any nested libpcap builds. Multiplied by 259*8b26181fSAndroid Build Coastguard Worker# the matrix size, the full output log size might exceed limits of some CI 260*8b26181fSAndroid Build Coastguard Worker# systems (as it had previously happened with Travis CI). Use with caution on 261*8b26181fSAndroid Build Coastguard Worker# a reduced matrix. 262*8b26181fSAndroid Build Coastguard Workerhandle_matrix_debug() { 263*8b26181fSAndroid Build Coastguard Worker [ "$MATRIX_DEBUG" != yes ] && return 264*8b26181fSAndroid Build Coastguard Worker echo '$ cat Makefile [...]' 265*8b26181fSAndroid Build Coastguard Worker sed '/^# DO NOT DELETE THIS LINE -- mkdep uses it.$/q' <Makefile 266*8b26181fSAndroid Build Coastguard Worker run_after_echo cat config.h 267*8b26181fSAndroid Build Coastguard Worker [ "$CMAKE" = yes ] || run_after_echo cat config.log 268*8b26181fSAndroid Build Coastguard Worker} 269*8b26181fSAndroid Build Coastguard Worker 270*8b26181fSAndroid Build Coastguard Workerpurge_directory() { 271*8b26181fSAndroid Build Coastguard Worker if [ "`os_id`" = SunOS-5.11 ]; then 272*8b26181fSAndroid Build Coastguard Worker # In Solaris 11 /bin/sh the pathname expansion of "*" always includes 273*8b26181fSAndroid Build Coastguard Worker # "." and "..", so the straightforward rm would always fail. 274*8b26181fSAndroid Build Coastguard Worker ( 275*8b26181fSAndroid Build Coastguard Worker cd "${1:?}" 276*8b26181fSAndroid Build Coastguard Worker for pd_each in *; do 277*8b26181fSAndroid Build Coastguard Worker if [ "$pd_each" != . ] && [ "$pd_each" != .. ]; then 278*8b26181fSAndroid Build Coastguard Worker rm -rf "$pd_each" 279*8b26181fSAndroid Build Coastguard Worker fi 280*8b26181fSAndroid Build Coastguard Worker done 281*8b26181fSAndroid Build Coastguard Worker ) 282*8b26181fSAndroid Build Coastguard Worker else 283*8b26181fSAndroid Build Coastguard Worker rm -rf "${1:?}"/* 284*8b26181fSAndroid Build Coastguard Worker fi 285*8b26181fSAndroid Build Coastguard Worker} 286*8b26181fSAndroid Build Coastguard Worker 287*8b26181fSAndroid Build Coastguard Worker# vi: set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab autoindent : 288