If you are going to make any changes to MySQL++, this file has some hints and commentary you may find helpful. Subversion Access ~~~~~~~~~~~~~~~~~ To check out the current development version from the Gna! Subversion repository, say: $ svn co svn://svn.gna.org/svn/mysqlpp/trunk mysqlpp If you're a MySQL++ committer, use svn over ssh instead: $ svn co svn+ssh://LOGIN@svn.gna.org/svn/mysqlpp/trunk mysqlpp where LOGIN is your Gna! login name. You will have to have your ssh public key registered with Gna! for this to work. Submitting Patches ~~~~~~~~~~~~~~~~~~ If you wish to submit a patch to the library, please send it to the MySQL++ mailing list. We want it in unified diff format. The easiest way to do this is to check out a copy of the current MySQL++ tree as described in the previous section. Then make your change, cd to the root directory of the project, and ask Subversion to generate the diff for you: $ svn diff > mychange.patch If your patch adds new files to the distribution, you can say "svn add newfile" before you do the diff, which will include the contents of that file in the patch. (You can do this even when you've checked out the tree anonymously.) Then say "svn revert newfile" to make Subversion forget about the new file. If you're making a patch against a MySQL++ distribution tarball, then you can generate the diff this way: $ diff -ruN mysql++-olddir mysql++-newdir > mychange.patch The diff command is part of every Unix and Linux system, and should be installed by default. If you're on a Windows machine, GNU diff is part of Cygwin (http://cygwin.com/). Subversion is also available for all of these systems. There are no excuses for not being able to make unified diffs. :) Adding Support for a Different Compiler ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MySQL++ now uses the Bakefile system for creating project files and makefiles. This allows us to make changes to a single set of files, and have the proper changes be made to all generated project files and makefiles. In the past, we used more ad-hoc systems, and we'd frequently forget to update individual project files and makefiles, so at any given time, at least one target was likely to be broken. If MySQL++ doesn't currently ship with project files or makefiles tuned for your compiler of choice, you need to work through the Bakefile mechanism to add support. We're not willing to do ad-hoc platform support any more, so please don't ask if you can send us project files instead; we don't want them. If you want to port MySQL++ to another platform, we need to be confident that the entire library works on your platform before we'll accept patches. In the past, we've had broken ports that were missing important library features, or that crashed when built in certain ways. Few people will knowingly use a crippled version of MySQL++, since there are usually acceptable alternatives. Therefore, such ports become maintenance baggage with little compensating value. Maintaining a Private CVS Repository ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You may find it helpful to maintain your own CVS repository. Whenever there is a new MySQL++ release, import it on the vendor branch like this: $ cvs import -m "Version 1.7.35" software/mysql++ mysql++ mysql++-1_7_35 (This assumes that you have your CVSROOT environment variable set properly.) Update the HEAD branch like this: $ cd mysql++ $ cvs update -PdA $ cvs update -j HEAD -j mysql++-1_7_35 -Pd $ cvs ci -m "merged 1.7.35 into HEAD" $ cvs tag mysql++-1_7_35-merged Then any changes you make can easily be tracked, and diffs can be produced with rdiff: $ cvs rdiff -ru mysql++-1_7_35 -r mysql++-1_7_35_equal_list \ $(cat CVS/Repository) > equal_list.patch On Manipulating the Bakefiles and Autoconf Files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If change any of the Bakefiles (*.bkl) or the autoconf stuff (configure.ac and everything in the config subdir), you need to run the command: $ ./bootstrap [pedantic] [noexamples] [configure options] This command rebuilds all of the project files and makefiles that depend on the Bakefiles and Autoconf stuff. If you pass 'pedantic' to the bootstrap script, it will set up the autoconf build system so it turns on all of GCC's warnings and such. It's useful to build the library in this mode when making changes to make sure there are no obvious problems with the code. If you pass 'noexamples', the examples won't be built. You can pass any of the previous options in any order. As soon as the bootstrap script sees an options that it doesn't understand, it stops processing the command line. Any subsequent options are passed (indirectly) to the configure script. See README.unix for more on configure script options.