======Long Live Crossfire!====== * The Absolutely Real Thing ======Introduction====== * Long-time player, patcher, documenter, coder... * Non-prolific contributor with primarily low-profile changes, but a long-standing fan and contributor... * [[https://www.openhub.net/accounts/kbulgrien]] * Notable contributions * GTK V2 client retrofit for libglade, plus numerous alternate main window layouts. * CFDialog.py / npc_dialog.py improvements and documentation. * Fixed the notorious double-character bugs in GTK clients. * Doxygen markup for the client code base. * Added SDL_mixer to client for sound. * Made several client releases. [[content]] ======Build Resources====== * [[http://www.gnu.org/software/automake/manual/autoconf/index.html#Top Automake Manual]] =====Debugging===== * Function call tracing may be done at run-time with [[http://ndevilla.free.fr/etrace/|etrace]]. =====Portability===== ====Shell Programming==== * [[http://www.gnu.org/software/automake/manual/autoconf/Portable-Shell.html#Portable-Shell|Automake Manual Chapter]] * Various topics, good workaround for echo -n @ [[http://www.in-ulm.de/~mascheck/various/|#! aribtrary unix stuff]] * [[http://www.linux.com/articles/34658|What to watch out for when writing portable shell scripts]] ====make==== * [[http://www.gnu.org/software/automake/manual/autoconf/Portable-Make.html#Portable-Make|Automake Manual Chapter]] ====Portable C/C++==== * [[http://www.gnu.org/software/automake/manual/autoconf/Portable-C-and-C_002b_002b.html#Portable-C-and-C_002b_002b|Automake Manual Chapter]] =====SVN Scripts===== ====svn-co.sh==== This script can do svn 1.5.x sparse checkouts or pre-1.5 checkouts. The script defaults to using subversion 1.5+ sparse checkouts. If an older client is detected, the script switches to a legacy checkout directory model. It is available for download from [[http://invidious.meflin.net/~kbulgrien/files/svn-co.sh|invidious.meflin.net]]. Create the desired development directory first, get the script, then run it to checkout. For example: $ sudo mkdir -p /home/devel/crossfire $ sudo chgrp -R ctools /home/devel $ sudo chmod -R g+rwx /home/devel $ cd /home/devel/crossfire $ curl -o svn-co.sh http://invidious.meflin.net/~kbulgrien/files/svn-co.sh $ bash svn-co.sh --trunk --all Built-in help shows: Usage: svn-co.sh \ { --client | --server | --all } \ { --trunk | --branch=1.xx } \ [ --release ] Where: xx is the branch number A client checkout with --release gets arch and server too. ====svn-up.sh==== This script is only used for SVN clients of a lower version number than 1.5, or when a non-sparse checkout is used. It is available for download from invidious.meflin.net. Enter the desired development directory first, get the script, and then run it to update. For example: $ cd /home/devel/crossfire $ curl -o svn-up.sh http://invidious.meflin.net/~kbulgrien/files/svn-up.sh $ bash svn-up.sh --trunk --all Built-in help shows: Usage: svn-up.sh \ { --client | --server | --all } \ { --trunk | --branch=1.xx } \ [ --release ] Where: xx is the branch number A client update with --release updates arch and server too. =====Configure Scripts===== ====trunk.autogen.sh==== $ cd /home/devel/crossfire $ curl -o trunk.autogen.sh http://invidious.meflin.net/~kbulgrien/files/trunk.autogen.sh ====branch.autogen.sh==== $ cd /home/devel/crossfire $ curl -o branch.autogen.sh http://invidious.meflin.net/~kbulgrien/files/branch.autogen.sh =====Distribution-Specific Setup===== ====Mageia 2==== See [[dev:linux_mageia_2|Mageia 2]] ====Mageia 1==== See [[dev:linux_mageia_1|Mageia 1]] ====Mandriva 2010.1 (Spring)==== See [[dev:linux_mandriva_2010.1|Mandriva 2010.1 (Spring)]] ====Mandriva 2009.0==== See [[dev:linux_mandriva_2009.0|Mandriva 2009.0]] ======Release Guide (WIP)====== The directions use SVN trunk as the example release. The instructions presume you start in the top level SVN directory (the one that contains the arch, client, maps, server) for each phase (arch, client, maps, server) This procedure assumes that release operations are done in the ''/home/devel/crossfire/rpmbuild'' directory. The RPMs build in this procedure may be installed by a user without using **sudo** or root permissions. The RPMs will be build to install in the user's home directory (**${HOME}/usr/local/games/crossfire**). This path is chosen so it is clearer how to modify the procedure to build RPMs that install into **/usr/local/games/crossfire**. =====Optional: Setup .rpmmacros===== A key to building RPMs without using sudo or root is centered around creating a .rpmmacros file in the builder's home directory. You only need a file like this set up if you want to build and install the rpm as a normal user. To make RPMs that use distribution defaults, make sure that ~/.rpmmacros does not exist, or that it does not conflict with the system-wide settings. # /etc/rpm/macros # (c) GPL 2003 Tero.Karvinen at-sign iki.fi %packager %(echo "$USER") %_topdir /home/devel/crossfire/rpmbuild # %_rpmtopdir %{_topdir}/%{name}/RPM %_rpmtopdir %{_topdir}/RPM %_builddir %{_rpmtopdir}/BUILD %_rpmdir %{_rpmtopdir}/RPMS %_sourcedir %{_rpmtopdir}/SOURCES %_specdir %{_rpmtopdir}/SPECS %_srcrpmdir %{_rpmtopdir}/SRPMS %_tmppath %{_rpmtopdir}/TMP %_buildroot %{_tmppath}/%{name}-root %_datadir %(echo "$HOME")/usr/local/games/crossfire # Build rpms in your home directory, without root priviledges # Users can copy this file to $HOME/.rpmmacros to override # settings, such as packager to "Firstname Lastname email". # Example of typical directory and file hierarchy for # rpm building: # ~/rpmbuild/ # ~/rpmbuild/nano/ # replace nano with rpm name # ~/rpmbuild/nano/TMP/ # ~/rpmbuild/nano/BUILD/ # user must create this dir # and files (can be extracted from a source rpm with # rpm2cpio *.src.rpm |cpio -dvi # ~/rpmbuild/nano/nano-1.2.tar.gz # ~/rpmbuild/nano/nano.spec # Then you can build your rpm with # rm -rf TMP/* BUILD/* ; rpmbuild -ba *.spec 2>&1 |tee rpmbuild.log # For more information, see www.iki.fi/karvinen To be able to sign RPMs, also add: %_signature gpg %_gpg_name Firstname I. Lastname =====Setup the Release Workspace===== Create the base workspace directory and make it your current working directory. $ export RELDIR=/home/devel/crossfire/rpmbuild $ mkdir -p ${RELDIR} $ cd ${RELDIR} Populate the release workspace with the necessary scripts: $ wget http://invidious.meflin.net/~kbulgrien/files/svn-co.sh $ wget http://invidious.meflin.net/~kbulgrien/files/svn-up.sh $ wget http://invidious.meflin.net/~kbulgrien/files/trunk.autogen.sh $ wget http://invidious.meflin.net/~kbulgrien/files/branch.autogen.sh $ wget http://invidious.meflin.net/~kbulgrien/files/prerelease.sh =====Create a Release or Snapshot===== It is only necessary to manually invoke the **prerelease.sh** script. The other scripts are automatically called as needed. The built-in help for **prerelease.sh** shows: Usage: prerelease.sh \ { --client | --server | --all } \ { --trunk | --branch=1.xx } \ [ --name=First_I._Last ] \ [ --email=me@my.domain ] \ [ --release=y ] \ [ --maps-bz2 ] Where: xx is the branch number --name --email Specify the RPM packager (default: user@my.domain) Use underscores instead of spaces for --name. --release=y Build a release instead of a snapshot. For the first release of a particular version, always use 0. For subsequent bugfix re-releases, increment the release count by one. --maps-bz2 Create a bzip2 maps tarball in addition to a gzip tarball. An example of how to build a snapshot release follows: $ bash prerelease.sh --trunk --client --name=First_I._Last --email=me@my.domain * If there are errors, rpmbuild will tell you. * RPMs will be put in RPM/RPMS/ * SRPM will be located in RPM/SRPMS Making an official release is not yet fully implemented and tested, but the primary difference is adding a --release parameter to the **prerelease.sh** command-line. For good information on how to sign RPMs, see http://fedoranews.org/tchung/gpg/ ======Bug Triage====== =====crossfire-client-gtk2===== ====Client | Save window position==== The client restores the window vertically offset (lower) by about the size of the window title bar. It should restore it the same place it was when saved. ====2.x Invidious==== * Can't easily reproduce this one. Had just bought a permanent apartment. Saved by 'a'pplying the bed and probably hit 'a' more that one once very quickly. The client crashed immediately. Had done a bunch of dropping right before. I don't have a clue what went bad. It was an RPM build. I do not know what the 24881 means in the message below. $ crossfire-client-gtk2 (crossfire-client-gtk2:24881): Gtk-CRITICAL **: gtk_widget_modify_fg: assertion `GTK_IS_WIDGET (widget)' failed (crossfire-client-gtk2:24881): Gtk-CRITICAL **: gtk_widget_modify_font: assertion `GTK_IS_WIDGET (widget)' failed Segmentation fault $ date Sat Dec 20 22:27:49 CST 2008 $ crossfire-client-gtk2 -loglevel 0 [ INFO ] (Client Version) GTK V2 Unix Client 2.0.r11029