diff mbox

[OpenWrt-Devel,RFC] add unison-2.48.3

Message ID 1442553210-32375-1-git-send-email-stefan@the2masters.de
State RFC
Headers show

Commit Message

Stefan Hellermann Sept. 18, 2015, 5:13 a.m. UTC
should probably be sent to the packages repo on github.

Signed-of-by: Stefan Hellermann <stefan@the2masters.de>
---
 package/network/utils/unison/Makefile              |  36 ++++
 .../utils/unison/patches/100-ocamlopt.patch        | 225 +++++++++++++++++++++
 2 files changed, 261 insertions(+)
 create mode 100644 package/network/utils/unison/Makefile
 create mode 100644 package/network/utils/unison/patches/100-ocamlopt.patch

Comments

Stefan Hellermann Sept. 18, 2015, 6:26 a.m. UTC | #1
two comments to my own patch:

2015-09-18 7:13 GMT+02:00 Stefan Hellermann <stefan@the2masters.de>:

> should probably be sent to the packages repo on github.
>
> Signed-of-by: Stefan Hellermann <stefan@the2masters.de>
> ---
>  package/network/utils/unison/Makefile              |  36 ++++
>  .../utils/unison/patches/100-ocamlopt.patch        | 225
> +++++++++++++++++++++
>  2 files changed, 261 insertions(+)
>  create mode 100644 package/network/utils/unison/Makefile
>  create mode 100644 package/network/utils/unison/patches/100-ocamlopt.patch
>
> diff --git a/package/network/utils/unison/Makefile
> b/package/network/utils/unison/Makefile
> new file mode 100644
> index 0000000..91d9516
> --- /dev/null
> +++ b/package/network/utils/unison/Makefile
> @@ -0,0 +1,36 @@
> +#
> +# Copyright (C) 2009-2011 OpenWrt.org
> +#
> +# This is free software, licensed under the GNU General Public License v2.
> +# See /LICENSE for more information.
> +#
> +
> +include $(TOPDIR)/rules.mk
> +
> +PKG_NAME:=unison
> +PKG_VERSION:=2.48.3
> +PKG_RELEASE:=1
> +
> +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
> +PKG_SOURCE_URL:=
> http://www.seas.upenn.edu/~bcpierce/unison//download/releases/$(PKG_NAME)-$(PKG_VERSION)/
> +
> +include $(INCLUDE_DIR)/package.mk
> +
> +define Package/unison
> +  SECTION:=utilities
> +  CATEGORY:=Utilities
> +  TITLE:=Unison file synchronizer
> +  URL:=http://www.cis.upenn.edu/~bcpierce/unison/
> +  DEPENDS:= libncurses
> +endef
> +
>

There is a # missing in front of next line


> +Stripping OCaml binaries is not possible
> +RSTRIP:=:
> +STRIP:=:
> +
> +define Package/unison/install
> +       $(INSTALL_DIR) $(1)/usr/bin
> +       $(INSTALL_BIN) $(PKG_BUILD_DIR)/unison $(1)/usr/bin
> +endef
> +
> +$(eval $(call BuildPackage,unison))
> diff --git a/package/network/utils/unison/patches/100-ocamlopt.patch
> b/package/network/utils/unison/patches/100-ocamlopt.patch
> new file mode 100644
> index 0000000..a8132e2
>

inotify_compat.h is missing in unison, this is known upstream.
https://www.marc.info/?l=unison-hackers&m=138390422022273&w=2
Another option is to remove fsmonitor from unison, as the binary
"unison-fsmonitor" is not currently installed onto the target.

--- /dev/null
> +++ b/package/network/utils/unison/patches/100-ocamlopt.patch
> @@ -0,0 +1,225 @@
> +--- /dev/null  2015-08-24 10:52:13.180000000 +0200
> ++++ unison-2.48.3/fsmonitor/linux/inotify_compat.h     2015-09-11
> 22:59:01.056000000 +0200
> +@@ -0,0 +1,167 @@
> ++/*
> ++ * This header is used if <sys/inotify.h> cannot be found.
> ++ *
> ++ * Inode based directory notification for Linux
> ++ *
> ++ * Copyright (C) 2005 John McCutchan
> ++ */
> ++
> ++#ifndef _LINUX_INOTIFY_H
> ++#define _LINUX_INOTIFY_H
> ++
> ++#include <stdint.h>
> ++#include <sys/syscall.h>
> ++#include <unistd.h>
> ++
> ++/*
> ++ * struct inotify_event - structure read from the inotify device for
> each event
> ++ *
> ++ * When you are watching a directory, you will receive the filename for
> events
> ++ * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ..., relative to the
> wd.
> ++ */
> ++struct inotify_event {
> ++      int             wd;             /* watch descriptor */
> ++      uint32_t                mask;           /* watch mask */
> ++      uint32_t                cookie;         /* cookie to synchronize
> two events */
> ++      uint32_t                len;            /* length (including
> nulls) of name */
> ++      char            name __flexarr; /* stub for possible name */
> ++};
> ++
> ++/* the following are legal, implemented events that user-space can watch
> for */
> ++#define IN_ACCESS             0x00000001      /* File was accessed */
> ++#define IN_MODIFY             0x00000002      /* File was modified */
> ++#define IN_ATTRIB             0x00000004      /* Metadata changed */
> ++#define IN_CLOSE_WRITE                0x00000008      /* Writtable file
> was closed */
> ++#define IN_CLOSE_NOWRITE      0x00000010      /* Unwrittable file closed
> */
> ++#define IN_OPEN                       0x00000020      /* File was opened
> */
> ++#define IN_MOVED_FROM         0x00000040      /* File was moved from X */
> ++#define IN_MOVED_TO           0x00000080      /* File was moved to Y */
> ++#define IN_CREATE             0x00000100      /* Subfile was created */
> ++#define IN_DELETE             0x00000200      /* Subfile was deleted */
> ++#define IN_DELETE_SELF                0x00000400      /* Self was
> deleted */
> ++#define IN_MOVE_SELF          0x00000800      /* Self was moved */
> ++
> ++/* the following are legal events.  they are sent as needed to any watch
> */
> ++#define IN_UNMOUNT            0x00002000      /* Backing fs was
> unmounted */
> ++#define IN_Q_OVERFLOW         0x00004000      /* Event queued overflowed
> */
> ++#define IN_IGNORED            0x00008000      /* File was ignored */
> ++
> ++/* helper events */
> ++#define IN_CLOSE              (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /*
> close */
> ++#define IN_MOVE                       (IN_MOVED_FROM | IN_MOVED_TO) /*
> moves */
> ++
> ++/* special flags */
> ++#define IN_ONLYDIR            0x01000000      /* only watch the path if
> it is a directory */
> ++#define IN_DONT_FOLLOW                0x02000000      /* don't follow a
> sym link */
> ++#define IN_MASK_ADD           0x20000000      /* add to the mask of an
> already existing watch */
> ++#define IN_ISDIR              0x40000000      /* event occurred against
> dir */
> ++#define IN_ONESHOT            0x80000000      /* only send event once */
> ++
> ++/*
> ++ * All of the events - we build the list by hand so that we can add
> flags in
> ++ * the future and not break backward compatibility.  Apps will get only
> the
> ++ * events that they originally wanted.  Be sure to add new events here!
> ++ */
> ++#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB |
> IN_CLOSE_WRITE | \
> ++                       IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
> ++                       IN_MOVED_TO | IN_DELETE | IN_CREATE |
> IN_DELETE_SELF | \
> ++                       IN_MOVE_SELF)
> ++
> ++#if defined (__alpha__)
> ++# define __NR_inotify_init 444
> ++# define __NR_inotify_add_watch 445
> ++# define __NR_inotify_rm_watch 446
> ++
> ++#elif defined (__arm__)
> ++# define __NR_inotify_init (__NR_SYSCALL_BASE+316)
> ++# define __NR_inotify_add_watch (__NR_SYSCALL_BASE+317)
> ++# define __NR_inotify_rm_watch (__NR_SYSCALL_BASE+318)
> ++
> ++#elif defined (__frv__)
> ++# define __NR_inotify_init 291
> ++# define __NR_inotify_add_watch 292
> ++# define __NR_inotify_rm_watch 293
> ++
> ++#elif defined(__i386__)
> ++# define __NR_inotify_init 291
> ++# define __NR_inotify_add_watch 292
> ++# define __NR_inotify_rm_watch 293
> ++
> ++#elif defined (__ia64__)
> ++# define __NR_inotify_init 1277
> ++# define __NR_inotify_add_watch 1278
> ++# define __NR_inotify_rm_watch 1279
> ++
> ++#elif defined (__mips__)
> ++# if _MIPS_SIM == _MIPS_SIM_ABI32
> ++#  define __NR_inotify_init (__NR_Linux + 284)
> ++#  define __NR_inotify_add_watch (__NR_Linux + 285)
> ++#  define __NR_inotify_rm_watch (__NR_Linux + 286)
> ++# endif
> ++# if _MIPS_SIM == _MIPS_SIM_ABI64
> ++#  define __NR_inotify_init (__NR_Linux + 243)
> ++#  define __NR_inotify_add_watch (__NR_Linux + 243)
> ++#  define __NR_inotify_rm_watch (__NR_Linux + 243)
> ++# endif
> ++# if _MIPS_SIM == _MIPS_SIM_NABI32
> ++#  define __NR_inotify_init (__NR_Linux + 247)
> ++#  define __NR_inotify_add_watch (__NR_Linux + 248)
> ++#  define __NR_inotify_rm_watch (__NR_Linux + 249)
> ++# endif
> ++
> ++#elif defined(__parisc__)
> ++# define __NR_inotify_init (__NR_Linux + 269)
> ++# define __NR_inotify_add_watch (__NR_Linux + 270)
> ++# define __NR_inotify_rm_watch (__NR_Linux + 271)
> ++
> ++#elif defined(__powerpc__) || defined(__powerpc64__)
> ++# define __NR_inotify_init 275
> ++# define __NR_inotify_add_watch 276
> ++# define __NR_inotify_rm_watch 277
> ++
> ++#elif defined (__s390__)
> ++# define __NR_inotify_init 284
> ++# define __NR_inotify_add_watch 285
> ++# define __NR_inotify_rm_watch 286
> ++
> ++#elif defined (__sh__)
> ++# define __NR_inotify_init 290
> ++# define __NR_inotify_add_watch 291
> ++# define __NR_inotify_rm_watch 292
> ++
> ++#elif defined (__sh64__)
> ++# define __NR_inotify_init 318
> ++# define __NR_inotify_add_watch 319
> ++# define __NR_inotify_rm_watch 320
> ++
> ++#elif defined (__sparc__) || defined (__sparc64__)
> ++# define __NR_inotify_init 151
> ++# define __NR_inotify_add_watch 152
> ++# define __NR_inotify_rm_watch 156
> ++
> ++#elif defined(__x86_64__)
> ++# define __NR_inotify_init 253
> ++# define __NR_inotify_add_watch 254
> ++# define __NR_inotify_rm_watch 255
> ++
> ++#else
> ++# error "Unsupported architecture!"
> ++#endif
> ++
> ++static inline int inotify_init (void)
> ++{
> ++      return syscall (__NR_inotify_init);
> ++}
> ++
> ++static inline int inotify_add_watch (int fd, const char *name, uint32_t
> mask)
> ++{
> ++      return syscall (__NR_inotify_add_watch, fd, name, mask);
> ++}
> ++
> ++static inline int inotify_rm_watch (int fd, uint32_t wd)
> ++{
> ++      return syscall (__NR_inotify_rm_watch, fd, wd);
> ++}
> ++
> ++
> ++#endif        /* _LINUX_INOTIFY_H */
> +--- unison-2.48.3_alt/fsmonitor/linux/Makefile 2012-09-18
> 18:10:59.000000000 +0200
> ++++ unison-2.48.3/fsmonitor/linux/Makefile     2015-09-11
> 23:07:33.492000000 +0200
> +@@ -22,8 +22,8 @@
> +
> + $(FSMONITOR)$(EXEC_EXT): $(FSMCAMLOBJS) $(FSMCOBJS)
> +       @echo Linking $@
> +-      $(CAMLC) -verbose $(CAMLFLAGS) -o $@ $(CFLAGS) $(FSMCAMLLIBS) $^
> $(CLIBS)
> ++      $(CAMLC) -verbose $(CAMLFLAGS) -o $@ $(FSMCAMLLIBS) $^ $(CLIBS)
> +
> + clean::
> +       rm -f $(DIR)/*.cm[iox] $(DIR)/*.o $(DIR)/*~
> +-      rm -f $(FSMONITOR)$(EXEC_EXT)
> +\ No newline at end of file
> ++      rm -f $(FSMONITOR)$(EXEC_EXT)
> +--- unison-2.48.3_alt/Makefile.OCaml   2014-09-28 18:48:05.000000000 +0200
> ++++ unison-2.48.3/Makefile.OCaml       2015-09-12 09:33:22.220000000 +0200
> +@@ -48,6 +48,7 @@
> +   OSARCH=win32gnuc
> +   EXEC_PREFIX=i686-w64-mingw32-
> + endif
> ++EXEC_PREFIX=$(CROSS)
> +
> + # The OCaml lib dir is used by all versions
> + # It is extracted from 'ocamlc -v' and Windows '\' separators are turned
> +@@ -58,7 +59,7 @@
> + # Better(?) version, June 2005:
> + # OCAMLLIBDIR=$(shell ocamlc -v | tail -1 | sed -e 's/.* //g' | sed -e
> 's/\\/\//g' | tr -d '\r')
> + # Another try, Feb 2011, suggested by Ron Isaacson
> +-OCAMLLIBDIR=$(shell ocamlc -v | tail -1 | sed -e 's/.* //g' | tr '\\'
> '/' | tr -d '\r')
> ++OCAMLLIBDIR=$(shell $(EXEC_PREFIX)ocamlc -v | tail -1 | sed -e 's/.*
> //g' | tr '\\' '/' | tr -d '\r')
> +
> + ## BCP (6/05) an alternative, but not quite working, version
> + ## suggested by Nick Montfort:
> +--- unison-2.48.3_alt/Makefile 2013-07-18 11:37:09.000000000 +0200
> ++++ unison-2.48.3/Makefile     2015-09-12 10:16:56.728000000 +0200
> +@@ -11,7 +11,7 @@
> + # If you set NATIVE=false, then make sure that the THREADS option below
> is
> + # also set to false unless your OCaml installation has true
> posix-compliant
> + # threads (i.e., -with-pthreads was given as an option to the config
> script).
> +-NATIVE=true
> ++NATIVE=false
> +
> + # Use THREADS=false if your OCaml installation is not configured with the
> + # -with-pthreads option.  (Unison will crash when compiled with
> THREADS=true
> +@@ -23,7 +23,9 @@
> + # an appropriate value automatically, depending on whether the lablgtk
> + # library is available.
> + #
> +-# UISTYLE=text
> ++UISTYLE=text
> ++
> ++CFLAGS=
> +
> + ########################################################################
> + ########################################################################
> --
> 2.1.4
>
>
diff mbox

Patch

diff --git a/package/network/utils/unison/Makefile b/package/network/utils/unison/Makefile
new file mode 100644
index 0000000..91d9516
--- /dev/null
+++ b/package/network/utils/unison/Makefile
@@ -0,0 +1,36 @@ 
+#
+# Copyright (C) 2009-2011 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=unison
+PKG_VERSION:=2.48.3
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://www.seas.upenn.edu/~bcpierce/unison//download/releases/$(PKG_NAME)-$(PKG_VERSION)/
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/unison
+  SECTION:=utilities
+  CATEGORY:=Utilities
+  TITLE:=Unison file synchronizer
+  URL:=http://www.cis.upenn.edu/~bcpierce/unison/
+  DEPENDS:= libncurses
+endef
+
+Stripping OCaml binaries is not possible
+RSTRIP:=:
+STRIP:=:
+
+define Package/unison/install
+	$(INSTALL_DIR) $(1)/usr/bin
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/unison $(1)/usr/bin
+endef
+
+$(eval $(call BuildPackage,unison))
diff --git a/package/network/utils/unison/patches/100-ocamlopt.patch b/package/network/utils/unison/patches/100-ocamlopt.patch
new file mode 100644
index 0000000..a8132e2
--- /dev/null
+++ b/package/network/utils/unison/patches/100-ocamlopt.patch
@@ -0,0 +1,225 @@ 
+--- /dev/null	2015-08-24 10:52:13.180000000 +0200
++++ unison-2.48.3/fsmonitor/linux/inotify_compat.h	2015-09-11 22:59:01.056000000 +0200
+@@ -0,0 +1,167 @@
++/*
++ * This header is used if <sys/inotify.h> cannot be found.
++ *
++ * Inode based directory notification for Linux
++ *
++ * Copyright (C) 2005 John McCutchan
++ */
++
++#ifndef _LINUX_INOTIFY_H
++#define _LINUX_INOTIFY_H
++
++#include <stdint.h>
++#include <sys/syscall.h>
++#include <unistd.h>
++
++/*
++ * struct inotify_event - structure read from the inotify device for each event
++ *
++ * When you are watching a directory, you will receive the filename for events
++ * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ..., relative to the wd.
++ */
++struct inotify_event {
++	int		wd;		/* watch descriptor */
++	uint32_t		mask;		/* watch mask */
++	uint32_t		cookie;		/* cookie to synchronize two events */
++	uint32_t		len;		/* length (including nulls) of name */
++	char		name __flexarr;	/* stub for possible name */
++};
++
++/* the following are legal, implemented events that user-space can watch for */
++#define IN_ACCESS		0x00000001	/* File was accessed */
++#define IN_MODIFY		0x00000002	/* File was modified */
++#define IN_ATTRIB		0x00000004	/* Metadata changed */
++#define IN_CLOSE_WRITE		0x00000008	/* Writtable file was closed */
++#define IN_CLOSE_NOWRITE	0x00000010	/* Unwrittable file closed */
++#define IN_OPEN			0x00000020	/* File was opened */
++#define IN_MOVED_FROM		0x00000040	/* File was moved from X */
++#define IN_MOVED_TO		0x00000080	/* File was moved to Y */
++#define IN_CREATE		0x00000100	/* Subfile was created */
++#define IN_DELETE		0x00000200	/* Subfile was deleted */
++#define IN_DELETE_SELF		0x00000400	/* Self was deleted */
++#define IN_MOVE_SELF		0x00000800	/* Self was moved */
++
++/* the following are legal events.  they are sent as needed to any watch */
++#define IN_UNMOUNT		0x00002000	/* Backing fs was unmounted */
++#define IN_Q_OVERFLOW		0x00004000	/* Event queued overflowed */
++#define IN_IGNORED		0x00008000	/* File was ignored */
++
++/* helper events */
++#define IN_CLOSE		(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
++#define IN_MOVE			(IN_MOVED_FROM | IN_MOVED_TO) /* moves */
++
++/* special flags */
++#define IN_ONLYDIR		0x01000000	/* only watch the path if it is a directory */
++#define IN_DONT_FOLLOW		0x02000000	/* don't follow a sym link */
++#define IN_MASK_ADD		0x20000000	/* add to the mask of an already existing watch */
++#define IN_ISDIR		0x40000000	/* event occurred against dir */
++#define IN_ONESHOT		0x80000000	/* only send event once */
++
++/*
++ * All of the events - we build the list by hand so that we can add flags in
++ * the future and not break backward compatibility.  Apps will get only the
++ * events that they originally wanted.  Be sure to add new events here!
++ */
++#define IN_ALL_EVENTS	(IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
++			 IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
++			 IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \
++			 IN_MOVE_SELF)
++
++#if defined (__alpha__)
++# define __NR_inotify_init 444
++# define __NR_inotify_add_watch 445
++# define __NR_inotify_rm_watch 446
++
++#elif defined (__arm__)
++# define __NR_inotify_init (__NR_SYSCALL_BASE+316)
++# define __NR_inotify_add_watch (__NR_SYSCALL_BASE+317)
++# define __NR_inotify_rm_watch (__NR_SYSCALL_BASE+318)
++
++#elif defined (__frv__)
++# define __NR_inotify_init 291
++# define __NR_inotify_add_watch 292
++# define __NR_inotify_rm_watch 293
++
++#elif defined(__i386__)
++# define __NR_inotify_init 291
++# define __NR_inotify_add_watch 292
++# define __NR_inotify_rm_watch 293
++
++#elif defined (__ia64__)
++# define __NR_inotify_init 1277
++# define __NR_inotify_add_watch 1278
++# define __NR_inotify_rm_watch 1279
++
++#elif defined (__mips__)
++# if _MIPS_SIM == _MIPS_SIM_ABI32
++#  define __NR_inotify_init (__NR_Linux + 284)
++#  define __NR_inotify_add_watch (__NR_Linux + 285)
++#  define __NR_inotify_rm_watch (__NR_Linux + 286)
++# endif
++# if _MIPS_SIM == _MIPS_SIM_ABI64
++#  define __NR_inotify_init (__NR_Linux + 243)
++#  define __NR_inotify_add_watch (__NR_Linux + 243)
++#  define __NR_inotify_rm_watch (__NR_Linux + 243)
++# endif
++# if _MIPS_SIM == _MIPS_SIM_NABI32
++#  define __NR_inotify_init (__NR_Linux + 247)
++#  define __NR_inotify_add_watch (__NR_Linux + 248)
++#  define __NR_inotify_rm_watch (__NR_Linux + 249)
++# endif
++
++#elif defined(__parisc__)
++# define __NR_inotify_init (__NR_Linux + 269)
++# define __NR_inotify_add_watch (__NR_Linux + 270)
++# define __NR_inotify_rm_watch (__NR_Linux + 271)
++
++#elif defined(__powerpc__) || defined(__powerpc64__)
++# define __NR_inotify_init 275
++# define __NR_inotify_add_watch 276
++# define __NR_inotify_rm_watch 277
++
++#elif defined (__s390__)
++# define __NR_inotify_init 284
++# define __NR_inotify_add_watch 285
++# define __NR_inotify_rm_watch 286
++
++#elif defined (__sh__)
++# define __NR_inotify_init 290
++# define __NR_inotify_add_watch 291
++# define __NR_inotify_rm_watch 292
++
++#elif defined (__sh64__)
++# define __NR_inotify_init 318
++# define __NR_inotify_add_watch 319
++# define __NR_inotify_rm_watch 320
++
++#elif defined (__sparc__) || defined (__sparc64__)
++# define __NR_inotify_init 151
++# define __NR_inotify_add_watch 152
++# define __NR_inotify_rm_watch 156
++
++#elif defined(__x86_64__)
++# define __NR_inotify_init 253
++# define __NR_inotify_add_watch 254
++# define __NR_inotify_rm_watch 255
++
++#else
++# error "Unsupported architecture!"
++#endif
++
++static inline int inotify_init (void)
++{
++	return syscall (__NR_inotify_init);
++}
++
++static inline int inotify_add_watch (int fd, const char *name, uint32_t mask)
++{
++	return syscall (__NR_inotify_add_watch, fd, name, mask);
++}
++
++static inline int inotify_rm_watch (int fd, uint32_t wd)
++{
++	return syscall (__NR_inotify_rm_watch, fd, wd);
++}
++
++
++#endif	/* _LINUX_INOTIFY_H */
+--- unison-2.48.3_alt/fsmonitor/linux/Makefile	2012-09-18 18:10:59.000000000 +0200
++++ unison-2.48.3/fsmonitor/linux/Makefile	2015-09-11 23:07:33.492000000 +0200
+@@ -22,8 +22,8 @@
+ 
+ $(FSMONITOR)$(EXEC_EXT): $(FSMCAMLOBJS) $(FSMCOBJS)
+ 	@echo Linking $@
+-	$(CAMLC) -verbose $(CAMLFLAGS) -o $@ $(CFLAGS) $(FSMCAMLLIBS) $^ $(CLIBS)
++	$(CAMLC) -verbose $(CAMLFLAGS) -o $@ $(FSMCAMLLIBS) $^ $(CLIBS)
+ 
+ clean::
+ 	rm -f $(DIR)/*.cm[iox] $(DIR)/*.o $(DIR)/*~
+-	rm -f $(FSMONITOR)$(EXEC_EXT)
+\ No newline at end of file
++	rm -f $(FSMONITOR)$(EXEC_EXT)
+--- unison-2.48.3_alt/Makefile.OCaml	2014-09-28 18:48:05.000000000 +0200
++++ unison-2.48.3/Makefile.OCaml	2015-09-12 09:33:22.220000000 +0200
+@@ -48,6 +48,7 @@
+   OSARCH=win32gnuc
+   EXEC_PREFIX=i686-w64-mingw32-
+ endif
++EXEC_PREFIX=$(CROSS)
+ 
+ # The OCaml lib dir is used by all versions
+ # It is extracted from 'ocamlc -v' and Windows '\' separators are turned
+@@ -58,7 +59,7 @@
+ # Better(?) version, June 2005:
+ # OCAMLLIBDIR=$(shell ocamlc -v | tail -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | tr -d '\r')
+ # Another try, Feb 2011, suggested by Ron Isaacson
+-OCAMLLIBDIR=$(shell ocamlc -v | tail -1 | sed -e 's/.* //g' | tr '\\' '/' | tr -d '\r')
++OCAMLLIBDIR=$(shell $(EXEC_PREFIX)ocamlc -v | tail -1 | sed -e 's/.* //g' | tr '\\' '/' | tr -d '\r')
+ 
+ ## BCP (6/05) an alternative, but not quite working, version
+ ## suggested by Nick Montfort:
+--- unison-2.48.3_alt/Makefile	2013-07-18 11:37:09.000000000 +0200
++++ unison-2.48.3/Makefile	2015-09-12 10:16:56.728000000 +0200
+@@ -11,7 +11,7 @@
+ # If you set NATIVE=false, then make sure that the THREADS option below is
+ # also set to false unless your OCaml installation has true posix-compliant
+ # threads (i.e., -with-pthreads was given as an option to the config script).
+-NATIVE=true
++NATIVE=false
+ 
+ # Use THREADS=false if your OCaml installation is not configured with the
+ # -with-pthreads option.  (Unison will crash when compiled with THREADS=true
+@@ -23,7 +23,9 @@
+ # an appropriate value automatically, depending on whether the lablgtk
+ # library is available.
+ #
+-# UISTYLE=text
++UISTYLE=text
++
++CFLAGS=
+ 
+ ########################################################################
+ ########################################################################