From 721668e915f3e811007ef6c6142b8ee1bc54d96d Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sun, 12 Mar 2017 18:22:25 +0100 Subject: [PATCH 01/36] pkg-config hack: don't you use ln in windows PLEASE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use pebuilt libglib2.0-devel rather than rebuilding --with-internal-glib Otherwise the compilation fails on modern cygwin with ‘g_win32_getlocale’ [-Werror=implicit-function-declaration] Add required libiconv-devel package for the building machine Also add perl required for building openssl Also add cmake required for building libgit2 Install zlib for cross compile on mingw32 target arch --- .appveyor.yml | 2 +- build.win32x86/third-party/Makefile.pkgconfig | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index cfbed2099..6ce15c0c4 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -58,7 +58,7 @@ cache: install: - ps: 'Start-FileDownload "http://cygwin.com/setup-x86.exe" -FileName "setup-x86.exe"' - ps: 'Start-FileDownload "http://cygwin.com/setup-x86_64.exe" -FileName "setup-x86_64.exe"' - - '%CYG_SETUP% -dgnqNO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_ROOT%\var\cache\setup" -P mingw64-%MINGW_ARCH%-gcc-core,mingw64-%MINGW_ARCH%-gcc-g++,mingw64-%MINGW_ARCH%-headers,mingw64-%MINGW_ARCH%-runtime,zip,mingw64-%MINGW_ARCH%-clang' + - '%CYG_SETUP% -dgnqNO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_ROOT%\var\cache\setup" -P mingw64-%MINGW_ARCH%-gcc-core,mingw64-%MINGW_ARCH%-gcc-g++,mingw64-%MINGW_ARCH%-headers,mingw64-%MINGW_ARCH%-runtime,zip,mingw64-%MINGW_ARCH%-clang,libiconv-devel,libglig2.0-devel,perl,mingw64-%MINGW_ARCH%-zlib,cmake' build: false diff --git a/build.win32x86/third-party/Makefile.pkgconfig b/build.win32x86/third-party/Makefile.pkgconfig index d096c33a0..0a32e5cfa 100644 --- a/build.win32x86/third-party/Makefile.pkgconfig +++ b/build.win32x86/third-party/Makefile.pkgconfig @@ -24,8 +24,8 @@ $(PKGCONFIGARCHIVE): $(PKGCONFIGBIN): $(PKGCONFIGARCHIVE) tar x -f $(PKGCONFIGARCHIVE) -C $(THIRDPARTYDIR) cd $(PKGCONFIGDIR) \ - && ./configure --prefix='$(THIRDPARTYOUTDIR)' --with-internal-glib \ - && make \ - && make install + && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ + && make LN=cp \ + && make LN=cp install pkgconfig: $(PKGCONFIGBIN) \ No newline at end of file From a9096c1b578e8111945460834e96d90c1d3d6378 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Fri, 17 Mar 2017 01:56:03 +0100 Subject: [PATCH 02/36] Add mingw32 target iconv required for compiling SDL2 --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 6ce15c0c4..6bb19ae6c 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -58,7 +58,7 @@ cache: install: - ps: 'Start-FileDownload "http://cygwin.com/setup-x86.exe" -FileName "setup-x86.exe"' - ps: 'Start-FileDownload "http://cygwin.com/setup-x86_64.exe" -FileName "setup-x86_64.exe"' - - '%CYG_SETUP% -dgnqNO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_ROOT%\var\cache\setup" -P mingw64-%MINGW_ARCH%-gcc-core,mingw64-%MINGW_ARCH%-gcc-g++,mingw64-%MINGW_ARCH%-headers,mingw64-%MINGW_ARCH%-runtime,zip,mingw64-%MINGW_ARCH%-clang,libiconv-devel,libglig2.0-devel,perl,mingw64-%MINGW_ARCH%-zlib,cmake' + - '%CYG_SETUP% -dgnqNO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_ROOT%\var\cache\setup" -P mingw64-%MINGW_ARCH%-gcc-core,mingw64-%MINGW_ARCH%-gcc-g++,mingw64-%MINGW_ARCH%-headers,mingw64-%MINGW_ARCH%-runtime,zip,mingw64-%MINGW_ARCH%-clang,libiconv-devel,libglig2.0-devel,perl,mingw64-%MINGW_ARCH%-zlib,cmake,mingw64-%MINGW_ARCH%-win-iconv' build: false From a25e48d0f41c83a00b2599b275430b534799557c Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sun, 12 Mar 2017 18:31:39 +0100 Subject: [PATCH 03/36] Nuke the deadly openssl symlink ** Hack Hack Hack ** This is a horrible hack. This is fragile because the mklink.pl file does not exist in 1.1.x version But frankly, asking for a windows build to rely on symlink???? WTF??? I tried several unsuccessful workarounds Configure no-symlinks It does not work because then include/*.h are not built I tried CYGWIN="winsymlinks" but it did not work (I don't even know if perl did take it into account) With this, openssl almost build. Almost, because the generated makefile don't use the right cross-compilation windres... /bin/sh: gcc: command not found windres: preprocessing failed. i686-w64-mingw32-gcc: error: rc.o: No such file or directory --- build.win32x86/third-party/Makefile.openssl | 1 + 1 file changed, 1 insertion(+) diff --git a/build.win32x86/third-party/Makefile.openssl b/build.win32x86/third-party/Makefile.openssl index 8ffe73707..9b8ad5400 100644 --- a/build.win32x86/third-party/Makefile.openssl +++ b/build.win32x86/third-party/Makefile.openssl @@ -21,6 +21,7 @@ $(OPENSSLARCHIVE): $(THIRDPARTYLIBDIR)/$(OPENSSLLIBNAME): $(OPENSSLARCHIVE) tar x -f $(OPENSSLARCHIVE) -C $(THIRDPARTYDIR) + sed -i 's/symlink/copy/g' $(OPENSSLDIR)/util/mklink.pl cd $(OPENSSLDIR) \ && ./Configure mingw --prefix='$(THIRDPARTYOUTDIR)' shared $(THIRDPARTY_CFLAGS) \ && make \ From af7874f31e3078125611267a7c53d734df3604cc Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Thu, 16 Mar 2017 01:29:57 +0100 Subject: [PATCH 04/36] openssl: be sure that correct environment is passed to configure Without this hack, the resource compiler failed to pick the cross-compile flavour. --- build.win32x86/third-party/Makefile.openssl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.win32x86/third-party/Makefile.openssl b/build.win32x86/third-party/Makefile.openssl index 9b8ad5400..4dbbed06f 100644 --- a/build.win32x86/third-party/Makefile.openssl +++ b/build.win32x86/third-party/Makefile.openssl @@ -23,7 +23,7 @@ $(THIRDPARTYLIBDIR)/$(OPENSSLLIBNAME): $(OPENSSLARCHIVE) tar x -f $(OPENSSLARCHIVE) -C $(THIRDPARTYDIR) sed -i 's/symlink/copy/g' $(OPENSSLDIR)/util/mklink.pl cd $(OPENSSLDIR) \ - && ./Configure mingw --prefix='$(THIRDPARTYOUTDIR)' shared $(THIRDPARTY_CFLAGS) \ + && CC='$(CC)' LD='$(LD)' AR='$(AR)' NM='$(NM)' RC='$(RC)' DLLTOOL='$(DLLTOOL)' DLLWRAP='$(DLLWRAP)' ./Configure mingw --prefix='$(THIRDPARTYOUTDIR)' shared $(THIRDPARTY_CFLAGS) \ && make \ && make install From 3e79be392cc25f156d16254db984d1f41c74edff Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Mon, 13 Mar 2017 21:11:30 +0100 Subject: [PATCH 05/36] Force cross compilation of libssh2 for mingw target --- build.win32x86/third-party/Makefile.libssh2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.win32x86/third-party/Makefile.libssh2 b/build.win32x86/third-party/Makefile.libssh2 index e2ec5352b..2511426f2 100644 --- a/build.win32x86/third-party/Makefile.libssh2 +++ b/build.win32x86/third-party/Makefile.libssh2 @@ -22,6 +22,8 @@ $(THIRDPARTYLIBDIR)/$(LIBSSH2LIBNAME): $(LIBSSH2ARCHIVE) tar x -f $(LIBSSH2ARCHIVE) -C $(THIRDPARTYDIR) cd $(LIBSSH2DIR) \ && ./configure \ + --build=x86_64-w64-cygwin \ + --host=i686-w64-mingw32 \ --prefix='$(THIRDPARTYOUTDIR)' \ CFLAGS='$(THIRDPARTY_CFLAGS)' \ LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ From f84b82d342d7e1140c3ad88d6635e84163f2d5e9 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Mon, 13 Mar 2017 22:31:59 +0100 Subject: [PATCH 06/36] Craft a specific CMAKE_TOOLCHAIN for cross compiling libgit2 for mingw32 from cygwin --- build.win32x86/third-party/Makefile.libgit2 | 3 ++- .../Toolchain-cross-mingw32-cygwin.cmake | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake diff --git a/build.win32x86/third-party/Makefile.libgit2 b/build.win32x86/third-party/Makefile.libgit2 index af4a096c4..d763f9755 100644 --- a/build.win32x86/third-party/Makefile.libgit2 +++ b/build.win32x86/third-party/Makefile.libgit2 @@ -20,15 +20,16 @@ $(LIBGIT2ARCHIVE): $(THIRDPARTYLIBDIR)/$(LIBGIT2LIBNAME): $(LIBGIT2ARCHIVE) tar x -f $(LIBGIT2ARCHIVE) -C $(THIRDPARTYDIR) + cp ../third-party/Toolchain-cross-mingw32-cygwin.cmake $(LIBGIT2DIR) cd $(LIBGIT2DIR) \ && cmake \ + -DCMAKE_TOOLCHAIN_FILE=./Toolchain-cross-mingw32-cygwin.cmake \ -DCMAKE_INSTALL_PREFIX=$(THIRDPARTYOUTDIR) \ -DUSE_SSH=ON \ -DBUILD_CLAR=OFF \ -DLIBSSH2_FOUND=ON \ -DLIBSSH2_INCLUDE_DIRS=$(THIRDPARTYINCLUDEDIR) \ -DLIBSSH2_LIBRARIES=$(THIRDPARTYLIBDIR)/libssh2-1.dll \ - -G "MSYS Makefiles" \ -DCMAKE_C_FLAGS="$(THIRDPARTY_CFLAGS)" \ && make \ && make install diff --git a/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake b/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake new file mode 100644 index 000000000..d2adf469f --- /dev/null +++ b/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake @@ -0,0 +1,17 @@ +# the name of the target operating system +SET(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc) +SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) +SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres) + +# here is the target environment located +SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr ) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file From d1cfbb237d0fa9ff1acbdea669a12a4b30d66916 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Mon, 13 Mar 2017 23:04:45 +0100 Subject: [PATCH 07/36] Have libsdl2 cross compile for mingw32 from cygwin Temporarily --disable-render-d3d because it causes an error: error: static declaration of 'IID_IDXGIFactory2' follows non-static declaration static const GUID IID_IDXGIFactory2 According to https://github.com/StephanTLavavej/mingw-distro/issues/10 this should be fixed by SDL-2.0.5 --- build.win32x86/third-party/Makefile.libsdl2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.win32x86/third-party/Makefile.libsdl2 b/build.win32x86/third-party/Makefile.libsdl2 index 27228d1e1..6882ea233 100644 --- a/build.win32x86/third-party/Makefile.libsdl2 +++ b/build.win32x86/third-party/Makefile.libsdl2 @@ -22,6 +22,8 @@ $(THIRDPARTYLIBDIR)/$(LIBSDL2LIBNAME): $(LIBSDL2ARCHIVE) tar x -f $(LIBSDL2ARCHIVE) -C $(THIRDPARTYDIR) cd $(LIBSDL2DIR) \ && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ + --host=i686-w64-mingw32 \ + --disable-render-d3d \ CFLAGS='$(THIRDPARTY_CFLAGS)' \ LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ && make \ From 4e292f5733e2404ef8c928f145ac04b99eaffe40 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Fri, 17 Mar 2017 01:54:58 +0100 Subject: [PATCH 08/36] SDL2: upgrade to 2.0.5 and restore enable-render-d3d option --- build.win32x86/third-party/Makefile.libsdl2 | 1 - third-party/libsdl2.spec | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build.win32x86/third-party/Makefile.libsdl2 b/build.win32x86/third-party/Makefile.libsdl2 index 6882ea233..6d51f0d51 100644 --- a/build.win32x86/third-party/Makefile.libsdl2 +++ b/build.win32x86/third-party/Makefile.libsdl2 @@ -23,7 +23,6 @@ $(THIRDPARTYLIBDIR)/$(LIBSDL2LIBNAME): $(LIBSDL2ARCHIVE) cd $(LIBSDL2DIR) \ && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ --host=i686-w64-mingw32 \ - --disable-render-d3d \ CFLAGS='$(THIRDPARTY_CFLAGS)' \ LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ && make \ diff --git a/third-party/libsdl2.spec b/third-party/libsdl2.spec index b734e49df..27c1cb567 100644 --- a/third-party/libsdl2.spec +++ b/third-party/libsdl2.spec @@ -1,8 +1,8 @@ -libsdl2_spec_download_url:=http://www.libsdl.org/release/SDL2-2.0.4.tar.gz -libsdl2_spec_archive_name:=SDL2-2.0.4.tar.gz -libsdl2_spec_unpack_dir_name:=SDL2-2.0.4 +libsdl2_spec_download_url:=http://www.libsdl.org/release/SDL2-2.0.5.tar.gz +libsdl2_spec_archive_name:=SDL2-2.0.5.tar.gz +libsdl2_spec_unpack_dir_name:=SDL2-2.0.5 libsdl2_spec_product_name_macOS:=libSDL2-2.0.0.dylib -libsdl2_spec_product_name_linux:=libSDL2-2.0.so.0.4.0 +libsdl2_spec_product_name_linux:=libSDL2-2.0.so.0.5.0 libsdl2_spec_product_name_windows:=SDL2.dll libsdl2_spec_symlinks_macOS:=libSDL2*.dylib libsdl2_spec_symlinks_linux:=libSDL2*so* From e351096e5da271cc7a389d98ab52b37a362783fd Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Mon, 13 Mar 2017 23:17:02 +0100 Subject: [PATCH 09/36] Upgrade zlib to 1.2.11 and use correct prefix for cross compiling for mingw32 from cygwin --- build.win32x86/third-party/Makefile.zlib | 1 + third-party/zlib.spec | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/build.win32x86/third-party/Makefile.zlib b/build.win32x86/third-party/Makefile.zlib index d8b4a8c1e..ea34aeefc 100644 --- a/build.win32x86/third-party/Makefile.zlib +++ b/build.win32x86/third-party/Makefile.zlib @@ -24,6 +24,7 @@ $(THIRDPARTYLIBDIR)/$(ZLIBLIBNAME): $(ZLIBARCHIVE) tar x -f $(ZLIBARCHIVE) -C $(THIRDPARTYDIR) cd $(ZLIBDIR) \ && make -fwin32/Makefile.gcc \ + PREFIX=i686-w64-mingw32- \ CFLAGS='$(THIRDPARTY_CFLAGS)' \ LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ && make install -fwin32/Makefile.gcc \ diff --git a/third-party/zlib.spec b/third-party/zlib.spec index b646f8f9d..eb19edb4d 100644 --- a/third-party/zlib.spec +++ b/third-party/zlib.spec @@ -1,6 +1,6 @@ -zlib_spec_download_url:=http://zlib.net/zlib-1.2.8.tar.gz -zlib_spec_archive_name:=zlib-1.2.8.tar.gz -zlib_spec_unpack_dir_name:=zlib-1.2.8 +zlib_spec_download_url:=http://zlib.net/zlib-1.2.11.tar.gz +zlib_spec_archive_name:=zlib-1.2.11.tar.gz +zlib_spec_unpack_dir_name:=zlib-1.2.11 zlib_spec_product_name_macOS:= zlib_spec_product_name_linux:= zlib_spec_product_name_windows:=zlib1.dll From 02518b3f1d3381b01506045cf8839b7ca13decfe Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Mon, 13 Mar 2017 23:29:12 +0100 Subject: [PATCH 10/36] Upgrade libpng to 1.6.28 and have it compiled for mingw32 from cygwin --- build.win32x86/third-party/Makefile.libpng | 1 + third-party/libpng.spec.win | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/build.win32x86/third-party/Makefile.libpng b/build.win32x86/third-party/Makefile.libpng index 0f1379d68..f7c6e7adf 100644 --- a/build.win32x86/third-party/Makefile.libpng +++ b/build.win32x86/third-party/Makefile.libpng @@ -22,6 +22,7 @@ $(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME): $(LIBPNGARCHIVE) tar x -f $(LIBPNGARCHIVE) -C $(THIRDPARTYDIR) cd $(LIBPNGDIR) \ && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ + --host=i686-w64-mingw32 \ CFLAGS='$(THIRDPARTY_CFLAGS) -march=pentium4 -I$(THIRDPARTYINCLUDEDIR)' \ CPPFLAGS='$(THIRDPARTY_CFLAGS) -march=pentium4 -I$(THIRDPARTYINCLUDEDIR)' \ LDFLAGS='$(THIRDPARTY_LDFLAGS) -march=pentium4 -L$(THIRDPARTYLIBDIR)' \ diff --git a/third-party/libpng.spec.win b/third-party/libpng.spec.win index 34bdb2bbf..8995eab3a 100644 --- a/third-party/libpng.spec.win +++ b/third-party/libpng.spec.win @@ -1,10 +1,10 @@ -# Using this version on windows because 1.2.49 fails, but I cannot use 1.6.26 in all versions -# because 1.6.26 fails on macOS. +# Using this version on windows because 1.2.49 fails, but I cannot use 1.6.28 in all versions +# because 1.6.28 may fail on macOS (1.6.26 did). # this cannot be good and eventually it will be a source of problems... so we need to reunite # versions as soon as possible. -libpng_spec_download_url:=ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng16/libpng-1.6.26.tar.gz -libpng_spec_archive_name:=libpng-1.6.26.tar.gz -libpng_spec_unpack_dir_name:=libpng-1.6.26 +libpng_spec_download_url:=ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng16/libpng-1.6.28.tar.gz +libpng_spec_archive_name:=libpng-1.6.28.tar.gz +libpng_spec_unpack_dir_name:=libpng-1.6.28 libpng_spec_product_name_macOS:=libpng16.16.dylib libpng_spec_product_name_linux:= libpng_spec_product_name_windows:=libpng16-16.dll From e21daea4368696f5c0716d9713599f515272d260 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Thu, 16 Mar 2017 08:15:33 +0100 Subject: [PATCH 11/36] libpng.pc is rceated as a symbolic link. Replace that with a copy. --- build.win32x86/third-party/Makefile.libpng | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.win32x86/third-party/Makefile.libpng b/build.win32x86/third-party/Makefile.libpng index f7c6e7adf..1d909c33d 100644 --- a/build.win32x86/third-party/Makefile.libpng +++ b/build.win32x86/third-party/Makefile.libpng @@ -14,7 +14,7 @@ LIBPNGLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBPNGLIBNAME) INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) EXTRALIBS:=$(EXTRALIBS) $(LIBPNGLIB) PLUGINREQS:=$(THIRDPARTYLIBS) - + $(LIBPNGARCHIVE): $(WGET) -O $(LIBPNGARCHIVE) $(LIBPNGURL) @@ -26,10 +26,10 @@ $(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME): $(LIBPNGARCHIVE) CFLAGS='$(THIRDPARTY_CFLAGS) -march=pentium4 -I$(THIRDPARTYINCLUDEDIR)' \ CPPFLAGS='$(THIRDPARTY_CFLAGS) -march=pentium4 -I$(THIRDPARTYINCLUDEDIR)' \ LDFLAGS='$(THIRDPARTY_LDFLAGS) -march=pentium4 -L$(THIRDPARTYLIBDIR)' \ - && make \ - && make install + && make LN=CP LN_S=CP\ + && make install LN=CP LN_S=CP $(LIBPNGLIB): pkgconfig zlib $(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME) cp -f $(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME) $(THIRDPARTYINSTALLDIR) - -libpng: $(LIBPNGLIB) \ No newline at end of file + +libpng: $(LIBPNGLIB) From 3b88de8936989b8b6f413a413e7e8ceae50e844e Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 00:14:08 +0100 Subject: [PATCH 12/36] Tell freetype2 to cross compile for mingw32 Unfortunately, build with autotool fails from cygwin because apinames.exe fails with cygwin path: could not open '/cygdrive/y/Smalltalk/opensmalltalk-vm/build.win32x86/pharo.cog.spur/build/third-party/freetype-2.6.5/include/freetype/ttnameid.h' for writing See https://lists.nongnu.org/archive/html/freetype/2015-11/msg00034.html --- build.win32x86/third-party/Makefile.freetype2 | 1 + 1 file changed, 1 insertion(+) diff --git a/build.win32x86/third-party/Makefile.freetype2 b/build.win32x86/third-party/Makefile.freetype2 index 4785af7fc..dfb8eb055 100644 --- a/build.win32x86/third-party/Makefile.freetype2 +++ b/build.win32x86/third-party/Makefile.freetype2 @@ -23,6 +23,7 @@ $(THIRDPARTYLIBDIR)/$(FREETYPE2LIBNAME): $(FREETYPE2ARCHIVE) cd $(FREETYPE2DIR) \ && ./configure \ --prefix='$(THIRDPARTYOUTDIR)' \ + --host=i686-w64-mingw32 \ --without-png \ PKG_CONFIG='$(PKG_CONFIG)' \ PKG_CONFIG_PATH='$(PKG_CONFIG_PATH)' \ From e81e1d912aad20413ad578806bfc7b137909bc58 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 00:55:52 +0100 Subject: [PATCH 13/36] Use cmake rather than autotools for compiling freetype2 This does workaround the apinames.exe problem not understanding cygwin path Note that the generated DLL name generated by cmake does not have the -6, so reflect that in the spec. --- build.win32x86/third-party/Makefile.freetype2 | 19 ++++++++++--------- third-party/freetype2.spec | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/build.win32x86/third-party/Makefile.freetype2 b/build.win32x86/third-party/Makefile.freetype2 index dfb8eb055..5187c4205 100644 --- a/build.win32x86/third-party/Makefile.freetype2 +++ b/build.win32x86/third-party/Makefile.freetype2 @@ -20,15 +20,16 @@ $(FREETYPE2ARCHIVE): $(THIRDPARTYLIBDIR)/$(FREETYPE2LIBNAME): $(FREETYPE2ARCHIVE) tar x -f $(FREETYPE2ARCHIVE) -C $(THIRDPARTYDIR) - cd $(FREETYPE2DIR) \ - && ./configure \ - --prefix='$(THIRDPARTYOUTDIR)' \ - --host=i686-w64-mingw32 \ - --without-png \ - PKG_CONFIG='$(PKG_CONFIG)' \ - PKG_CONFIG_PATH='$(PKG_CONFIG_PATH)' \ - CFLAGS='$(THIRDPARTY_CFLAGS)' \ - LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ + cp ../third-party/Toolchain-cross-mingw32-cygwin.cmake $(FREETYPE2DIR) + test -d $(FREETYPE2DIR)/build || mkdir $(FREETYPE2DIR)/build + cd $(FREETYPE2DIR)/build \ + && cmake ..\ + -DCMAKE_TOOLCHAIN_FILE=../Toolchain-cross-mingw32-cygwin.cmake \ + -DCMAKE_INSTALL_PREFIX=$(THIRDPARTYOUTDIR) \ + -DWITH_PNG=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_C_FLAGS="$(THIRDPARTY_CFLAGS)" \ + -DCMAKE_LD_FLAGS="$(THIRDPARTY_LDFLAGS)" \ && make \ && make install diff --git a/third-party/freetype2.spec b/third-party/freetype2.spec index 666f942bb..bca63fa41 100644 --- a/third-party/freetype2.spec +++ b/third-party/freetype2.spec @@ -3,5 +3,5 @@ freetype2_spec_archive_name:=freetype-2.6.5.tar.gz freetype2_spec_unpack_dir_name:=freetype-2.6.5 freetype2_spec_product_name_macOS:=libfreetype.6.dylib freetype2_spec_product_name_linux:= -freetype2_spec_product_name_windows:=libfreetype-6.dll +freetype2_spec_product_name_windows:=libfreetype.dll freetype2_spec_symlinks_macOS:=libfreetype*.dylib From ba3ecee0c79251f0bdb602f661f3de41f4e52c7a Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 01:09:21 +0100 Subject: [PATCH 14/36] cleanup: nuke unused THIRDPARTY_LDFLAGS from freetype2 --- build.win32x86/third-party/Makefile.freetype2 | 1 - 1 file changed, 1 deletion(-) diff --git a/build.win32x86/third-party/Makefile.freetype2 b/build.win32x86/third-party/Makefile.freetype2 index 5187c4205..b1d5b794c 100644 --- a/build.win32x86/third-party/Makefile.freetype2 +++ b/build.win32x86/third-party/Makefile.freetype2 @@ -29,7 +29,6 @@ $(THIRDPARTYLIBDIR)/$(FREETYPE2LIBNAME): $(FREETYPE2ARCHIVE) -DWITH_PNG=OFF \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_C_FLAGS="$(THIRDPARTY_CFLAGS)" \ - -DCMAKE_LD_FLAGS="$(THIRDPARTY_LDFLAGS)" \ && make \ && make install From a3e4540cedfb78419b06c705a98545cfbd13b1d5 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 01:04:20 +0100 Subject: [PATCH 15/36] Let pixman cross-compile for mingw from cygwin --- build.win32x86/third-party/Makefile.pixman | 1 + 1 file changed, 1 insertion(+) diff --git a/build.win32x86/third-party/Makefile.pixman b/build.win32x86/third-party/Makefile.pixman index c88a6b938..3a3999b2b 100644 --- a/build.win32x86/third-party/Makefile.pixman +++ b/build.win32x86/third-party/Makefile.pixman @@ -23,6 +23,7 @@ $(THIRDPARTYLIBDIR)/$(PIXMANLIBNAME): $(PIXMANARCHIVE) cd $(PIXMANDIR) \ && ./configure \ --prefix='$(THIRDPARTYOUTDIR)' \ + --host=i686-w64-mingw32 \ PKG_CONFIG="$(PKG_CONFIG)" \ PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" \ CFLAGS='$(THIRDPARTY_CFLAGS)' \ From 222f655dc5fc097721bf4e59704d8bdcf44c7285 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 03:48:06 +0100 Subject: [PATCH 16/36] Let cairo cross compile for mingw from cygwin --- build.win32x86/third-party/Makefile.cairo | 1 + 1 file changed, 1 insertion(+) diff --git a/build.win32x86/third-party/Makefile.cairo b/build.win32x86/third-party/Makefile.cairo index 34e0dce0b..d7ba445bc 100644 --- a/build.win32x86/third-party/Makefile.cairo +++ b/build.win32x86/third-party/Makefile.cairo @@ -28,6 +28,7 @@ $(THIRDPARTYLIBDIR)/$(CAIROLIBNAME): $(CAIROARCHIVE) cd $(CAIRODIR) \ && ./configure \ --prefix="$(THIRDPARTYOUTDIR)" \ + --host=i686-w64-mingw32 \ PKG_CONFIG="$(PKG_CONFIG)" \ PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" \ CFLAGS='$(THIRDPARTY_CFLAGS) -I$(THIRDPARTYINCLUDEDIR) -march=pentium4' \ From f7d3c98eaa001d2d07c1f2b75cad00fa16f86a73 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 20:57:04 +0100 Subject: [PATCH 17/36] cairo: remove _SSIZE_T_DEFINED hack that is now un-necessary --- build.win32x86/third-party/Makefile.cairo | 1 - 1 file changed, 1 deletion(-) diff --git a/build.win32x86/third-party/Makefile.cairo b/build.win32x86/third-party/Makefile.cairo index d7ba445bc..0ca51c4da 100644 --- a/build.win32x86/third-party/Makefile.cairo +++ b/build.win32x86/third-party/Makefile.cairo @@ -36,7 +36,6 @@ $(THIRDPARTYLIBDIR)/$(CAIROLIBNAME): $(CAIROARCHIVE) --disable-silent-rules \ --disable-xlib \ --disable-dependency-tracking \ - && echo "#define _SSIZE_T_DEFINED 1" >> config.h \ && make \ && make install From 7a31b5115eb98f521adf424c619483dd703b5aaf Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Tue, 14 Mar 2017 22:24:04 +0100 Subject: [PATCH 18/36] cairo: upgrade to 1.14.8 This does not solve the issue I have with cygwin build: there are trailing lines generated at end of tests/cairo-test-constructors.c that make the compilation fail --- third-party/cairo.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/third-party/cairo.spec b/third-party/cairo.spec index b661dc582..55ca984a2 100644 --- a/third-party/cairo.spec +++ b/third-party/cairo.spec @@ -1,6 +1,6 @@ -cairo_spec_download_url:=http://www.cairographics.org/releases/cairo-1.14.6.tar.xz -cairo_spec_archive_name:=cairo-1.14.6.tar.xz -cairo_spec_unpack_dir_name:=cairo-1.14.6 +cairo_spec_download_url:=http://www.cairographics.org/releases/cairo-1.14.8.tar.xz +cairo_spec_archive_name:=cairo-1.14.8.tar.xz +cairo_spec_unpack_dir_name:=cairo-1.14.8 cairo_spec_product_name_macOS:=libcairo.2.dylib cairo_spec_product_name_windows:=libcairo-2.dll cairo_spec_symlinks_macOS:=libcairo.dylib From eee7663456f2825c1d78583f5cdf486443866ec4 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Wed, 15 Mar 2017 23:54:03 +0100 Subject: [PATCH 19/36] cairo: ugly patch to workaround not truncated file on cygwin We remove the file if it exists before regenerating it With this, the trailing lines generated at end of tests/cairo-test-constructors.c are gone --- build.win32x86/third-party/Makefile.cairo | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/build.win32x86/third-party/Makefile.cairo b/build.win32x86/third-party/Makefile.cairo index 0ca51c4da..17a5886cb 100644 --- a/build.win32x86/third-party/Makefile.cairo +++ b/build.win32x86/third-party/Makefile.cairo @@ -18,11 +18,15 @@ PLUGINREQS:=$(THIRDPARTYLIBS) $(CAIROARCHIVE): $(WGET) -O $(CAIROARCHIVE) $(CAIROURL) -# IMPORTANT: This hack of "echo..." is needed to properly compile cairo. -# this is a long time error reported by Igor a lot of time ago: -# https://lists.cairographics.org/archives/cairo/2012-October/023675.html -# nobody answered his concern at the time and today (version 1.14.6), -# this is still not solved. +# IMPORTANT: The hack for editing test/Makefile after ./configure +# is required on cygwin because it fails to truncate the file +# test/cairo-test-constructors.c +# when it overwrites it, causing compilation to fail on trailing lines +# We thus add a rule for removing the file before generating it if it exists +# sed '/pattern/i newLine' +# This works in version 1.14.28 but somehow fragile. +# If this cygwin bug is confirmed, the line should be added to Makefile.am +# and any other relevant file, and the change pushed back to cairo repository. $(THIRDPARTYLIBDIR)/$(CAIROLIBNAME): $(CAIROARCHIVE) tar x -f $(CAIROARCHIVE) -C $(THIRDPARTYDIR) cd $(CAIRODIR) \ @@ -36,6 +40,7 @@ $(THIRDPARTYLIBDIR)/$(CAIROLIBNAME): $(CAIROARCHIVE) --disable-silent-rules \ --disable-xlib \ --disable-dependency-tracking \ + && sed -i '/.* sh .\/make-/i\\ttest -e \$$\@ \&\& rm \$$\@' test/Makefile \ && make \ && make install From 2fa25585a7db1944e78328001868a79b6b27de27 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Thu, 16 Mar 2017 21:15:14 +0100 Subject: [PATCH 20/36] SqueakSSL: don't hardcode mingw library path we want to build thru cygwin cross-compile --- platforms/win32/plugins/SqueakSSL/Makefile | 1 - platforms/win32/plugins/SqueakSSL/Makefile.plugin | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/platforms/win32/plugins/SqueakSSL/Makefile b/platforms/win32/plugins/SqueakSSL/Makefile index 7bb6c6101..c171930ac 100644 --- a/platforms/win32/plugins/SqueakSSL/Makefile +++ b/platforms/win32/plugins/SqueakSSL/Makefile @@ -17,7 +17,6 @@ OPENSSL:=/usr/local/openssl-1.0.1e EXTRALIBS:= -L$(OPENSSL) \ -lssl -lcrypto \ - -L/usr/lib/w32api \ -lcrypt32 -lsecur32 # You may need the following to make an internal plugin diff --git a/platforms/win32/plugins/SqueakSSL/Makefile.plugin b/platforms/win32/plugins/SqueakSSL/Makefile.plugin index 649a7c34f..5c23a8997 100644 --- a/platforms/win32/plugins/SqueakSSL/Makefile.plugin +++ b/platforms/win32/plugins/SqueakSSL/Makefile.plugin @@ -19,7 +19,7 @@ OPENSSL:=/usr/local/openssl-1.0.1e else OPENSSL:=$(THIRDPARTYOUTDIR)/lib endif -EXTRALIBS:= -L$(OPENSSL) -lssl -lcrypto -L/usr/lib/w32api -lcrypt32 -lsecur32 +EXTRALIBS:= -L$(OPENSSL) -lssl -lcrypto -lcrypt32 -lsecur32 # You may need the following to make an internal plugin DLLTOOLEXTRA := $(OPENSSL)/libssl.a $(OPENSSL)/libcrypto.a From 38b7022611df2d07c22add42994cd71e42b8c975 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Thu, 16 Mar 2017 22:26:12 +0100 Subject: [PATCH 21/36] copy iconv.dll and libwindpthread along with libgcc to pharo build directory NOTA: maybe we can force linker option -static-libgcc in SDL2 by adding configuration option enable_shared_with_static_runtimes? --- build.win32x86/third-party/Makefile.libgcc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/build.win32x86/third-party/Makefile.libgcc b/build.win32x86/third-party/Makefile.libgcc index 62ff76e72..db8a56423 100644 --- a/build.win32x86/third-party/Makefile.libgcc +++ b/build.win32x86/third-party/Makefile.libgcc @@ -8,11 +8,23 @@ ifndef THIRDPARTYDIR include ../common/Makefile.lib.extra endif -LIBGCCLIBNAME:=libgcc_s_dw2-1.dll +LIBGCCLIBNAME:=libgcc_s_sjlj-1.dll LIBGCCLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBGCCLIBNAME) -MINGWLIBDIR:=/C/MinGW/bin +MINGWLIBDIR:=/usr/i686-w64-mingw32/sys-root/mingw/bin -$(LIBGCCLIB): +LIBPTHREADLIBNAME:=libwinpthread-1.dll +LIBPTHREADLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBPTHREADLIBNAME) + +LIBICONVLIBNAME:=iconv.dll +LIBICONVLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBICONVLIBNAME) + +$(LIBGCCLIB): $(LIBICONVLIB) $(LIBPTHREADLIB) cp -f $(MINGWLIBDIR)/$(LIBGCCLIBNAME) $(THIRDPARTYINSTALLDIR) - + +$(LIBPTHREADLIB): + cp -f $(MINGWLIBDIR)/$(LIBPTHREADLIBNAME) $(THIRDPARTYINSTALLDIR) + +$(LIBICONVLIB): + cp -f $(MINGWLIBDIR)/$(LIBICONVLIBNAME) $(THIRDPARTYINSTALLDIR) + libgcc: $(LIBGCCLIB) From ecbb2298f4045aaf9c77f28eb722c15310b40920 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Thu, 16 Mar 2017 22:29:13 +0100 Subject: [PATCH 22/36] Add win32 pharo.cog.spur build to appveyor --- .appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index 6bb19ae6c..1ce16dd45 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -28,6 +28,11 @@ environment: CYG_ROOT: C:\cygwin CYG_SETUP: setup-x86.exe MINGW_ARCH: i686 + - FLAVOR: pharo.cog.spur + ARCH: win32x86 + CYG_ROOT: C:\cygwin + CYG_SETUP: setup-x86.exe + MINGW_ARCH: i686 - FLAVOR: newspeak.cog.spur ARCH: win32x86 CYG_ROOT: C:\cygwin From e27c43962947b4eb9f0ae0e3ef975a6b48740adb Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Fri, 17 Mar 2017 23:14:20 +0100 Subject: [PATCH 23/36] Correct stupid typo libglig => libglib preventing pkg-config to compile --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1ce16dd45..e8c752fd3 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -63,7 +63,7 @@ cache: install: - ps: 'Start-FileDownload "http://cygwin.com/setup-x86.exe" -FileName "setup-x86.exe"' - ps: 'Start-FileDownload "http://cygwin.com/setup-x86_64.exe" -FileName "setup-x86_64.exe"' - - '%CYG_SETUP% -dgnqNO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_ROOT%\var\cache\setup" -P mingw64-%MINGW_ARCH%-gcc-core,mingw64-%MINGW_ARCH%-gcc-g++,mingw64-%MINGW_ARCH%-headers,mingw64-%MINGW_ARCH%-runtime,zip,mingw64-%MINGW_ARCH%-clang,libiconv-devel,libglig2.0-devel,perl,mingw64-%MINGW_ARCH%-zlib,cmake,mingw64-%MINGW_ARCH%-win-iconv' + - '%CYG_SETUP% -dgnqNO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_ROOT%\var\cache\setup" -P mingw64-%MINGW_ARCH%-gcc-core,mingw64-%MINGW_ARCH%-gcc-g++,mingw64-%MINGW_ARCH%-headers,mingw64-%MINGW_ARCH%-runtime,zip,mingw64-%MINGW_ARCH%-clang,libiconv-devel,libglib2.0-devel,perl,mingw64-%MINGW_ARCH%-zlib,cmake,mingw64-%MINGW_ARCH%-win-iconv' build: false From 35238390889778b953f8a56cc84793f8d2059d9a Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Fri, 17 Mar 2017 23:37:36 +0100 Subject: [PATCH 24/36] openssl: don't force AR macro The AR from ../common/Makefile.tools already append the cr options The openssl configure add yet another r, so we end up building a library named r instead of libcrypto.a There is no difference between i686-w64-mingw32-ar and ar anyway... --- build.win32x86/third-party/Makefile.openssl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.win32x86/third-party/Makefile.openssl b/build.win32x86/third-party/Makefile.openssl index 4dbbed06f..60c164a97 100644 --- a/build.win32x86/third-party/Makefile.openssl +++ b/build.win32x86/third-party/Makefile.openssl @@ -23,7 +23,7 @@ $(THIRDPARTYLIBDIR)/$(OPENSSLLIBNAME): $(OPENSSLARCHIVE) tar x -f $(OPENSSLARCHIVE) -C $(THIRDPARTYDIR) sed -i 's/symlink/copy/g' $(OPENSSLDIR)/util/mklink.pl cd $(OPENSSLDIR) \ - && CC='$(CC)' LD='$(LD)' AR='$(AR)' NM='$(NM)' RC='$(RC)' DLLTOOL='$(DLLTOOL)' DLLWRAP='$(DLLWRAP)' ./Configure mingw --prefix='$(THIRDPARTYOUTDIR)' shared $(THIRDPARTY_CFLAGS) \ + && CC='$(CC)' LD='$(LD)' NM='$(NM)' RC='$(RC)' DLLTOOL='$(DLLTOOL)' DLLWRAP='$(DLLWRAP)' ./Configure mingw --prefix='$(THIRDPARTYOUTDIR)' shared $(THIRDPARTY_CFLAGS) \ && make \ && make install From 2bae43f13c1e3e1a0d80488e634db8d38448b03a Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 01:48:29 +0100 Subject: [PATCH 25/36] libgit2: don't put /usr in the FIND_ROOT_PATH Otherwise, cmake will find some cygwin files incompatible for cross compilation to mingw32 I don't know why the build did succeed once in cygwin64, it does not in cygwin32 without this fix. --- build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake b/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake index d2adf469f..0785c6829 100644 --- a/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake +++ b/build.win32x86/third-party/Toolchain-cross-mingw32-cygwin.cmake @@ -7,7 +7,7 @@ SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres) # here is the target environment located -SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 /usr ) +SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32 ) # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search From d87bb41ebc824c4159968845bac14660d1b71b2a Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 15:19:33 +0100 Subject: [PATCH 26/36] Force win32 pharo.cog.spur mvm to end with the error code of `make` not of the `tee` Otherwise, the failing builds appear as green on appveyor This is a copy of https://github.com/OpenSmalltalk/opensmalltalk-vm/commit/46d8e8cd25d9b92ffd21ce21dcdeb2406b18c804 --- build.win32x86/common/Makefile.lib.extra | 2 +- build.win32x86/pharo.cog.spur/Makefile | 2 +- build.win32x86/pharo.cog.spur/mvm | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.win32x86/common/Makefile.lib.extra b/build.win32x86/common/Makefile.lib.extra index c788449a3..5f78bc230 100644 --- a/build.win32x86/common/Makefile.lib.extra +++ b/build.win32x86/common/Makefile.lib.extra @@ -1,4 +1,4 @@ - # +# # THIRDPARTYLIBS The libraries to build (you define them in ./third-party/LIB/Makefile.lib) # THIRDPARTYDIR Where to build libraries # THIRDPARTYOUTDIR Where to first install libraries (output place) diff --git a/build.win32x86/pharo.cog.spur/Makefile b/build.win32x86/pharo.cog.spur/Makefile index e84d9123a..bfc8470a5 100644 --- a/build.win32x86/pharo.cog.spur/Makefile +++ b/build.win32x86/pharo.cog.spur/Makefile @@ -1,5 +1,5 @@ ############################################################################# -# Makefile for Win32 Cog Spur PharoVM using gcc-3.4.x and cygwin +# Makefile for Win32 Cog Spur PharoVM using gcc and cygwin # Do make init to allow make -n to function. ############################################################################# diff --git a/build.win32x86/pharo.cog.spur/mvm b/build.win32x86/pharo.cog.spur/mvm index a8e3bf286..686479939 100755 --- a/build.win32x86/pharo.cog.spur/mvm +++ b/build.win32x86/pharo.cog.spur/mvm @@ -21,13 +21,13 @@ else fi if [ -n "$D" ]; then rm -rf builddbg/vm/*.exe - make $@ debug 2>&1 | tee LOGD + make $@ debug 2>&1 | tee LOGD ; test ${PIPESTATUS[0]} -eq 0 fi if [ -n "$A" ]; then rm -rf buildast/vm/*.exe - make $@ assert 2>&1 | tee LOGA + make $@ assert 2>&1 | tee LOGA ; test ${PIPESTATUS[0]} -eq 0 fi if [ -n "$F" ]; then rm -rf build/vm/*.exe - make $@ 2>&1 | tee LOGF + make $@ 2>&1 | tee LOGF ; test ${PIPESTATUS[0]} -eq 0 fi From cbfad7fd59e686f506b7b3d77b7b3429c814c3db Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 18:42:49 +0100 Subject: [PATCH 27/36] Add opportunity to clean up the appveyor build cache --- .appveyor.yml | 2 +- .appveyorcleancache.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .appveyorcleancache.txt diff --git a/.appveyor.yml b/.appveyor.yml index e8c752fd3..63134a391 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -58,7 +58,7 @@ platform: clone_depth: 5 cache: - - .thirdparty-cache + - .thirdparty-cache -> appveyorcleancache.txt install: - ps: 'Start-FileDownload "http://cygwin.com/setup-x86.exe" -FileName "setup-x86.exe"' diff --git a/.appveyorcleancache.txt b/.appveyorcleancache.txt new file mode 100644 index 000000000..16b88c40e --- /dev/null +++ b/.appveyorcleancache.txt @@ -0,0 +1,2 @@ +Edit this file when you want to clean the appveyor cache +See https://www.appveyor.com/docs/build-cache/#cleaning-up-cache From c2a4d76526028e99fff6815e075a29303be5e374 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 19:49:24 +0100 Subject: [PATCH 28/36] libpng.1.6.28 already disappeared, pick 1.6.29 --- third-party/libpng.spec.win | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/third-party/libpng.spec.win b/third-party/libpng.spec.win index 8995eab3a..faf565290 100644 --- a/third-party/libpng.spec.win +++ b/third-party/libpng.spec.win @@ -1,10 +1,10 @@ -# Using this version on windows because 1.2.49 fails, but I cannot use 1.6.28 in all versions +# Using this version on windows because 1.2.49 fails, but I cannot use 1.6.29 in all versions # because 1.6.28 may fail on macOS (1.6.26 did). # this cannot be good and eventually it will be a source of problems... so we need to reunite # versions as soon as possible. -libpng_spec_download_url:=ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng16/libpng-1.6.28.tar.gz -libpng_spec_archive_name:=libpng-1.6.28.tar.gz -libpng_spec_unpack_dir_name:=libpng-1.6.28 +libpng_spec_download_url:=ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng16/libpng-1.6.29.tar.gz +libpng_spec_archive_name:=libpng-1.6.29.tar.gz +libpng_spec_unpack_dir_name:=libpng-1.6.29 libpng_spec_product_name_macOS:=libpng16.16.dylib libpng_spec_product_name_linux:= -libpng_spec_product_name_windows:=libpng16-16.dll +libpng_spec_product_name_windows:=libpng16-29.dll From 141f8808680c5b2a9bbe0508769811bc44b0ce2d Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 20:58:27 +0100 Subject: [PATCH 29/36] Oups, libpng16-16 seems to be hardcoded somewhere in libpng, we can't choose. --- third-party/libpng.spec.win | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/libpng.spec.win b/third-party/libpng.spec.win index faf565290..10c3d6b60 100644 --- a/third-party/libpng.spec.win +++ b/third-party/libpng.spec.win @@ -7,4 +7,4 @@ libpng_spec_archive_name:=libpng-1.6.29.tar.gz libpng_spec_unpack_dir_name:=libpng-1.6.29 libpng_spec_product_name_macOS:=libpng16.16.dylib libpng_spec_product_name_linux:= -libpng_spec_product_name_windows:=libpng16-29.dll +libpng_spec_product_name_windows:=libpng16-16.dll From 5e6d9805491ad44c015a2bec23ae5f359e1c763f Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 22:28:14 +0100 Subject: [PATCH 30/36] Revert the appveyor build cache reset It was a bad idea because git sources are extracted at each build, appveyor thinks that the .appveyorcleancache.txt was updated, and thus clean the cache at each build... --- .appveyor.yml | 2 +- .appveyorcleancache.txt | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 .appveyorcleancache.txt diff --git a/.appveyor.yml b/.appveyor.yml index 63134a391..e8c752fd3 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -58,7 +58,7 @@ platform: clone_depth: 5 cache: - - .thirdparty-cache -> appveyorcleancache.txt + - .thirdparty-cache install: - ps: 'Start-FileDownload "http://cygwin.com/setup-x86.exe" -FileName "setup-x86.exe"' diff --git a/.appveyorcleancache.txt b/.appveyorcleancache.txt deleted file mode 100644 index 16b88c40e..000000000 --- a/.appveyorcleancache.txt +++ /dev/null @@ -1,2 +0,0 @@ -Edit this file when you want to clean the appveyor cache -See https://www.appveyor.com/docs/build-cache/#cleaning-up-cache From 08ccf1faab9ebf4c29a581333ef38c10bc6f960e Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 22:35:30 +0100 Subject: [PATCH 31/36] Update the win32 pharo.cog.spur.lowcode directory --- .../pharo.cog.spur.lowcode/Makefile | 28 ++++++++++--------- .../pharo.cog.spur.lowcode/Pharo.exe.manifest | 4 +-- .../pharo.cog.spur.lowcode/Pharo.rc | 8 +++--- build.win32x86/pharo.cog.spur.lowcode/mvm | 6 ++-- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/build.win32x86/pharo.cog.spur.lowcode/Makefile b/build.win32x86/pharo.cog.spur.lowcode/Makefile index 5cb6c076e..d8bf5f40a 100644 --- a/build.win32x86/pharo.cog.spur.lowcode/Makefile +++ b/build.win32x86/pharo.cog.spur.lowcode/Makefile @@ -1,5 +1,5 @@ ############################################################################# -# Makefile for Win32 Cog Spur PharoVM using gcc-3.4.x and cygwin +# Makefile for Win32 Cog Spur PharoVM using gcc and cygwin # Do make init to allow make -n to function. ############################################################################# @@ -12,24 +12,26 @@ VMSRCDIR:=../../spurlowcodesrc/vm # ALLOCA_LIES_SO_USE_GETSP=0 Some compilers return the stack address+4 on alloca function, # then FFI module needs to adjust that. It is NOT the case of mingw. # For more information see this thread: http://forum.world.st/There-are-something-fishy-with-FFI-plugin-td4584226.html -COGDEFS:= -DPharoVM=1 -DIMMUTABILITY=1 -DSTACK_ALIGN_BYTES=16 -DALLOCA_LIES_SO_USE_GETSP=0 +#COGDEFS:= -DPharoVM=1 -DIMMUTABILITY=1 -DSTACK_ALIGN_BYTES=16 -DALLOCA_LIES_SO_USE_GETSP=0 +COGDEFS:= -DPharoVM=1 -DIMMUTABILITY=1 -THIRDPARTYLIBS:=pkgconfig openssl libssh2 libgit2 libsdl2 zlib libpng freetype2 pixman cairo +THIRDPARTYLIBS:=pkgconfig openssl libssh2 libgit2 libsdl2 zlib libpng freetype2 pixman cairo libgcc include ../common/Makefile # third-party libraries # -include ../third-party/pkgconfig/Makefile.lib -include ../third-party/freetype2/Makefile.lib -include ../third-party/openssl/Makefile.lib -include ../third-party/libssh2/Makefile.lib -include ../third-party/libgit2/Makefile.lib -include ../third-party/libsdl2/Makefile.lib -include ../third-party/zlib/Makefile.lib -include ../third-party/pixman/Makefile.lib -include ../third-party/libpng/Makefile.lib -include ../third-party/cairo/Makefile.lib +include ../third-party/Makefile.pkgconfig +include ../third-party/Makefile.freetype2 +include ../third-party/Makefile.openssl +include ../third-party/Makefile.libssh2 +include ../third-party/Makefile.libgit2 +include ../third-party/Makefile.libsdl2 +include ../third-party/Makefile.zlib +include ../third-party/Makefile.pixman +include ../third-party/Makefile.libpng +include ../third-party/Makefile.cairo +include ../third-party/Makefile.libgcc # Since SDLDisplayPlugin will be included as internal plugin, we need to add the library to the path # add to the end to allow thirdparty vars to be defined. diff --git a/build.win32x86/pharo.cog.spur.lowcode/Pharo.exe.manifest b/build.win32x86/pharo.cog.spur.lowcode/Pharo.exe.manifest index 191b3a8cf..700351c87 100644 --- a/build.win32x86/pharo.cog.spur.lowcode/Pharo.exe.manifest +++ b/build.win32x86/pharo.cog.spur.lowcode/Pharo.exe.manifest @@ -6,10 +6,10 @@ -Squeak Smalltalk Virtual Machine +Pharo Smalltalk Virtual Machine false diff --git a/build.win32x86/pharo.cog.spur.lowcode/Pharo.rc b/build.win32x86/pharo.cog.spur.lowcode/Pharo.rc index 95549661c..2af73f65b 100644 --- a/build.win32x86/pharo.cog.spur.lowcode/Pharo.rc +++ b/build.win32x86/pharo.cog.spur.lowcode/Pharo.rc @@ -16,11 +16,11 @@ BEGIN BEGIN BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilin BEGIN - VALUE "CompanyName", "Squeak.org\0" - VALUE "FileDescription", "Squeak Cog Spur Virtual Machine\0" + VALUE "CompanyName", "Pharo.org\0" + VALUE "FileDescription", "Pharo Cog Spur Virtual Machine\0" VALUE "FileVersion", FILEVERSIONSTRING - VALUE "LegalCopyright", "Copyright \251 Squeak.org 1996-2014\0" - VALUE "ProductName", "Squeak Cog Spur\0" + VALUE "LegalCopyright", "Copyright \251 https://github.com/opensmalltalk 1996-2016\0" + VALUE "ProductName", "Pharo Cog Spur\0" VALUE "ProductVersion", "5.0\0" END END diff --git a/build.win32x86/pharo.cog.spur.lowcode/mvm b/build.win32x86/pharo.cog.spur.lowcode/mvm index a8e3bf286..686479939 100644 --- a/build.win32x86/pharo.cog.spur.lowcode/mvm +++ b/build.win32x86/pharo.cog.spur.lowcode/mvm @@ -21,13 +21,13 @@ else fi if [ -n "$D" ]; then rm -rf builddbg/vm/*.exe - make $@ debug 2>&1 | tee LOGD + make $@ debug 2>&1 | tee LOGD ; test ${PIPESTATUS[0]} -eq 0 fi if [ -n "$A" ]; then rm -rf buildast/vm/*.exe - make $@ assert 2>&1 | tee LOGA + make $@ assert 2>&1 | tee LOGA ; test ${PIPESTATUS[0]} -eq 0 fi if [ -n "$F" ]; then rm -rf build/vm/*.exe - make $@ 2>&1 | tee LOGF + make $@ 2>&1 | tee LOGF ; test ${PIPESTATUS[0]} -eq 0 fi From 137c75b9287ca89ba83edca94b89a9a2d503b124 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 23:27:13 +0100 Subject: [PATCH 32/36] Add win64 pharo.stack.spur build with its thirdparty Note: building openssl with clang fails, so use gcc for this library Also, it is necessary to replace another symlink by a copy in util/point.sh --- build.win64x64/common/Makefile | 14 ++++- build.win64x64/common/Makefile.lib.extra | 31 +++++++++++ build.win64x64/pharo.stack.spur/Makefile | 32 +++++++++++ build.win64x64/pharo.stack.spur/Pharo.def.in | 3 ++ .../pharo.stack.spur/Pharo.exe.manifest | 30 +++++++++++ build.win64x64/pharo.stack.spur/Pharo.ico | Bin 0 -> 353118 bytes build.win64x64/pharo.stack.spur/Pharo.rc | 32 +++++++++++ build.win64x64/pharo.stack.spur/mvm | 33 ++++++++++++ build.win64x64/pharo.stack.spur/plugins.ext | 6 +++ build.win64x64/pharo.stack.spur/plugins.int | 40 ++++++++++++++ build.win64x64/third-party/Makefile.cairo | 50 ++++++++++++++++++ build.win64x64/third-party/Makefile.freetype2 | 38 +++++++++++++ build.win64x64/third-party/Makefile.libgcc | 30 +++++++++++ build.win64x64/third-party/Makefile.libgit2 | 40 ++++++++++++++ build.win64x64/third-party/Makefile.libpng | 35 ++++++++++++ build.win64x64/third-party/Makefile.libsdl2 | 34 ++++++++++++ build.win64x64/third-party/Makefile.libssh2 | 36 +++++++++++++ build.win64x64/third-party/Makefile.openssl | 37 +++++++++++++ build.win64x64/third-party/Makefile.pixman | 37 +++++++++++++ build.win64x64/third-party/Makefile.pkgconfig | 31 +++++++++++ build.win64x64/third-party/Makefile.zlib | 40 ++++++++++++++ .../Toolchain-cross-mingw32-cygwin.cmake | 17 ++++++ 22 files changed, 644 insertions(+), 2 deletions(-) create mode 100644 build.win64x64/common/Makefile.lib.extra create mode 100644 build.win64x64/pharo.stack.spur/Makefile create mode 100644 build.win64x64/pharo.stack.spur/Pharo.def.in create mode 100644 build.win64x64/pharo.stack.spur/Pharo.exe.manifest create mode 100644 build.win64x64/pharo.stack.spur/Pharo.ico create mode 100644 build.win64x64/pharo.stack.spur/Pharo.rc create mode 100644 build.win64x64/pharo.stack.spur/mvm create mode 100644 build.win64x64/pharo.stack.spur/plugins.ext create mode 100644 build.win64x64/pharo.stack.spur/plugins.int create mode 100644 build.win64x64/third-party/Makefile.cairo create mode 100644 build.win64x64/third-party/Makefile.freetype2 create mode 100644 build.win64x64/third-party/Makefile.libgcc create mode 100644 build.win64x64/third-party/Makefile.libgit2 create mode 100644 build.win64x64/third-party/Makefile.libpng create mode 100644 build.win64x64/third-party/Makefile.libsdl2 create mode 100644 build.win64x64/third-party/Makefile.libssh2 create mode 100644 build.win64x64/third-party/Makefile.openssl create mode 100644 build.win64x64/third-party/Makefile.pixman create mode 100644 build.win64x64/third-party/Makefile.pkgconfig create mode 100644 build.win64x64/third-party/Makefile.zlib create mode 100644 build.win64x64/third-party/Toolchain-cross-mingw32-cygwin.cmake diff --git a/build.win64x64/common/Makefile b/build.win64x64/common/Makefile index 7dfa90239..c02f57754 100644 --- a/build.win64x64/common/Makefile +++ b/build.win64x64/common/Makefile @@ -74,6 +74,14 @@ include plugins.int LIBS:= $(addprefix $(OBJDIR)/, $(addsuffix .lib, $(INTERNAL_PLUGINS))) DLLS:= $(addprefix $(OBJDIR)/, $(addsuffix .dll, $(EXTERNAL_PLUGINS))) +############################################################################# +# The third-party libraries +# +ifneq ($(THIRDPARTYLIBS),) +include ../common/Makefile.lib.extra +THIRDPARTYPREREQS:=$(THIRDPARTYCACHEDIR) $(THIRDPARTYOUTDIR) +endif + ############################################################################# # Generic VM source file definitions # @@ -151,7 +159,7 @@ debug: $(MAKE) -f $(MAKEFILE_LIST) CONFIGURATION=debug THREADING=single $(@,debug=) default # Do make init to allow make -n to function. -init: $(OBJDIR) mkNamedPrims.exe +init: $(THIRDPARTYPREREQS) $(OBJDIR) mkNamedPrims.exe cleanall: clean cleanmt cleanast cleanmtast cleandbg cleanmtdbg @@ -209,7 +217,7 @@ $(ETOBJ): $(WIN32MISCDIR)/etext.c vm: $(VMEXE) -$(VMEXE): $(OBJDIR) $(VMOBJ) $(LIBS) $(VMEXP) resource.o $(BTOBJ) $(ETOBJ) +$(VMEXE): $(OBJDIR) $(THIRDPARTYLIBS) $(VMOBJ) $(LIBS) $(VMEXP) resource.o $(BTOBJ) $(ETOBJ) $(CC) -o $(OBJDIR)/version.o $(CFLAGS) $(INCLUDES) $(DEFS) -c $(WIN32DIR)/version.c $(LD) $(LDFLAGS) -o $(VMEXE) \ $(BTOBJ) $(VMOBJ) $(VMEXP) $(OBJDIR)/resource.o $(LIBS) $(STDLIBS) $(ETOBJ) @@ -262,6 +270,7 @@ $(OBJDIR)/%.lib: $(call plugin-makefile,$(*F)) $(MAKE) $(MFLAGS) BUILD=$(BUILD) \ -f $(call plugin-makefile,$(*F)) \ CONFIGURATION=$(CONFIGURATION) TOOLPREFIX=$(TOOLPREFIX) \ + THIRDPARTYOUTDIR=$(THIRDPARTYOUTDIR) \ PLATDIR=$(PLATDIR) PLUGINSRCDIR=$(PLUGINSRCDIR) VMSRCDIR=$(VMSRCDIR) \ LIBNAME=$(*F) COGDEFS="$(COGDEFS)" XDEFS=-DSQUEAK_BUILTIN_PLUGIN \ $(OBJDIR)/$(*F).lib @@ -273,6 +282,7 @@ $(OBJDIR)/%.dll: $(call plugin-makefile,$(*F)) -f $(call plugin-makefile,$(*F)) \ CONFIGURATION=$(CONFIGURATION) TOOLPREFIX=$(TOOLPREFIX) \ PLATDIR=$(PLATDIR) PLUGINSRCDIR=$(PLUGINSRCDIR) VMSRCDIR=$(VMSRCDIR) \ + THIRDPARTYOUTDIR=$(THIRDPARTYOUTDIR) \ COGDEFS="$(COGDEFS)" LIBNAME=$(*F) $(OBJDIR)/$(*F).dll ############################################################################# diff --git a/build.win64x64/common/Makefile.lib.extra b/build.win64x64/common/Makefile.lib.extra new file mode 100644 index 000000000..2344c4791 --- /dev/null +++ b/build.win64x64/common/Makefile.lib.extra @@ -0,0 +1,31 @@ +# +# THIRDPARTYLIBS The libraries to build (you define them in ./third-party/LIB/Makefile.lib) +# THIRDPARTYDIR Where to build libraries +# THIRDPARTYOUTDIR Where to first install libraries (output place) +# THIRDPARTYCACHEDIR Where to download thirdparty libraries +# + +THIRDPARTYDIR?=$(BUILD)/third-party +#windows installs dlls in bin dir +THIRDPARTYLIBDIR?=$(THIRDPARTYOUTDIR)/bin +THIRDPARTYINCLUDEDIR?=$(THIRDPARTYOUTDIR)/include +THIRDPARTYCACHEDIR?=../../.thirdparty-cache +THIRDPARTYOUTDIR?=$(abspath $(THIRDPARTYCACHEDIR)/windows/x86_64) +THIRDPARTYINSTALLDIR?=$(BUILD)/vm +THIRDPARTY_CFLAGS?=-m64 -static-libgcc -static-libstdc++ +THIRDPARTY_LDFLAGS?=-m64 -static-libgcc -static-libstdc++ +WGET?=wget -q --no-check-certificate + + +$(THIRDPARTYDIR): + if [ ! -d $(THIRDPARTYDIR) ]; then mkdir -p $(THIRDPARTYDIR); fi + +$(THIRDPARTYOUTDIR): $(THIRDPARTYDIR) + if [ ! -d $(THIRDPARTYOUTDIR) ]; then mkdir -p $(THIRDPARTYOUTDIR); fi + +$(THIRDPARTYINSTALLDIR): + if [ ! -d $(THIRDPARTYINSTALLDIR) ]; then mkdir -p $(THIRDPARTYINSTALLDIR); fi + +$(THIRDPARTYCACHEDIR): + if [ ! -d $(THIRDPARTYCACHEDIR) ]; then mkdir -p $(THIRDPARTYCACHEDIR); fi + diff --git a/build.win64x64/pharo.stack.spur/Makefile b/build.win64x64/pharo.stack.spur/Makefile new file mode 100644 index 000000000..0451aa37f --- /dev/null +++ b/build.win64x64/pharo.stack.spur/Makefile @@ -0,0 +1,32 @@ +############################################################################# +# Makefile for Win32 Stack Spur PharoVM using cygwin +# Do make init to allow make -n to function. +############################################################################# + +VM:=Pharo +VM_NAME:=Pharo Virtual Machine + +VMSRCDIR:=../../spurstack64src/vm +COGDEFS:= -DPharoVM=1 -DIMMUTABILITY=1 + +THIRDPARTYLIBS:=pkgconfig openssl libssh2 libgit2 libsdl2 zlib libpng freetype2 pixman cairo libgcc + +include ../common/Makefile + +# third-party libraries +# +include ../third-party/Makefile.pkgconfig +include ../third-party/Makefile.freetype2 +include ../third-party/Makefile.openssl +include ../third-party/Makefile.libssh2 +include ../third-party/Makefile.libgit2 +include ../third-party/Makefile.libsdl2 +include ../third-party/Makefile.zlib +include ../third-party/Makefile.pixman +include ../third-party/Makefile.libpng +include ../third-party/Makefile.cairo +include ../third-party/Makefile.libgcc + +# Since SDLDisplayPlugin will be included as internal plugin, we need to add the library to the path +# add to the end to allow thirdparty vars to be defined. +STDLIBS+= -L$(THIRDPARTYOUTDIR)/lib -lSDL2 \ No newline at end of file diff --git a/build.win64x64/pharo.stack.spur/Pharo.def.in b/build.win64x64/pharo.stack.spur/Pharo.def.in new file mode 100644 index 000000000..070ebef80 --- /dev/null +++ b/build.win64x64/pharo.stack.spur/Pharo.def.in @@ -0,0 +1,3 @@ +; Set the total stack size to 4 megabytes (0x400000), reserving 4Mb and +; committing 64k (0x10000) +STACKSIZE 0x400000,0x10000 diff --git a/build.win64x64/pharo.stack.spur/Pharo.exe.manifest b/build.win64x64/pharo.stack.spur/Pharo.exe.manifest new file mode 100644 index 000000000..700351c87 --- /dev/null +++ b/build.win64x64/pharo.stack.spur/Pharo.exe.manifest @@ -0,0 +1,30 @@ + + + +Pharo Smalltalk Virtual Machine + + + false + + + + + + + + diff --git a/build.win64x64/pharo.stack.spur/Pharo.ico b/build.win64x64/pharo.stack.spur/Pharo.ico new file mode 100644 index 0000000000000000000000000000000000000000..fa3669a19a856ab0d3fc35fc43fb50c4704d7594 GIT binary patch literal 353118 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

qn|)sY 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 D?h#+f literal 0 HcmV?d00001 diff --git a/build.win64x64/pharo.stack.spur/Pharo.rc b/build.win64x64/pharo.stack.spur/Pharo.rc new file mode 100644 index 000000000..615da13d7 --- /dev/null +++ b/build.win64x64/pharo.stack.spur/Pharo.rc @@ -0,0 +1,32 @@ +#ifdef _WIN32 +1 ICON DISCARDABLE "Pharo.ico" +2 ICON DISCARDABLE "Pharo.ico" +3 ICON DISCARDABLE "Pharo.ico" + +1 VERSIONINFO + FILEVERSION 5,0,0,0 + PRODUCTVERSION 5,0,0,0 + FILEFLAGSMASK 0x3fL + FILEFLAGS 0xaL + FILEOS 0x10001L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilin + BEGIN + VALUE "CompanyName", "Pharo.org\0" + VALUE "FileDescription", "Pharo Stack Spur Virtual Machine\0" + VALUE "FileVersion", FILEVERSIONSTRING + VALUE "LegalCopyright", "Copyright \251 https://github.com/opensmalltalk 1996-2017\0" + VALUE "ProductName", "Pharo Stack Spur\0" + VALUE "ProductVersion", "5.0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END +#endif diff --git a/build.win64x64/pharo.stack.spur/mvm b/build.win64x64/pharo.stack.spur/mvm new file mode 100644 index 000000000..686479939 --- /dev/null +++ b/build.win64x64/pharo.stack.spur/mvm @@ -0,0 +1,33 @@ +#!/bin/bash -e +A=;D=;F= +if [ $# = 0 ]; then + A=1;D=1;F=1 +else + while getopts 'Aadf?' opt "$@"; do + case $opt in + A) A=1;D=1;F=1;; + a) A=1;; + d) D=1;; + f) F=1;; + *) echo usage $0 [-A] [-a\ [-d] [-f]; exit 0;; + esac + done + if [ "$1" = -- ]; then + if [ "$A$D$F" = "" ]; then + A=1;D=1;F=1 + fi + fi + shift `expr $OPTIND - 1` +fi +if [ -n "$D" ]; then + rm -rf builddbg/vm/*.exe + make $@ debug 2>&1 | tee LOGD ; test ${PIPESTATUS[0]} -eq 0 +fi +if [ -n "$A" ]; then + rm -rf buildast/vm/*.exe + make $@ assert 2>&1 | tee LOGA ; test ${PIPESTATUS[0]} -eq 0 +fi +if [ -n "$F" ]; then + rm -rf build/vm/*.exe + make $@ 2>&1 | tee LOGF ; test ${PIPESTATUS[0]} -eq 0 +fi diff --git a/build.win64x64/pharo.stack.spur/plugins.ext b/build.win64x64/pharo.stack.spur/plugins.ext new file mode 100644 index 000000000..ae7dd42ad --- /dev/null +++ b/build.win64x64/pharo.stack.spur/plugins.ext @@ -0,0 +1,6 @@ +# Copied, perhaps edited, from ../../src/examplePlugins.ext +EXTERNAL_PLUGINS = \ +SurfacePlugin \ +SqueakSSL \ +FT2Plugin + diff --git a/build.win64x64/pharo.stack.spur/plugins.int b/build.win64x64/pharo.stack.spur/plugins.int new file mode 100644 index 000000000..8e83b90b0 --- /dev/null +++ b/build.win64x64/pharo.stack.spur/plugins.int @@ -0,0 +1,40 @@ +# Copied, perhaps edited, from ../../src/examplePlugins.int +INTERNAL_PLUGINS = \ +ADPCMCodecPlugin \ +AsynchFilePlugin \ +B3DAcceleratorPlugin \ +B2DPlugin \ +BitBltPlugin \ +BMPReadWriterPlugin \ +CroquetPlugin \ +ZipPlugin \ +DropPlugin \ +DSAPrims \ +FFTPlugin \ +FilePlugin \ +FloatArrayPlugin \ +FloatMathPlugin \ +HostWindowPlugin \ +SqueakFFIPrims \ +IA32ABI \ +JoystickTabletPlugin \ +JPEGReaderPlugin \ +JPEGReadWriter2Plugin \ +LargeIntegers \ +LocalePlugin \ +Matrix2x3Plugin \ +MIDIPlugin \ +MiscPrimitivePlugin \ +Mpeg3Plugin \ +RePlugin \ +SecurityPlugin \ +SerialPlugin \ +SocketPlugin \ +SoundCodecPrims \ +SoundGenerationPlugin \ +SoundPlugin \ +StarSqueakPlugin \ +UUIDPlugin \ +Win32OSProcessPlugin \ +SDL2DisplayPlugin \ +EventsHandlerPlugin diff --git a/build.win64x64/third-party/Makefile.cairo b/build.win64x64/third-party/Makefile.cairo new file mode 100644 index 000000000..bbfd81571 --- /dev/null +++ b/build.win64x64/third-party/Makefile.cairo @@ -0,0 +1,50 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/cairo.spec + +# plugin definitions +CAIROURL:=$(cairo_spec_download_url) +CAIROLIBNAME:=$(cairo_spec_product_name_windows) +CAIRODIR:=$(THIRDPARTYDIR)/$(cairo_spec_unpack_dir_name) +CAIROARCHIVE:=$(THIRDPARTYCACHEDIR)/$(cairo_spec_archive_name) +CAIROLIB:=$(THIRDPARTYINSTALLDIR)/$(CAIROLIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(CAIROLIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(CAIROARCHIVE): + $(WGET) -O $(CAIROARCHIVE) $(CAIROURL) + +# IMPORTANT: The hack for editing test/Makefile after ./configure +# is required on cygwin because it fails to truncate the file +# test/cairo-test-constructors.c +# when it overwrites it, causing compilation to fail on trailing lines +# We thus add a rule for removing the file before generating it if it exists +# sed '/pattern/i newLine' +# This works in version 1.14.28 but somehow fragile. +# If this cygwin bug is confirmed, the line should be added to Makefile.am +# and any other relevant file, and the change pushed back to cairo repository. +$(THIRDPARTYLIBDIR)/$(CAIROLIBNAME): $(CAIROARCHIVE) + tar x -f $(CAIROARCHIVE) -C $(THIRDPARTYDIR) + cd $(CAIRODIR) \ + && ./configure \ + --prefix="$(THIRDPARTYOUTDIR)" \ + --host=x86_64-w64-mingw32 \ + PKG_CONFIG="$(PKG_CONFIG)" \ + PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" \ + CFLAGS='$(THIRDPARTY_CFLAGS) -I$(THIRDPARTYINCLUDEDIR) ' \ + LDFLAGS='$(THIRDPARTY_LDFLAGS) -L$(THIRDPARTYLIBDIR) ' \ + --disable-silent-rules \ + --disable-xlib \ + --disable-dependency-tracking \ + && sed -i '/.* sh .\/make-/i\\ttest -e \$$\@ \&\& rm \$$\@' test/Makefile \ + && make \ + && make install + +$(CAIROLIB): pkgconfig libpng freetype2 pixman $(THIRDPARTYLIBDIR)/$(CAIROLIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(CAIROLIBNAME) $(THIRDPARTYINSTALLDIR) + +cairo: $(CAIROLIB) \ No newline at end of file diff --git a/build.win64x64/third-party/Makefile.freetype2 b/build.win64x64/third-party/Makefile.freetype2 new file mode 100644 index 000000000..b1d5b794c --- /dev/null +++ b/build.win64x64/third-party/Makefile.freetype2 @@ -0,0 +1,38 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/freetype2.spec + +# plugin definitions +FREETYPE2URL:=$(freetype2_spec_download_url) +FREETYPE2LIBNAME:=$(freetype2_spec_product_name_windows) +FREETYPE2DIR:=$(THIRDPARTYDIR)/$(freetype2_spec_unpack_dir_name) +FREETYPE2ARCHIVE:=$(THIRDPARTYCACHEDIR)/$(freetype2_spec_archive_name) +FREETYPE2LIB:=$(THIRDPARTYINSTALLDIR)/$(FREETYPE2LIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) $(THIRDPARTYINCLUDEDIR)/freetype2 +EXTRALIBS:=$(EXTRALIBS) $(FREETYPE2LIB) +PLUGINREQS:=$(PLUGINREQS) $(THIRDPARTYLIBS) + +$(FREETYPE2ARCHIVE): + $(WGET) -O $(FREETYPE2ARCHIVE) $(FREETYPE2URL) + +$(THIRDPARTYLIBDIR)/$(FREETYPE2LIBNAME): $(FREETYPE2ARCHIVE) + tar x -f $(FREETYPE2ARCHIVE) -C $(THIRDPARTYDIR) + cp ../third-party/Toolchain-cross-mingw32-cygwin.cmake $(FREETYPE2DIR) + test -d $(FREETYPE2DIR)/build || mkdir $(FREETYPE2DIR)/build + cd $(FREETYPE2DIR)/build \ + && cmake ..\ + -DCMAKE_TOOLCHAIN_FILE=../Toolchain-cross-mingw32-cygwin.cmake \ + -DCMAKE_INSTALL_PREFIX=$(THIRDPARTYOUTDIR) \ + -DWITH_PNG=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_C_FLAGS="$(THIRDPARTY_CFLAGS)" \ + && make \ + && make install + +$(FREETYPE2LIB): pkgconfig libpng $(THIRDPARTYLIBDIR)/$(FREETYPE2LIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(FREETYPE2LIBNAME) $(THIRDPARTYINSTALLDIR) + +freetype2: $(FREETYPE2LIB) \ No newline at end of file diff --git a/build.win64x64/third-party/Makefile.libgcc b/build.win64x64/third-party/Makefile.libgcc new file mode 100644 index 000000000..d79534c71 --- /dev/null +++ b/build.win64x64/third-party/Makefile.libgcc @@ -0,0 +1,30 @@ +# TODO: This is a very UGLY workaround, since I need to distribute LIBGCC_S_DW2-1.DLL with +# Pharo because some third-party libraries persist on require it as dependency. +# +# 14/12/2017: Of course I need to find a way to fix the real problem, but I do not have +# the time right now so I'm doing this :( + +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif + +LIBGCCLIBNAME:=libgcc_s_sjlj-1.dll +LIBGCCLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBGCCLIBNAME) +MINGWLIBDIR:=/usr/x86_64-w64-mingw32/sys-root/mingw/bin + +LIBPTHREADLIBNAME:=libwinpthread-1.dll +LIBPTHREADLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBPTHREADLIBNAME) + +LIBICONVLIBNAME:=iconv.dll +LIBICONVLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBICONVLIBNAME) + +$(LIBGCCLIB): $(LIBICONVLIB) $(LIBPTHREADLIB) + cp -f $(MINGWLIBDIR)/$(LIBGCCLIBNAME) $(THIRDPARTYINSTALLDIR) + +$(LIBPTHREADLIB): + cp -f $(MINGWLIBDIR)/$(LIBPTHREADLIBNAME) $(THIRDPARTYINSTALLDIR) + +$(LIBICONVLIB): + cp -f $(MINGWLIBDIR)/$(LIBICONVLIBNAME) $(THIRDPARTYINSTALLDIR) + +libgcc: $(LIBGCCLIB) diff --git a/build.win64x64/third-party/Makefile.libgit2 b/build.win64x64/third-party/Makefile.libgit2 new file mode 100644 index 000000000..d763f9755 --- /dev/null +++ b/build.win64x64/third-party/Makefile.libgit2 @@ -0,0 +1,40 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/libgit2.spec + +# plugin definitions +LIBGIT2URL:=$(libgit2_spec_download_url) +LIBGIT2LIBNAME:=$(libgit2_spec_product_name_windows) +LIBGIT2DIR:=$(THIRDPARTYDIR)/$(libgit2_spec_unpack_dir_name) +LIBGIT2ARCHIVE:=$(THIRDPARTYCACHEDIR)/$(libgit2_spec_archive_name) +LIBGIT2LIB:=$(THIRDPARTYINSTALLDIR)/$(LIBGIT2LIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(LIBGIT2LIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(LIBGIT2ARCHIVE): + $(WGET) -O $(LIBGIT2ARCHIVE) $(LIBGIT2URL) + +$(THIRDPARTYLIBDIR)/$(LIBGIT2LIBNAME): $(LIBGIT2ARCHIVE) + tar x -f $(LIBGIT2ARCHIVE) -C $(THIRDPARTYDIR) + cp ../third-party/Toolchain-cross-mingw32-cygwin.cmake $(LIBGIT2DIR) + cd $(LIBGIT2DIR) \ + && cmake \ + -DCMAKE_TOOLCHAIN_FILE=./Toolchain-cross-mingw32-cygwin.cmake \ + -DCMAKE_INSTALL_PREFIX=$(THIRDPARTYOUTDIR) \ + -DUSE_SSH=ON \ + -DBUILD_CLAR=OFF \ + -DLIBSSH2_FOUND=ON \ + -DLIBSSH2_INCLUDE_DIRS=$(THIRDPARTYINCLUDEDIR) \ + -DLIBSSH2_LIBRARIES=$(THIRDPARTYLIBDIR)/libssh2-1.dll \ + -DCMAKE_C_FLAGS="$(THIRDPARTY_CFLAGS)" \ + && make \ + && make install + +$(LIBGIT2LIB): libssh2 $(THIRDPARTYLIBDIR)/$(LIBGIT2LIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(LIBGIT2LIBNAME) $(THIRDPARTYINSTALLDIR) + +libgit2: $(LIBGIT2LIB) \ No newline at end of file diff --git a/build.win64x64/third-party/Makefile.libpng b/build.win64x64/third-party/Makefile.libpng new file mode 100644 index 000000000..bd3a76345 --- /dev/null +++ b/build.win64x64/third-party/Makefile.libpng @@ -0,0 +1,35 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/libpng.spec.win + +# plugin definitions +LIBPNGURL:=$(libpng_spec_download_url) +LIBPNGLIBNAME:=$(libpng_spec_product_name_windows) +LIBPNGDIR:=$(THIRDPARTYDIR)/$(libpng_spec_unpack_dir_name) +LIBPNGARCHIVE:=$(THIRDPARTYCACHEDIR)/$(libpng_spec_archive_name) +LIBPNGLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBPNGLIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(LIBPNGLIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(LIBPNGARCHIVE): + $(WGET) -O $(LIBPNGARCHIVE) $(LIBPNGURL) + +$(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME): $(LIBPNGARCHIVE) + tar x -f $(LIBPNGARCHIVE) -C $(THIRDPARTYDIR) + cd $(LIBPNGDIR) \ + && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ + --host=x86_64-w64-mingw32 \ + CFLAGS='$(THIRDPARTY_CFLAGS) -I$(THIRDPARTYINCLUDEDIR)' \ + CPPFLAGS='$(THIRDPARTY_CFLAGS) -I$(THIRDPARTYINCLUDEDIR)' \ + LDFLAGS='$(THIRDPARTY_LDFLAGS) -L$(THIRDPARTYLIBDIR)' \ + && make LN=CP LN_S=CP\ + && make install LN=CP LN_S=CP + +$(LIBPNGLIB): pkgconfig zlib $(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(LIBPNGLIBNAME) $(THIRDPARTYINSTALLDIR) + +libpng: $(LIBPNGLIB) diff --git a/build.win64x64/third-party/Makefile.libsdl2 b/build.win64x64/third-party/Makefile.libsdl2 new file mode 100644 index 000000000..d76b7dedc --- /dev/null +++ b/build.win64x64/third-party/Makefile.libsdl2 @@ -0,0 +1,34 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/libsdl2.spec + +# plugin definitions +LIBSDL2URL:=$(libsdl2_spec_download_url) +LIBSDL2LIBNAME:=$(libsdl2_spec_product_name_windows) +LIBSDL2DIR:=$(THIRDPARTYDIR)/$(libsdl2_spec_unpack_dir_name) +LIBSDL2ARCHIVE:=$(THIRDPARTYCACHEDIR)/$(libsdl2_spec_archive_name) +LIBSDL2LIB:=$(THIRDPARTYINSTALLDIR)/$(LIBSDL2LIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(LIBSDL2LIB) +PLUGINREQS:=$(PLUGINREQS) $(THIRDPARTYLIBS) + +$(LIBSDL2ARCHIVE): + $(WGET) -O $(LIBSDL2ARCHIVE) $(LIBSDL2URL) + +$(THIRDPARTYLIBDIR)/$(LIBSDL2LIBNAME): $(LIBSDL2ARCHIVE) + tar x -f $(LIBSDL2ARCHIVE) -C $(THIRDPARTYDIR) + cd $(LIBSDL2DIR) \ + && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ + --host=x86_64-w64-mingw32 \ + CFLAGS='$(THIRDPARTY_CFLAGS)' \ + LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ + && make \ + && make install + +$(LIBSDL2LIB): $(THIRDPARTYLIBDIR)/$(LIBSDL2LIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(LIBSDL2LIBNAME) $(THIRDPARTYINSTALLDIR) + +libsdl2: $(LIBSDL2LIB) \ No newline at end of file diff --git a/build.win64x64/third-party/Makefile.libssh2 b/build.win64x64/third-party/Makefile.libssh2 new file mode 100644 index 000000000..f471473dc --- /dev/null +++ b/build.win64x64/third-party/Makefile.libssh2 @@ -0,0 +1,36 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/libssh2.spec + +# plugin definitions +LIBSSH2URL:=$(libssh2_spec_download_url) +LIBSSH2LIBNAME:=$(libssh2_spec_product_name_windows) +LIBSSH2DIR:=$(THIRDPARTYDIR)/$(libssh2_spec_unpack_dir_name) +LIBSSH2ARCHIVE:=$(THIRDPARTYCACHEDIR)/$(libssh2_spec_archive_name) +LIBSSH2LIB:=$(THIRDPARTYINSTALLDIR)/$(LIBSSH2LIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(LIBSSH2LIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(LIBSSH2ARCHIVE): + $(WGET) -O $(LIBSSH2ARCHIVE) $(LIBSSH2URL) + +$(THIRDPARTYLIBDIR)/$(LIBSSH2LIBNAME): $(LIBSSH2ARCHIVE) + tar x -f $(LIBSSH2ARCHIVE) -C $(THIRDPARTYDIR) + cd $(LIBSSH2DIR) \ + && ./configure \ + --build=x86_64-w64-cygwin \ + --host=x86_64-w64-mingw32 \ + --prefix='$(THIRDPARTYOUTDIR)' \ + CFLAGS='$(THIRDPARTY_CFLAGS)' \ + LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ + && make \ + && make install + +$(LIBSSH2LIB): openssl $(THIRDPARTYLIBDIR)/$(LIBSSH2LIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(LIBSSH2LIBNAME) $(THIRDPARTYINSTALLDIR) + +libssh2: $(LIBSSH2LIB) diff --git a/build.win64x64/third-party/Makefile.openssl b/build.win64x64/third-party/Makefile.openssl new file mode 100644 index 000000000..96e2f23af --- /dev/null +++ b/build.win64x64/third-party/Makefile.openssl @@ -0,0 +1,37 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/openssl.spec + +# plugin definitions +OPENSSLURL:=$(openssl_spec_download_url) +OPENSSLLIBNAME:=$(openssl_spec_product1_name_windows) +OPENSSLALLLIBNAMES:=$(openssl_spec_product2_name_windows) $(OPENSSLLIBNAME) +OPENSSLDIR:=$(THIRDPARTYDIR)/$(openssl_spec_unpack_dir_name) +OPENSSLARCHIVE:=$(THIRDPARTYCACHEDIR)/$(openssl_spec_archive_name) +OPENSSLLIB:=$(THIRDPARTYINSTALLDIR)/$(OPENSSLLIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(OPENSSLLIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(OPENSSLARCHIVE): + $(WGET) -O $(OPENSSLARCHIVE) $(OPENSSLURL) + +$(THIRDPARTYLIBDIR)/$(OPENSSLLIBNAME): $(OPENSSLARCHIVE) + tar x -f $(OPENSSLARCHIVE) -C $(THIRDPARTYDIR) + sed -i 's/symlink/copy/g' $(OPENSSLDIR)/util/mklink.pl + sed -i 's/ln -s/cp/g' $(OPENSSLDIR)/util/point.sh + cd $(OPENSSLDIR) \ + && CC=x86_64-w64-mingw32-gcc LD='$(LD)' NM='$(NM)' RC='$(RC)' DLLTOOL='$(DLLTOOL)' DLLWRAP='$(DLLWRAP)' ./Configure mingw64 --prefix='$(THIRDPARTYOUTDIR)' shared $(THIRDPARTY_CFLAGS) \ + && make \ + && make install + +# Assuming building ssleay32.dll will also build libeay32.dll +$(OPENSSLLIB): $(THIRDPARTYLIBDIR)/$(OPENSSLLIBNAME) + @for each in $(OPENSSLALLLIBNAMES); do \ + cp -f $(THIRDPARTYLIBDIR)/$$each $(THIRDPARTYINSTALLDIR); \ + done + +openssl: $(OPENSSLLIB) diff --git a/build.win64x64/third-party/Makefile.pixman b/build.win64x64/third-party/Makefile.pixman new file mode 100644 index 000000000..aeaf1b72a --- /dev/null +++ b/build.win64x64/third-party/Makefile.pixman @@ -0,0 +1,37 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/pixman.spec + +# plugin definitions +PIXMANURL:=$(pixman_spec_download_url) +PIXMANLIBNAME:=$(pixman_spec_product_name_windows) +PIXMANDIR:=$(THIRDPARTYDIR)/$(pixman_spec_unpack_dir_name) +PIXMANARCHIVE:=$(THIRDPARTYCACHEDIR)/$(pixman_spec_archive_name) +PIXMANLIB:=$(THIRDPARTYINSTALLDIR)/$(PIXMANLIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(PIXMANLIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(PIXMANARCHIVE): + $(WGET) -O $(PIXMANARCHIVE) $(PIXMANURL) + +$(THIRDPARTYLIBDIR)/$(PIXMANLIBNAME): $(PIXMANARCHIVE) + tar x -f $(PIXMANARCHIVE) -C $(THIRDPARTYDIR) + cd $(PIXMANDIR) \ + && ./configure \ + --prefix='$(THIRDPARTYOUTDIR)' \ + --host=x86_64-w64-mingw32 \ + PKG_CONFIG="$(PKG_CONFIG)" \ + PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" \ + CFLAGS='$(THIRDPARTY_CFLAGS)' \ + LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ + && make \ + && make install + +$(PIXMANLIB): pkgconfig libpng $(THIRDPARTYLIBDIR)/$(PIXMANLIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(PIXMANLIBNAME) $(THIRDPARTYINSTALLDIR) + +pixman: $(PIXMANLIB) \ No newline at end of file diff --git a/build.win64x64/third-party/Makefile.pkgconfig b/build.win64x64/third-party/Makefile.pkgconfig new file mode 100644 index 000000000..0a32e5cfa --- /dev/null +++ b/build.win64x64/third-party/Makefile.pkgconfig @@ -0,0 +1,31 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/pkgconfig.spec.win + +# plugin definitions +PKGCONFIGURL:=$(pkgconfig_spec_download_url) +PKGCONFIGDIR:=$(THIRDPARTYDIR)/$(pkgconfig_spec_unpack_dir_name) +PKGCONFIGARCHIVE:=$(THIRDPARTYCACHEDIR)/$(pkgconfig_spec_archive_name) +PKGCONFIGBIN:=$(THIRDPARTYOUTDIR)/bin/pkg-config.exe +PKGCONFIGLIB:=$(THIRDPARTYOUTDIR)/lib/pkgconfig + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +PLUGINREQS:=$(THIRDPARTYLIBS) + +# export this values if pkg_config is included +PKG_CONFIG:=$(PKGCONFIGBIN) +PKG_CONFIG_PATH:=$(PKGCONFIGLIB) + +$(PKGCONFIGARCHIVE): + $(WGET) -O $(PKGCONFIGARCHIVE) $(PKGCONFIGURL) + +$(PKGCONFIGBIN): $(PKGCONFIGARCHIVE) + tar x -f $(PKGCONFIGARCHIVE) -C $(THIRDPARTYDIR) + cd $(PKGCONFIGDIR) \ + && ./configure --prefix='$(THIRDPARTYOUTDIR)' \ + && make LN=cp \ + && make LN=cp install + +pkgconfig: $(PKGCONFIGBIN) \ No newline at end of file diff --git a/build.win64x64/third-party/Makefile.zlib b/build.win64x64/third-party/Makefile.zlib new file mode 100644 index 000000000..42cf722fa --- /dev/null +++ b/build.win64x64/third-party/Makefile.zlib @@ -0,0 +1,40 @@ +ifndef THIRDPARTYDIR + include ../common/Makefile.lib.extra +endif +include ../../third-party/zlib.spec + +# plugin definitions +ZLIBURL:=$(zlib_spec_download_url) +ZLIBLIBNAME:=$(zlib_spec_product_name_windows) +ZLIBDIR:=$(THIRDPARTYDIR)/$(zlib_spec_unpack_dir_name) +ZLIBARCHIVE:=$(THIRDPARTYCACHEDIR)/$(zlib_spec_archive_name) +ZLIBLIB:=$(THIRDPARTYINSTALLDIR)/$(ZLIBLIBNAME) + +# ensure third-party library is built and recognised by plugins +INCDIRS:=$(INCDIRS) $(THIRDPARTYINCLUDEDIR) +EXTRALIBS:=$(EXTRALIBS) $(ZLIBLIB) +PLUGINREQS:=$(THIRDPARTYLIBS) + +$(ZLIBARCHIVE): + $(WGET) -O $(ZLIBARCHIVE) $(ZLIBURL) + +# IMPORTANT: the copy to libz.dll is because libssh2.dll config tries to load a "libz.dll" no +# matters the real name :( +$(THIRDPARTYLIBDIR)/$(ZLIBLIBNAME): $(ZLIBARCHIVE) + tar x -f $(ZLIBARCHIVE) -C $(THIRDPARTYDIR) + cd $(ZLIBDIR) \ + && make -fwin32/Makefile.gcc \ + PREFIX=x86_64-w64-mingw32- \ + CFLAGS='$(THIRDPARTY_CFLAGS)' \ + LDFLAGS='$(THIRDPARTY_LDFLAGS)' \ + && make install -fwin32/Makefile.gcc \ + SHARED_MODE=1 \ + INCLUDE_PATH='$(THIRDPARTYOUTDIR)/include' \ + LIBRARY_PATH='$(THIRDPARTYOUTDIR)/lib' \ + BINARY_PATH='$(THIRDPARTYOUTDIR)/bin' + cp $(THIRDPARTYLIBDIR)/zlib1.dll $(THIRDPARTYLIBDIR)/libz.dll + +$(ZLIBLIB): $(THIRDPARTYLIBDIR)/$(ZLIBLIBNAME) + cp -f $(THIRDPARTYLIBDIR)/$(ZLIBLIBNAME) $(THIRDPARTYINSTALLDIR) + +zlib: $(ZLIBLIB) \ No newline at end of file diff --git a/build.win64x64/third-party/Toolchain-cross-mingw32-cygwin.cmake b/build.win64x64/third-party/Toolchain-cross-mingw32-cygwin.cmake new file mode 100644 index 000000000..5fe0793cc --- /dev/null +++ b/build.win64x64/third-party/Toolchain-cross-mingw32-cygwin.cmake @@ -0,0 +1,17 @@ +# the name of the target operating system +SET(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +SET(CMAKE_C_COMPILER x86_64-w64-mingw32-clang) +SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-clang++) +SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +# here is the target environment located +SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 ) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file From ce2e77542a80cf52e9fc10f0d2e6208c228e34f7 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sat, 18 Mar 2017 23:35:04 +0100 Subject: [PATCH 33/36] Also add win64 pharo.stack.spur to appveyor --- .appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index e8c752fd3..48347a28f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -48,6 +48,11 @@ environment: CYG_ROOT: C:\cygwin64 CYG_SETUP: setup-x86_64.exe MINGW_ARCH: x86_64 + - FLAVOR: pharo.stack.spur + ARCH: win64x64 + CYG_ROOT: C:\cygwin64 + CYG_SETUP: setup-x86_64.exe + MINGW_ARCH: x86_64 matrix: fast_finish: false From 955b1bef42256c86bd2c9323d6ab07d92cfcf256 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sun, 19 Mar 2017 13:38:58 +0100 Subject: [PATCH 34/36] Correct 64bits reference for libgcc dll Note: Unlike 32bits VM, SDL2 do not depend anymore on this dll But currently cairo and libpixman do still depend on this libgcc We should probably add some -static-libgcc option. --- build.win64x64/third-party/Makefile.libgcc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.win64x64/third-party/Makefile.libgcc b/build.win64x64/third-party/Makefile.libgcc index d79534c71..902763a40 100644 --- a/build.win64x64/third-party/Makefile.libgcc +++ b/build.win64x64/third-party/Makefile.libgcc @@ -8,7 +8,7 @@ ifndef THIRDPARTYDIR include ../common/Makefile.lib.extra endif -LIBGCCLIBNAME:=libgcc_s_sjlj-1.dll +LIBGCCLIBNAME:=libgcc_s_seh-1.dll LIBGCCLIB:=$(THIRDPARTYINSTALLDIR)/$(LIBGCCLIBNAME) MINGWLIBDIR:=/usr/x86_64-w64-mingw32/sys-root/mingw/bin From 94f1ca9f0d045d05be581398021533bd37f29c18 Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sun, 19 Mar 2017 13:56:21 +0100 Subject: [PATCH 35/36] Take the specified COGDEFS into account Otherwise, -DPharoVM=1 option is not passed to C compiler and build fails --- build.win64x64/common/Makefile.tools | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.win64x64/common/Makefile.tools b/build.win64x64/common/Makefile.tools index e181e3ab9..2c7ba5f5f 100644 --- a/build.win64x64/common/Makefile.tools +++ b/build.win64x64/common/Makefile.tools @@ -28,9 +28,9 @@ NDEBUG:= -DAllocationCheckFiller=0xADD4E55 -D'VM_LABEL(foo)=0' endif ifeq ($(THREADING),multi) -COGDEFS:= -DCOGMTVM=1 -DDEBUGVM=$(DEBUGVM) +COGDEFS:= $(COGDEFS) -DCOGMTVM=1 -DDEBUGVM=$(DEBUGVM) else -COGDEFS:= -DCOGMTVM=0 -DDEBUGVM=$(DEBUGVM) +COGDEFS:= $(COGDEFS) -DCOGMTVM=0 -DDEBUGVM=$(DEBUGVM) endif # Set minimum version to WindowsXP (see /cygwin/usr/include//w32api/w32api.h) From 91e297996a7c46417cff1601817c809a06cc325e Mon Sep 17 00:00:00 2001 From: nicolas-cellier-aka-nice Date: Sun, 19 Mar 2017 17:18:55 +0100 Subject: [PATCH 36/36] Exclude SqueakSSL from plugins in win64 Currently, the build is failing for this plugin. To be further inquired... --- build.win64x64/pharo.stack.spur/plugins.ext | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.win64x64/pharo.stack.spur/plugins.ext b/build.win64x64/pharo.stack.spur/plugins.ext index ae7dd42ad..81024caee 100644 --- a/build.win64x64/pharo.stack.spur/plugins.ext +++ b/build.win64x64/pharo.stack.spur/plugins.ext @@ -1,6 +1,5 @@ # Copied, perhaps edited, from ../../src/examplePlugins.ext EXTERNAL_PLUGINS = \ SurfacePlugin \ -SqueakSSL \ FT2Plugin - +#SqueakSSL