From 42508fd3867f3616e41cd29ab292549405b39572 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 4 Sep 2024 11:16:44 +0200 Subject: [PATCH] Import pages from MediaWiki. --- Configuration.md | 12 + Configuration/CUDA.md | 43 ++++ Configuration/Dll-Redirects.md | 56 +++++ Configuration/Environment-Variables.md | 106 +++++++++ Configuration/Miscellaneous.md | 38 +++ Configuration/PhysX.md | 22 ++ Configuration/Registry-redirects.png | Bin 0 -> 47827 bytes Contributing.md | 112 +++++++++ Packaging.md | 156 ++++++++++++ Usage.md | 52 ++++ home.md | 315 +++++++++++++++++++++++++ 11 files changed, 912 insertions(+) create mode 100644 Configuration.md create mode 100644 Configuration/CUDA.md create mode 100644 Configuration/Dll-Redirects.md create mode 100644 Configuration/Environment-Variables.md create mode 100644 Configuration/Miscellaneous.md create mode 100644 Configuration/PhysX.md create mode 100644 Configuration/Registry-redirects.png create mode 100644 Contributing.md create mode 100644 Packaging.md create mode 100644 Usage.md create mode 100644 home.md diff --git a/Configuration.md b/Configuration.md new file mode 100644 index 0000000..1ed58bf --- /dev/null +++ b/Configuration.md @@ -0,0 +1,12 @@ +## Available topics + +- [CUDA Configuration](Configuration/CUDA) + +- [Dll Redirects Configuration](Configuration/Dll-Redirects) + +- [Environment Variables + Configuration](Configuration/Environment-Variables) + +- [Miscellaneous Configuration](Configuration/Miscellaneous) + +- [PhysX Configuration](Configuration/PhysX) diff --git a/Configuration/CUDA.md b/Configuration/CUDA.md new file mode 100644 index 0000000..af1c072 --- /dev/null +++ b/Configuration/CUDA.md @@ -0,0 +1,43 @@ +Starting with version 1.7.34 Wine Staging provides support for CUDA, a +GPU computation platform by NVIDIA. CUDA is often used by games to run +physic calculations on the GPU or in scientific environments to speed up +simulations. For games there is also a separate NVIDIA library called +[PhysX](Configuration/PhysX) which makes use of CUDA and +provides some predefined physic simulations. + +In order to use CUDA based applications you need to have a NVIDIA +graphic card (\>= Geforce 8xxx) and you need to use the proprietary +NVIDIA driver. Make sure that you also have the 32 bit driver files +installed on 64 bit systems. Please note that there is a +[bug](https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-331/+bug/1361207) +affecting some Ubuntu distributions, that the necessary kernel modules +for CUDA (`nvivida_uvm`) are not loaded automatically. As a workaround +you can manually install the package `nvidia-modprobe` package (for +example with `sudo apt-get install nvidia-modprobe`) if you encounter +this problem. + +The easiest way to verify that everything is set up correctly is to use +the linux version of [CUDA-Z](https://cuda-z.sourceforge.net/). If the +application starts and shows information about your GPU everything is +working fine. If you only get an error message it is possible that you +are either missing some files or not all required kernel modules are +loaded. + +There is no additional configuration required for Wine Staging and +applications can directly start using CUDA. Nevertheless, the +implementation is not yet complete and some functions (like directly +accessing DirectX objects from CUDA) are unimplemented. In case an +application will try to use one of this functions it is going to +abort/crash. If CUDA is only an optional dependency of the program you +want to use, and it doesn't work with our incomplete implementation, it +might be useful to disable CUDA support again until the support is good +enough. Feel free to report a bug in this case, and we will try to fix +it till the next release. + +## Disable CUDA + +Hiding CUDA support from applications can be done by deactivating the +nvcuda.dll through winecfg. Open `winecfg`, go to the Libraries tab, add +an override for `nvcuda` and change it to disable by pressing the edit +button. If you would like to re-enable the support, you just need to +remove this line again. diff --git a/Configuration/Dll-Redirects.md b/Configuration/Dll-Redirects.md new file mode 100644 index 0000000..923e3de --- /dev/null +++ b/Configuration/Dll-Redirects.md @@ -0,0 +1,56 @@ +Wine Staging 1.7.33 introduced a feature called DLL Redirects which make +it possible to dynamically exchange the DLLs a program tries to load. +This feature is currently used by our CSMT implementation to replace +`wined3d.dll` with `wined3d-csmt.dll` to allow switching it on and off +at runtime. These redirects are controlled through registry keys and +work with builtin/wine dlls and native/win32 dlls. + +## Adding redirects + +In order to add a redirection, you need to create a registry key using +regedit. You can either create a global dll redirection under + + HKEY_CURRENT_USER\Software\Wine\DllRedirects + +or an application specific one under + + HKEY_CURRENT_USER\Software\Wine\AppDefaults\[app.exe]\DllRedirects + +(replace \[app.exe\] with the actual filename of the executable). + +If you want to add a redirect from broken.dll to working.dll, you need +to create a string value (REG_SZ) with broken as name (you need to strip +off the .dll extension) and working.dll as value. Alternatively you can +also specify a full win32 path to the dll. + +Here you can see what it looks like for the CSMT redirect:
+![](/Configuration/Registry-redirects.png "registry-redirects.png") + +## How does it work? + +We added some logic to Wine's dll loader to replace the filename of the +loaded dll. Wine itself thinks that the original dll is loaded and +therefore all API functions like `GetModuleFileName` or +`GetModuleHandle` will still work as if the original was loaded. This +makes it almost impossible for an application to find out that the wrong +library is loaded. There are some ways like checking the actual file +content of the library against the loaded memory chunks but it is +unlikely that an application implements something like this. However, +this approach also has some drawbacks which may be fixed in future +versions. + +## Drawbacks + +You can only redirect existing dlls because an application can query the +full path of a loaded library and it is not clear which path we should +return for non existing dlls. A library may be anywhere in the programs +search path (C:\windows\system32, current working directory, ...) and we +therefore require the file to exist. + +The current implementation of DLL redirects does not store any +information about loaded dlls which were redirected. This causes trouble +if an application tries to manually load the target of a redirection +while the same library is already loaded under a different name. Wine +does not notice that the library was already loaded and tries to load it +a second time. The behaviour of builtin/native DLLs is slightly +different, but in both cases an application might be confused. diff --git a/Configuration/Environment-Variables.md b/Configuration/Environment-Variables.md new file mode 100644 index 0000000..705e7f1 --- /dev/null +++ b/Configuration/Environment-Variables.md @@ -0,0 +1,106 @@ +Some features of Wine Staging are experimental and affect so many parts +of Wine that they cannot be configured through winecfg or a registry +key. In these cases we decided to add an environment variable that +allows you to enable/disable the feature. The following list contains a +description of the supported environment variables and what they are +supposed to do. + +## Write Copy + +The `STAGING_WRITECOPY` environment variable can be used to simulate +the memory management system of Windows more precisely. Windows loads +dlls only a single time into the memory when multiple applications +want to use the same dll. This should lower the memory usage and +Windows will only create a copy of them if an application tries to +modify them (Copy-on-Write). On Wine it will have no effect on the +memory usage, but an application can check if a dll was already +modified in the current process and some programs (for example, +[Voobly](#29384)) fail if this information is incorrect. + +You can enable the feature simply by starting a program using + + STAGING_WRITECOPY=1 /opt/wine-staging/bin/wine game.exe + +The feature is currently not enabled by default since it revealed +further bugs in Wine. Please help us by testing programs with this +feature enabled and report bugs in our [bug +tracker](https://bugs.winehq.org) so that we can enable this feature by +default in future versions. + +## Shared Memory + +Wine Staging can optimize some wineserver calls by using shared memory. +While this only brings a small performance improvement for most +programs, it can result in a big improvement for applications which use +specific API functions in an excessive way. This feature can be enabled +through `STAGING_SHARED_MEMORY` and is only available for Linux with +kernel \>= 3.17 at the moment. We are going to enable it for more +platforms in future versions. + +In order to use this feature make sure that the wineserver was started +using this environment variable (i.e. no other programs are currently +running in the WINEPREFIX) + + STAGING_SHARED_MEMORY=1 /opt/wine-staging/bin/wine game.exe + +## Realtime Priorities + +The Realtime Priority patchset allows applications running in Wine to +use higher priority levels on Linux than they are usually allowed to +use. + +You can change the priority level on the wineserver by setting the +`STAGING_RT_PRIORITY_SERVER` environment variable, which has a similar +effect like using shared memory. The wineserver is usually idling and +waiting for new requests, so setting a higher priority causes the system +to schedule the wineserver faster and double the throughput in +wineserver benchmarks. + +It is also possible to change the priority of all programs running in +Wine by setting `STAGING_RT_PRIORITY_BASE` though this will usually not +result in big performance improvements. The linux kernel will reduce the +priority again if an application does not idle often enough and most +games therefore may even run slower this way. We recommend changing the +priority only for the wineserver since this gives you a small +performance improvement without the risk of slowing down your +application, but feel free to try it yourself. + +Before you can make use of the realtime priority levels, you need to +give the wineserver the permission to use them. + +### setcap + +The easiest and simplest way is to set file capabilities on the +wineserver: + + sudo setcap cap_sys_nice+ep /opt/wine-staging/bin/wineserver + +This should be enough on most systems, but will be reset on a wine +staging update. + +### limits.conf + +Alternatively, you can give your user the permission to use the realtime +priorities in all programs. Some distributions already provide an audio +group that grants you these permissions. If this is not the case, you +can add the following entry to /etc/security/lmits.conf: + + @userOrGroup - rtprio 90 + @userOrGroup - nice -10 + +Now logout and back in. + +### Use RT priorities + +In case you want to change the priority of the wineserver, make sure +that the server was not started yet. Now start your application using: + + STAGING_RT_PRIORITY_SERVER=90 STAGING_RT_PRIORITY_BASE=90 /opt/wine-staging/bin/wine test.exe + +The priority must be between 1 (lowest) and 99 (highest). You do not +need to use both of them, simply skip one if you don't want to enable it +or set it to 0. Note that you probably should not use 99, as the kernel +has some housekeeping threads running at this priority. More information +can also be found in the [patch submission +request](https://bugs.wine-staging.com/show_bug.cgi?id=183#c0) where +this feature was added. diff --git a/Configuration/Miscellaneous.md b/Configuration/Miscellaneous.md new file mode 100644 index 0000000..08e2e0e --- /dev/null +++ b/Configuration/Miscellaneous.md @@ -0,0 +1,38 @@ +All Wine Staging specific registry settings which do not have a +dedicated wiki entry are mentioned on this page. You can change the +settings using `regedit`. + +## Tablet / Media Center + +On Windows application can check through the `GetSystemMetrics` API +function whether the system is a tablet and/or Media Center. Wine +Staging contains a patch to configure the return value through the +registry. + +| Registry Key (HKCU\Software\Wine\\) | Type | Values | Description | +|-------------------------------------|-------|--------|------------------------------------------------| +| ...\System\TabletPC | DWORD | 0 / 1 | 1 if the system is a tablet pc, otherwise 0 | +| ...\System\MediaCenter | DWORD | 0 / 1 | 1 if the system is a media center, otherwise 0 | + +The same values can also be configured using the application specific +registry keys. + +## DirectSound Mixing buffers + +Wine does not support hardware mixing of sound buffers (and most linux +sound drivers don't support it either) and therefore the whole sound +mixing is done on the CPU. This can cause trouble for games that use +DirectSound with many different sound buffers, especially if they have +different sampling rates. Some games even use one sound buffer per sound +causing Wines complicated sound mixing algorithm to slow down the whole +game. We added a patch to Wine Staging which uses a faster but slightly +more incorrect algorithm if a specific number of sound buffers is +exceeded. The default limit is 4 but it can be changed through the +following registry key. + +| Registry Key (HKCU\Software\Wine\\) | Type | Values | Description | +|-------------------------------------|-------|--------|--------------| +| ...\DirectSound\HQBuffersMax | DWORD | \>= 0 | buffer limit | + +The same values can also be configured using the application specific +registry keys. diff --git a/Configuration/PhysX.md b/Configuration/PhysX.md new file mode 100644 index 0000000..f3c4fb8 --- /dev/null +++ b/Configuration/PhysX.md @@ -0,0 +1,22 @@ +PhysX is a physics simulation library provided by NVIDIA which is +commonly used in games. Wine supports this library since quite some +time in the CPU fallback mode which means that all physics +calculations are done on your CPU. On Windows PhysX also supports +offloading of calculations to NVIDIA based graphic cards through +[CUDA](Configuration/CUDA). Starting with Wine Staging 1.7.34 the +necessary features were added to provide the same possibility in Wine. + +If you want to use GPU accelerated PhsyX you should first make sure that +[CUDA](Configuration/CUDA) is set up correctly as described in +the according Wiki page. The next step is to install the PhysX software +into the wineprefix containing the program requiring PhysX support. Many +applications will directly install the necessary dlls during the +installation, but you can also download them from the [NVIDIA +website](https://www.nvidia.com/object/physx-9.14.0702-driver.html). +PhysX should now be able to offload calculations to a NVIDIA GPU. + +You can verify that PhsysX is working properly using the [PhysX +FluidMark](https://www.ozone3d.net/benchmarks/physx-fluidmark/) +Benchmark. The software displays in the start dialog whether GPU +acceleration is available. You can also compare the FPS between GPU and +CPU based simulations by changing the GPU checkbox in the start dialog. diff --git a/Configuration/Registry-redirects.png b/Configuration/Registry-redirects.png new file mode 100644 index 0000000000000000000000000000000000000000..16140d66d97c9a0bde07431eacbdb3a1a8842948 GIT binary patch literal 47827 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

>C9REF(BnQw?qMA%m3k-NT-eVz^W&?E2DE=ykk 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 vsAX;2s<{%8v;q z8`bit5&L?CJ)&P+>obaPzbIh{Cae%cXLe6ZC!_Pf~U70*(HX)Q`czEf*OC$> zHaAOtUfflSG~WPeV`5>E`8^FmAAPeEFf&U(y*t?WR25dq(%qV`DqI+hT8l?Qk{AqW zYm(oM1&9kCU-P-ro(g4A+nHZo;m6$;iKTO{b<}+!bFb+mWqhOGUjC9wAfnaV63VbR zJbPHk6Gy!RZ}LSCU^%_FogIBAGZ1IU;HzA}%!0Hjzm(T+E{uIoJiXKUw;3+4KVi%B zkY5~Z7T%%Cnz(GG)k*Buz2HMXfGg@SElLQ=nF(OV+mxi$aKj^uF%5#OTK^@gF7HBv zTfikO6rcvzAp#{0;^gDk!Bmvar^o=AcIoL_$Jz-mtXSK$#gOI)G!pMn@8h#T7u{>T z#|;d!Hy7Zuq3htIFR~c;1tS~Z!yQo!$ggC@=A{zmY;Kva&{i z8d{FO2?_WyKCN*5_zK)Gn)Arr=H=(FbFT&T6>l6(pIPJCvyNtaZwB-2OupaH%#bFw zJ2Tp`$7L2M(9LKZ3@NinfzX z8{@ul(M}f6@4=KVYs>LcEq#Bym!a7g%f!W}Uq22^iwdVdfLl+e3&wq4+Q+gPpP$Ue zhd_M+bam?7T zobrBAbKiRYczY#G_ek4;QL3ArG8He=xF@J;}@&{qL>K(<8od&fTqQ)ULn)X7K6g%(QsqAw#U;5qgc{ng(%oN3g zw$VH9kG8}u4yGX?;{5eDKX09XLYjjHe`4|x>I|yXN8q0b4^{e^SG@X}l|S+Jkpa`` zT91a<^XvQ>n|b~B(qoXZ%+tbEX`#HFd&^tbUyi=J>UZ2aU!p2Ff3vr3NHF@1T!LSB zcm|0-Mp2{q(I?8(R?um7fYA7tap0`OK;hYpMTgfYMba6RTGKXgUW5wE+y zbs*ilwHe8HgD-M#YNYCP`XlX^_UEtcsGcxbvh%(Q&)prqyYBB|a>;W4RQc%kT z{D3-5-2A)|KMTv9bX9ra(U)Id89d1NYC>m#mb=a`remt6Kc4N# z)~SkjxBk4Ke?|SIb5bg1?KUt6m@@5Kp-;7%-~qxOt9+KU90blz%z?HrVs{1fp6H9Y z*h2r?(}_~r#&F#@;B808H=ngU20po^t3lhb1^BWD_wIdK@?fmu>XJtL16s&~afl__ z6FR2%uT4lQ-ava$b&B}T4D_4Ap0v$nQuK_Rl;6R{l~Ip-z^nTTeN6IL_6Tbj?0XA zyYZWh+z|&Wk#Jc5Np2ptm$_03ei}T2iJ*&F!J-bc%dXxJ?p=Nc5R})9B{B%BsCTlO zWK;nR8uk>XS;QUhWHonuM;%q`mhKOZ@0LT6TKg`2M+`-97 z6p*}k6oag_S{Pl)4ta4gBf@nVFIHha|0Z7VdD8xNb2e=n>JnB-=00zvN4L;pr;)Os zf<%P8W_oq6*)@_(^e1$s7q9F+lzi>U}ztkqHhalvhVT%N$>!!g2MX8(pSud;FMu8p> z`MkKomN76lWy_;oPp9tiS4_4h$s!-c)7>AQA37lLNE7S~3<AQ-x6CX5^p06?iTk4Ihi8RiZ2Pi}5t|az z>%pP7)iPT`tgAn_T5;^Jb_?65@85Z*;S_Y0%UsuwJ^qe171^eBIUL~-R~gPq#~+km zvb};a7a>z$ju_;pEPTxtI}EIm$RP(ls)9f9VYsWxb@Go@^@n*3ot+TWq$%<)f_{~M zOJ(Z79B0*~bo^MOc7(7y0en8XnM>h+Seh(1iyzG5QU`WWXQz2`SV(lAkd z*F#QMPZUU6jXJOSN{1)ExT1_88~#q6PF=ZYfBsaupBiQRdD%g!HphH;fyW*)kN}#S zJ2~lJ&c3>7^?LVvKU!B&Z;=GY883N*32Y^p#MOU6@B8JO2fwx9FrLZmcjf6KjQ)h$ zyYRjPoDE&Qzz(U4@cI-KHQD{aL8g=pakR?FD(h>N?)MMR6Nt zAoJXH_z#Oi2VTu890IX-?n$q;tP_pIzLXX!_4@82r!zsFlK-K8(duco)=F<4*(o3% zS_`S$S{OU=a=XtwA*$LkVGuL9(r%MJif8;^A zMmw_a4O?RU*Q1so5V|maH68FX@0T0C>qN^41gN%o3La5F_*Oib9_YOkWWg9S=r(rl zSL%m2j)m7LMUQEc>^w@_k}`xc3l^wSo!LKG9RgkPMp?SZG)O39t`|zG!*5G8DD4d< z=6Yq^vK1XyPJ1a#=QK@Uxz~M^I^Q`so?8lE)WJ@8xbpu*=g_A~R%@S?Gp&L%0C)c3 za;wM@TDN}z^DpYRgNWD>nHZKm8zemI~zOS!pMBGbY!H#H1L5T{m{!5o1Nx~;Cww!h_UX# ziUHT4lsZXxxl^mAFnKit7Jyr*{VxFATNRM5pz7+`rS6!|8Wy`(`kME^PSI=P8*7Qv zY;ChlpC?xNfee>U;xaNaU0ai}*@`&#OeY!oyd3*LtRp9$=&NfJapKE>q| z1iD3MN{WjYoW&CnlMnInX_IAHO-# zB=07|lsAo4oVl%;l{Z6MdK*#uc|);Z%ZX&M0YV#|RhB3)HE9O3yRfXMvB^EofE%m38@GQAQ?SVA8NXcQ>`;TRXfKFb`tViHr8g2!gftFJbA z>rKQN%6NEu_*+{u(LS=jB~&TMmT7gOlrLSY38PbfNX*fwg{R*Cn^RK1j$$;5)k4#P z1~y)~`U`Gy#gQ-O7zGiFGbwBm1PeUQWx|EU{S^I*HRrf!_g@vwr>p?aB4(>gfvI4LWynONapRG@o3le4&6R_{tS6TtJ`*+ZXUDz#31~v$m@H0 z2F3_IcB~X%n&$0i$WQ*hjV|&A|;|ZR1{kOoOmR-ew}#A+@~zx9{UFKd)03 z$27VP?13L+CH{w0wJeuWPO8Lc1v#8!+}8`%6##*#92b1&Z=AVtE*x>`^$)r_dB3kGA+B%PLsdOyz;3G)F&6*BJ@1|Fs@jCz zjXU@rAstZDS+rLjk&}YWcvXZwD4uWnm28hC>kU0jdIQ(ms}jP~FAvl^RXE%T?TW?B zUCh8VWERH3E;NANcJD)>4+5Lnlv(GJINu@}yOo!p%q7o%xVt{od2C68Or!z$ytgsf zH?9fJA*kl@op9}A(5XresK;~6L7+A)W^>kiwq`ceJ9oHEuPwH}g*QJ{DzwsX$mh?5 zqrAZlNp9$0t;2Scq~7uFes+sm-^Ebi1_XppKeR`_Dwszxx5wP1-lb<-UkLHbEMLsw z4$5UE{j>b^B(TORsdM!or)LDOi_jM|M~k}@B2EbO$+4q(&zg@(xB}fV31tot z;jNdyoE#Qh^Q%vpy^jlL0ntx&>sV-9Z6ia^ zSJOU`mWXtLJ$G)ygqLS2`fG+otWgg>zCO01njfGto?^cU!sJH1%9uOXC|G`L5Z6tj zUbSztJF*|pJ9kB6SBZiQ45V30<1Lz}S)(s#8_>-7Gef+ngB+NdHob>$sBTIhk3-!4 znJZr%Cws(beZ;tc9oW3pB}!M$s$PUXT&bxn$h2|Q?chCC|DA@G4ozy^IZykO2jS9p zhq0&nJ3##ZY=0@AoU?N&#giw2O1ZCjc`L+Oc>HMqsOtA{j}^x{GavQkC7n$3qc|6q z@PO|y?Au#y3|a23-CP~Ja5aO)iZ=_U($-7k$=E=qYlN(G^Z%Z@i~SaaDV-rde*OBj zWqT5VKq12PhZ0=<0R8CXRygbMTfQ2Me(xu`?H=XDQkDSyJ0!a-9)iNFV9c_RnEW!A z64of+E-Avj_#Iuci^NiUbAz6_lSu(~_Hn7uD}U1Ue+cvykN(6!>SyiwR{aA>Kv}ZC zL=nr7MgP=04qW_m(6T>OEBzBGjh=+31I$B>HZG4oNLiiA5#v&kkeK3$qpj2P^V`f< zS4%purbJB>6D;{mTCdxHUBj10r+F$2*8kkSn|#ToxG?`K;3*pcF2emufuP5guu-VQ zvy{tAQpcU=(aQ1ZUsC;K{(}>0*hec}<{=%#D04@%)S3xqWc(u>FKp%J zare-L_7VKd`+`|B1C(}la>BcuhiR>`D!mF!y{GKc=wax)G4>tY>Ei2hb~BHuc%f`* z0hg}7>r!0<_`pDiJ#;=}07~t|V8-K_OKTLwPf@V}&RV!iZ zF@xkkIZf16kYe^w1A~3qB55{;`QN+^<`Iclf)}f}?=nt}X4~pq4^}5@n2D79TfV+D z9(I{EnzPj$lL4CQQ5w|m?YshdG!wVM&n&j&-=M6gj`o5urW^H>m!Amo&J96=x?8Gcf_owSpXkR?rF|}#k#;2)DJ-nY#v@*Z* zNq_yIMi|n}TjcK1&cqc|qfncDwO~k`I>VTAhc{=>dKe0KVm0sI(RMz0|Jn+r_{9JR zXbhLTzj=>b`!R(RU7TCHhI}gP`;AY4wfW38My*7bhgLn*j8X37&894`uacFntHH16 zp*}6VI}U5=DCMRp&(MEv_~Dz1U>=X>3mB;)%NOdKy?)%HC2`-m1$Q*k;1nr%``x}k zVB+MBA-bvVV;20YFQD2I_x)|rB3+02+3kEv1j%~-1@jOA3JkSxgXc}a6uy~3I7y-7 zm35B+q=IyE&W=?d-SDX-Ha<{<-{K4=P9MGVF0yN%(K>I!k+?t`{gZ83PVe_Zg!H-Mo2I$g$iEk@z`qkS{Xw z#tjN3*>`U=aKazt>l|&7%O9!j=H~JUBeY}0agUAr&h z5!$4lohDnVa*vhBr;LM_->^@iJ-NSn#T%A`RGanqL~VW4TI*kvG>a-0ChJuXdYKVa zXRS}%o~bPh`X!dfrDb#V00_82EmgW+xieCr_JnA6YUIHBEfg|c6Jx>bjI%*BDX2d^ zZ%)*$E8V@nV|4kY9Kh2*U4Hla3zr$DTETW+!S&q~k2Mze7a+2f^Z$F?UvVJ_hEB(> zUXLdpcQ(UHa$kq~(=0Ya14+{Cg}D`%-xLx}D`+RaV=wlK8Our_akikKPH0GELu09< z3U(vj#;OnjOr%Mx`cCv*MM2l^qFizay7uYwr~{X(<02=0DuI>bd0?>gq2h^=Uaf6N zbImvS&Bi2^eIl)~PA^f&w9|{INaT!Mr0O$;;2|PG(MkqXbi_&u&$-PijP4Yzs>OC0 zxMuOg5}KuhTlo9GsQ|Oof+(f-@~?GeGVUci;o@n8eo;5YI)j2;fZek>!==t0?azW9 zHqUsT&X}wHwr)_MBZW)r*3pMP({7RnDl?FhQWdzHEsBuXELq#65{|4r5?`KPxQMmx z^_h&b?TC=vKG{ER{{pC}a3oQvD01m`5xZoDaLLmTcWXXm6da}Q{w$EccYIM~pxl+~ zW#<3d;&uc9L`kH2ByPH|@rgOoJ08||Iv|A=Ig^YD8`Aa0ju8u<21gX3Vu(n-eY0UG-xH1GVzh! z-3{vfV?S~7Swm1t6W|BR{tD0vzipj2V)c@z8~p2tK$~kAZk>=H@~sfwWppnQR&F2$-9E&q43eWK#75p z!w*;7)*QtYtht8x`RML9b`aLv@7fqLtB%!@qSs4OLKy5s`pT{=?=Hy{X#ysMauO1K zL*s8#qPBJ89~{%~hj;zL5vX6bnPM!IHAf?K%W&e06?2@QG-1W(kw=AHw*XijYSI>3 z6Wqjns=qxZ+@Y?CXOAw3J(VAxdJt*7<&{pu(Xr~=KlvoLjck#78FCivDeLT-6-UoD zDdZl{BE6z|jmcpZ+jHu8_egyg0-GQ5;D6|g;q*JLr2<%vagOqfRG*E&>lG$|x>mAn z#t#|B%GoNZ4j8B%0;PB>fb!NBq7&ZS?>lX-F2EFg=DRVBvE^8$$8olAa62wUOx|vX zv!ev;E!&KT*RRKv+m<{(tJKk{8#&J(CeAVNVrk1Jzc>!0epfB`e?%}QzOKQ}M^$b# zE=3@9hOCG3{~oV&GX?h3?@!s{8yyjEN796w0fwJN34`=y^XdObvcI(P2oA)Rn^w5kQ)l zzIJ7asG7TqKG0*XN@?4O2RJuUrsv_~ZA2OWD&)AGR0*ayuQxdWNWigy(EVwsd8@XL zD0kA1NTEY?phG!}L_i>N?`lN#pAjFZZKXj-xSF?FH^11n;Y~%0u^84!1{|q>oZjD+ z;v$Nj&!O*+4{M!9mN^dEDcCPad~hWWwH2ZOhy+hPRsM)eeC-2>si+F2BqhHOuiqme zU>oS}K}z?Z6zLYG)u!ygoAb(&72f)C>oMd~nNNlR)E(rb=!B(|$*ao*C-mxRNdB)v zE%kXeTT0yKrgzmiRaCnrSTn$yw8V44%ftWfxq*kD~xfnvqH}d6awo z$w>~>zbg&g!^h`6H&1T)6@bU4M-fB%_=|D;_X}s>rk!E|FqobH{G4fKMuZy547e|J z{uLV?e4mIg`*@?a)6UeJr+xXA3Z!$ulr`V349ZT18>S0|Z}ZP_p8Y6`C~Nq)`g14> zGai}vjOOt>bICV<`7V?|hnL^_f1=OSjpdrUr(Q;?PwSPl%1KRc4y{xgdz;wf3h{46 zwH`ED^=mk#*IM+~S)n!#9_6Ih1N(C@{w-wibA5U~XL_Mm+mq%0$Mk|vH2{VkLVFFz zW)Zj=;b%Cu;okAoMXUG0_Y(L4d%(Z3RkMpv$qSs^kzv-veQ;Ad(IVen`1@5lBTx|` z+Jle0_L%pztm0Gs4}#sDlT%UOj|*o}jVh0UV6~xxByq(WTg78n1qc+h8 zS_NfNXZMGv=BENZpPjPPIqe!6cD#Q*eZrQ?nKKc9w6oo^2WL@df;e|Wnkglq0+n7qfo{*%0d%N((@P0h z9>Ek@=y#*w?l}GPA0JQx#k5H*%JMm44okNjZSYIk%wbjiD6e4p&l!DQA(^V767?&z1#3H9qrNb)v;eV}{8}Ijc$&FC8`QWZ9(UyVad- zL{jcF`6M-6P(2N@E^U%~{9mz0ys?!4(X{$w?8n|ytqB{ooM|C1#|twz>~Nas4rzuB zUl&0`mUOT>={S`AK>ypERe!S2e2&pj8s6H#I;-wVWJe<& z&90$%G=Biu_~JhWDL{&HZF)AzDhvf80pK*hY2kPJUlpYtHPPD>drzK5_V^+N#`WvOEFTw%V4iiKvSV#@E&H0_-u?SbGuRez(Wb&0ItQll z@k9F(A*yi1MgCn3xIm~h+pw74MO5kdk5PLu4k2o)6!iTBQO^{Hq+zDf_nuVV^|n^XC%3Ld+lcagUO|>yPTb5X4$2|G6nhw(L)qW7J99_d0&;P@nVA&JKFnSJxix$J$9liebPe6z~3pK z1$Ql(5EmyRUr{2$*qkp7`x*|#qemI(SE$ltN^e8skVV$>eJB!f5yEg7jb*Tw4BtR8 zWpS2ZKWRKXyaJCP?iMTox8&~kGA!%!84dQTGPchD%|~+f@U{H3(c3HE&h8|@%L7?3 zbnR_OCldAb(eEMt#M7>PixQV%{!_i$M^)LSN=GfiM9aR%bU9%&f2?_ zF&JOGP14d~5GK7iWyH2vB`|G#5l^V9=WU~?qR|&zvgVSvze}YR!v&$9?=A|G0R}tE=HxJ z3o#&00Aa~AtbiVg38hCO)0v2x13dA2hY!x*ar`(`!O5t zTsnZm%a>XOCir{=(|quk@)E0^yFPClsKk^Mo2!fq2wl9`+zf0q<{3}CJmGn2?on&V z!QrYdZQ5oTQG03ITg!o?Pq78ZwB_15k09Vv<&!d|o~uegI6pYVpU)@e>N4PY%JnOH za%P*N0uBFN+LW=>U*edLb%Nm*5 zV-h?6;_e0j&BCtQ$ROGKZLntS&c0Jb!h@Y0_<=J*)%c(}fyN)A>o$|{PY^n^_L3P_ z*?pjmen%8>yw#p&x}9#3o-Xj|qb(sLqo9U;2T$x>)p1p2`x6ihe@i}bM|o&FFo&uk zEoQ2I9{4E(V{E?m^X3T#^ew}9H&eN;1?D;KD#jcKQ6_?6_M!!^RFr$Z(KT>dFgBhO zWUl^P_jO@@8eiB*DuwuG04Y^%O*LCbkfGiDJ;Df_{)IJCW?|*(6ra2{!~sZS+JA7` zkX0W*joK%&2gc|QUrTsi=X$$UM=2YF6F#CZy}dX2Vus9kFyx%W{N~$l=yopXjn>Cg zc5ZiaZWkQ3<=H55jcWPv0(~pO%DI}kS0PqIb3E|qDIlVtM9E^UyrlecH!kA9GjhHE z=(UUZD=RVTcfsS}h4cqZ+5((MdDwB;Cb|$2$Bp6JsJ@anN87>>f<$6AWXW2s=i;?j z@u9jXz>MtDIQ3m(@gzu)Ed&$&yW(tTMf6Ik?RMAT#n~i&5CMfuuu?zwYQ2Bgkd4E9 z4PUjNseUD1wARJ z$wh!I467VYrUMm@2~&EGUS2}nX^Z5!*SVpiceb~#esBSO8={*D3|{f;yeD3By8K;c zNT`4;3%INoD7F8>KnT%}5Ru(mbguh{ZKZMC`1M{^PQ&ozlgQAM(O^v8-bF6u-!^IKjU+v3Z!Y(Mm4E|o zyEBh>_|`(6CBzGrmIaNpxj$Eb4}D=Wcq@Isr_4&hDfr7ht-jeHL_{RjL^Xscd1g_| ztSX)@L?BDJaZJ<$vj z!~lI_`}^qio>vbFD{PJ9C$xQQBI2fb_@so=xIf0vY)$a_XwX7Xl_{u^GLiEzP%m}j z3=g9rb74nQzbJg55IZFF@Y&mYrfTSSCEtuUBQOyL9g61jF}YVtg3TQxR%W?!)=#WQ zN?4ZZue;;hHW-(axhm8pD?YlpJ9W1kykI7`U16ky{2-Y=F=?+(y%PA;c3xfMFrGpg zsv_ibPpbQfc~t@t1|=>tAy;h_9?nv~oyt>`=(>7ql^C#Y2(ZgEGqw zJo{&aBh6uaO1)C^b&Qx;Yf%9gRT28tu&tw6Kg2o}-1JFWn|KVj(evFW?S)O9{<__XzNt`3Y{M^kha zZB#{-#gr3lOx~m10!k*PWJuu9s&K5eB^c4c;^DlsL!vQ#46yAF9P#9CB*KOk3rog9 zZ2v~j+AL4fmQA;}>bNPOvzTruD`Qb?UcfbHss-O|)(q}J@M4FX{pRvJ$UMv=N5 zJ4%`=ue3R>TigSne0uNmIuwvKQ9E@iXa~rfYc`U}szMG;9-=)pR`QHQA@KPKT!w-m zOpLCQI`Xch-w2@_lxv({zFPHZ-_wfGMSfv2s@tnelj*|Mo(CvTBA0a`8vk5lo#W$Z zs*3`unB)#hhDs>U>Y@$OlktrN3n ziE;ukhf_EE>r-R35xmq{w~t9@4nHhkF^o(kc8IN0!@KhQ;UjH6ZP{_{ty#CCZ1Fq! zcbC;Z?;jHkcFr#88Qe)m`zGXZc(yKglRH}0;pe(L$xU;c+7Haqk`DlD-ku=$8H>j{ zog!zd6j2-Uxerz+3hQOVC=lxaq-CL1agh+BTaprSGQSIs>94X~8*GU`Q1nqnt*zS2 zTFXB4EONIL9j`z9IfHYOxyHs5~GMT^7{z^ASvd+?-zU3-dCae z7j+7Clu;Yf(HpBel{_)Q%o+5qn=Qs|7P~_guXa-1laP2%J541o5_U)=I@cZAXZSzB zehskC5E}iyHh?a6>2Zf+8|YXqnFo19-V;&TaDtg0PN$k)Wu$-D8Vj##w1OWh>B=SM zw@w6R4HS|oVyGp&w%<{%^g1eglce3F!0<=dUvnJd5iNBs(Ckaw_`^g|zq?J9hjOlI zwdi;=>*BA|w9Ua*T}dxLZ1a7b<53y{4Y~3D_C4){vy+HXMYj5P4m6J6s3S^mMYG7x zTl-y%4b-fbIS^KQFI+wwDD?W29sn!luf4x6LEl@&S3gssijs>RTMj80OVe_sh$~ZE z*B7AA?>%q2Eyzs_uu=1HZ}zB=QSR@b72nIl_!^n9+iL5Fz?r8GDMgR#s+anZ-xlA566L zunc!+al3$Ow#U&ln$XYrgPE!%Av)*8=Fwt^D&;!WH;y-rEFQQ*f51DFfVKp^+N`jW z`Yj7=uU2QwI}X1dqqXnI9)*D$Diwl)-Tu{*3!#99uUs_gFU5qSvgOje+}?bo1xXf~ zphMI3&*v6_G*q3nySHF?!wf({fx+a=v*o6p^1yS9={>Vxyy(@le^7(%N78K{= literal 0 HcmV?d00001 diff --git a/Contributing.md b/Contributing.md new file mode 100644 index 0000000..7a218f9 --- /dev/null +++ b/Contributing.md @@ -0,0 +1,112 @@ +## Contributing to Wine + +The best way to make Staging better is to make upstream Wine better. +This helps both projects, as Staging draws directly and regularly from +upstream Wine. Many patches in the past which have been written for +Staging have been perfectly acceptable for upstream Wine, so for any +simple patch, going straight upstream is almost always better. + +## For new developers + +We try to make the process of contributing to Wine as friendly and +helpful as possible, but nevertheless it can be difficult to get patches +in, especially for new developers who don't have a familiarity with the +code base. One of the purposes of Staging is to provide a less demanding +environment for new developers, so that patches which aren't quite up to +upstream's high quality standards at first can be accepted into Staging, +improved by the author with the help of the Staging maintainers, and +then submitted upstream. On the other hand, some simple patches may +already be quite acceptable for upstream, so don't be surprised if a +patch is suggested for upstreaming right away by a Staging maintainer or +someone else. + +## For experienced developers + +Another purpose of Staging, as is suggested by its name, is to provide a +temporary place for large or risky patchsets to gain some testing, so as +to more completely test them for bugs and account for regressions that +the changes might expose. We encourage all developers to take advantage +of this facility, both to improve their code and to avoid the situation +where helpful patches are long to see the light of day. + +## Requirements + +Our standards are less strict than upstream Wine, but we do still have +some requirements: + +- The patch must be a step in the right direction; that is, we don't + allow patches that are gross hacks, or take an obviously wrong + approach to solving a problem. The end goal is always to submit the + patch upstream eventually, so work should progress in that direction. +- The patch must have a bug attached. We place great value on + traceability, so we require all patches to have an associated WineHQ + bug (exceptions may be granted under special circumstances). We also + strongly encourage all discussion to take place on the relevant bug. +- Like upstream Wine, a patch must have correct attribution. If you did + not write a patch, you must make this clear (ideally using the From: + line in the patch itself). +- Unlike upstream Wine, we do not require sign-offs. We take sign-offs + to mean the same thing as they do for upstream Wine: that you consider + your code to be good enough to go into upstream Wine and to meet all + of the legal and technical requirements thereof; accordingly a + sign-off is not necessary for Staging patches, which do not need to + meet these requirements. However, if you do provide a sign-off, be + aware that your sign-off may be preserved by someone else who submits + the patch upstream. +- Like upstream Wine, we do not take contributions from anyone who has + disassembled or reverse-engineered Microsoft code, or seen sources + (whether leaked or publicly available). + +## How to submit patches + +As of 2018, Staging has a strict policy that all new patches submitted +for Staging *must* have an associated bug report. This is to combat the +problem where patches written cannot be verified, justified, or tested +for regressions. To facilitate this, Staging uses the Wine bug tracker +as, in some sense, a patch tracker. If you want a patch to be included +in Staging, attach it to the bug, and then add one of the Staging +maintainers (Alistair Leslie-Hughes, Zebediah Figura, or Paul Gofman) as +CC, *with the explicit request* that the patch be considered for +Staging. Please be explicit and provide details about the patch if you +can, and tell us why you are submitting the patch into Staging rather +than upstream Wine. Don't just CC one of us and expect us to know what +you want; make sure you state clearly that the patch is meant for +Staging. If you are writing a patch for a bug that has not yet been +filed, it's perfectly fine to file a new bug. + +We prefer patches to be formatted for submission using +`git format-patch`, as this is how all patches are stored in the Staging +repository itself. If you have several patches, please compress them +into a single tarball or zip instead of attaching each one individually. +However, if you have several patches which fix individual bugs (e.g. a +series of patches in different areas that are needed to allow a certain +application to work), these should ideally target separate bugs in +Bugzilla, which can be created if necessary. + +After a Staging maintainer has considered the patch, if it is deemed +acceptable for Staging, we will add the patch to the Staging repository +and mark the bug as STAGED. We may additionally scout existing bugs or +the wine-devel mailing list for patches, but if you want to make sure we +see a patch to be added into Staging, make sure you CC us and request so +on the relevant bug. Since we use Bugzilla as a patch tracker, further +discussion on a patch will take place on the bug report, so make sure +you are subscribed to it. + +## Packaging + +We already support a large number of distributions and provide new +builds every two weeks, but we can not support every single +distribution. If you are using an unsupported one and you know how to +create packages, feel free to do so by following the instructions in +our [Packaging](Packaging) guidelines. We may also add a description +on how to use your packages in our Installation instructions, if you +tell us about them. Just open a bug report or contact us on IRC. + +## Testing + +The idea behind Wine Staging is to add experimental functions and bug +fixes. In order to make sure that we do not introduce any new bugs or +failed to fix existing ones, we need people to test Wine Staging. We try +to test as much stuff as possible on our own, but some bugs occur in +proprietary software which we do not own. You should therefore try as +much software as possible with Wine Staging. diff --git a/Packaging.md b/Packaging.md new file mode 100644 index 0000000..fc73079 --- /dev/null +++ b/Packaging.md @@ -0,0 +1,156 @@ +In case you want to compile Wine Staging or create a package for it, you +should follow these instructions. Please note that simply applying all +patches inside the `patches` folder won't work. Even when using the +script it is still possible to exclude patches if desired, take a look +at the end of this document for more details. + +## Compiling Wine Staging + +Before you can start compiling Wine Staging, you need to make sure that +you have all necessary dependencies installed. The easiest way to find +the appropriate packages for your distribution (especially if you want +to create a package) is to take a look at an existing Wine source +packages. In case you are using a 64 bit system, you can optionally +decide to compile Wine for 32 and 64 bit to create a "WOW64" build, but +you will always need at least the 32 bit part. Depending on the +Distribution you are using, this can be a bit complicated and you can +find some tips in [Building Wine](https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine#shared-wow64). + +Wine Staging also supports the following optional dependencies: + +| Library | Functionality | +|-----------------|------------------------------------------------| +| **libpulse** | PulseAudio support | +| **libattr** | Windows ACL support | +| **libtxc_dxtn** | DXTn software decoding / encoding support (\*) | +| **libva-x11** | GPU video decoding via X11 | +| **libva-drm** | GPU video decoding via DRM | +| **libgtk-3** | GTK3 theming support | + +(\*) Since 1.7.37 it is not necessary anymore to have this library +available at build time, if it is called either `libtxc_dxtn.so` or +`libtxc_dxtn_s2tc.so.0`. If your distro uses a library with a +different name, you still need it. This change was done to simplify +building Wine Staging on distros where `libtxc_dxtn` is not available +in the official repositories. + +The compilation will also continue without these libraries installed, +though you may want to provide as many features as possible if you are +creating a package. + +### Instructions + +The following instructions (based on the [Gentoo +Wiki](https://wiki.gentoo.org/wiki/Netflix/Pipelight#Compiling_manually)) +will explain how to compile Wine Staging. If you encounter any problems, +feel free to join our IRC channel \#wine-staging. + +As the first step please grab the latest Wine source (or use the git +repos for development): + +```sh +$ wget https://prdownloads.sourceforge.net/wine/wine-1.7.38.tar.bz2 +$ wget https://github.com/wine-compholio/wine-staging/archive/v1.7.38.tar.gz +``` + +Extract the archives: + +```sh +$ tar xvjf wine-1*.tar.bz2 +$ cd wine-1* +$ tar xvzf ../v1.7.38.tar.gz --strip-components 1 +``` + +And apply the patches: + +```sh +$ ./patches/patchinstall.sh DESTDIR="$(pwd)" --all +``` + +Afterwards run configure (you can also specify a prefix if you don't +want to install Wine Staging system-wide: +`--prefix=$HOME/staging-test`): + +```sh +$ ./configure --with-xattr +``` + +Before you continue you should make sure that `./configure` doesn't show +any warnings (look at the end of the output). If there are any warnings, +this most likely means that you're missing some important header files. +Install them and repeat the `./configure` step until all problems are +fixed. + +Afterwards compile everything (and grab a cup of coffee): + +```sh +$ make +``` + +And install it (you only need sudo for a system-wide installation): + +```sh +$ sudo make install +``` + +### Failure to apply all patches + +When trying to build the current git version of Wine Staging (and not a +release tag), it can happen from time to time that `patchinstall.sh` +will fail because of a failure to apply all patches. This happens either +when patches get upstream into the development branch (and have to be +deleted from Wine Staging), or when changes in the development branch +conflict with Wine Staging patchsets. In both cases we will try to fix +the problem as soon as possible, and there is usually no need to open a +separate bug report for it. + +To workaround this issue, you can run: + +```sh +$ ./patches/patchinstall.sh --upstream-commit +``` + +It will return a git commit hash like +`d04a54857cc84f881393e4bc794185650a302084`. By checking out exactly this +commit in the Wine git repository, you should be able to apply all +patches without issues. Alternatively you can also wait until we push a +commit to rebase Wine Staging against the current development branch. + +### Excluding patches + +It is also possible to apply only a subset of the patches, for example +if you're compiling for a distribution where PulseAudio is not +installed, or if you just don't like a specific patchset. Please note +that some patchsets depend on each other, and requesting an impossible +situation might result in a failure to apply all patches. + +Lets assume you want to exclude the patchset in directory `DIRNAME`, +then just invoke the script like this: + +```sh +$ ./patches/patchinstall.sh DESTDIR="$(pwd)" --all -W DIRNAME +``` + +Using the same method its also possible to exclude multiple patchsets. +If you want to exclude a very large number of patches, it is easier to +do specify a list of patches which should be included instead. To apply +for example only the patchsets in directory `DIRNAME1` and `DIRNAME2`, +you can use: + +```sh +$ ./patches/patchinstall.sh DESTDIR="$(pwd)" DIRNAME1 DIRNAME2 +``` + +## Additional notes for package maintainers + +Some applications and games require fonts like Arial or Courier to run +properly. In order to fix this problem Wine Staging contains some open +source replacement fonts which use the same metrics as the original +fonts by Microsoft. These fonts are licensed under different terms than +Wine and you will need to ship the according license files. + +By applying the font patches the LICENSE file is being updated to +reflect which files are covered by which license. Moreover you will also +get the following new files containing the individual licenses: +`COPYING.arial`, `COPYING.cour` and `COPYING.msyh`. Simply add these +files to your package. diff --git a/Usage.md b/Usage.md new file mode 100644 index 0000000..5e5d10d --- /dev/null +++ b/Usage.md @@ -0,0 +1,52 @@ +Since we don't want to duplicate a lot of information here, we +recommend to take a look at the official [Wine +FAQ](https://gitlab.winehq.org/wine/wine/-/wikis/FAQ) for general +information about how to use Wine. The following part will mainly +concentrate on the differences between Wine and Wine Staging. + +## Multiple Wine versions + +It is absolutely no problem to have multiple versions of Wine installed +at the same time, for example regular system Wine located in +`/usr/bin/wine` and Wine Staging in `/opt/wine-staging/bin/wine`. +Nevertheless it can be confusing for beginners, so when you plan to use +Wine Staging as a replacement for system-Wine it might be useful to +install the `wine-staging-compat` compatibility symlinks package, which +allows to omit the `/opt/wine-staging/bin/` part in all following +commandlines. Please refer to the installation instructions for more +details. + +If you prefer to continue with multiple Wine versions, make sure to type +always the full path in order to select the right one. You can switch +between versions as often as you like - just make sure that all Windows +programs have terminated before starting them with a different version. + +## Running Wine Staging + +To run Wine Staging without compatibility symlinks always type +`/opt/wine-staging/bin/wine`, for example: + + cd ~/.wine/drive_c// + /opt/wine-staging/bin/wine game.exe + +You also have to add `/opt/wine-staging/bin/` when running other wine +related programs, here are some additional examples: + + # Initialize the wine prefix + /opt/wine-staging/bin/wineboot + + # Open the wine configuration + /opt/wine-staging/bin/winecfg + + # Run winepath to convert paths + /opt/wine-staging/bin/winepath --unix 'c:\Windows' + + # Kill the running wineserver instance + /opt/wine-staging/bin/wineserver -k + +## Wineprefix + +Unless you specify a special `WINEPREFIX` environment variable, Wine +Staging will use the same wineprefix `~/.wine` (in your home directory) +like regular Wine. This allows you to use your already installed +programs directly, without much effort or re-installing them. diff --git a/home.md b/home.md new file mode 100644 index 0000000..fda849e --- /dev/null +++ b/home.md @@ -0,0 +1,315 @@ +--- +title: Wine Staging +--- + +## What is Wine Staging? + +Wine Staging is the testing area of winehq.org. It contains bug fixes +and features, which have not been integrated into the development branch +yet. The idea of Wine Staging is to provide experimental features faster +to end users and to give developers the possibility to discuss and +improve their patches before they are integrated into the main branch. + +Wine Staging is maintained as [a set of +patches](https://gitlab.winehq.org/wine/wine-staging) which has to be +applied on top of the corresponding Wine development version. Package +maintainers can decide if they want to include our full patchset, or +only want to cherry-pick patches for specific bugs. + +The current Wine-Staging team is: + +- Alistair Leslie-Hughes (lead maintainer) +- Dean Greer +- Paul Gofman +- Thomas Crider +- Zeb Figura + +## Installation + +Pre-compiled Staging packages for most major distributions are +available on the +[Download](https://gitlab.winehq.org/wine/wine/-/wikis/Download) +page. Instructions for installing Staging are given under each +distribution that provides it. + +## Building from source + +Since Wine-Staging is maintained as a set of patches rather than a +forked repository, the process of building is slightly different. You +will first need a vanilla Wine source tree and the required +dependencies; for instructions see [Building +Wine](https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine). Note +that Staging adds some optional dependencies which are necessary for +certain additional features. You will also need the Staging "source"; +this can be cloned or downloaded from [the GitLab +page](https://gitlab.winehq.org/wine/wine-staging). + +Once you have obtained the sources, you will need to apply the Staging +patches of your choice (or all of them) on top of the Wine source tree. +You can do this using the provided `staging/patchinstall.py` script +(introduced with wine-staging 5.6, for earlier versions use +`patches/patchinstall.sh`); see its options with `--help` for detailed +instructions. If you apply patches manually, take note that you will +also need to run `autoreconf -f` and `tools/make_requests`, as such +generated changes are not included in Staging patches. Be warned that an +individual version of the Staging repository will *only* successfully +apply against the upstream Wine commit it was last rebased against. + +After you have applied patches, compilation proceeds as usual for +upstream Wine; refer to [Building +Wine](https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine) for +detailed instructions. + +## Reporting and debugging bugs against Staging + +We, the Staging maintainers, really need to know whether a bug is +introduced by a Staging patch, or has nothing to do with any Staging +patches. If a bug is introduced by a Staging patch, it suggests that +something is wrong with the patch in question, and that patch needs to +be fixed before it can be sent upstream. + +Therefore, when reporting a bug against Staging, **always** test +**both** the **latest** Staging and upstream releases. If the bug is +also present in the same form with upstream Wine, the bug should be +reported against the Wine product, not the Wine-Staging product. Doing +this saves *everyone* a lot of time and effort. + +If the bug is present in Wine-Staging but not in upstream Wine, then the +next most helpful thing to do is to bisect between Staging and Wine. In +order to do this, you'll first want to acquire a clean Wine tree as well +as the latest set of Staging patches. Next, apply each patch as a +separate commit, using the command + + path/to/staging-tree/staging/patchinstall.py --all --backend=git-am --force-autoconf -d path/to/wine/source/dir + +. You'll need to use the `--force-autoconf` argument to ensure that +patches affecting configure.ac or protocol.def are properly applied; +alternatively, you can omit this argument, so long as you remember to +run it before compiling each step of the bisect. From here the bisect +should proceed as normal; you can find some (admittedly rather +outdated) instructions +[here](https://gitlab.winehq.org/wine/wine/-/wikis/Regression-Testing). + +### Regressions between Staging versions + +Suppose a failure is introduced in a later Staging version, that does +not occur in an earlier one. This, again, could mean one of several +things, each of which have a vastly different significance. There could +be a bug introduced by a new Staging patch, or (re)introduced by losing +one; there could be an error during rebasing, or an obscure way in which +a change upstream breaks a Staging patch. Alternatively, there could be +a problem introduced or exposed by a patch committed upstream, that is, +a regression strictly in upstream Wine. Again, we really need to know +which one of these things has happened. Therefore, we will again ask +you, before you do anything else, to test the corresponding upstream +Wine releases of both the "good" version and the "bad" version. + +If both the "old" and "new" upstream Wine releases are not affected by +the bug, it's a bug in Staging, and should be reported against the +Wine-Staging product. In this case, it's again most helpful to then +perform a regression test between Staging and Wine, as detailed above. + +If the "old" upstream Wine release is not affected by the bug, but the +"new" one is, we can pretty safely assume it's a bug in upstream Wine. +In that case, the bug should be reported against the Wine product. From +here the most helpful thing to do is perform a regression test between +upstream Wine releases. + +If the application does not work using upstream Wine to the point of +triggering the bug in question—that is, it fails too early, but that +failure is fixed by a Staging patch—the same principle applies, but is +muddied by the additional presence of Staging patches. We first need to +know exactly *which* Staging patches fix the earlier bug. This might be +documented on bugs attached the application in our AppDB, or it may only +be mentioned on the bugs themselves (in the latter case, please do +submit bug links to the AppDB). It also may not be known at all, in +which case you'll need to perform a *reverse* bisect between +Wine-Staging and upstream Wine, of the last known working version—that +is, a bisect where the meanings of "bad" and "good" are reversed. You +may have to perform multiple such bisects, if the application depends on +multiple Staging patches. + +Once you've identified exactly which patches are necessary before the +failure can be reproduced, the next step is to try applying only those +patches against a clean upstream Wine of the earliest broken version. If +the failure is not present, this implies something was broken in +Staging. Figuring out what can be difficult, and is probably very +dependent on circumstances, so this guide won't prescribe any further +course of action at the present moment. If the failure is present, this +implies something was broken in upstream Wine. In that case the next +step is to perform a bisect between upstream Wine versions, as +normal—except at every step you'll also need to apply the Staging +patches that are necessary for the application to run. + +This may seem like a lot of bisects and testing to perform—and it is, +but it really is the easiest way for a problem to be fixed. It may be +easiest for the user to simply pull a debug log with given flags, but in +the vast majority of cases, it's orders of magnitude easier to fix a bug +if it's known exactly what patch introduces that bug. Making things +easier for developers is by far the best route to getting a bug fixed +quickly. At the same time, we recognize that bisects are time-consuming +for anyone to perform, and we will understand if you can't spare the +time to perform them—as long as you understand in turn that your bug is +not by any means guaranteed to be fixed quickly. However, we will always +expect you to have tried upstream Wine first. + +## Submitting patches + +We welcome everyone, old and new contributors alike, to contribute new +patches to Wine-Staging. Our primary goal is to offer a place for large, +incomplete, or risky patchsets to be tested and maintained until they +are ready for inclusion into upstream Wine. For new developers, we also +try to provide a more helpful and less demanding environment to get +acquainted with the Wine project. + +### Requirements + +Our standards are less strict than upstream Wine, but we do still have +some requirements: + +- The patch must be a step in the right direction; that is, we don't + allow patches that are gross hacks, or take an obviously wrong + approach to solving a problem. The end goal is always to submit the + patch upstream eventually, so work should progress in that direction. +- The patch must have a bug attached. We place great value on + traceability, so we require all patches to have an associated WineHQ + bug (exceptions may be granted under special circumstances). We also + strongly encourage all discussion to take place on the relevant bug. +- Like upstream Wine, a patch must have correct attribution. If you did + not write a patch, you must make this clear (ideally using the From: + line in the patch itself). You must use your real name. +- Like upstream Wine, we cannot take contributions from anyone who has + disassembled or reverse-engineered Microsoft code, or seen sources + (whether leaked or publicly available). + +### How to submit + +Since we need a bug report anyway, the ideal way to submit a patch is +simply to attach it to the given bug report. If you have a patch (or +patch set) which fixes a bug and you'd like it to be included in +staging, please attach it to the bug as a patch against Wine (rather +than against the Wine-Staging tree itself). Instructions for how to +create patches against Wine can be found at [Submitting +Patches](https://gitlab.winehq.org/wine/wine/-/wikis/Submitting-Patches). If +you have several patches, please compress them into a single tarball +or zip instead of attaching each one individually. + +Then, CC or e-mail Alistair Leslie-Hughes (leslie_alistair AT SPAMFREE +hotmail DOT com) and Zeb Figura (z DOT figura 12 AT SPAMFREE gmail DOT +com) on the bug asking for acceptance into Staging. Please be explicit +and provide details about the patch if you can, and tell us why you are +submitting the patch into Staging rather than upstream Wine. If +accepted, we will add your patch into the Staging tree, creating the +definition files and updating the install script as necessary. + +We may ask you to submit your patch upstream first if it seems good +enough already. Remember that Wine-Staging is never the ultimate goal +for a patch; all patches should eventually get into upstream Wine. + +## Maintaining Staging + +At the time of this writing, none of the Staging maintainers plan to go +anywhere. Nevertheless, so that all future hand-offs proceed smoothly, +I've attempted to document the general process of maintaining Staging +below, or at least the parts that particularly need instructions. + +### Organization + +The layout of the Staging repository is mostly self-explanatory. The +`staging/` directory contains tools to maintain the patches, and the +`patches/` directory contains the patches themselves, as well as the +\`patchinstall.sh\` script to install them. + +Each set of patches is contained within a single folder, labeled +\`component-Short_Description\`, where the component is the most salient +DLL or source directory (as with upstream Wine). Each set contains one +or more patches, plus a \`definition\` file. This latter file uses a +relatively simple format that looks like this: + + Fixes: [10000] The original win32 api implementation is still more popular than wine. + Depends: ntdll-Some_Dependency + Depends: server-Another_Dependency + Disabled: true + +The `Fixes:` line was historically used by a tool that would check +whether a linked bug was still open. That tool was rarely useful and has +been removed. Specifying it is still a convenience, though. At any rate +any new patch set added to the tree \*must\* have a corresponding bug +linked somewhere, either in the patches themselves or in the definition +file. + +Each `Depends:` line gives the name of a patch set that *must* be +applied before this one is applied. Sometimes this dependency is given +for the purpose of functionality; i.e. this patch simply won't work +without its dependency also applied. More often it's given because the +two patches touch closely related code, and the diffs would conflict if +they were applied independently. + +A `Disabled:` line may be added if necessary. We try to avoid this if at +all possible. A disabled patch is not being maintained, is not being +rebased, is not being tested, and is really useless to everyone, with +the exception that it's at least visible if anyone wants to look for it. +The line may be omitted if the patch is not disabled (i.e. you don't +have to put `false`). + +### Rebasing + +We currently rebase staging onto upstream wine after every daily commit +round. We could do it less often, but this has a tendency to make +changes pile up and become much more difficult to deal with. The point +of rebasing is to change the patches to apply directly on top of +upstream. We have scripts to make this relatively simple. + +I keep a separate git worktree, which is entirely clean (no untracked +files) so that I can just run `git clean -df` to wipe artifacts of +rebasing. + +Starting from an up-to-date source tree `wine/` and a not yet rebased +staging tree `wine-staging/`, my process of rebasing goes like this: + +1. Examine the day's commit list and remove any Staging patches which + were upstreamed or obviated. Make sure to do this, as patches which + were upstreamed without changes will be silently ignored by + `git-am`. +2. From `wine-staging/`, run `./staging/newupdate.py`. +3. If applying the patches fails, repeat the following until it + succeeds: + 1. From `wine/`, run + `wine-staging/staging/patchinstall.py -r `. + This will fail inside of `git-am`. + 2. Run `git am --show-current-patch | patch -p1`. + 3. Resolve conflicts manually if fuzz detection wasn't enough. + 4. Run `git add -u && git am --continue`. You may need to also + manually `git add` files that were added by the patch. + 5. Run `git format-patch -N -1 --no-signoff`, and replace the + previous patch with that. Alternatively, replace -1 with a + larger number. Try to avoid changing the filename, though; it + makes things more difficult to trace. I usually just generate a + patch and then cp it onto the old filename. You can omit + --no-signoff by configuring `format.signOff` to false. + 6. Make sure the updated diff makes sense—things didn't get applied + in completely the wrong place, upstream code didn't change to + break the functionality of the new changes. I often just read + the diff of the diffs, at a certain point it's easy enough to + tell + 7. Run `git reset --hard origin && git clean -df` and go back to + step 2. +4. Build Wine. +5. Run winecfg, at least; make sure wine isn't completely broken. We + don't hold wine-staging to nearly as high a standard as upstream + wine, mostly because we simply don't have the time (note also that + currently many tests are broken on wine-staging anyway). +6. Run `./staging/commit-rebase.sh`. +7. Push. + +## Quick Links + +Here are some links to the most important topics. + +- [Usage](Usage) + +- [Configuration](Configuration) + +- [Contributing](Contributing) + +- [Bugs](https://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=STAGED&bug_status=REOPENED&bug_status=NEEDINFO&bug_status=RESOLVED&list_id=610554&product=Wine-staging&query_format=advanced)