[Wine] Should I report my problem in Bugzilla? Outcast problem.

L. Rahyen research at science.su
Tue Nov 6 22:54:25 CST 2007


On Tuesday November 6 2007 17:14, Rémi G. wrote:
> Thank you for your answer ;)
>
> As you suggest to me, I report the bug in bugzilla here :
> http://bugs.winehq.org/show_bug.cgi?id=10283
>
> But before doing a regression test, I would like to try an old version
> of Wine to be sure Outcast works with it.
>
> In order to install Wine 0.9, I try these commands (on ubuntu 7.10) :
>
> sudo apt-get install git ccache build-dep wine wine-dev
> git clone git://source.winehq.org/git/wine.git wine-git
> cd wine-git
>
> Then, to tell git I would like to install wine 0.9, I type this :
>
> git branch oldstuff wine-0.9
> git checkout oldstuff

	This is wrong. You need to execute:

git-reset wine-0.9
git checkout -f

	If necessary use this command to destroy your unintentional changes in 
current source:

git checkout -f

> Then, I try to compile Wine 0.9.2 with the following lines :
>
> CC="ccache gcc" ./configure && make clean && make
> ...
> [compilation errors]
> ...
> So my questions are :
> What could I do to avoid this?

	Short answer. To compile wine-0.9 execute the following from the root of the 
source directory (I assume that you have .diff files that are attached to 
this message there):

git-reset wine-0.9
git checkout -f
patch -p1 < 0.9-gdi-freetype-old.diff
patch -p1 < 0.9-kernel-time.diff
patch -p1 < 0.9-wrc-parser.diff
./configure && make depend && make

	At least on Debian Etch system I was able to compile wine-0.9 successfully. 
Try this first. Then install your game to clean WINE prefix, cd to its 
directory and run it. For example (I assume that you have your git repository 
with WINE source at /usr/src/wine-git/ ):

export WINEPREFIX=~/.wine-tmp
rm -rf ~/.wine-tmp/
/usr/src/wine-git/tools/wineprefixcreate
cd /mnt/hdc/
/usr/src/wine-git/wine setup.exe
cd ~/..wine-tmp/drive_c/Games/My_Game/
/usr/src/wine-git/wine game.exe

	If your game works with 0.9 then you can proceed with regression testing.
	Please note that you *may* need to repeat above commands so to start with 
clean WINE prefix directory each time during regression testing; in practice 
everything should work with the same WINE prefix directory in most cases so 
you most likely don't need to reinstall your game from scratch each time.

	Long answer: you may wonder how I did find necessary changes to compile 
wine-0.9 successfully on moder system? Below you can find detailed 
instructions on real world example. I recommend you to read these 
instructions carefully - this will help you to do the regression test between 
modern WINE and wine-0.9 without troubles.

	*	*	*

	REVERSE REGRESSION TESTING HOWTO

	Sometimes old programs doesn't compile on new systems. But what if you know 
that old program worked better than new one for particular task? This called 
regression. Fastest way to find the cause of regression is to do regression 
testing. But usual regression testing procedure will fail to work: you cannot 
compile and test old versions!
	Let's examine real-world example. We want to run regression test between 
wine-0.9 and wine-0.9.40. But we cannot compile wine-0.9 on modern system! 
That means we cannot do the regression test? No, we can! But we need to do 
reverse regression test first... What "reverse" does mean? It means that if 
program compiles (in this example WINE) - this is "bad" revision. If it 
doesn't compile - this is "good" revision.

	*	*	*

	0) Lets start. This is preliminary optional step. System used by the author 
of this howto was Debain Etch at the time of writing. We know that 0.9 
doesn't compile on it. Let's try to compile other old revisions - maybe they 
will work? For example:

git-reset wine-0.9.10
git checkout -f

	Then try to compile:

./configure && make depend && make

	Great! Now we know that wine-0.9.10 can be successfully compiled on Debian 
Etch. So we now know that wine-0.9.10 compiles fine on Debian Etch but 0.9 
doesn't. Good starting point. Actually this is optional step - we can use 
0.9-0.9.40 history window as starting point too. But 0.9-0.9.10 is better 
because it allow us to find out the cause faster.

	*	*	*

	1) First, we need to start git-bisect:

git-bisect start

	Then we need to tell GIT that our current revision (0.9.10) is good:

git-bisect bad wine-0.9.10

	This is correct: we are using "git-bisect bad" for good revision because we 
are going to do reverse regression test. And we need to choose bad revision 
that we cannot compile:

git-bisect good wine-0.9

	*	*	*

	2) Now try to compile:

./configure && make depend && make

	If at the end of compilation you see:

Wine build complete.

	Then current revision is good and you need to execute (remember, we are doing 
reverse regression test so "bad" means good revision):

make distclean; git-checkout -f && git-bisect bad

	Clean up commands "make distclean" and "git-checkout -f" are for sanity 
(without them sometimes strange things may happen).
	If you don't see "Wine build complete." then compilation was stopped because 
of errors. In this case you need to execute:

make distclean; git-checkout -f && git-bisect good

	"good" means bad revision.
	Make sure that you are doing reverse regression test against one particular 
error at a time and ignore all other errors when choosing between "good" 
and "bad".
	Advice: when 2-20 revisions left it is easy to find that patch by using qgit 
program and SHA1 id of current revision. This may save you some time 
especially if you have slow computer.

	*	*	*

	3) Go to step 2. Stop when you find lack of what patch is causing 
compile "current" errors and execute:

git-bisect reset

	*	*	*

	When trying to compile 0.9 first compilation error will be:

gcc -m32 -c -I. -I. -I../../include -I../../include  -DINCLUDEDIR="\"/usr/local/include/wine\""  -Wall -pipe -fno-strict-aliasing -gstabs+ -Wdeclaration-after-statement -Wpointer-arith  -O3 -mfpmath=387,sse -ffast-math -mmmx -msse -msse2 -msse3 -m3dnow -maccumulate-outgoing-args -minline-all-stringops -Wdisabled-optimization -Wall  -o 
lex.yy.o lex.yy.c
lex.yy.c:2610: error: expected ';', ',' or ')' before numeric constant
make.bin[2]: *** [lex.yy.o] Error 1
make.bin[2]: *** Waiting for unfinished jobs....

	Make sure to do reverse regression test against this error only and ignore 
all other possible errors (if any).
	If you followed above steps carefully you will find that this error is caused 
by lack of 69dcbaaf93a65820a28fe2485b6d15a90f423899 commit in 0.9. Using qgit 
it is easy to find this patch. Select it in the tree, press Ctrl+P to open 
separate window with patch content. Now press right mouse button and 
choose "Select All". Then press Ctrl+C to copy whole patch. With your 
favorite editor create file "0.9-wrc-parser.diff" and paste the patch into.
	Now go to step 0 and search for a cause of next problem. When you face 
with "expected ';', ',' or ')' before numeric constant" error again at step 2 
execute:

patch -p1 < 0.9-wrc-parser.diff
make depend && make

	When you stop at next error or successfully complete compilation - follow 
corresponding instructions in step 2.
	I think you get the idea. Each iteration of reverse regression testing will 
give us yet another patch. At the end we have all patches necessary to 
compile ancient wine-0.9 on modern system.

	*	*	*

	There is some important notes. First, sometimes patches won't apply to old 
revisions. Usually this isn't big trouble. For example, I have incorporated 
following patches to a file "0.9-gdi-freetype.diff": 
603d21cbc4fc8b915248cd3a6f90b02f721980c4
0458a5e38dcf7d03a0eedd1e63922c1eb4e37cb9

	But we cannot apply this fix to 0.9 directly. How to solve this problem? 
Execute this to choose wine-0.9 revision first:

git-reset wine-0.9
git checkout -f

	Then try to apply the patch:

patch -p1 < 0.9-gdi-freetype.diff

	Fortunately, just 1 out of 6 hunks failed to apply. We now have 
freetype.c.rej. Open it. As you can see it is very easy to fix this by 
editing freetype.c accordingly. Save the result 
to "0.9-gdi-freetype-old.diff" by executing:

git-diff > 0.9-gdi-freetype-old.diff

	*	*	*

	There is an alternative to reverse regression test: fix the code yourself. 
This may be even faster if you know exactly what's wrong, how to fix it and 
there is few lines to change. For example, this is exactly how I created 
patch "0.9-kernel-time.diff": by fixing the code manually (I just replaced 
old function TIME_ClockTimeToFileTime with newer version of it taken from 
recent time.c). However, if you don't know exact cause or there to many lines 
to change reverse regression testing is best and fastest option.

	*	*	*

	At the end of the whole process you should have four 
patches: "0.9-kernel-time.diff", "0.9-gdi-freetype.diff", "0.9-gdi-freetype-old.diff" 
and "0.9-wrc-parser.diff".
	As you remember, our original goal was to do regression test between 0.9.40 
and 0.9. So what now? Just proceed with regression test as usual. When you 
get compile error just apply corresponding patch and try to compile again.
	It may be confusing to have multiple versions of patch to fix similar error 
("0.9-gdi-freetype.diff" and "0.9-gdi-freetype-old.diff" in this case). But 
actually it isn't too hard to guess what you need. For example if you about 
0.9.5 revision you need 0.9-gdi-freetype.diff", if you about 0.9 revision you 
need "0.9-gdi-freetype-old.diff". Of course it is possible to apply wrong 
version of patch by mistake. Just execute:

git-checkout -f

	And then apply right patch(es).

	*	*	*

	Using above instructions it is possible to do regression test between recent 
version of WINE and ancient one. Everything should be very straightforward 
even for non-programmer. Just basic knowledge is needed. If you havn't basic 
knowledge just read man pages for commands you don't know.

	END OF REVERSE REGRESSION TESTING HOWTO

	This howto isn't stricly step-by-step guide and isn't perfectly written but I 
havn't time for writing better version. However, I think that above howto is 
understandable enough to be useful. If not (or you find any errors/typos) 
then tell me about this.

> Should I remove wine first (binary .deb provided with ubuntu)?

	Simplest way to run WINE during regression testing is to just execute "./wine 
program.exe" from the root of the source directory where you are doing the 
regression test.

	In case if you stuck completely (or havn't enough personal/CPU time), you can 
consider to send your game via postal mail to someone who can try to do the 
regression testing for you. For example, I can try. When I complete 
regression testing I can return the game back to you if you want.
	It is obvious that you really should try to do the regression testing 
yourself first because it is a fastest way to find the cause of the bug. I 
will try to help you remotely if possible, just ask for help in case of any 
problem.

	Thank you for using WINE.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0.9-gdi-freetype-old.diff
Type: text/x-diff
Size: 5122 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-users/attachments/20071107/f0dad1e8/attachment-0004.diff 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0.9-kernel-time.diff
Type: text/x-diff
Size: 635 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-users/attachments/20071107/f0dad1e8/attachment-0005.diff 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0.9-gdi-freetype.diff
Type: text/x-diff
Size: 5350 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-users/attachments/20071107/f0dad1e8/attachment-0006.diff 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0.9-wrc-parser.diff
Type: text/x-diff
Size: 6520 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-users/attachments/20071107/f0dad1e8/attachment-0007.diff 


More information about the wine-users mailing list