Login Page - Create Account

Support Board


Date/Time: Mon, 25 Nov 2024 22:19:19 +0000



[User Discussion] - Debian 12 (Bookworm), Wine 5, and Sierra Chart

View Count: 461

[2024-01-25 04:50:52]
ijtraderji - Posts: 6
I had been using Debian 10 & 11 with SierraChart using Wine and the IQFeed data feed. It all worked beautifully, through all versions. My last version of Debian 11 came with Wine-5.0.3 (stable) as the most recent Wine package for Debian 11.

When I upgraded to Debian 12 it had as its standard package Wine-8.0. I had problems with both SierraChart and the IQFeed client. Downgrading multiple times through WineHQ did not help. I came to learn via a different route that IO Completion Ports (used for high performance networking and also uses Overlapped I/O) was working in Wine 5.0.x but broken by Wine 6.x.

None of the installation tools I tried (WineHQ packages, Bottles, or Debian older versions) had a Wine 5.0.x stable build for Debian Bookworm. So I decided to try to build Wine-5.0.5 (stable) from source. I encountered a few different problems but was able to find the solutions, and I am back to having a flawlessly working Wine / Sierra Chart / IQFeed configuration. I run this on a 24-core CPU and rarely experience any crashes. In my tests I did not find that using the single receive buffer workaround helped performance - I have been able to use this version of Sierra Chart and prior versions on wine 5.0.x with no issues throughout Debian 10 & 11, and now Debian 12.

The purpose of my post is to share the build process for Wine-5.0.5 from source, and to confirm that it works very well on Debian 12 (Bookworm) with Sierra Chart v2564 64-bit and the latest IQFeed client. I also attached the patched wine-5.0.5 (stable) source code and a build script, which is in the source tarball and is named make-wineWoW.sh. You may have to make the script executable to run it. Out of the box it expects to be extracted in ~/Documents/SourceCode/wine-5.0.5. Time to execute varies with the CPU power you have, on my 24 CPU system it takes 6 minutes.

File hashes: wine-5.0.5.tar.xz
sha256sum 5afe1d991499deb87817d4245f4bcba0e65649f9dfafd9bc04eb2fb55dfd2cac
md5sum edb975d370a65e6b1d2a8ad4cab727c3

1. Installing 64-bit dependencies:
sudo apt install build-essential gcc-multilib gcc-mingw-w64 libasound2-dev libpulse-dev libdbus-1-dev libfontconfig-dev libfreetype-dev libgnutls28-dev libgl-dev libunwind-dev libx11-dev libxcomposite-dev libxcursor-dev libxfixes-dev libxi-dev libxrandr-dev libxrender-dev libxext-dev bison flex libmpg123-dev libcups2-dev libsane-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libosmesa6-dev libvulkan-dev libxml2-dev libxinerama-dev libxxf86vm-dev libglu1-mesa-dev libpcap-dev libncurses-dev liblcms2-dev libudev-dev libsdl2-dev libfaudio-dev libvkd3d-dev libldap-dev gettext libxslt1-dev libopenal-dev libva-dev libgtk-3-dev libudev-dev libgphoto2-dev libkrb5-dev
2. Installing 32-bit dependencies (need to make sure added architecture i386 first):
sudo apt install libasound2-dev:i386 libc6-dev:i386 libcups2-dev:i386 libdbus-1-dev:i386 libfaudio-dev:i386 libfontconfig-dev:i386 libfreetype-dev:i386 libgl-dev:i386 libglu1-mesa-dev:i386 libgnutls28-dev:i386 libgstreamer-plugins-base1.0-dev:i386 libgstreamer1.0-dev:i386 liblcms2-dev:i386 libx11-dev:i386 libldap-dev:i386 libmpg123-dev:i386 libncurses-dev:i386 libopenal-dev:i386 libosmesa6-dev:i386 libpcap-dev:i386 libpulse-dev:i386 libsane-dev:i386 libsdl2-dev:i386 libudev-dev:i386 libunwind-dev:i386 libvkd3d-dev:i386 libvulkan-dev:i386 libxcomposite-dev:i386 libxcursor-dev:i386 libxfixes-dev:i386 libxi-dev:i386 libxinerama-dev:i386 libxml2-dev:i386 libxrandr-dev:i386 libxrender-dev:i386 libxslt1-dev:i386 libxxf86vm-dev:i386 libva-dev:i386 libgtk-3-dev:i386 libudev-dev:i386 libgphoto2-dev:i386 libkrb5-dev:i386
3. Build Wine 64 bit with 32 bit support (follows WineHQ instructions):
# Assumes ~/Documents/SourceCode/wine-5.0.5 is the top source code folder. Wine 5.0.5 source tarball can be downloaded from WineHQ https://dl.winehq.org/wine/source/ . Once built correctly the Wine binaries will be in /opt/wine-5.0.5/bin .
mkdir ~/Documents/SourceCode/wine-5.0.5/wine64-build/
mkdir ~/Documents/SourceCode/wine-5.0.5/wine32-build/
cd ~/Documents/SourceCode/wine-5.0.5/wine64-build/
PKG_CONFIG_PATH=
../configure --enable-win64 --prefix=/opt/wine-5.0.5
# change -j option to number of CPUs for faster makes
make -j4
cd ~/Documents/SourceCode/wine-5.0.5/wine32-build/
PKG_CONFIG_PATH=/usr/lib32
../configure --with-wine64=../wine64-build --prefix=/opt/wine-5.0.5
# change -j option to number of CPUs for faster makes
make -j4
cd ~/Documents/SourceCode/wine-5.0.5/wine64-build/
sudo make install
4. In case of build errors, the following patches need to be applied. Didn’t know how to do this so I hand-edited each file, which works. Note the file sincos.c has to be created in the dlls/msvcrt folder.

iff --git a/dlls/msvcr100/Makefile.in b/dlls/msvcr100/Makefile.in
index c5a7710ea41..edf4b4d4407 100644
--- a/dlls/msvcr100/Makefile.in
+++ b/dlls/msvcr100/Makefile.in
@@ -34,6 +34,7 @@ C_SRCS = \
process.c \
scanf.c \
scheduler.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcr110/Makefile.in b/dlls/msvcr110/Makefile.in
index d2ba0ac29e3..c3ee2ca7e8e 100644
--- a/dlls/msvcr110/Makefile.in
+++ b/dlls/msvcr110/Makefile.in
@@ -34,6 +34,7 @@ C_SRCS = \
process.c \
scanf.c \
scheduler.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcr120/Makefile.in b/dlls/msvcr120/Makefile.in
index 68a85c581d1..953e9760ca0 100644
--- a/dlls/msvcr120/Makefile.in
+++ b/dlls/msvcr120/Makefile.in
@@ -34,6 +34,7 @@ C_SRCS = \
process.c \
scanf.c \
scheduler.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcr70/Makefile.in b/dlls/msvcr70/Makefile.in
index e6dd41b32a5..4c443ecd7f6 100644
--- a/dlls/msvcr70/Makefile.in
+++ b/dlls/msvcr70/Makefile.in
@@ -33,6 +33,7 @@ C_SRCS = \
onexit.c \
process.c \
scanf.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcr71/Makefile.in b/dlls/msvcr71/Makefile.in
index 7795ce1ae24..6f51a326c6b 100644
--- a/dlls/msvcr71/Makefile.in
+++ b/dlls/msvcr71/Makefile.in
@@ -33,6 +33,7 @@ C_SRCS = \
onexit.c \
process.c \
scanf.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcr80/Makefile.in b/dlls/msvcr80/Makefile.in
index 7d11f65b3a3..3e2da553562 100644
--- a/dlls/msvcr80/Makefile.in
+++ b/dlls/msvcr80/Makefile.in
@@ -33,6 +33,7 @@ C_SRCS = \
onexit.c \
process.c \
scanf.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcr90/Makefile.in b/dlls/msvcr90/Makefile.in
index 9cb511bbe06..4a49fcfd254 100644
--- a/dlls/msvcr90/Makefile.in
+++ b/dlls/msvcr90/Makefile.in
@@ -33,6 +33,7 @@ C_SRCS = \
onexit.c \
process.c \
scanf.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcrt/Makefile.in b/dlls/msvcrt/Makefile.in
index 486e6f5491b..16405262fca 100644
--- a/dlls/msvcrt/Makefile.in
+++ b/dlls/msvcrt/Makefile.in
@@ -38,6 +38,7 @@ C_SRCS = \
process.c \
scanf.c \
scheduler.c \
+ sincos.c \
string.c \
thread.c \
time.c \
diff --git a/dlls/msvcrt/sincos.c b/dlls/msvcrt/sincos.c
new file mode 100644
index 00000000000..1a34c50f034
--- /dev/null
+++ b/dlls/msvcrt/sincos.c
@@ -0,0 +1,40 @@
+/*
+ * sincos implementation
+ *
+ * Copyright 2021 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#if 0
+#pragma makedep implib
+#endif
+
+#include <math.h>
+
+/* GCC may optimize a pair of sin(), cos() calls to a single sincos() call,
+ * which is not exported by any msvcrt version. */
+
+void sincos(double x, double *s, double *c)
+{
+ *s = sin(x);
+ *c = cos(x);
+}
+
+void sincosf(float x, float *s, float *c)
+{
+ *s = sinf(x);
+ *c = cosf(x);
+}
diff --git a/dlls/ucrtbase/Makefile.in b/dlls/ucrtbase/Makefile.in
index a576cf0250b..2910016f29f 100644
--- a/dlls/ucrtbase/Makefile.in
+++ b/dlls/ucrtbase/Makefile.in
@@ -37,6 +37,7 @@ C_SRCS = \
printf.c \
process.c \
scanf.c \
+ sincos.c \
string.c \
thread.c \
time.c \

diff --git a/dlls/wldap32/init.c b/dlls/wldap32/init.c
index afaef3b52f2..d3409d1465b 100644
--- a/dlls/wldap32/init.c
+++ b/dlls/wldap32/init.c
@@ -322,7 +322,7 @@ exit:
* The timeout parameter may be NULL in which case a default timeout
* value will be used.
*/
-ULONG CDECL ldap_connect( WLDAP32_LDAP *ld, struct l_timeval *timeout )
+ULONG CDECL WLDAP32_ldap_connect( WLDAP32_LDAP *ld, struct l_timeval *timeout )
{
TRACE( "(%p, %p)\n", ld, timeout );

diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h
index 69035050961..a6cddabf559 100644
--- a/dlls/wldap32/winldap_private.h
+++ b/dlls/wldap32/winldap_private.h
@@ -320,7 +320,7 @@ ULONG CDECL ldap_compare_ext_sA(WLDAP32_LDAP*,PCHAR,PCHAR,PCHAR,struct WLDAP32_b
ULONG CDECL ldap_compare_ext_sW(WLDAP32_LDAP*,PWCHAR,PWCHAR,PWCHAR,struct WLDAP32_berval*,PLDAPControlW*,PLDAPControlW*);
ULONG CDECL ldap_compare_sA(WLDAP32_LDAP*,PCHAR,PCHAR,PCHAR);
ULONG CDECL ldap_compare_sW(WLDAP32_LDAP*,PWCHAR,PWCHAR,PWCHAR);
-ULONG CDECL ldap_connect(WLDAP32_LDAP*,LDAP_TIMEVAL*);
+ULONG CDECL WLDAP32_ldap_connect(WLDAP32_LDAP*,LDAP_TIMEVAL*);
WLDAP32_LDAP * CDECL ldap_conn_from_msg(WLDAP32_LDAP*,WLDAP32_LDAPMessage*);
ULONG CDECL ldap_control_freeA(LDAPControlA*);
ULONG CDECL ldap_control_freeW(LDAPControlW*);
diff --git a/dlls/wldap32/wldap32.spec b/dlls/wldap32/wldap32.spec
index 8a8e29fc198..33e630dea87 100644
--- a/dlls/wldap32/wldap32.spec
+++ b/dlls/wldap32/wldap32.spec
@@ -75,7 +75,7 @@
85 cdecl ldap_compare_ext_sW(ptr wstr wstr wstr ptr ptr ptr)
86 cdecl ldap_compare_sA(ptr str str str)
87 cdecl ldap_compare_sW(ptr wstr wstr wstr)
- 88 cdecl ldap_connect(ptr ptr)
+ 88 cdecl ldap_connect(ptr ptr) WLDAP32_ldap_connect
89 cdecl ldap_control_free(ptr) ldap_control_freeA
90 cdecl ldap_control_freeA(ptr)
91 cdecl ldap_control_freeW(ptr)
Date Time Of Last Edit: 2024-01-25 15:56:42
attachmentwine-5.0.5.tar.xz - Attached On 2024-01-25 15:38:09 UTC - Size: 23.94 MB - 150 views
[2024-01-25 08:05:33]
ticinotrader - Posts: 392
If you have not already done so, I recommend that you read the following thread:

Slow data with v2524
[2024-01-25 15:55:21]
ijtraderji - Posts: 6
Thanks for the link. In my tests as I changed wine versions (all the way up to 9.0 stable) I found problematic behavior with either SC, IQFeed, or both. When doing the tests I did not know about the single network buffer fix, so was just running with multiple buffers. However, I have a simple high performance networking application which uses IO Completion Ports and Overlapped I/O and it stopped working properly some time after wine 5.0.5 (wine 5.22 staging and 6.x fail). So I had reason to believe the newer Wine versions were part of the problem.

In the Wine enthusiast community it is understood that certain things work better on certain versions of Wine. That's why there's so many tools to manage Wine versions (Proton, Lutris, PlayOnLinux, CrossOver, Bottles, etc.).

In the end, we just want our target applications to run flawlessly without all the added headaches that come with running Windows. My experience was that with Debian 12 and the build process described above, my headaches were solved (for now). I get great multithreaded performance and don't have to use the single buffer. My build also works great with IQFeed's client, which I need, and another trading application which I also need.

I went back and attached the patched source code I used and a build script to the post above. If you use it, please post if it works on your Linux. For Debian users, building from source code would only be needed for Debian 12 (Bookworm) as the prior versions let you install wine-5.0.3 (stable) which does well with SierraChart.
Date Time Of Last Edit: 2024-01-25 16:06:38

To post a message in this thread, you need to log in with your Sierra Chart account:

Login

Login Page - Create Account