diff --git a/build/pkgs/suitesparse/patches/04-cygwin.patch b/build/pkgs/suitesparse/patches/04-cygwin.patch
new file mode 100644
index 00000000000..803a395e86d
--- /dev/null
+++ b/build/pkgs/suitesparse/patches/04-cygwin.patch
@@ -0,0 +1,762 @@
+Patch to support installing correctly on Cygwin.
+
+This includes:
+
+* Installing DLLs under bin/ with a cyg- prefix instead of lib-
+* Creating and installing import libs (.dll.a files) in lib/
+
+For the time being versioning of import libs is not used, but it is
+for DLLs.
+
+This unfortunately requires a patch bomb since all of SuiteSparse's
+libraries have their own Makefiles even though they are near copies
+of each other with minor differences.
+
+See https://trac.sagemath.org/ticket/28829
+diff -ruN a/AMD/Lib/Makefile b/AMD/Lib/Makefile
+--- a/AMD/Lib/Makefile	2019-12-02 16:05:04.856283600 +0100
++++ b/AMD/Lib/Makefile	2019-12-02 18:12:09.753790100 +0100
+@@ -2,7 +2,7 @@
+ # AMD Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libamd
++LIBRARY = amd
+ VERSION = 2.4.6
+ SO_VERSION = 2
+ 
+@@ -81,19 +81,22 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install AMD
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/amd.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Doc/AMD_UserGuide.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/AMD_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/amd.h
+ 	chmod 644 $(INSTALL_DOC)/AMD_UserGuide.pdf
+ 	chmod 644 $(INSTALL_DOC)/AMD_README.txt
+diff -ruN a/BTF/Lib/Makefile b/BTF/Lib/Makefile
+--- a/BTF/Lib/Makefile	2019-12-02 16:04:51.542288600 +0100
++++ b/BTF/Lib/Makefile	2019-12-02 18:12:16.908303300 +0100
+@@ -2,7 +2,7 @@
+ # BTF Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libbtf
++LIBRARY = btf
+ VERSION = 1.2.6
+ SO_VERSION = 1
+ 
+@@ -66,18 +66,21 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install BTF
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/btf.h $(INSTALL_INCLUDE)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/BTF_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/btf.h
+ 	chmod 644 $(INSTALL_DOC)/BTF_README.txt
+ 
+diff -ruN a/CAMD/Lib/Makefile b/CAMD/Lib/Makefile
+--- a/CAMD/Lib/Makefile	2019-12-02 16:04:50.051276500 +0100
++++ b/CAMD/Lib/Makefile	2019-12-02 18:12:07.722810200 +0100
+@@ -2,7 +2,7 @@
+ # CAMD Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libcamd
++LIBRARY = camd
+ VERSION = 2.4.6
+ SO_VERSION = 2
+ 
+@@ -62,19 +62,22 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install CAMD
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/camd.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Doc/CAMD_UserGuide.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/CAMD_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/camd.h
+ 	chmod 644 $(INSTALL_DOC)/CAMD_UserGuide.pdf
+ 	chmod 644 $(INSTALL_DOC)/CAMD_README.txt
+diff -ruN a/CCOLAMD/Lib/Makefile b/CCOLAMD/Lib/Makefile
+--- a/CCOLAMD/Lib/Makefile	2019-12-02 16:04:49.279277800 +0100
++++ b/CCOLAMD/Lib/Makefile	2019-12-02 18:12:22.610632700 +0100
+@@ -2,7 +2,7 @@
+ # CCOLAMD Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libccolamd
++LIBRARY = ccolamd
+ VERSION = 2.9.6
+ SO_VERSION = 2
+ 
+@@ -49,18 +49,21 @@
+ 	- $(RM) -r $(PURGE)
+ 
+ # install CCOLAMD
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/ccolamd.h $(INSTALL_INCLUDE)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/CCOLAMD_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/ccolamd.h
+ 	chmod 644 $(INSTALL_DOC)/CCOLAMD_README.txt
+ 
+diff -ruN a/CHOLMOD/Lib/Makefile b/CHOLMOD/Lib/Makefile
+--- a/CHOLMOD/Lib/Makefile	2019-12-02 16:04:51.453293800 +0100
++++ b/CHOLMOD/Lib/Makefile	2019-12-02 18:12:16.627302900 +0100
+@@ -2,7 +2,7 @@
+ # CHOLMOD/Lib/Makefile: for compiling the CHOLMOD library
+ #===============================================================================
+ 
+-LIBRARY = libcholmod
++LIBRARY = cholmod
+ VERSION = 3.0.13
+ SO_VERSION = 3
+ 
+@@ -535,20 +535,23 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install CHOLMOD
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/cholmod*.h $(INSTALL_INCLUDE)
+ 	$(RM) $(INSTALL_INCLUDE)/cholmod_internal.h
+-	$(CP) ../Doc/CHOLMOD_UserGuide.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/CHOLMOD_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++	$(CP) ../Doc/CHOLMOD_UserGuide.pdf $(INSTALL_DOC)
+ 	chmod 644 $(INSTALL_INCLUDE)/cholmod*.h
+ 	chmod 644 $(INSTALL_DOC)/CHOLMOD_UserGuide.pdf
+ 	chmod 644 $(INSTALL_DOC)/CHOLMOD_README.txt
+diff -ruN a/COLAMD/Lib/Makefile b/COLAMD/Lib/Makefile
+--- a/COLAMD/Lib/Makefile	2019-12-02 16:04:58.545276600 +0100
++++ b/COLAMD/Lib/Makefile	2019-12-02 18:12:17.545302000 +0100
+@@ -2,7 +2,7 @@
+ # COLAMD Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libcolamd
++LIBRARY = colamd
+ VERSION = 2.9.6
+ SO_VERSION = 2
+ 
+@@ -49,18 +49,21 @@
+ 	- $(RM) -r $(PURGE)
+ 
+ # install COLAMD
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/colamd.h $(INSTALL_INCLUDE)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/COLAMD_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/colamd.h
+ 	chmod 644 $(INSTALL_DOC)/COLAMD_README.txt
+ 
+diff -ruN a/CSparse/Lib/Makefile b/CSparse/Lib/Makefile
+--- a/CSparse/Lib/Makefile	2019-12-02 16:04:58.059294300 +0100
++++ b/CSparse/Lib/Makefile	2019-12-02 18:12:09.158797700 +0100
+@@ -14,7 +14,7 @@
+ # install' in this Makefile only installs a static compiled library in
+ # CSparse/Lib.  It does not install it for system-wide usage.
+ 
+-LIBRARY = libcsparse
++LIBRARY = csparse
+ CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O
+ 
+ I = -I../Include
+diff -ruN a/CXSparse/Lib/Makefile b/CXSparse/Lib/Makefile
+--- a/CXSparse/Lib/Makefile	2019-12-02 16:04:49.462296500 +0100
++++ b/CXSparse/Lib/Makefile	2019-12-02 18:12:23.167631600 +0100
+@@ -2,7 +2,7 @@
+ # CXSparse Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libcxsparse
++LIBRARY = cxsparse
+ VERSION = 3.2.0
+ SO_VERSION = 3
+ 
+@@ -113,18 +113,21 @@
+ 	- $(RM) -r $(PURGE)
+ 
+ # install CXSparse
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(CS)
++$(INSTALL_SO): $(CS)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/cs.h $(INSTALL_INCLUDE)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/CXSPARSE_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/cs.h
+ 	chmod 644 $(INSTALL_DOC)/CXSPARSE_README.txt
+ 
+diff -ruN a/CXSparse_newfiles/Lib/Makefile b/CXSparse_newfiles/Lib/Makefile
+--- a/CXSparse_newfiles/Lib/Makefile	2019-12-02 16:05:04.505277300 +0100
++++ b/CXSparse_newfiles/Lib/Makefile	2019-12-02 18:12:08.029790200 +0100
+@@ -2,7 +2,7 @@
+ # CXSparse Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libcxsparse
++LIBRARY = cxsparse
+ VERSION = 3.2.0
+ SO_VERSION = 3
+ 
+@@ -113,18 +113,21 @@
+ 	- $(RM) -r $(PURGE)
+ 
+ # install CXSparse
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(CS)
++$(INSTALL_SO): $(CS)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/cs.h $(INSTALL_INCLUDE)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/CXSPARSE_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/cs.h
+ 	chmod 644 $(INSTALL_DOC)/CXSPARSE_README.txt
+ 
+diff -ruN a/GPUQREngine/Lib/Makefile b/GPUQREngine/Lib/Makefile
+--- a/GPUQREngine/Lib/Makefile	2019-12-02 16:04:50.027276700 +0100
++++ b/GPUQREngine/Lib/Makefile	2019-12-02 18:12:07.617802700 +0100
+@@ -2,7 +2,7 @@
+ # GPUQREngine/Lib/Makefile: for compiling the GPUQREngine library
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libGPUQREngine
++LIBRARY = GPUQREngine
+ VERSION = 1.0.5
+ SO_VERSION = 1
+ 
+@@ -129,17 +129,20 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install GPUQREngine.  Note that the include files are not installed.
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJS)
++$(INSTALL_SO): $(OBJS)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CXX) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
+-	$(CP) ../README.txt $(INSTALL_DOC)/GPUQRENGINE_README.txt
+ 	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
++	$(CP) ../README.txt $(INSTALL_DOC)/GPUQRENGINE_README.txt
+ 	chmod 644 $(INSTALL_DOC)/GPUQRENGINE_README.txt
+ 
+ # uninstall GPUQREngine
+diff -ruN a/KLU/Lib/Makefile b/KLU/Lib/Makefile
+--- a/KLU/Lib/Makefile	2019-12-02 16:04:51.621283700 +0100
++++ b/KLU/Lib/Makefile	2019-12-02 18:12:09.148789600 +0100
+@@ -2,7 +2,7 @@
+ # KLU Lib/Makefile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libklu
++LIBRARY = klu
+ VERSION = 1.3.8
+ SO_VERSION = 1
+ 
+@@ -263,19 +263,22 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install KLU
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/klu.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Doc/KLU_UserGuide.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/KLU_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/klu.h
+ 	chmod 644 $(INSTALL_DOC)/KLU_UserGuide.pdf
+ 	chmod 644 $(INSTALL_DOC)/KLU_README.txt
+diff -ruN a/LDL/Lib/Makefile b/LDL/Lib/Makefile
+--- a/LDL/Lib/Makefile	2019-12-02 16:04:51.803294200 +0100
++++ b/LDL/Lib/Makefile	2019-12-02 18:12:17.500303700 +0100
+@@ -2,7 +2,7 @@
+ # LDL Lib/Makefile 
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libldl
++LIBRARY = ldl
+ VERSION = 2.2.6
+ SO_VERSION = 2
+ 
+@@ -46,19 +46,22 @@
+ 	- $(RM) -r $(CLEAN)
+ 
+ # install LDL
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/ldl.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Doc/ldl_userguide.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/LDL_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/ldl.h
+ 	chmod 644 $(INSTALL_DOC)/ldl_userguide.pdf
+ 	chmod 644 $(INSTALL_DOC)/LDL_README.txt
+diff -ruN a/RBio/Lib/Makefile b/RBio/Lib/Makefile
+--- a/RBio/Lib/Makefile	2019-12-02 16:05:04.771295500 +0100
++++ b/RBio/Lib/Makefile	2019-12-02 18:12:09.016789800 +0100
+@@ -2,7 +2,7 @@
+ # RBio/Lib/Makefile: for compiling the RBio library
+ #===============================================================================
+ 
+-LIBRARY = librbio
++LIBRARY = rbio
+ VERSION = 2.2.6
+ SO_VERSION = 2
+ 
+@@ -60,18 +60,21 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install RBio
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/RBio.h $(INSTALL_INCLUDE)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/RBIO_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/RBio.h
+ 	chmod 644 $(INSTALL_DOC)/RBIO_README.txt
+ 
+diff -ruN a/SPQR/Lib/Makefile b/SPQR/Lib/Makefile
+--- a/SPQR/Lib/Makefile	2019-12-02 16:04:50.190277100 +0100
++++ b/SPQR/Lib/Makefile	2019-12-02 18:12:07.955789500 +0100
+@@ -2,7 +2,7 @@
+ # SuiteSparseQR/Lib/Makefile
+ #===============================================================================
+ 
+-LIBRARY = libspqr
++LIBRARY = spqr
+ VERSION = 2.0.9
+ SO_VERSION = 2
+ 
+@@ -242,22 +242,25 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install SPQR
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CXX) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/SuiteSparseQR.hpp $(INSTALL_INCLUDE)
+ 	$(CP) ../Include/SuiteSparseQR_C.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Include/SuiteSparseQR_definitions.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Include/spqr.hpp $(INSTALL_INCLUDE)
+ 	$(CP) ../Doc/spqr_user_guide.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/SPQR_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/SuiteSparseQR.hpp
+ 	chmod 644 $(INSTALL_INCLUDE)/SuiteSparseQR_C.h
+ 	chmod 644 $(INSTALL_INCLUDE)/SuiteSparseQR_definitions.h
+diff -ruN a/SuiteSparse_config/Makefile b/SuiteSparse_config/Makefile
+--- a/SuiteSparse_config/Makefile	2019-12-02 16:05:03.939278100 +0100
++++ b/SuiteSparse_config/Makefile	2019-12-02 18:12:16.275303600 +0100
+@@ -6,7 +6,7 @@
+ export SUITESPARSE
+ 
+ # version of SuiteSparse_config is also version of SuiteSparse meta-package
+-LIBRARY = libsuitesparseconfig
++LIBRARY = suitesparseconfig
+ VERSION = 5.5.0
+ SO_VERSION = 5
+ 
+@@ -44,19 +44,23 @@
+ 	- $(RM) -r $(CLEAN)
+ 
+ # install SuiteSparse_config
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++# Likely redundant with the above but not on Cygwin
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
+-	$(CP) SuiteSparse_config.h $(INSTALL_INCLUDE)
+-	$(CP) README.txt $(INSTALL_DOC)/SUITESPARSECONFIG_README.txt
+ 	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 755 $(INSTALL_LIB)/$(SO_PLAIN)
++endif
++	$(CP) SuiteSparse_config.h $(INSTALL_INCLUDE)
++	$(CP) README.txt $(INSTALL_DOC)/SUITESPARSECONFIG_README.txt
+ 	chmod 644 $(INSTALL_INCLUDE)/SuiteSparse_config.h
+ 	chmod 644 $(INSTALL_DOC)/SUITESPARSECONFIG_README.txt
+ 
+diff -ruN a/SuiteSparse_config/SuiteSparse_config.mk b/SuiteSparse_config/SuiteSparse_config.mk
+--- a/SuiteSparse_config/SuiteSparse_config.mk	2019-12-02 16:05:03.944279100 +0100
++++ b/SuiteSparse_config/SuiteSparse_config.mk	2019-12-02 18:12:16.277302200 +0100
+@@ -153,6 +153,11 @@
+     # It places its shared *.so libraries in SuiteSparse/lib.
+     # Linux also requires the -lrt library (see below)
+     LDLIBS ?= -lm
++    # Note: Because suitesparse doesn't really do install staging properly
++    # (it just outputs final build artifacts directly to their install paths)
++    # we must add that path to our linker flags in order to link properly
++    # against built libraries; it might be better to fix the whole build
++    # system though).
+     LDFLAGS += -L$(INSTALL_LIB)
+ 
+     # NOTE: Use of the Intel MKL BLAS is strongly recommended.  The OpenBLAS can
+@@ -340,16 +346,15 @@
+     #---------------------------------------------------------------------------
+ 
+     # To disable these auto configurations, use 'make UNAME=custom'
+-
+     ifndef UNAME
+-        ifeq ($(OS),Windows_NT)
+-            # Cygwin Make on Windows has an $(OS) variable, but not uname.
+-            # Note that this option is untested.
+-            UNAME = Windows
+-        else
+-            # Linux and Darwin (Mac OSX) have been tested.
+-            UNAME := $(shell uname)
+-        endif
++        # Linux and Darwin (Mac OSX) have been tested.
++        UNAME := $(shell uname)
++    endif
++
++    # On Cygwin we'll typically have UNAME=CYGWIN<something> but just normalize
++    # to "CYGWIN"
++    ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
++        UNAME := Cygwin
+     endif
+ 
+     #---------------------------------------------------------------------------
+@@ -446,21 +451,23 @@
+ 
+ SO_OPTS = $(LDFLAGS)
+ 
+-ifeq ($(UNAME),Windows)
+-    # Cygwin Make on Windows (untested)
+-    AR_TARGET = $(LIBRARY).lib
+-    SO_PLAIN  = $(LIBRARY).dll
+-    SO_MAIN   = $(LIBRARY).$(SO_VERSION).dll
+-    SO_TARGET = $(LIBRARY).$(VERSION).dll
+-    SO_INSTALL_NAME = echo
++ifeq ($(UNAME),Cygwin)
++    # Cygwin Make on Windows
++    AR_TARGET = lib$(LIBRARY).a
++    SO_TARGET = cyg$(LIBRARY)-$(SO_VERSION).dll
++    IMPLIB = lib$(LIBRARY).dll.a
++    SO_OPTS += -shared -Wl,--no-undefined -Wl,--out-implib -Wl,$(INSTALL_LIB)/$(IMPLIB)
++    INSTALL_DLL := $(DESTDIR)$(INSTALL)/bin
++    INSTALL_SO = $(INSTALL_DLL)/$(SO_TARGET)
+ else
+     # Mac or Linux/Unix
+-    AR_TARGET = $(LIBRARY).a
++    AR_TARGET = lib$(LIBRARY).a
++    INSTALL_SO = $(INSTALL_LIB)/$(SO_TARGET)
+     ifeq ($(UNAME),Darwin)
+         # Mac
+-        SO_PLAIN  = $(LIBRARY).dylib
+-        SO_MAIN   = $(LIBRARY).$(SO_VERSION).dylib
+-        SO_TARGET = $(LIBRARY).$(VERSION).dylib
++        SO_PLAIN  = lib$(LIBRARY).dylib
++        SO_MAIN   = lib$(LIBRARY).$(SO_VERSION).dylib
++        SO_TARGET = lib$(LIBRARY).$(VERSION).dylib
+         SO_OPTS  += -dynamiclib -compatibility_version $(SO_VERSION) \
+                     -current_version $(VERSION) \
+                     -shared -undefined dynamic_lookup
+@@ -469,9 +476,9 @@
+         SO_INSTALL_NAME = install_name_tool -id
+     else
+         # Linux and other variants of Unix
+-        SO_PLAIN  = $(LIBRARY).so
+-        SO_MAIN   = $(LIBRARY).so.$(SO_VERSION)
+-        SO_TARGET = $(LIBRARY).so.$(VERSION)
++        SO_PLAIN  = lib$(LIBRARY).so
++        SO_MAIN   = lib$(LIBRARY).so.$(SO_VERSION)
++        SO_TARGET = lib$(LIBRARY).so.$(VERSION)
+         SO_OPTS  += -shared -Wl,-soname -Wl,$(SO_MAIN) -Wl,--no-undefined
+         # Linux/Unix *.so files can be moved without modification:
+         SO_INSTALL_NAME = echo
+diff -ruN a/SuiteSparse_config/xerbla/Makefile b/SuiteSparse_config/xerbla/Makefile
+--- a/SuiteSparse_config/xerbla/Makefile	2019-12-02 16:05:03.949290500 +0100
++++ b/SuiteSparse_config/xerbla/Makefile	2019-12-02 18:12:16.284303200 +0100
+@@ -16,9 +16,9 @@
+ all: library
+ 
+ ifeq ($(USE_FORTRAN),0)
+-    LIBRARY = libcerbla
++    LIBRARY = cerbla
+ else
+-    LIBRARY = libxerbla
++    LIBRARY = xerbla
+ endif
+ 
+ include ../SuiteSparse_config.mk
+@@ -44,19 +44,22 @@
+ 	- $(RM) xerbla.o
+ 
+ # install libcerbla / libxerbla
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(DEPENDS)
++$(INSTALL_SO): $(DEPENDS)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(COMPILE)
+ 	$(CC) $(SO_OPTS) xerbla.o -o $@
+ 	- $(RM) xerbla.o
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
+-	$(CP) xerbla.h $(INSTALL_INCLUDE)
+ 	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
++	$(CP) xerbla.h $(INSTALL_INCLUDE)
+ 	chmod 644 $(INSTALL_INCLUDE)/xerbla.h
+ 
+ # uninstall libcerbla / libxerbla
+diff -ruN a/SuiteSparse_GPURuntime/Lib/Makefile b/SuiteSparse_GPURuntime/Lib/Makefile
+--- a/SuiteSparse_GPURuntime/Lib/Makefile	2019-12-02 16:04:57.931276800 +0100
++++ b/SuiteSparse_GPURuntime/Lib/Makefile	2019-12-02 18:12:08.912790400 +0100
+@@ -2,7 +2,7 @@
+ # SuiteSparse_GPURuntime/Lib/Makfile
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libSuiteSparse_GPURuntime
++LIBRARY = SuiteSparse_GPURuntime
+ VERSION = 1.0.5
+ SO_VERSION = 1
+ 
+@@ -70,17 +70,20 @@
+ #-------------------------------------------------------------------------------
+ 
+ # install SuiteSparse_GPURuntime (just the library, not the include files)
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJS)
++$(INSTALL_SO): $(OBJS)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CXX) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
+-	$(CP) ../README.txt $(INSTALL_DOC)/GPURUNTIME_README.txt
+ 	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
++	$(CP) ../README.txt $(INSTALL_DOC)/GPURUNTIME_README.txt
+ 	chmod 644 $(INSTALL_DOC)/GPURUNTIME_README.txt
+ 
+ # uninstall SuiteSparse_GPURuntime
+diff -ruN a/UMFPACK/Lib/Makefile b/UMFPACK/Lib/Makefile
+--- a/UMFPACK/Lib/Makefile	2019-12-02 16:05:03.957276500 +0100
++++ b/UMFPACK/Lib/Makefile	2019-12-02 18:12:17.206308800 +0100
+@@ -2,7 +2,7 @@
+ # UMFPACK Makefile for compiling on Unix systems
+ #-------------------------------------------------------------------------------
+ 
+-LIBRARY = libumfpack
++LIBRARY = umfpack
+ VERSION = 5.7.9
+ SO_VERSION = 5
+ 
+@@ -288,20 +288,23 @@
+ 
+ #-------------------------------------------------------------------------------
+ # install UMFPACK
+-install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET)
++install: $(AR_TARGET) $(INSTALL_SO)
+ 
+-$(INSTALL_LIB)/$(SO_TARGET): $(OBJ)
++$(INSTALL_SO): $(OBJ)
+ 	@mkdir -p $(INSTALL_LIB)
++	@mkdir -p $(dir $(INSTALL_SO))
+ 	@mkdir -p $(INSTALL_INCLUDE)
+ 	@mkdir -p $(INSTALL_DOC)
+ 	$(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS)
++ifneq ($(UNAME),Cygwin)
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) )
+ 	( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) )
++	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
++endif
+ 	$(CP) ../Include/umfpack*.h $(INSTALL_INCLUDE)
+ 	$(CP) ../Doc/UMFPACK_UserGuide.pdf $(INSTALL_DOC)
+ 	$(CP) ../Doc/UMFPACK_QuickStart.pdf $(INSTALL_DOC)
+ 	$(CP) ../README.txt $(INSTALL_DOC)/UMFPACK_README.txt
+-	chmod 755 $(INSTALL_LIB)/$(SO_TARGET)
+ 	chmod 644 $(INSTALL_INCLUDE)/umfpack*.h
+ 	chmod 644 $(INSTALL_DOC)/UMFPACK_UserGuide.pdf
+ 	chmod 644 $(INSTALL_DOC)/UMFPACK_QuickStart.pdf