From 35bb3d3c8ecb7f79dae6b2c1fda40593508c9080 Mon Sep 17 00:00:00 2001
From: Paul Sajna <paulsajna@gmail.com>
Date: Thu, 2 Nov 2017 19:25:30 -0700
Subject: [PATCH] recipe for vim

---
 recipes/vim/recipe.sh |  56 +++++++++++
 recipes/vim/vim.patch | 211 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 267 insertions(+)
 create mode 100644 recipes/vim/recipe.sh
 create mode 100644 recipes/vim/vim.patch

diff --git a/recipes/vim/recipe.sh b/recipes/vim/recipe.sh
new file mode 100644
index 000000000..c14e95e90
--- /dev/null
+++ b/recipes/vim/recipe.sh
@@ -0,0 +1,56 @@
+VERSION=8.0.586
+TAR=http://ftp.vim.org/vim/unix/vim-$VERSION.tar.bz2
+BUILD_DEPENDS=(ncurses)
+
+export AR="${HOST}-ar"
+export AS="${HOST}-as"
+export CC="${HOST}-gcc"
+export CXX="${HOST}-g++"
+export LD="${HOST}-ld"
+export NM="${HOST}-nm"
+export OBJCOPY="${HOST}-objcopy"
+export OBJDUMP="${HOST}-objdump"
+export RANLIB="${HOST}-ranlib"
+export READELF="${HOST}-readelf"
+export STRIP="${HOST}-strip"
+
+function recipe_version {
+    echo "$VERSION"
+    skip=1
+}
+
+function recipe_update {
+    echo "skipping update"
+    skip=1
+}
+
+function recipe_build {
+    sysroot="${PWD}/../sysroot"
+    export LDFLAGS="-L$sysroot/lib"
+    export CPPFLAGS="-I$sysroot/include"
+    export vim_cv_toupper_broken=set
+    export vim_cv_terminfo=no
+    export vim_cv_tty_group=world
+    export vim_cv_getcwd_broken=yes
+    export vim_cv_stat_ignores_slash=no
+    export vim_cv_memmove_handles_overlap=yes
+    ./configure --host=${HOST} --prefix=/ --with-tlib=ncurses
+    make 
+    skip=1
+}
+
+function recipe_test {
+    echo "skipping test"
+    skip=1
+}
+
+function recipe_clean {
+    make clean
+    skip=1
+}
+
+function recipe_stage {
+    dest="$(realpath $1)"
+    make DESTDIR="$dest" ${MAKEFLAGS} install
+    skip=1
+}
diff --git a/recipes/vim/vim.patch b/recipes/vim/vim.patch
new file mode 100644
index 000000000..26d5ad698
--- /dev/null
+++ b/recipes/vim/vim.patch
@@ -0,0 +1,211 @@
+diff -ru source/src/channel.c source-new/src/channel.c
+--- source/src/channel.c	2017-10-30 17:21:14.784946514 -0700
++++ source-new/src/channel.c	2017-10-30 17:27:08.234992143 -0700
+@@ -852,29 +852,27 @@
+ 	     * actually able to connect.
+ 	     * We detect a failure to connect when either read and write fds
+ 	     * are set.  Use getsockopt() to find out what kind of failure. */
+-/*
+- *            if (FD_ISSET(sd, &rfds) || FD_ISSET(sd, &wfds))
+- *            {
+- *                ret = getsockopt(sd,
+- *                              SOL_SOCKET, SO_ERROR, &so_error, &so_error_len);
+- *                if (ret < 0 || (so_error != 0
+- *                        && so_error != EWOULDBLOCK
+- *                        && so_error != ECONNREFUSED
+- *# ifdef EINPROGRESS
+- *                        && so_error != EINPROGRESS
+- *# endif
+- *                        ))
+- *                {
+- *                    ch_errorn(channel,
+- *                            "channel_open: Connect failed with errno %d",
+- *                            so_error);
+- *                    PERROR(_(e_cannot_connect));
+- *                    sock_close(sd);
+- *                    channel_free(channel);
+- *                    return NULL;
+- *                }
+- *            }
+- */
++	    if (FD_ISSET(sd, &rfds) || FD_ISSET(sd, &wfds))
++	    {
++		ret = getsockopt(sd,
++			      SOL_SOCKET, SO_ERROR, &so_error, &so_error_len);
++		if (ret < 0 || (so_error != 0
++			&& so_error != EWOULDBLOCK
++			&& so_error != ECONNREFUSED
++# ifdef EINPROGRESS
++			&& so_error != EINPROGRESS
++# endif
++			))
++		{
++		    ch_errorn(channel,
++			    "channel_open: Connect failed with errno %d",
++			    so_error);
++		    PERROR(_(e_cannot_connect));
++		    sock_close(sd);
++		    channel_free(channel);
++		    return NULL;
++		}
++	    }
+ 
+ 	    if (FD_ISSET(sd, &wfds) && so_error == 0)
+ 		/* Did not detect an error, connection is established. */
+diff -ru source/src/memfile.c source-new/src/memfile.c
+--- source/src/memfile.c	2017-10-30 17:24:53.944974807 -0700
++++ source-new/src/memfile.c	2017-10-30 17:27:08.244992145 -0700
+@@ -596,88 +596,88 @@
+     if (hp == NULL || status == FAIL)
+ 	mfp->mf_dirty = FALSE;
+ 
+-/*    if ((flags & MFS_FLUSH) && *p_sws != NUL)*/
+-    /*{*/
+-/*#if defined(UNIX)*/
+-/*# ifdef HAVE_FSYNC*/
++    if ((flags & MFS_FLUSH) && *p_sws != NUL)
++    {
++#if defined(UNIX)
++# ifdef HAVE_FSYNC
+ 	/*
+ 	 * most Unixes have the very useful fsync() function, just what we need.
+ 	 */
+-	/*if (STRCMP(p_sws, "fsync") == 0)*/
+-	/*{*/
+-	    /*if (fsync(mfp->mf_fd))*/
+-		/*status = FAIL;*/
+-	/*}*/
+-	/*else*/
+-/*# endif*/
+-	    /*[> OpenNT is strictly POSIX (Benzinger) <]*/
+-	    /*[> Tandem/Himalaya NSK-OSS doesn't have sync() <]*/
+-	    /*[> No sync() on Stratus VOS <]*/
+-/*# if defined(__OPENNT) || defined(__TANDEM) || defined(__VOS__)*/
+-	    /*fflush(NULL);*/
+-/*# else*/
+-	    /*//sync();*/
+-/*# endif*/
+-/*#endif*/
+-/*#ifdef VMS*/
+-	/*if (STRCMP(p_sws, "fsync") == 0)*/
+-	/*{*/
+-	    /*if (fsync(mfp->mf_fd))*/
+-		/*status = FAIL;*/
+-	/*}*/
+-/*#endif*/
+-/*#ifdef SYNC_DUP_CLOSE*/
++	if (STRCMP(p_sws, "fsync") == 0)
++	{
++	    if (fsync(mfp->mf_fd))
++		status = FAIL;
++	}
++	else
++# endif
++	    /* OpenNT is strictly POSIX (Benzinger) */
++	    /* Tandem/Himalaya NSK-OSS doesn't have sync() */
++	    /* No sync() on Stratus VOS */
++# if defined(__OPENNT) || defined(__TANDEM) || defined(__VOS__)
++	    fflush(NULL);
++# else
++	    sync();
++# endif
++#endif
++#ifdef VMS
++	if (STRCMP(p_sws, "fsync") == 0)
++	{
++	    if (fsync(mfp->mf_fd))
++		status = FAIL;
++	}
++#endif
++#ifdef SYNC_DUP_CLOSE
+ 	/*
+ 	 * Win32 is a bit more work: Duplicate the file handle and close it.
+ 	 * This should flush the file to disk.
+ 	 */
+-	/*if ((fd = dup(mfp->mf_fd)) >= 0)*/
+-	    /*close(fd);*/
+-/*#endif*/
+-/*#ifdef AMIGA*/
+-/*# if defined(__AROS__) || defined(__amigaos4__)*/
+-	/*if (fsync(mfp->mf_fd) != 0)*/
+-	    /*status = FAIL;*/
+-/*# else*/
++	if ((fd = dup(mfp->mf_fd)) >= 0)
++	    close(fd);
++#endif
++#ifdef AMIGA
++# if defined(__AROS__) || defined(__amigaos4__)
++	if (fsync(mfp->mf_fd) != 0)
++	    status = FAIL;
++# else
+ 	/*
+ 	 * Flush() only exists for AmigaDos 2.0.
+ 	 * For 1.3 it should be done with close() + open(), but then the risk
+ 	 * is that the open() may fail and lose the file....
+ 	 */
+-/*#  ifdef FEAT_ARP*/
+-	/*if (dos2)*/
+-/*#  endif*/
+-/*#  ifdef SASC*/
+-	/*{*/
+-	    /*struct UFB *fp = chkufb(mfp->mf_fd);*/
++#  ifdef FEAT_ARP
++	if (dos2)
++#  endif
++#  ifdef SASC
++	{
++	    struct UFB *fp = chkufb(mfp->mf_fd);
+ 
+-	    /*if (fp != NULL)*/
+-		/*Flush(fp->ufbfh);*/
+-	/*}*/
+-/*#  else*/
+-/*#   if defined(_DCC) || defined(__GNUC__) || defined(__MORPHOS__)*/
+-	/*{*/
+-/*#    if defined(__GNUC__) && !defined(__MORPHOS__) && defined(__libnix__)*/
++	    if (fp != NULL)
++		Flush(fp->ufbfh);
++	}
++#  else
++#   if defined(_DCC) || defined(__GNUC__) || defined(__MORPHOS__)
++	{
++#    if defined(__GNUC__) && !defined(__MORPHOS__) && defined(__libnix__)
+ 	    /* Have function (in libnix at least),
+ 	     * but ain't got no prototype anywhere. */
+-	    /*extern unsigned long fdtofh(int filedescriptor);*/
+-/*#    endif*/
+-/*#    if !defined(__libnix__)*/
+-	    /*fflush(NULL);*/
+-/*#    else*/
+-	    /*BPTR fh = (BPTR)fdtofh(mfp->mf_fd);*/
++	    extern unsigned long fdtofh(int filedescriptor);
++#    endif
++#    if !defined(__libnix__)
++	    fflush(NULL);
++#    else
++	    BPTR fh = (BPTR)fdtofh(mfp->mf_fd);
+ 
+-	    /*if (fh != 0)*/
+-		/*Flush(fh);*/
+-/*#    endif*/
+-	/*}*/
+-/*#   else [> assume Manx <]*/
+-	    /*Flush(_devtab[mfp->mf_fd].fd);*/
+-/*#   endif*/
+-/*#  endif*/
+-/*# endif*/
+-/*#endif [> AMIGA <]*/
+-    /*}*/
++	    if (fh != 0)
++		Flush(fh);
++#    endif
++	}
++#   else /* assume Manx */
++	    Flush(_devtab[mfp->mf_fd].fd);
++#   endif
++#  endif
++# endif
++#endif /* AMIGA */
++    }
+ 
+     got_int |= got_int_save;
-- 
GitLab