Rewrote COMPILE.rst

develop
Petr Mrázek 2011-07-31 05:50:37 +02:00
parent 262e915b93
commit 024f23c227
3 changed files with 178 additions and 424 deletions

@ -1,37 +1,40 @@
################ ###############
Compiling DFHACK Building DFHACK
################ ###############
============================
Here's how you build dfhack!
============================
.. contents:: .. contents::
=================
Building on Linux
=================
On Linux, DFHack acts as a library that shadows parts of the SDL API using LD_PRELOAD.
Dependencies Dependencies
============ ============
* ``cmake`` DFHack is meant to be installed into an existing DF folder, so get one ready.
* A compiler for building the main lib and the various tools.
* (Linux only) Veinlook requires the wide-character ncurses library (libncursesw)
* (Linux only) You'll need X11 dev libraries.
Building on Linux For building, you need a 32-bit version of GCC. For example, to build DFHack on
================= a 64-bit distribution like Arch, you'll need the multilib development tools and libraries.
To run in the output folder (without installing) building the library
is simple. Enter the build folder, run the tools. Like this:: Before you can build anything, you'll also need ``cmake``. It is advisable to also get
``ccmake`` on distributions that split the cmake package into multiple parts.
Build
=====
Building is fairly straightforward. Enter the ``build`` folder and start the build like this::
cd build cd build
cmake .. -DCMAKE_BUILD_TYPE:string=Release cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=/home/user/DF
make make install
This will build the library and its tools and place them in a sub-directory ``bin`` inside your build directory. Obviously, replace the install path with path to your DF. This will build the library
along with the normal set of plugins and install them into your DF folder.
Alternatively, you can use ccmake instead of cmake: Alternatively, you can use ccmake instead of cmake::
cd build cd build
ccmake .. ccmake ..
make make install
This will show a curses-based interface that lets you set all of the This will show a curses-based interface that lets you set all of the
extra options. extra options.
@ -39,94 +42,32 @@ extra options.
You can also use a cmake-friendly IDE like KDevelop 4 or the cmake-gui You can also use a cmake-friendly IDE like KDevelop 4 or the cmake-gui
program. program.
To be installed into the system or packaged:: ===================
cd build
cmake -DCMAKE_BUILD_TYPE:string=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DMEMXML_DATA_PATH:path=/usr/share/dfhack ..
make
make install
With this dfhack installs:
* library to ``$CMAKE_INSTALL_PREFIX/lib``
* executables to ``$CMAKE_INSTALL_PREFIX/bin``
* The ``Memory.xml`` file to ``/usr/share/dfhack``
Building on Windows Building on Windows
=================== ===================
You need ``cmake``. Get the win32 installer version from the official First, you need ``cmake``. Get the win32 installer version from the official
site: http://www.cmake.org/cmake/resources/software.html site: http://www.cmake.org/cmake/resources/software.html
It has the usual installer wizard thing. It has the usual installer wizard. Make sure you let it add its binary folder
to your binary search PATH so the tool can be later run from anywhere.
-----------
Using mingw
-----------
You also need a compiler. I build dfhack using mingw. You can get it
from the mingw site: http://www.mingw.org/
Get the automated installer, it will download newest version of mingw You'll also need a copy of Microsoft Visual C++ 2010. The Express version is sufficient.
and set things up nicely. Grab it from Microsoft's site.
You'll have to add ``C:\MinGW\`` to your PATH variable. Build
=====
Open the ``build`` folder and double click the batch script there. This will eventually open
a cmake GUI window. Here, set CMAKE_INSTALL_PREFIX to your DF folder and set up any other
options you're interested in. Hit configure and generate, close the GUI.
Building This crates a folder under build/ that contains the solution files for MSVC.
--------
open up cmd and navigate to the ``dfhack\build`` folder, run ``cmake``
and the mingw version of make::
cd build
cmake .. -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE:string=Release
mingw32-make
----------
Using MSVC
----------
open up ``cmd`` and navigate to the ``dfhack\build`` folder, run
``cmake``::
cd build
cmake ..
This will generate MSVC solution and project files. When you open the solution, make sure you never use the Debug builds. Those aren't
binary-compatible with DF. If you try to use a debug build with DF, you'll only get crashes.
So pick either Release or RelWithDebInfo build and build the INSTALL target.
.. note::
You are working in the ``/build`` folder. Files added to
projects from within MSVC will end up there! (and that's
wrong). Any changes to the build system should be done
by changing the CMakeLists.txt files and running ``cmake``!
-------------------------
Using some other compiler
-------------------------
I'm afraid you are on your own. dfhack wasn't tested with any other
compiler.
Try using a different cmake generator that's intended for your tools.
Build targets
=============
dfhack has a few build targets:
* If you're only after the library run ``make dfhack``.
* ``make`` will build everything.
* ``make expbench`` will build the expbench testing program and the
library.
* Some of the utilities and the doxygen documentation won't be
normally built. You can enable them by specifying some extra
CMake variables::
BUILD_DFHACK_DOCUMENTATION - generate the documentation (really bad)
BUILD_DFHACK_EXAMPLES - build tools from tools/examples
BUILD_DFHACK_PLAYGROUND - build tools from tools/playground
Example::
cmake .. -DBUILD_DFHACK_EXAMPLES=ON
===========
Build types Build types
=========== ===========
``cmake`` allows you to pick a build type by changing this ``cmake`` allows you to pick a build type by changing this
@ -139,19 +80,30 @@ variable: ``CMAKE_BUILD_TYPE``
Without specifying a build type or 'None', cmake uses the Without specifying a build type or 'None', cmake uses the
``CMAKE_CXX_FLAGS`` variable for building. ``CMAKE_CXX_FLAGS`` variable for building.
Valid an useful build types include 'Release', 'Debug' and Valid and useful build types include 'Release', 'Debug' and
'RelWithDebInfo'. There are others, but they aren't really that useful. 'RelWithDebInfo'. 'Debug' is not available on Windows.
Have fun.
================================ ================================
Using the library as a developer Using the library as a developer
================================ ================================
DFHack is using the zlib/libpng license. This makes it easy to link to Currently, the only way to use the library is to write a plugin that can be loaded by it.
it, use it in-source or add your own extensions. Contributing back to All the plugins can be found in the 'plugins' folder. There's no in-depth documentation
the dfhack repository is welcome and the right thing to do :) on how to write one yet, but it should be easy enough to copy one and just follow the pattern.
Rudimentary API documentation can be built using doxygen. The most important parts of DFHack are the Core, Console, Modules and Plugins.
* Core acts as the centerpiece of DFHack - it acts as a filter between DF and SDL and synchronizes the various plugins with DF.
* Console is a thread-safe console that can be used to invoke commands exported by Plugins.
* Modules actually describe the way to access information in DF's memory. You can get them from the Core. Most modules are split into two parts: high-level and low-level. Higl-level is mostly method calls, low-level publicly visible pointers to DF's data structures.
* Plugins are the tools that use all the other stuff to make things happen. A plugin can have a list of commands that it exports and an onupdate function that will be called each DF game tick.
Rudimentary API documentation can be built using doxygen (see build options with ``ccmake`` or ``cmake-gui``).
DFHack consists of variously licensed code, but invariably weak copyleft.
The main license is zlib/libpng, some bits are MIT licensed, and some are BSD licensed.
Feel free to add your own extensions and plugins. Contributing back to
the dfhack repository is welcome and the right thing to do :)
Contributing to DFHack Contributing to DFHack
====================== ======================
@ -178,89 +130,22 @@ don't know what, check out http://github.com/peterix/dfhack/issues --
this is also a good place to dump new ideas and/or bugs that need this is also a good place to dump new ideas and/or bugs that need
fixing. fixing.
---------------- ---------------
Layout for tools Memory research
---------------- ---------------
Tools live in the tools/ folder. There, they are split into three If you want to do memory research, you'll need some tools and some knowledge.
categories. In general, you'll need a good memory viewer and optionally something
to look at machine code without getting crazy :)
distributed
these tools get distributed with binary releases and are installed
by doing 'make install' on linux. They are supposed to be stable
and supported. Experimental, useless, buggy or untested stuff
doesn't belong here.
examples
examples are tools that aren't very useful, but show how DF and
DFHack work. They should use only DFHack API functions. No actual
hacking or 'magic offsets' are allowed.
playground
This is a catch-all folder for tools that aren't ready to be
examples or be distributed in binary releases. All new tools should
start here. They can contain actual hacking, magic values and other
nasty business.
------------------------
Modules - what are they?
------------------------
DFHack uses modules to partition sets of features into manageable
chunks. A module can have both client and server side.
Client side is the part that goes into the main library and is
generally written in C++. It is exposed to the users of DFHack.
Server side is used inside DF and serves to accelerate the client
modules. This is written mostly in C style.
There's a Core module that shouldn't be changed, because it defines the
basic commands like reading and writing raw data. The client parts for
the Core module are the various implementations of the Process
interface.
A good example of a module is Maps. Named the same in both client and
server, it allows accelerating the reading of map blocks.
Communication between modules happens by using shared memory. This is
pretty fast, but needs quite a bit of care to not break.
------------ Good windows tools include:
Dependencies
------------ * Cheat Engine
Internal * IDA Pro (the free version)
either part of the codebase or statically linked.
External Good linux tools:
linked as dynamic loaded libraries (.dll, .so, etc.)
* edb (Evan's Debugger)
If you want to add dependencies, think twice about it. All internal * IDA Pro running under wine.
dependencies for core dfhack should be either public domain or require * Some of the tools residing in the ``legacy`` dfhack branch.
attribution at most. External dependencies for tools can be either
that, or any Free Software licenses.
Current internal dependencies
-----------------------------
tinyxml
used by core dfhack to read offset definitions from Memory.xml
md5
an implementation of the MD5 hash algorithm. Used for identifying
DF binaries on Linux.
argstream
Allows reading terminal application arguments. GPL!
Current external dependencies
-----------------------------
wide-character ncurses
used for the veinlook tool on Linux.
x11 libraries
used for sending key events on linux
Build-time dependencies
-----------------------
cmake
you need cmake to generate the build system and some configuration
headers
=========================
Memory offset definitions
=========================
The files with memory offset definitions used by dfhack can be found in the
data folder.
Using publicly known information and analyzing the game's data is preferred.

@ -3,13 +3,13 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" /> <meta name="generator" content="Docutils 0.8: http://docutils.sourceforge.net/" />
<title>Compiling DFHACK</title> <title>Building DFHACK</title>
<style type="text/css"> <style type="text/css">
/* /*
:Author: David Goodger (goodger@python.org) :Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $ :Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $
:Copyright: This stylesheet has been placed in the public domain. :Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils. Default cascading style sheet for the HTML output of Docutils.
@ -47,6 +47,10 @@ blockquote.epigraph {
dl.docutils dd { dl.docutils dd {
margin-bottom: 0.5em } margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms /* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt { dl.docutils dt {
font-weight: bold } font-weight: bold }
@ -185,7 +189,7 @@ img.align-center, .figure.align-center, object.align-center {
/* reset inner alignment in figures */ /* reset inner alignment in figures */
div.align-right { div.align-right {
text-align: left } text-align: inherit }
/* div.align-center * { */ /* div.align-center * { */
/* text-align: left } */ /* text-align: left } */
@ -245,7 +249,7 @@ pre.address {
margin-top: 0 ; margin-top: 0 ;
font: inherit } font: inherit }
pre.literal-block, pre.doctest-block { pre.literal-block, pre.doctest-block, pre.math {
margin-left: 2em ; margin-left: 2em ;
margin-right: 2em } margin-right: 2em }
@ -310,168 +314,87 @@ ul.auto-toc {
</style> </style>
</head> </head>
<body> <body>
<div class="document" id="compiling-dfhack"> <div class="document" id="building-dfhack">
<h1 class="title">Compiling DFHACK</h1> <h1 class="title">Building DFHACK</h1>
<div class="section" id="here-s-how-you-build-dfhack">
<h1><a class="toc-backref" href="#id2">Here's how you build dfhack!</a></h1>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title first">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#here-s-how-you-build-dfhack" id="id2">Here's how you build dfhack!</a><ul> <li><a class="reference internal" href="#building-on-linux" id="id2">Building on Linux</a><ul>
<li><a class="reference internal" href="#dependencies" id="id3">Dependencies</a></li> <li><a class="reference internal" href="#dependencies" id="id3">Dependencies</a></li>
<li><a class="reference internal" href="#building-on-linux" id="id4">Building on Linux</a></li> <li><a class="reference internal" href="#build" id="id4">Build</a></li>
<li><a class="reference internal" href="#building-on-windows" id="id5">Building on Windows</a><ul>
<li><a class="reference internal" href="#using-mingw" id="id6">Using mingw</a><ul>
<li><a class="reference internal" href="#building" id="id7">Building</a></li>
</ul>
</li>
<li><a class="reference internal" href="#using-msvc" id="id8">Using MSVC</a></li>
<li><a class="reference internal" href="#using-some-other-compiler" id="id9">Using some other compiler</a></li>
</ul>
</li>
<li><a class="reference internal" href="#build-targets" id="id10">Build targets</a></li>
<li><a class="reference internal" href="#build-types" id="id11">Build types</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#using-the-library-as-a-developer" id="id12">Using the library as a developer</a><ul> <li><a class="reference internal" href="#building-on-windows" id="id5">Building on Windows</a><ul>
<li><a class="reference internal" href="#contributing-to-dfhack" id="id13">Contributing to DFHack</a><ul> <li><a class="reference internal" href="#id1" id="id6">Build</a></li>
<li><a class="reference internal" href="#coding-style" id="id14">Coding style</a></li>
<li><a class="reference internal" href="#how-to-get-new-code-into-dfhack" id="id15">How to get new code into DFHack</a></li>
<li><a class="reference internal" href="#layout-for-tools" id="id16">Layout for tools</a></li>
<li><a class="reference internal" href="#modules-what-are-they" id="id17">Modules - what are they?</a></li>
<li><a class="reference internal" href="#id1" id="id18">Dependencies</a><ul>
<li><a class="reference internal" href="#current-internal-dependencies" id="id19">Current internal dependencies</a></li>
<li><a class="reference internal" href="#current-external-dependencies" id="id20">Current external dependencies</a></li>
<li><a class="reference internal" href="#build-time-dependencies" id="id21">Build-time dependencies</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#build-types" id="id7">Build types</a></li>
<li><a class="reference internal" href="#using-the-library-as-a-developer" id="id8">Using the library as a developer</a><ul>
<li><a class="reference internal" href="#contributing-to-dfhack" id="id9">Contributing to DFHack</a><ul>
<li><a class="reference internal" href="#coding-style" id="id10">Coding style</a></li>
<li><a class="reference internal" href="#how-to-get-new-code-into-dfhack" id="id11">How to get new code into DFHack</a></li>
<li><a class="reference internal" href="#memory-research" id="id12">Memory research</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#memory-offset-definitions" id="id22">Memory offset definitions</a></li>
</ul> </ul>
</div> </div>
<div class="section" id="building-on-linux">
<h1><a class="toc-backref" href="#id2">Building on Linux</a></h1>
<p>On Linux, DFHack acts as a library that shadows parts of the SDL API using LD_PRELOAD.</p>
<div class="section" id="dependencies"> <div class="section" id="dependencies">
<h2><a class="toc-backref" href="#id3">Dependencies</a></h2> <h2><a class="toc-backref" href="#id3">Dependencies</a></h2>
<ul class="simple"> <p>DFHack is meant to be installed into an existing DF folder, so get one ready.</p>
<li><tt class="docutils literal">cmake</tt></li> <p>For building, you need a 32-bit version of GCC. For example, to build DFHack on
<li>A compiler for building the main lib and the various tools.</li> a 64-bit distribution like Arch, you'll need the multilib development tools and libraries.</p>
<li>(Linux only) Veinlook requires the wide-character ncurses library (libncursesw)</li> <p>Before you can build anything, you'll also need <tt class="docutils literal">cmake</tt>. It is advisable to also get
<li>(Linux only) You'll need X11 dev libraries.</li> <tt class="docutils literal">ccmake</tt> on distributions that split the cmake package into multiple parts.</p>
</ul>
</div> </div>
<div class="section" id="building-on-linux"> <div class="section" id="build">
<h2><a class="toc-backref" href="#id4">Building on Linux</a></h2> <h2><a class="toc-backref" href="#id4">Build</a></h2>
<p>To run in the output folder (without installing) building the library <p>Building is fairly straightforward. Enter the <tt class="docutils literal">build</tt> folder and start the build like this:</p>
is simple. Enter the build folder, run the tools. Like this:</p>
<pre class="literal-block"> <pre class="literal-block">
cd build cd build
cmake .. -DCMAKE_BUILD_TYPE:string=Release cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=/home/user/DF
make make install
</pre> </pre>
<p>This will build the library and its tools and place them in a sub-directory <tt class="docutils literal">bin</tt> inside your build directory.</p> <p>Obviously, replace the install path with path to your DF. This will build the library
along with the normal set of plugins and install them into your DF folder.</p>
<p>Alternatively, you can use ccmake instead of cmake:</p> <p>Alternatively, you can use ccmake instead of cmake:</p>
<blockquote> <pre class="literal-block">
cd build cd build
ccmake .. ccmake ..
make</blockquote> make install
</pre>
<p>This will show a curses-based interface that lets you set all of the <p>This will show a curses-based interface that lets you set all of the
extra options.</p> extra options.</p>
<p>You can also use a cmake-friendly IDE like KDevelop 4 or the cmake-gui <p>You can also use a cmake-friendly IDE like KDevelop 4 or the cmake-gui
program.</p> program.</p>
<p>To be installed into the system or packaged:</p> </div>
<pre class="literal-block">
cd build
cmake -DCMAKE_BUILD_TYPE:string=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DMEMXML_DATA_PATH:path=/usr/share/dfhack ..
make
make install
</pre>
<p>With this dfhack installs:</p>
<ul class="simple">
<li>library to <tt class="docutils literal">$CMAKE_INSTALL_PREFIX/lib</tt></li>
<li>executables to <tt class="docutils literal">$CMAKE_INSTALL_PREFIX/bin</tt></li>
<li>The <tt class="docutils literal">Memory.xml</tt> file to <tt class="docutils literal">/usr/share/dfhack</tt></li>
</ul>
</div> </div>
<div class="section" id="building-on-windows"> <div class="section" id="building-on-windows">
<h2><a class="toc-backref" href="#id5">Building on Windows</a></h2> <h1><a class="toc-backref" href="#id5">Building on Windows</a></h1>
<p>You need <tt class="docutils literal">cmake</tt>. Get the win32 installer version from the official <p>First, you need <tt class="docutils literal">cmake</tt>. Get the win32 installer version from the official
site: <a class="reference external" href="http://www.cmake.org/cmake/resources/software.html">http://www.cmake.org/cmake/resources/software.html</a></p> site: <a class="reference external" href="http://www.cmake.org/cmake/resources/software.html">http://www.cmake.org/cmake/resources/software.html</a></p>
<p>It has the usual installer wizard thing.</p> <p>It has the usual installer wizard. Make sure you let it add its binary folder
<div class="section" id="using-mingw"> to your binary search PATH so the tool can be later run from anywhere.</p>
<h3><a class="toc-backref" href="#id6">Using mingw</a></h3> <p>You'll also need a copy of Microsoft Visual C++ 2010. The Express version is sufficient.
<p>You also need a compiler. I build dfhack using mingw. You can get it Grab it from Microsoft's site.</p>
from the mingw site: <a class="reference external" href="http://www.mingw.org/">http://www.mingw.org/</a></p> <div class="section" id="id1">
<p>Get the automated installer, it will download newest version of mingw <h2><a class="toc-backref" href="#id6">Build</a></h2>
and set things up nicely.</p> <p>Open the <tt class="docutils literal">build</tt> folder and double click the batch script there. This will eventually open
<p>You'll have to add <tt class="docutils literal"><span class="pre">C:\MinGW\</span></tt> to your PATH variable.</p> a cmake GUI window. Here, set CMAKE_INSTALL_PREFIX to your DF folder and set up any other
<div class="section" id="building"> options you're interested in. Hit configure and generate, close the GUI.</p>
<h4><a class="toc-backref" href="#id7">Building</a></h4> <p>This crates a folder under build/ that contains the solution files for MSVC.</p>
<p>open up cmd and navigate to the <tt class="docutils literal">dfhack\build</tt> folder, run <tt class="docutils literal">cmake</tt> <p>When you open the solution, make sure you never use the Debug builds. Those aren't
and the mingw version of make:</p> binary-compatible with DF. If you try to use a debug build with DF, you'll only get crashes.
<pre class="literal-block"> So pick either Release or RelWithDebInfo build and build the INSTALL target.</p>
cd build
cmake .. -G&quot;MinGW Makefiles&quot; -DCMAKE_BUILD_TYPE:string=Release
mingw32-make
</pre>
</div>
</div>
<div class="section" id="using-msvc">
<h3><a class="toc-backref" href="#id8">Using MSVC</a></h3>
<p>open up <tt class="docutils literal">cmd</tt> and navigate to the <tt class="docutils literal">dfhack\build</tt> folder, run
<tt class="docutils literal">cmake</tt>:</p>
<pre class="literal-block">
cd build
cmake ..
</pre>
<p>This will generate MSVC solution and project files.</p>
<div class="note">
<p class="first admonition-title">Note</p>
<p class="last">You are working in the <tt class="docutils literal">/build</tt> folder. Files added to
projects from within MSVC will end up there! (and that's
wrong). Any changes to the build system should be done
by changing the CMakeLists.txt files and running <tt class="docutils literal">cmake</tt>!</p>
</div>
</div>
<div class="section" id="using-some-other-compiler">
<h3><a class="toc-backref" href="#id9">Using some other compiler</a></h3>
<p>I'm afraid you are on your own. dfhack wasn't tested with any other
compiler.</p>
<p>Try using a different cmake generator that's intended for your tools.</p>
</div>
</div> </div>
<div class="section" id="build-targets">
<h2><a class="toc-backref" href="#id10">Build targets</a></h2>
<p>dfhack has a few build targets:</p>
<ul>
<li><p class="first">If you're only after the library run <tt class="docutils literal">make dfhack</tt>.</p>
</li>
<li><p class="first"><tt class="docutils literal">make</tt> will build everything.</p>
</li>
<li><p class="first"><tt class="docutils literal">make expbench</tt> will build the expbench testing program and the
library.</p>
</li>
<li><p class="first">Some of the utilities and the doxygen documentation won't be
normally built. You can enable them by specifying some extra
CMake variables:</p>
<pre class="literal-block">
BUILD_DFHACK_DOCUMENTATION - generate the documentation (really bad)
BUILD_DFHACK_EXAMPLES - build tools from tools/examples
BUILD_DFHACK_PLAYGROUND - build tools from tools/playground
</pre>
<p>Example:</p>
<pre class="literal-block">
cmake .. -DBUILD_DFHACK_EXAMPLES=ON
</pre>
</li>
</ul>
</div> </div>
<div class="section" id="build-types"> <div class="section" id="build-types">
<h2><a class="toc-backref" href="#id11">Build types</a></h2> <h1><a class="toc-backref" href="#id7">Build types</a></h1>
<p><tt class="docutils literal">cmake</tt> allows you to pick a build type by changing this <p><tt class="docutils literal">cmake</tt> allows you to pick a build type by changing this
variable: <tt class="docutils literal">CMAKE_BUILD_TYPE</tt></p> variable: <tt class="docutils literal">CMAKE_BUILD_TYPE</tt></p>
<pre class="literal-block"> <pre class="literal-block">
@ -479,29 +402,38 @@ cmake .. -DCMAKE_BUILD_TYPE:string=BUILD_TYPE
</pre> </pre>
<p>Without specifying a build type or 'None', cmake uses the <p>Without specifying a build type or 'None', cmake uses the
<tt class="docutils literal">CMAKE_CXX_FLAGS</tt> variable for building.</p> <tt class="docutils literal">CMAKE_CXX_FLAGS</tt> variable for building.</p>
<p>Valid an useful build types include 'Release', 'Debug' and <p>Valid and useful build types include 'Release', 'Debug' and
'RelWithDebInfo'. There are others, but they aren't really that useful.</p> 'RelWithDebInfo'. 'Debug' is not available on Windows.</p>
<p>Have fun.</p>
</div>
</div> </div>
<div class="section" id="using-the-library-as-a-developer"> <div class="section" id="using-the-library-as-a-developer">
<h1><a class="toc-backref" href="#id12">Using the library as a developer</a></h1> <h1><a class="toc-backref" href="#id8">Using the library as a developer</a></h1>
<p>DFHack is using the zlib/libpng license. This makes it easy to link to <p>Currently, the only way to use the library is to write a plugin that can be loaded by it.
it, use it in-source or add your own extensions. Contributing back to All the plugins can be found in the 'plugins' folder. There's no in-depth documentation
on how to write one yet, but it should be easy enough to copy one and just follow the pattern.</p>
<p>The most important parts of DFHack are the Core, Console, Modules and Plugins.</p>
<ul class="simple">
<li>Core acts as the centerpiece of DFHack - it acts as a filter between DF and SDL and synchronizes the various plugins with DF.</li>
<li>Console is a thread-safe console that can be used to invoke commands exported by Plugins.</li>
<li>Modules actually describe the way to access information in DF's memory. You can get them from the Core. Most modules are split into two parts: high-level and low-level. Higl-level is mostly method calls, low-level publicly visible pointers to DF's data structures.</li>
<li>Plugins are the tools that use all the other stuff to make things happen. A plugin can have a list of commands that it exports and an onupdate function that will be called each DF game tick.</li>
</ul>
<p>Rudimentary API documentation can be built using doxygen (see build options with <tt class="docutils literal">ccmake</tt> or <tt class="docutils literal"><span class="pre">cmake-gui</span></tt>).</p>
<p>DFHack consists of variously licensed code, but invariably weak copyleft.
The main license is zlib/libpng, some bits are MIT licensed, and some are BSD licensed.</p>
<p>Feel free to add your own extensions and plugins. Contributing back to
the dfhack repository is welcome and the right thing to do :)</p> the dfhack repository is welcome and the right thing to do :)</p>
<p>Rudimentary API documentation can be built using doxygen.</p>
<div class="section" id="contributing-to-dfhack"> <div class="section" id="contributing-to-dfhack">
<h2><a class="toc-backref" href="#id13">Contributing to DFHack</a></h2> <h2><a class="toc-backref" href="#id9">Contributing to DFHack</a></h2>
<p>Several things should be kept in mind when contributing to DFHack.</p> <p>Several things should be kept in mind when contributing to DFHack.</p>
<div class="section" id="coding-style"> <div class="section" id="coding-style">
<h3><a class="toc-backref" href="#id14">Coding style</a></h3> <h3><a class="toc-backref" href="#id10">Coding style</a></h3>
<p>DFhack uses ANSI formatting and four spaces as indentation. Line <p>DFhack uses ANSI formatting and four spaces as indentation. Line
endings are UNIX. The files use UTF-8 encoding. Code not following this endings are UNIX. The files use UTF-8 encoding. Code not following this
won't make me happy, because I'll have to fix it. There's a good chance won't make me happy, because I'll have to fix it. There's a good chance
I'll make <em>you</em> fix it ;)</p> I'll make <em>you</em> fix it ;)</p>
</div> </div>
<div class="section" id="how-to-get-new-code-into-dfhack"> <div class="section" id="how-to-get-new-code-into-dfhack">
<h3><a class="toc-backref" href="#id15">How to get new code into DFHack</a></h3> <h3><a class="toc-backref" href="#id11">How to get new code into DFHack</a></h3>
<p>You can send patches or make a clone of the github repo and ask me on <p>You can send patches or make a clone of the github repo and ask me on
the IRC channel to pull your code in. I'll review it and see if there the IRC channel to pull your code in. I'll review it and see if there
are any problems. I'll fix them if they are minor.</p> are any problems. I'll fix them if they are minor.</p>
@ -510,92 +442,25 @@ don't know what, check out <a class="reference external" href="http://github.com
this is also a good place to dump new ideas and/or bugs that need this is also a good place to dump new ideas and/or bugs that need
fixing.</p> fixing.</p>
</div> </div>
<div class="section" id="layout-for-tools"> <div class="section" id="memory-research">
<h3><a class="toc-backref" href="#id16">Layout for tools</a></h3> <h3><a class="toc-backref" href="#id12">Memory research</a></h3>
<p>Tools live in the tools/ folder. There, they are split into three <p>If you want to do memory research, you'll need some tools and some knowledge.
categories.</p> In general, you'll need a good memory viewer and optionally something
<dl class="docutils"> to look at machine code without getting crazy :)</p>
<dt>distributed</dt> <p>Good windows tools include:</p>
<dd>these tools get distributed with binary releases and are installed <ul class="simple">
by doing 'make install' on linux. They are supposed to be stable <li>Cheat Engine</li>
and supported. Experimental, useless, buggy or untested stuff <li>IDA Pro (the free version)</li>
doesn't belong here.</dd> </ul>
<dt>examples</dt> <p>Good linux tools:</p>
<dd>examples are tools that aren't very useful, but show how DF and <ul class="simple">
DFHack work. They should use only DFHack API functions. No actual <li>edb (Evan's Debugger)</li>
hacking or 'magic offsets' are allowed.</dd> <li>IDA Pro running under wine.</li>
<dt>playground</dt> <li>Some of the tools residing in the <tt class="docutils literal">legacy</tt> dfhack branch.</li>
<dd>This is a catch-all folder for tools that aren't ready to be </ul>
examples or be distributed in binary releases. All new tools should <p>Using publicly known information and analyzing the game's data is preferred.</p>
start here. They can contain actual hacking, magic values and other
nasty business.</dd>
</dl>
</div>
<div class="section" id="modules-what-are-they">
<h3><a class="toc-backref" href="#id17">Modules - what are they?</a></h3>
<p>DFHack uses modules to partition sets of features into manageable
chunks. A module can have both client and server side.</p>
<p>Client side is the part that goes into the main library and is
generally written in C++. It is exposed to the users of DFHack.</p>
<p>Server side is used inside DF and serves to accelerate the client
modules. This is written mostly in C style.</p>
<p>There's a Core module that shouldn't be changed, because it defines the
basic commands like reading and writing raw data. The client parts for
the Core module are the various implementations of the Process
interface.</p>
<p>A good example of a module is Maps. Named the same in both client and
server, it allows accelerating the reading of map blocks.</p>
<p>Communication between modules happens by using shared memory. This is
pretty fast, but needs quite a bit of care to not break.</p>
</div>
<div class="section" id="id1">
<h3><a class="toc-backref" href="#id18">Dependencies</a></h3>
<dl class="docutils">
<dt>Internal</dt>
<dd>either part of the codebase or statically linked.</dd>
<dt>External</dt>
<dd>linked as dynamic loaded libraries (.dll, .so, etc.)</dd>
</dl>
<p>If you want to add dependencies, think twice about it. All internal
dependencies for core dfhack should be either public domain or require
attribution at most. External dependencies for tools can be either
that, or any Free Software licenses.</p>
<div class="section" id="current-internal-dependencies">
<h4><a class="toc-backref" href="#id19">Current internal dependencies</a></h4>
<dl class="docutils">
<dt>tinyxml</dt>
<dd>used by core dfhack to read offset definitions from Memory.xml</dd>
<dt>md5</dt>
<dd>an implementation of the MD5 hash algorithm. Used for identifying
DF binaries on Linux.</dd>
<dt>argstream</dt>
<dd>Allows reading terminal application arguments. GPL!</dd>
</dl>
</div>
<div class="section" id="current-external-dependencies">
<h4><a class="toc-backref" href="#id20">Current external dependencies</a></h4>
<dl class="docutils">
<dt>wide-character ncurses</dt>
<dd>used for the veinlook tool on Linux.</dd>
<dt>x11 libraries</dt>
<dd>used for sending key events on linux</dd>
</dl>
</div>
<div class="section" id="build-time-dependencies">
<h4><a class="toc-backref" href="#id21">Build-time dependencies</a></h4>
<dl class="docutils">
<dt>cmake</dt>
<dd>you need cmake to generate the build system and some configuration
headers</dd>
</dl>
</div>
</div>
</div> </div>
</div> </div>
<div class="section" id="memory-offset-definitions">
<h1><a class="toc-backref" href="#id22">Memory offset definitions</a></h1>
<p>The files with memory offset definitions used by dfhack can be found in the
data folder.</p>
</div> </div>
</div> </div>
</body> </body>

@ -3,13 +3,13 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" /> <meta name="generator" content="Docutils 0.8: http://docutils.sourceforge.net/" />
<title></title> <title></title>
<style type="text/css"> <style type="text/css">
/* /*
:Author: David Goodger (goodger@python.org) :Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $ :Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $
:Copyright: This stylesheet has been placed in the public domain. :Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils. Default cascading style sheet for the HTML output of Docutils.
@ -47,6 +47,10 @@ blockquote.epigraph {
dl.docutils dd { dl.docutils dd {
margin-bottom: 0.5em } margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms /* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt { dl.docutils dt {
font-weight: bold } font-weight: bold }
@ -185,7 +189,7 @@ img.align-center, .figure.align-center, object.align-center {
/* reset inner alignment in figures */ /* reset inner alignment in figures */
div.align-right { div.align-right {
text-align: left } text-align: inherit }
/* div.align-center * { */ /* div.align-center * { */
/* text-align: left } */ /* text-align: left } */
@ -245,7 +249,7 @@ pre.address {
margin-top: 0 ; margin-top: 0 ;
font: inherit } font: inherit }
pre.literal-block, pre.doctest-block { pre.literal-block, pre.doctest-block, pre.math {
margin-left: 2em ; margin-left: 2em ;
margin-right: 2em } margin-right: 2em }