This weekend I tried building several of the tor projects on Windows (tor, vidalia, tbb, and vanilla firefox). I kept notes of my adventures, some of the quirks I ran into, and the final set of instructions that seemed to work for me.
Perhaps most usefully, I've created an Amazon AMI that anyone will be able to boot up and use. (Yes, this has trust issues, I've addressed them in the top of the README document attached.) The intention is that people who want to test a patch or develop a patch can use this to bootstrap themselves, without having to fight long and hard to set up a Windows build environment.
I've attached two documents: 1) TBB Environment README.txt 2) Adventures in Compilation.txt
The first is the README for the environment. The second is a journal of my trying to figure out what to do. Specifically I'm going to call out several issues. If desired, I can submit patches to address them, and they can be reviewed.
I understand that documentation is usually a lower priority than actually shipping software, please take these comments not as bitchy criticism, but instead a list of things I'd like to improve, if someone can review my suggestions and shepard me a little.
1) Firefox's official build environment is VS2010 while TBB's is VS2008
I'm not 100% sure, but it seems like it'd be relatively easy to switch TBB over to 2010. There may be some issues. But it seems like it'd be good to track FF's official build env. I ran across at least 1 Vanilla FF issue that broke in 2008, and there seemed to be a few in the bugtracker.
2) Vidalia's build environment instructions contradict TBB's
https://gitweb.torproject.org/vidalia.git/blob/HEAD:/INSTALL https://gitweb.torproject.org/torbrowser.git/blob/HEAD:/docs/buildmachine_se...
Vidalia's says you need CMake in your PATH, TBB's says you don't. I think it can be in your PATH.
3) There's no explicit instructions on how to build Tor in Windows
It seems like you just build it in MinGW? It worked anyway. It's a (minor) bitch to get the components built and placed in the 'correct way and place' for the MinGW toolchain. (Now documented in my README)
4) The TorBrowser build instructions are really, really bad.
https://gitweb.torproject.org/torbrowser.git/blob/HEAD:/docs/buildmachine_se... This is pretty good. But it just ends abruptly, and doesn't tell you want to do.
https://gitweb.torproject.org/torbrowser.git/blob/HEAD:/docs/HACKING This document seems to be mostly up to date, although I think the FF Extensions it lists have been changed since.
https://gitweb.torproject.org/torbrowser.git/blob/HEAD:/build-scripts/INSTAL... This one is super out of date. - You don't need subversion or winrar - It talks a lot about getting FirefoxPortable (or built a custom Firefox) - I didn't try following the instructions for MinGW, msys, cmake, qt, msysGTK, or autoconf - since I had those already. It seems these sections have been subsumed by the windows buildmachine document - The OpenSSL instructions do not match the instructions IN OpenSSL - Vidalia's links are way out of date and dead - Its instructions for Vidalia don't match Vidalia's - It talks about PidginPortable? I think that's been nixed... - "Currently the Tor Browser Bundle uses FirefoxPortable binaries." - It talks about building with MSVC 7.1 (Visual Studio 2003) - It stops short of telling you how to actually build the bundle, probably because the makefiles are newer than this document
https://gitweb.torproject.org/torbrowser.git/blob/HEAD:/build-scripts/DEPLOY... This doesn't seem applicable at all anymore
I eventually found (by searching my email spools) the magic incantation to kick it off. The "TorBrowser" section of Adventures in Compilation.txt shows my hiccups and luck getting it going.
Finally, after all this.... tbb-firefox crashes. I don't know why. I don't know if it's because I'm using VS2010, or my msvc*.dll swaps. Specifically it's crashing here:
c:\build\torbrowser\build-scripts\build-alpha-windows\build\firefox-17.0.3esr\content\xul\templates\src\nsrulenetwork.h class Iterator : public ConstIterator { public: Iterator(ReteNode** aNode) : ConstIterator(aNode) {}
Iterator& operator++() { ++mCurrent; return *this; }
Iterator operator++(int) { Iterator result(*this); ++mCurrent; return result; }
ReteNode* operator*() const { return *mCurrent; } <=========================================
ReteNode* operator->() const { return *mCurrent; }
bool operator==(const ConstIterator& aConstIterator) const { return mCurrent == aConstIterator.mCurrent; }
bool operator!=(const ConstIterator& aConstIterator) const { return mCurrent != aConstIterator.mCurrent; } };
I'm not quite sure where to start figuring out *why* it's dereferencing a null ptr. The windbg output is in the bottom of both docs.
The AMI for the EC2 instance is ami-2e36ab47 - when you start it, open ports 3389 and 8080 in the firewall for 0.0.0.0/0 (or just your IP address if you want.) If you try it, and get skeeved out by them asking for your SSH private key to get the password, check out https://github.com/tomrittervg/decrypt-windows-ec2-passwd
-tom