Welcome to the wonderful world of Microsoft Windows
"I'm trying to compile PHP on Windows"
Such a simple statement brought various reactions in IRC channels and mailing lists. But invariably I heard the same thing asked.
[photopress:writer.jpg,full,alignleft] No, I'm not insane. And I realize that there are some great resources for downloading precompiled ready to go PHP windows binaries and extensions. However, I've been working with PHP-GTK2, a project that currently has a lot of work to be done in both documenting (which I have helped with and need to do more of) and writing C code (which is something I'd like to learn to help with). The general idea of PHP-GTK2 is to create wrappers around GTK+ which is a great toolkit but it takes a while to write things in C. Other scripting languages have similiar wrappers, including Perl, Ruby, and Python. But I prefer PHP, mostly for aesthetic and subjective, not objective reasons. And scripting languages are so much easier to deal with compared to compiled languages. Besides, it makes desktop app development on Windows really fast and easy - the screenshot is from the Open Source project I'm writing with it.
I wanted to be able to test new things being placed in CVS and learn enough C to help increase the implementation percentage. Right now PHP-GTK2 is simply trying to finish the 2.6.9 version of GTK+ - I want 2.10 for all the nifty new features, including an "assistant", status bar icons, even cross-platform printing. But that isn't going to happen very swiftly if all the current developers are busy. Rule number one of open source...if you want it, write it. But I couldn't even begin to fiddle with source code until I could compile the thing.
After spending several days and countless hours messing with the nuances of Microsoft's insane and headache inducing compile and development system I now have a working 5.2 dev + PHP-GTK2 dev. This is a rather long and somewhat insane tutorial on how to accomplish this feat for those with time on their hands who aren't afraid of the windows command line but aren't necessarily C gurus.
I'll be going over four main steps
- Setup a (free as in money, not beer) compile environment
- Compile PHP
- Compile PHP-GTK2
- Deploy PHP-GTK2
The Compile Environment
[photopress:vce.jpg,full,alignleft] Although GCC rules the world in the *nix universe, on Windows things tend to be more fragmented. There is cygwin for those who love their linux tools, mingw the open source favorite, Borland's "professional" C tools, hardware specific compilers such as Intel's and Sun's and of course Microsoft's enormous(as in sheer size) Visual Studio. I'm sure there are many more C\C++ compilers for windows, but these appear to be the most common.
Because this is a fun side project I didn't want to be shelling out any big bucks, and because theoretically Microsoft knows windows best I decided to go with Visual C++ Express - a stripped down version of the C++ component from Microsoft's Visual Studio available for free.
Start by making sure you have a fairly large chunk of hard drive space available for the environment. Although VCE isn't that large, you'll also be installing other components that will take up over a gig of space. Next you'll need to download Microsoft's Visual C++ Express from their website. Follow the installer using the usual setup, you don't need the additional items offered like sql server 2005 if you just intend to compile and work on PHP.
After you have the program installed, open it once to make sure things are set up. There will be a nag until you "register" the product. Basically you'll need to answer a bunch of questions and you'll need a Microsoft passport account. Registration is free and if you uninstall and then reinstall using the same passport you won't need to fill out the form again.
Next we need to install the Windows Platform SDK. This is an enormous install, and can take a long time to download on dial-up. After you've downloaded and installed the Windows SDK you need to get it working with VCE. Microsoft has a document on the procedure. You can skip the first few steps since we'll be using the command line tools. You just need to alter your corewin_express.vsprops and default.js. It's not too difficult if you know how to use find in wordpad and search for files on windows. Or you can simply download the already altered files from the links above and drop them into place if you're lazy. You can also ignore the "build a test application" part of the instructions.
[photopress:prompt.jpg,full,alignright] Finally we need the last piece of the puzzle, the .Net Framework SDK. As before, download it, let it install in the default location (it will want to become part of your VCE install).
Now we have one more step to complete. PHP uses a command line environment to build instead of a Visual Studio project. There is a file called vsvars32.bat that is used to set up all the Visual Studio variables. Search for that file (it's buried pretty well). You need to edit the batch file, adding the paths to the /bin directories from the two newly installed sdk's to the PATH variable, the /include directories of both to the INCLUDE variable, and the /lib directories to the LIB (not LIBPATH) variables. Save the file, and now when you run the Visual Studio 2005 command prompt (in the start menu) everything will be set up properly.
One last thing - php will be looking for a file called winres.h. A quick google search and I find a mailing list post with the same error, and a fix. Seems the microsoft platform sdk and php disagree on a header name - so search for WinResrc.h, (somewhere in the include dir of the windows platform sdk) copy it, and rename the file winres.h
[photopress:dirlayout.jpg,full,alignleft] First of all, you need to decide on a location for all the source code you will be using. I chose c:/php because I'm so original, but basically anywhere would work. First you'll need the source code for PHP5.2. I used tortoisecvs to check out the latest php source with anonymous CVS into c:/php/php5. You can also download an official release or a source snap.
Next you'll need libraries and headers. You can get all the required ones plus additional ones for building extensions from Edin's site. Unzip the contents and place them in the build directory, parallel to your php source. You also need to add the path to your php_build/bin directory to the vsvars32.bat file so the build environment can find and use the tools there. If you get an error during configure about bison you may need to add @SET BISON_SIMPLE= php_build\bin\bison.simple to the vsvars32.bat file.
Now it's time to build PHP. Open up the Visual Studio 2005 command prompt and cd to your php source directory. Run buildconf, and then follow the directions to view all available configuration options. Create your configure line. You need the cli to run PHP-GTK2 properly but you can also build the windows cli and do any additional extensions you'd like.
After running cscript /nologo configure.js (your configure options here) you're all set.
[photopress:configure.jpg,full,alignright] Run nmake - this is the actual compilation and might take awhile. After nmake is finished it's probably a good idea to run nmake test
Now there are a few caveats to building software with VCE (basically Visual Studio 2005 tools) that all make deployment a bit of a pain. First of all anything built will require the mscvr80.dll - that's the new microsoft C runtime. Usually the runtime is shipped with new versions of windows or installed via a service pack. For some reason anything less than vista will need to install the redistributable package from microsoft.
Secondly VCE creates "manifest files" that tell the dll or exe which runtime to use. Unless you want to bother always shipping the manifest file around, you'll need to "pack" the manifest into the dll or exe file - msdn has instructions for doing this. Using the command line is the easiest course - altering makefiles is too much of a pain. And if you create debug versions you're not allowed to distribute them.
PHP-GTK2 will require two items, the source code for the extension and the GTK+ development library stuff. Let's start with the libraries since it will take a rather long time and a lot of downloads.
Start with Gtk's ftp site. We'll want the 2.6.9 branch versions of GTK+ and its dependencies. Download glib, gtk+ and pango dev packages. I had a problem with something not being available in the 1.9.0 download of atk, so I got the 1.10.1 version instead. I created a seperate directory for all the GTK+ libs, parallel to the php_build dir, and called it gtk_build (I know, I'm so original)
Now unzip the glib contents. Drop the created folders into your gtk_build directory. Now go into gtk_build/lib/glib-2.0/include and move glibconfig.h to gtk_build/include. Next go into gtk_build/include/glib-2.0. Move the contents of that directory up one so you have gtk_build/include/glib and gtk_build/include/gobject, etc. Next unzip the gtk contents. Drop the folders into gtk_build again. Next go into gtk_build/lib/gtk-2.0/include and move gdkconfig.h into gtk_build/include. Then go to gtk_build/include/gtk-2.0 and move all the contents one directory up (just like you did with glib). Unzip pango and atk and drop them into place. Just like gtk and glib you'll need to go into the include directory and move /atk out of /atk-1.0 and /pango out of /pango-1.0.
Almost there - gtk uses iconv and gettext, but the version you used for PHP won't work quite right, so we'll head to Tor's site and get some working libs. You'll need libiconv and gettext. Unzip them and put their contents in your gtk_build directory. Do NOT put them in your php_build directory - they'll overwrite stuff and cause a mess!
No, we're still not done. You'll also need two additional tools - grep and sed for windows. You can get them from GNU utilities for Win32. Download the zip, remove grep and sed, and place them in you php_build/bin - NOT your gtk_build directory.
Now you'll need to add a few more directories to vsvars32.bat. You'll need to add your gtk_build/lib path and the path to your newly compiled PHP Release_TS folder to LIB, the location of some kind of php cli added to PATH (this is used for generating C files), and the location of gtk_build/include and your php source (mine is c:\php\php5) to the INCLUDE variable. Now you're almost ready to build.
Probably the best way to get php-gtk2 source is to use cvs, the only release is an alpha that's rather old at this point. My source ended up in php-gtk parallel to the php_build, php5, and gtk_build directories.
There's one last thing you need to do - open main/php_gtk.h in your php-gtk source folder. There's a little VS 2005 bug that we need to fix (I need to submit it to the mailing list) - move
underneath the #ifdef PHP_WIN32 block (that means after the #endif)
Now open the command prompt, just like you did for building php, and run buildconf, then look at the configure options and then run configure - currently the only PHP-GTK2 extension with a windows configure file is libglade - you can get the header and library files needed from Glade/Gtk+ downloads, put the contents in your gtk_build directory. The include directory is nested like the others, so take glade-2.40/glade and move it one dir up. But I still couldn't get the extension to build properly - but since I don't use any extensions I don't really care at this point :)
It might take awhile for the files to generate. You can look at the progress in win32/logs.
Just like the php SAPIS you built above, the dll will need to have the manifest packed inside (how annoying)
I already discussed a few problems in deployment - you'll need to get the manifest into the dlls/exe files and every user needs the right microsoft C runtime.
Here's another problem. GTK can be very flakey on Windows because there are a ton of different dll files and you need the right ones. Dll Hell at its finest. Usually a program that uses GTK on windows bundles their own GTK+ libs to avoid missing symbols or incorrect versions and other such nonsense. The nice thing about GTk+ is it's supposed to be completely backward compatible. Although this isn't always true in practice, PHP-GTK2 should be able to run with newer dll runtime versions without any problems. The advantage to this is you get all the bugfixes, and there have been a lot to the windows version. Just remember that a newer runtime version doesn't mean the new features magically appear as well.
Start by creating a directory for holding your deployable (not deplorable) PHP-GTK2. All the .dll files should go in the top directory - usually they are in /bin in the zip. The reason for this is so php can find them easily without modifying PATH vars or other such nonsense.
First you'll need to download glib and its dependencies, Iconv and gettext. You only need the iconv.dll and charset.dll from the iconv package. The gettext only has intl.dll. Then the .dlls included in the glib package. You'll need the lib/locale directory for translated messages. If your app is only in one or two languages, you only need to include those.
Next the dependency stuff - libxml2 for the libxml2.dll, zlib for zlib1.dll. Then we need image dll stuff, libpng for libpng13.dll, libjpeg for jpeg62.dll, tiff for libtiff3.dll, and freetype for freetype6.dll. Then we need the smaller libraries - cairo for libcairo-2.dll, which is very cool, atk for libatk-1.0-0.dll (and possibly .mo files from the lib/locale directory), and pango - you'll need the four .dlls from the package along with the entire /etc folder.
Finally you'll need gtk+ - the latest from the 2.6, 2.8, or 2.10 branches (I like gtk+-2.10.6.zip - a bit more stable on windows) You'll need everything in the zip file. Put the .dlls in bin in the deployment directory and then copy the additional directories parallel.
Now you're ready to move your newly built PHP 5.2 and PHP-GTK2 to its new home. Move your windows php cli (if you built it) and your regular php cli (I hope you built at least one) to the deployment dir. You'll also need the php5ts.dll and any extensions you built as shared (plus any .dlls they require).
Finally, move your php-gtk2.dll over and load it via your php.ini. You can find an example php-gtk ini in the /win32 dir in the php-gtk source. You're finished - try running one of the demo apps (they're in /demo in the php-gtk source)
If you'd like wimp to be the default theme, copy the gtkrc file from share/themes/MS-Windows/gtk-2.0 to etc/gtk-2.0