summaryrefslogtreecommitdiff
path: root/cross
diff options
context:
space:
mode:
authorkent <kent>2001-10-21 12:24:15 +0000
committerkent <kent>2001-10-21 12:24:15 +0000
commit29324b84f8d4074c2112a2b118ea12df7c6c503b (patch)
tree3e243a31dfa5a6bdbb463c0ad48f58b723a36ce7 /cross
parent90574b209a8f7cb0bf3c7b400c44b6dd7d228eec (diff)
downloadpkgsrc-29324b84f8d4074c2112a2b118ea12df7c6c503b.tar.gz
Sync with PEACE repositry.
- Apply stack-protection patch. - Upgrade binutils: 2.9.1 -> 2.11.2. This package does not use cross-binutils-2.9.1
Diffstat (limited to 'cross')
-rw-r--r--cross/i386-netbsdpe/Makefile19
-rw-r--r--cross/i386-netbsdpe/distinfo9
-rw-r--r--cross/i386-netbsdpe/files/cross.mk65
-rw-r--r--cross/i386-netbsdpe/patches/binutils-aa16
-rw-r--r--cross/i386-netbsdpe/patches/binutils-ab12
-rw-r--r--cross/i386-netbsdpe/patches/binutils-ac13
-rw-r--r--cross/i386-netbsdpe/patches/binutils-ad20
-rw-r--r--cross/i386-netbsdpe/patches/patch-de46
8 files changed, 135 insertions, 65 deletions
diff --git a/cross/i386-netbsdpe/Makefile b/cross/i386-netbsdpe/Makefile
index aa7c6539d02..b2518264f2e 100644
--- a/cross/i386-netbsdpe/Makefile
+++ b/cross/i386-netbsdpe/Makefile
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.7 2001/03/10 21:15:27 wiz Exp $
-#
+# $NetBSD: Makefile,v 1.8 2001/10/21 12:24:15 kent Exp $
+# $PEACE: Makefile,v 1.16 2001/10/19 07:43:09 kent Exp $
-DISTVERSION= 1.1.4
-DISTFILES= # none
+DISTVERSION= 1.2.1
+CROSS_DISTFILES= # none
MAINTAINER= peace-sacrifice@hauN.org
HOMEPAGE= http://chiharu.hauN.org/peace/
@@ -27,11 +27,18 @@ GCC_CONFIGURE_ARGS+= --enable-threads
BINUTILS_EXTRAS= dlltool windres
+# Mingw pathes
GCC_WIN32_PATCHBUNDLE= ${GCC_DISTNAME}-x86-win32-patches.tar.gz
GCC_WIN32_PATCH= ${WRKDIR}/${GCC_DISTNAME}-patches/${GCC_DISTNAME}-x86-win32.diff
MASTER_SITES+= ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/${GCC_DISTNAME}/patches/
CROSS_DISTFILES+= ${GCC_WIN32_PATCHBUNDLE}
+# SSP patch
+MASTER_SITES+= http://www.trl.ibm.com/projects/security/ssp/gcc2_95_2/
+SSP_PATCH= protector-2.95.2-2.tar.gz
+CROSS_DISTFILES+= ${SSP_PATCH}
+
+# pthread
PTHREAD_DISTNAME= unproven-pthreads-0.17
PTHREAD_DISTFILE= ${PTHREAD_DISTNAME}.tar.gz
MASTER_SITES+= ftp://ftp.flame.org/pub/netbsd/
@@ -54,6 +61,10 @@ post-patch:
cd ${WRKDIR}/${GCC_DISTNAME}/gcc && \
${LN} -s ../../${PTHREAD_DISTNAME}/include/pthread.h . && \
${LN} -s ../../${PTHREAD_DISTNAME}/include/pthread .
+ cd ${WRKDIR} && /usr/bin/tar zxf ${_DISTDIR}/${SSP_PATCH}
+ ${CP} ${WRKDIR}/protector.c ${WRKDIR}/protector.h ${WRKDIR}/${GCC_DISTNAME}/gcc/
+ ${PATCH} -d ${WRKDIR}/${GCC_DISTNAME} --forward --quiet -E < ${WRKDIR}/protector.dif
+# ${PATCH} -d ${WRKDIR}/${GCC_DISTNAME} --forward --quiet -E < ${WRKDIR}/protectonly.dif
CFLAGS_FOR_TARGET+= -I${WRKDIR}
post-configure:
diff --git a/cross/i386-netbsdpe/distinfo b/cross/i386-netbsdpe/distinfo
index f7122221d46..00c2216ccdc 100644
--- a/cross/i386-netbsdpe/distinfo
+++ b/cross/i386-netbsdpe/distinfo
@@ -1,16 +1,19 @@
-$NetBSD: distinfo,v 1.2 2001/04/21 09:36:24 skrll Exp $
+$NetBSD: distinfo,v 1.3 2001/10/21 12:24:15 kent Exp $
SHA1 (gcc-2.95.2-x86-win32-patches.tar.gz) = 8018d7a1c32211fc7a2f413cd49c422f7ccfd2ec
Size (gcc-2.95.2-x86-win32-patches.tar.gz) = 217965 bytes
+SHA1 (protector-2.95.2-2.tar.gz) = 7b906b45e4e08e414ec8bca611d5371d82994401
+Size (protector-2.95.2-2.tar.gz) = 17034 bytes
SHA1 (unproven-pthreads-0.17.tar.gz) = 9f50e31da916b341e0c1ce21012bbd95b1a08a7d
Size (unproven-pthreads-0.17.tar.gz) = 234180 bytes
-SHA1 (binutils-2.9.1.tar.gz) = 9df3cdcd34f81118ee403f8794b277ad28a57e14
-Size (binutils-2.9.1.tar.gz) = 5694541 bytes
+SHA1 (binutils-2.11.2.tar.gz) = 4095688f3478e8d4693ad2b965008a49f033e08f
+Size (binutils-2.11.2.tar.gz) = 9934295 bytes
SHA1 (gcc-2.95.2.tar.gz) = c3da103de3fa97c78ccc1b4fdc29fa25bf26a6c8
Size (gcc-2.95.2.tar.gz) = 12885815 bytes
SHA1 (patch-aa) = cd270eb18e0b65641a416c1215388dc9fb91f33d
SHA1 (patch-co) = 8a6ca102d76ebda1dc4edf5d65da2a5d4cedb183
SHA1 (patch-cp) = f94a5dfdb13cf00cc06854617defa56e8370d3b8
SHA1 (patch-cq) = f897fef519f7966de094d25954073b9a2a793891
+SHA1 (patch-de) = 8618f7e14bc76cb0d45ebe52bbd8f71b5e64bb2a
SHA1 (patch-ma) = 4cd59064a5bb813d7ecf560d5038f7ba1a67b733
SHA1 (patch-pe) = 4875256eed89dcb9b635c97c70cbdfce49ddd1b9
diff --git a/cross/i386-netbsdpe/files/cross.mk b/cross/i386-netbsdpe/files/cross.mk
index 5ee654a7dd6..684e3b3f9f1 100644
--- a/cross/i386-netbsdpe/files/cross.mk
+++ b/cross/i386-netbsdpe/files/cross.mk
@@ -1,5 +1,4 @@
-# $NetBSD: cross.mk,v 1.6 2001/03/10 21:15:27 wiz Exp $
-# $PEACE: cross.mk,v 1.1 2001/01/16 15:20:26 kent Exp $
+# $PEACE: cross.mk,v 1.6 2001/10/19 07:43:10 kent Exp $
# based on pkgsrc/cross/COMMON/cross.mk
# NetBSD: cross.mk,v 1.16 2000/11/09 13:04:55 wiz Exp
@@ -10,6 +9,7 @@ DISTNAME= cross-${TARGET_ARCH}-${DISTVERSION}
CATEGORIES+= cross lang
USE_CROSSBASE= yes
PLIST_SRC= ${WRKDIR}/.PLIST_SRC
+MESSAGE_SUBST+= CROSSBASE=${CROSSBASE}
HOMEPAGE?= http://gcc.gnu.org/
@@ -29,31 +29,25 @@ pre-install-dirs:
${INSTALL_DATA_DIR} ${TARGET_DIR}/lib
.if defined(USE_CROSS_BINUTILS)
-BINUTILS_DISTNAME= binutils-2.9.1
+BINUTILS_DISTNAME= binutils-2.11.2
BINUTILS_WRKSRC= ${WRKDIR}/${BINUTILS_DISTNAME}
CROSS_DISTFILES+= ${BINUTILS_DISTNAME}.tar.gz
MASTER_SITES+= ${MASTER_SITE_GNU:=binutils/}
CONFIGURE_ARGS+= --with-gnu-as --with-gnu-ld
-DEPENDS+= cross-binutils>=2.9.1.1:../../cross/binutils
+#DEPENDS+= cross-binutils>=2.9.1.1:../../cross/binutils
PLIST_PRE+= ${COMMON_DIR}/PLIST-binutils
AS_FOR_TARGET= ${BINUTILS_WRKSRC}/gas/as-new
-AR_FOR_TARGET= ${WRKDIR}/ar
-NM_FOR_TARGET= ${WRKDIR}/nm
-RANLIB_FOR_TARGET= ${WRKDIR}/ranlib
-LD_FOR_TARGET= ${WRKDIR}/ld
+AR_FOR_TARGET= ${BINUTILS_WRKSRC}/binutils/ar
+NM_FOR_TARGET= ${BINUTILS_WRKSRC}/binutils/nm-new
+RANLIB_FOR_TARGET= ${BINUTILS_WRKSRC}/binutils/ranlib
+LD_FOR_TARGET= ${BINUTILS_WRKSRC}/ld/ld-new
-pre-patch: binutils-patch
pre-configure: binutils-configure
do-build: binutils-build
do-install: binutils-install
-binutils-patch:
- @for i in ${COMMON_DIR}/patches-binutils/patch-*; do \
- ${PATCH} -d ${BINUTILS_WRKSRC} --forward --quiet -E < $$i; \
- done
-
BFD64ARG= --enable-64-bit-bfd
binutils-configure:
@@ -63,32 +57,16 @@ binutils-configure:
--target=${TARGET_ARCH} ${BFD64ARG}
binutils-build:
- @cd ${BINUTILS_WRKSRC}/bfd && ${SETENV} ${MAKE_ENV} \
- ${MAKE_PROGRAM} ${MAKE_FLAGS} bfd.h
- @cd ${BINUTILS_WRKSRC}/libiberty && ${SETENV} ${MAKE_ENV} \
- ${MAKE_PROGRAM} ${MAKE_FLAGS} all
- @cd ${BINUTILS_WRKSRC}/gas && ${SETENV} ${MAKE_ENV} \
- ${MAKE_PROGRAM} ${MAKE_FLAGS} as-new
- ${TEST} -x ${WRKDIR}/ar || ${LINK.c} -o ${WRKDIR}/ar \
- -DPREFIX=\"${PREFIX}\" \
- -DGNUTARGET=\"${BINUTILS_GNUTARGET}\" \
- ${COMMON_DIR}/buwrapper.c
- @cd ${WRKDIR} && \
- ${LN} -f ar nm && \
- ${LN} -f ar ranlib
- ${TEST} -x ${WRKDIR}/ld || ${LINK.c} -o ${WRKDIR}/ld \
- -DPREFIX=\"${PREFIX}\" \
- -DGNUTARGET=\"${BINUTILS_GNUTARGET}\" \
- -DLDEMULATION=\"${BINUTILS_LDEMULATION}\" \
- -DLD_RPATH_LINK=\"${TARGET_DIR}/lib\" \
- ${COMMON_DIR}/buwrapper.c
+ @cd ${BINUTILS_WRKSRC} && ${SETENV} ${MAKE_ENV} \
+ ${MAKE_PROGRAM} ${MAKE_FLAGS}
binutils-install:
${INSTALL_PROGRAM} ${BINUTILS_WRKSRC}/gas/as-new ${TARGET_DIR}/bin/as
- ${INSTALL_PROGRAM} ${WRKDIR}/ar ${TARGET_DIR}/bin/ar
- ${INSTALL_PROGRAM} ${WRKDIR}/ld ${TARGET_DIR}/bin/ld
- for i in addr2line nm objcopy objdump ranlib size strings strip ${BINUTILS_EXTRAS}; do \
- ${LN} -f ${TARGET_DIR}/bin/ar ${TARGET_DIR}/bin/$$i; \
+ ${INSTALL_PROGRAM} ${BINUTILS_WRKSRC}/ld/ld-new ${TARGET_DIR}/bin/ld
+ ${INSTALL_PROGRAM} ${BINUTILS_WRKSRC}/binutils/nm-new ${TARGET_DIR}/bin/nm
+ ${INSTALL_PROGRAM} ${BINUTILS_WRKSRC}/binutils/strip-new ${TARGET_DIR}/bin/strip
+ for i in addr2line ar objcopy objdump ranlib size strings ${BINUTILS_EXTRAS}; do \
+ ${INSTALL_PROGRAM} ${BINUTILS_WRKSRC}/binutils/$$i ${TARGET_DIR}/bin/$$i; \
done
for i in addr2line ar as ld nm objcopy objdump ranlib size strings strip ${BINUTILS_EXTRAS}; do \
${LN} -f ${TARGET_DIR}/bin/$$i ${PREFIX}/bin/${TARGET_ARCH}-$$i; \
@@ -97,12 +75,10 @@ binutils-install:
.if defined(USE_CROSS_GCC)
GCC_DISTNAME= gcc-2.95.2
-#EGCS_DISTDIR= releases/${EGCS_DISTNAME}
GCC_INTVERSION= 2.95.2
-#EGCS_PATCHBUNDLE= ${EGCS_DISTNAME}-NetBSD-19980104.diff.gz
GCC_WRKSRC= ${WRKDIR}/${GCC_DISTNAME}
GCC_LANGUAGES= c # add to these below
-BUILD_DEPENDS+= ${LOCALBASE}/bin/autoheader:../../devel/autoconf
+BUILD_DEPENDS+= autoconf-*:../../devel/autoconf
.if defined(GCC_CXX)
CXX_CONFIGURE_ARGS+= --with-gxx-include-dir=${TARGET_DIR}/include/c++
@@ -132,8 +108,6 @@ PLIST_PRE+= ${GCC_PLIST_DIR}/PLIST-gcc-objc-runtime
# the main PLIST needs to go last to get the @dirrm's right
PLIST_PRE+= ${GCC_PLIST_DIR}/PLIST-gcc
CROSS_DISTFILES+= ${GCC_DISTNAME}.tar.gz #${EGCS_PATCHBUNDLE}
-#MASTER_SITES+= ftp://egcs.cygnus.com/pub/egcs/${EGCS_DISTDIR}/ \
-# ${MASTER_SITE_LOCAL}
USE_GMAKE= yes
CC_FOR_TARGET= ${GCC_WRKSRC}/gcc/xgcc -B${GCC_WRKSRC}/gcc/ ${CFLAGS_FOR_TARGET}
@@ -155,7 +129,7 @@ GCC_MAKE= ${SETENV} ${MAKE_ENV} \
${MAKE_PROGRAM} ${MAKE_FLAGS} ${GCC_MAKE_FLAGS}
.if defined(GCC_FAKE_RUNTIME)
-CROSS_SYS_INCLUDE= ${WRKDIR}/include
+CROSS_SYS_INCLUDE= ${WRKDIR}/include
.endif
.if defined(CROSS_SYS_INCLUDE)
CFLAGS_FOR_TARGET+= -idirafter ${CROSS_SYS_INCLUDE}
@@ -186,8 +160,7 @@ gcc-configure:
--host=${MACHINE_GNU_ARCH}--netbsd --target=${TARGET_ARCH} \
${GCC_CONFIGURE_ARGS} ${CXX_CONFIGURE_ARGS}
.if defined(GCC_FAKE_RUNTIME)
- @${MKDIR} ${CROSS_SYS_INCLUDE} ${CROSS_SYS_INCLUDE}/machine \
- ${CROSS_SYS_INCLUDE}/sys
+ @${MKDIR} ${CROSS_SYS_INCLUDE} ${CROSS_SYS_INCLUDE}/machine ${CROSS_SYS_INCLUDE}/sys
@cd ${CROSS_SYS_INCLUDE} && ${TOUCH} ${TOUCH_FLAGS} machine/ansi.h \
sys/time.h stdlib.h unistd.h
.endif
@@ -228,7 +201,7 @@ gcc-install:
.if defined(GCC_CXX)
@${MKDIR} ${TARGET_DIR}/include/c++
@for file in exception new new.h typeinfo; do \
- ${CP} -p ${GCC_WRKSRC}/gcc/cp/inc/$$file ${TARGET_DIR}/include/c++; \
+ ${INSTALL_DATA} ${GCC_WRKSRC}/gcc/cp/inc/$$file ${TARGET_DIR}/include/c++; \
done
.if defined(GCC_CXX_RUNTIME)
@${MKDIR} ${TARGET_DIR}/include/g++/std
diff --git a/cross/i386-netbsdpe/patches/binutils-aa b/cross/i386-netbsdpe/patches/binutils-aa
index b0b9e9b7e84..69bc170687d 100644
--- a/cross/i386-netbsdpe/patches/binutils-aa
+++ b/cross/i386-netbsdpe/patches/binutils-aa
@@ -1,13 +1,15 @@
---- bfd/config.bfd.dist Sun Oct 1 20:56:02 2000
-+++ bfd/config.bfd Sun Oct 1 20:56:55 2000
-@@ -195,6 +195,10 @@
- targ_selvecs=i386bsd_vec
- targ_underscore=yes
+$NetBSD: binutils-aa,v 1.2 2001/10/21 12:24:16 kent Exp $
+
+--- bfd/config.bfd.dist Thu Jun 14 20:16:59 2001
++++ bfd/config.bfd
+@@ -351,6 +351,10 @@
+ targ_defvec=bfd_elf32_i386_vec
+ targ_selvecs=i386netbsd_vec
;;
+ i[3456]86-*-netbsdpe*)
+ targ_defvec=i386pe_vec
+ targ_selvecs="i386pe_vec i386pei_vec"
+ ;;
- i[3456]86-*-netbsd* | i[3456]86-*-openbsd*)
+ i[3456]86-*-netbsdaout* | i[3456]86-*-netbsd* | i[3456]86-*-openbsd*)
targ_defvec=i386netbsd_vec
- targ_selvecs=i386bsd_vec
+ targ_selvecs="bfd_elf32_i386_vec i386bsd_vec"
diff --git a/cross/i386-netbsdpe/patches/binutils-ab b/cross/i386-netbsdpe/patches/binutils-ab
index fbdb0b51b09..2357aed8ffe 100644
--- a/cross/i386-netbsdpe/patches/binutils-ab
+++ b/cross/i386-netbsdpe/patches/binutils-ab
@@ -1,10 +1,12 @@
---- gas/configure.in.dist Sun Oct 1 20:59:05 2000
-+++ gas/configure.in Sun Oct 1 20:59:46 2000
-@@ -150,6 +150,7 @@
- i386-sequent-bsd*) fmt=aout em=dynix bfd_gas=yes ;;
+$NetBSD: binutils-ab,v 1.2 2001/10/21 12:24:16 kent Exp $
+
+--- gas/configure.in.dist Mon Jun 11 19:04:44 2001
++++ gas/configure.in
+@@ -240,6 +240,7 @@
+ i386-*-beoself* | i386-*-beos*) fmt=elf bfd_gas=yes ;;
i386-*-bsd*) fmt=aout em=386bsd ;;
i386-*-netbsd0.8) fmt=aout em=386bsd ;;
+ i386-*-netbsdpe*) fmt=coff em=pe bfd_gas=yes ;;
i386-*-netbsd*) fmt=aout em=nbsd bfd_gas=yes;;
i386-*-openbsd*) fmt=aout em=nbsd bfd_gas=yes;;
- i386-*-linux*aout* | i386-*-linuxoldld) fmt=aout em=linux ;;
+ i386-*-linux*aout* | i386-*-linux*oldld) fmt=aout em=linux ;;
diff --git a/cross/i386-netbsdpe/patches/binutils-ac b/cross/i386-netbsdpe/patches/binutils-ac
new file mode 100644
index 00000000000..e4150e08776
--- /dev/null
+++ b/cross/i386-netbsdpe/patches/binutils-ac
@@ -0,0 +1,13 @@
+$NetBSD: binutils-ac,v 1.1 2001/10/21 12:24:16 kent Exp $
+
+--- ld/configure.tgt.dist Mon Jun 11 19:05:08 2001
++++ ld/configure.tgt
+@@ -144,6 +144,8 @@
+ i[3456]86-*-solaris2*) targ_emul=elf_i386 ;;
+ i[3456]86-*-unixware) targ_emul=elf_i386 ;;
+ i[3456]86-*-solaris*) targ_emul=elf_i386 ;;
++i[3456]86-*-netbsdpe*) targ_emul=i386pe ;
++ targ_extra_ofiles="deffilep.o pe-dll.o" ;;
+ i[3456]86-*-netbsd*) targ_emul=i386nbsd ;;
+ i[3456]86-*-netware) targ_emul=i386nw ;;
+ i[3456]86-*-elf*) targ_emul=elf_i386 ;;
diff --git a/cross/i386-netbsdpe/patches/binutils-ad b/cross/i386-netbsdpe/patches/binutils-ad
new file mode 100644
index 00000000000..5107dd33ff3
--- /dev/null
+++ b/cross/i386-netbsdpe/patches/binutils-ad
@@ -0,0 +1,20 @@
+$NetBSD: binutils-ad,v 1.1 2001/10/21 12:24:16 kent Exp $
+
+--- bfd/cofflink.c.orig Thu Jun 7 12:08:24 2001
++++ bfd/cofflink.c
+@@ -708,6 +708,15 @@
+ long_section_names = false;
+ for (o = abfd->sections; o != NULL; o = o->next)
+ {
++#if 0
++ fprintf(stderr, "_bfd_coff_final_link: %s%s%s%s%s\n", o->name
++ o->flags & SEC_CODE ? " SEC_CODE" : "",
++ o->flags & SEC_DATA ? " SEC_DATA" : "",
++ o->flags & SEC_ALLOC ? " SEC_ALLOC" : "",
++ o->flags & SEC_READONLY ? " SEC_READONLY" : "");
++#endif
++ if (o->flags & SEC_CODE && o->flags & SEC_DATA)
++ o->flags &= ~SEC_DATA;
+ o->reloc_count = 0;
+ o->lineno_count = 0;
+ for (p = o->link_order_head; p != NULL; p = p->next)
diff --git a/cross/i386-netbsdpe/patches/patch-de b/cross/i386-netbsdpe/patches/patch-de
new file mode 100644
index 00000000000..6778f128899
--- /dev/null
+++ b/cross/i386-netbsdpe/patches/patch-de
@@ -0,0 +1,46 @@
+$NetBSD: patch-de,v 1.1 2001/10/21 12:24:16 kent Exp $
+
+--- gcc/cp/decl.c~ Tue Mar 27 22:17:25 2001
++++ gcc/cp/decl.c
+@@ -10266,8 +10266,18 @@
+ ignore_attrs = 0;
+ else if (inner_attrs)
+ {
+- decl_attributes (type, inner_attrs, NULL_TREE);
+- inner_attrs = NULL_TREE;
++ /*decl_attributes (type, inner_attrs, NULL_TREE);*/
++ /* Create a dummy decl to pass to decl_attributes. The
++ attributes will be added to a variant of type, and this
++ new variant type can be retrieved from the dummy decl.
++ Passing type directly causes the attributes to be added
++ to type, which is wrong because type may be used
++ elsewhere without attributes. */
++
++ tree dummy = build_decl (TYPE_DECL, NULL_TREE, type);
++ decl_attributes (dummy, inner_attrs, NULL_TREE);
++ type = TREE_TYPE (dummy);
++ inner_attrs = NULL_TREE;
+ }
+
+ switch (TREE_CODE (declarator))
+@@ -10969,7 +10979,19 @@
+ if (inner_attrs)
+ {
+ if (! ignore_attrs)
+- decl_attributes (type, inner_attrs, NULL_TREE);
++ /*decl_attributes (type, inner_attrs, NULL_TREE);*/
++ {
++ /* Create a dummy decl to pass to decl_attributes. The
++ attributes will be added to a variant of type, and this
++ new variant type can be retrieved from the dummy decl.
++ Passing type directly causes the attributes to be added
++ to type, which is wrong because type may be used
++ elsewhere without attributes. */
++
++ tree dummy = build_decl (TYPE_DECL, NULL_TREE, type);
++ decl_attributes (dummy, inner_attrs, NULL_TREE);
++ type = TREE_TYPE (dummy);
++ }
+ else if (attrlist)
+ TREE_VALUE (attrlist) = chainon (inner_attrs, TREE_VALUE (attrlist));
+ else