1#!/bin/sh
2#
3# Build a binary package using polypkg
4# Usage: mkpkg [--debug] [--flavor flavor] [--platform platform] [--osversion ver]
5#
6
7# Make sure IFS is set to space, tab, newline in that order.
8space=' '
9tab='	'
10nl='
11'
12IFS=" 	$nl"
13
14# Parse arguments
15usage="usage: mkpkg [--debug] [--flavor flavor] [--platform platform] [--osversion ver]"
16debug=0
17flavor=vanilla
18crossbuild=false
19while test $# -gt 0; do
20    case "$1" in
21	--debug)
22	    set -x
23	    debug=1
24	    PPFLAGS="--debug${PPFLAGS+$space}${PPFLAGS}"
25	    ;;
26	--flavor=?*)
27	    flavor=`echo "$1" | sed -n 's/^--flavor=\(.*\)/\1/p'`
28	    PPVARS="${PPVARS}${PPVARS+$space}flavor=$flavor"
29	    ;;
30	--flavor)
31	    if [ $# -lt 2 ]; then
32		echo "$usage" 1>&2
33		exit 1
34	    fi
35	    flavor="$2"
36	    PPVARS="${PPVARS}${PPVARS+$space}flavor=$flavor"
37	    shift
38	    ;;
39	--platform=?*)
40	    arg=`echo "$1" | sed -n 's/^--platform=\(.*\)/\1/p'`
41	    PPFLAGS="${PPFLAGS}${PPFLAGS+$space}--platform $arg"
42	    ;;
43	--platform)
44	    if [ $# -lt 2 ]; then
45		echo "$usage" 1>&2
46		exit 1
47	    fi
48	    PPFLAGS="${PPFLAGS}${PPFLAGS+$space}--platform $2"
49	    shift
50	    ;;
51	--osversion=?*)
52	    arg=`echo "$1" | sed -n 's/^--osversion=\(.*\)/\1/p'`
53	    osversion="$arg"
54	    ;;
55	--osversion)
56	    if [ $# -lt 2 ]; then
57		echo "$usage" 1>&2
58		exit 1
59	    fi
60	    osversion="$2"
61	    shift
62	    ;;
63	--build|--host)
64	    crossbuild=true
65	    configure_opts="${configure_opts}${configure_opts+$tab}$1"
66	    ;;
67	*)
68	    # Pass unknown options to configure
69	    configure_opts="${configure_opts}${configure_opts+$tab}$1"
70	    ;;
71    esac
72    shift
73done
74
75top_srcdir=`dirname $0`
76
77: ${osversion="`$top_srcdir/pp --probe`"}
78test -n "$osversion" || exit 1
79osrelease=`echo "$osversion" | sed -e 's/^[^0-9]*//' -e 's/-.*$//'`
80
81# Choose compiler options by osversion if not cross-compiling.
82if [ "$crossbuild" = "false" ]; then
83    case "$osversion" in
84	hpux*)
85	    # Use the HP ANSI C compiler on HP-UX if possible
86	    if [ -z "$CC" -a -x /opt/ansic/bin/cc ]; then
87		CC=/opt/ansic/bin/cc; export CC
88		if [ -z "$CFLAGS" ]; then
89		    CFLAGS=-O; export CFLAGS
90		fi
91	    fi
92	    ;;
93	sol[0-9]*)
94	    # Use the Sun Studio C compiler on Solaris if possible
95	    if [ -z "$CC" -a -x /usr/bin/cc ]; then
96		CC=/usr/bin/cc; export CC
97		if [ -z "$CFLAGS" ]; then
98		    CFLAGS=-O; export CFLAGS
99		fi
100	    fi
101	    ;;
102    esac
103fi
104
105# Choose configure options by osversion.
106# We use the same configure options as vendor packages when possible.
107case "$osversion" in
108    centos*|rhel*)
109	if [ $osrelease -ge 40 ]; then
110	    # RHEL 4 and up support SELinux
111	    configure_opts="${configure_opts}${configure_opts+$tab}--with-selinux"
112	fi
113	if [ $osrelease -ge 50 ]; then
114	    # RHEL 5 and up has audit support and uses a separate PAM
115	    # config file for "sudo -i".
116	    configure_opts="${configure_opts}${configure_opts+$tab}--with-linux-audit"
117	    configure_opts="${configure_opts}${configure_opts+$tab}--with-pam-login"
118	    PPVARS="${PPVARS}${PPVARS+$space}linux_audit=1.4.0"
119	fi
120	# Note, must indent with tabs, not spaces due to IFS trickery
121	configure_opts="--prefix=/usr
122		--with-logging=syslog
123		--with-logfac=authpriv
124		--with-pam
125		--enable-zlib=system
126		--with-editor=/bin/vi
127		--with-env-editor
128		--with-ignore-dot
129		--with-tty-tickets
130		--with-ldap
131		--with-passprompt=[sudo] password for %p: 
132		$configure_opts"
133	;;
134    sles*)
135	if [ $osrelease -ge 10 ]; then
136	    # SLES 11 and higher has SELinux
137	    if [ $osrelease -ge 11 ]; then
138		configure_opts="${configure_opts}${configure_opts+$tab}--with-selinux"
139	    fi
140	fi
141	# SuSE doesn't have /usr/libexec
142	libexec=lib
143	case "$osversion" in
144	    *64*)	gcc -v 2>&1 | grep "with-cpu=[^ ]*32" >/dev/null || libexec=lib64
145			;;
146	esac
147	# Note, must indent with tabs, not spaces due to IFS trickery
148	# XXX - SuSE uses secure path but only for env_reset
149	configure_opts="--prefix=/usr
150		--libexecdir=/usr/$libexec/sudo
151		--with-logging=syslog
152		--with-logfac=auth
153		--with-all-insults
154		--with-ignore-dot
155		--with-tty-tickets
156		--enable-shell-sets-home
157		--with-sudoers-mode=0440
158		--with-pam
159		--enable-zlib=system
160		--with-ldap
161		--with-env-editor
162		--with-passprompt=%p\'s password: 
163		$configure_opts"
164
165	make_opts='docdir=$(datarootdir)/doc/packages/$(PACKAGE_TARNAME)'
166	;;
167    deb*|ubu*)
168	# Man pages should be compressed in .deb files
169	export MANCOMPRESS='gzip -9'
170	export MANCOMPRESSEXT='.gz'
171	# If Ubuntu, add --enable-admin-flag
172	case "$osversion" in
173	    ubu*)
174		configure_opts="${configure_opts}${configure_opts+$tab}--enable-admin-flag${tab}--without-lecture"
175		;;
176	esac
177	# Note, must indent with tabs, not spaces due to IFS trickery
178	if test "$flavor" = "ldap"; then
179	    configure_opts="${configure_opts}${configure_opts+$tab}--with-ldap
180		--with-ldap-conf-file=/etc/sudo-ldap.conf"
181	fi
182	configure_opts="${configure_opts}${configure_opts+$tab}--with-selinux"
183	configure_opts="--prefix=/usr
184		--with-all-insults
185		--with-pam
186		--enable-zlib=system
187		--with-fqdn
188		--with-logging=syslog
189		--with-logfac=authpriv
190		--with-env-editor
191		--with-editor=/usr/bin/editor
192		--with-timeout=15
193		--with-password-timeout=0
194		--with-passprompt=[sudo] password for %p: 
195		--with-timedir=/var/lib/sudo
196		--disable-root-mailer
197		--disable-setresuid
198		--with-sendmail=/usr/sbin/sendmail
199		--mandir=/usr/share/man
200		--libexecdir=/usr/lib/sudo
201		--with-secure-path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
202		$configure_opts"
203	;;
204    macos*)
205	case "$osversion" in
206	    *i386|*x86_64)
207		# Build intel-only universal binaries
208		ARCH_FLAGS="-arch i386 -arch x86_64"
209		;;
210	esac
211	if test "${osversion}" != "`$top_srcdir/pp --probe`"; then
212	    sdkvers=`echo "${osversion}" | sed 's/^macos\([0-9][0-9]\)\([0-9]*\)-.*$/\1.\2/'`
213	    SDK_FLAGS="-isysroot /Developer/SDKs/MacOSX${sdkvers}.sdk -mmacosx-version-min=${sdkvers}"
214	fi
215	export CFLAGS="-O2 -g $ARCH_FLAGS $SDK_FLAGS"
216	export LDFLAGS="$ARCH_FLAGS $SDK_FLAGS"
217	# Note, must indent with tabs, not spaces due to IFS trickery
218	configure_opts="--with-pam
219		--without-tty-tickets
220		--enable-zlib=system
221		--with-ldap
222		--with-insults=disabled
223		--with-logging=syslog
224		--with-logfac=authpriv
225		--with-editor=/usr/bin/vim
226		--with-env-editor
227		$configure_opts"
228	;;
229    aix*)
230	# Note, must indent with tabs, not spaces due to IFS trickery
231	# Note: we include our own zlib instead of relying on the
232	#       AIX freeware version being installed.
233	configure_opts="
234		--prefix=/opt/freeware
235		--mandir=/opt/freeware/man
236		--with-insults=disabled
237		--with-logging=syslog
238		--with-logfac=auth
239		--with-editor=/usr/bin/vi
240		--with-env-editor
241		--enable-zlib=builtin
242		--disable-nls
243		$configure_opts"
244	PPVARS="${PPVARS}${PPVARS+$space}aix_freeware=true"
245	;;
246    *)
247	# For Solaris, add project support and use let configure choose zlib.
248	# For all others, use the builtin zlib.
249	case "$osversion" in
250	    sol*) configure_opts="${configure_opts}${configure_opts+$tab}--with-project";;
251	    *) configure_opts="${configure_opts}${configure_opts+$tab}--enable-zlib=builtin";;
252	esac
253	if test "$flavor" = "ldap"; then
254	    configure_opts="${configure_opts}${configure_opts+$tab}--with-ldap"
255	fi
256	# Note, must indent with tabs, not spaces due to IFS trickery
257	configure_opts="
258		--with-insults=disabled
259		--with-logging=syslog
260		--with-logfac=auth
261		--with-editor=/usr/bin/vim:/usr/bin/vi:/bin/vi
262		--with-env-editor
263		$configure_opts"
264	;;
265esac
266
267# Remove spaces from IFS when setting $@ so that passprompt may include them
268OIFS="$IFS"
269IFS="	$nl"
270set -- $configure_opts $extra_opts
271IFS="$OIFS"
272if [ -r Makefile ]; then
273    make $make_opts distclean
274fi
275$top_srcdir/configure "$@" || exit 1
276make $make_opts && make $make_opts PPFLAGS="$PPFLAGS" PPVARS="$PPVARS" package
277test $debug -eq 0 && rm -rf destdir
278