Latest Posts

Changes in WidelandsGoingCMake

Editor Comment

archived


Revision Differences of Revision 42

# Widelands going CMake ¶

__NOTE: This page describes the transition from SCons to CMake for mostly historical purposes. It is no longer updated or actively maintained. If you want to know details on how to build Widelands with CMake, see BuildingWidelands for up-to-date information.__ ¶

Widelands project plans to move from the current build system SCons to CMake. ¶

This page is to track progress and collect important information in the transition process. ¶

## Table of Contents: ¶
[TOC] ¶



## Important Links ¶

* [SCons](http://www.scons.org) ¶
* [CMake](http://www.cmake.org) ¶
* [CMake Tutorial \(PDF\]](http://www-flc.desy.de/ldcoptimization/documents/talks/CMake_Tutorial.pdf) ¶

## Important notes ¶
### Things to know about CMake/make ¶
* SCons and CMake use a very different approach on building. With SCons you build within the source path, with CMake you are very obligued not to do so, but build in a different path instead. This is called "out of source build". ¶
* With SCons you only use one command for building, with CMake you use two. CMake is a tool to generate Makefiles, which are then used to build. So it is "scons" vs. "cmake;make". But don't worry, most of the time you don't need to think about this. ¶

### Things to know about the transition ¶
* CMake transition is now on the main repository (bzr) in Launchpad. If you check out from there, and build using scons, you can also try building using cmake/make ¶

## What you can do with cmake/make for widelands ¶
### cmake ¶
* General cmake command (from out-of-source-directory!): cmake <path to source-top-level-directory> generates everything. ¶
* e.g. cd ~/widelands-cmake-build && cmake ~/widelands/widelands ¶
* all other settings in cmake are made using "directive" -D ¶
* Attention: every setting is "remembered" by CMake cache, so if you say -DFU=BAR and at next run of cmake you omit -DFU=BAR, it is still set! ¶
* Select build type: Debug or Release (at the moment only those two are supported) ¶
* cmake -DCMAKE_BUILD_TYPE=Release ~/widelands/widelands ¶
* cmake -DCMAKE_BUILD_TYPE=Debug ~/widelands/widelands ¶
* Define the version of the built package (override/skip SVN versioning scheme) ¶
* cmake -DWL_VERSION_MAJOR=0 -DWL_VERSION_MINOR=15 ~/widelands/widelands ¶
* Define the target directory for the "install" target ¶
* cmake -DCMAKE_INSTALL_PREFIX=~/widelands-install ¶
* Choose if a portable version is build (required if widelands is installed **not** in /usr/ or /usr/local) ¶
* cmake -DWL_PORTABLE=true ¶
* Disable boost unit test for debug build ¶
* cmake -DWL_UNIT_TESTS=FALSE ¶

### make ¶
* make (ALL) ¶
* compile everything, up to executable with the settings from cmake call ¶
* make codecheck ¶
* run the codechecks ¶
* make doc ¶
* generate documentation. Currently only with Build Type Debug, but this is easily changed if necessary. ¶
* make pics ¶
* optimize the images in the pics directory (not in source directory, it copies them over) ¶
* make quickpics ¶
* just copy the images in the pics directory without optimizing them (this is a developer target) ¶
* make install ¶
* install into the target dir, this is /usr/local per default (you need root privileges!) or you change it (see above) ¶
* make package ¶
* generate a package, currently out of order (generating empty package) and has still missing features (pics not included and so on) ¶
* make lang ¶
* generate the translations (not in source directory, copies them over to build directory) ¶

### Starting with CMake in the transition (this is for Linux; Windows will differ) ¶
#### 1. Preparation ¶
* Get the sources, as written in [[ BzrPrimer ]] ¶
* $ cd ~/widelands/widelands ¶
* $ mkdir build-cmake ¶

#### 2. Using CMake ¶
* $ cd ~/widelands/widelands/build-cmake ¶
* go to the build directory ¶
* $ cmake .. ¶
* let CMake create the Makefiles in the current directory, regarding the CMakeLists.txt files in the parent (widelands-cmake) directory (this is out-of-source) ¶
* $ cmake -DCMAKE_INSTALL_PREFIX=~/widelands-cmake-install .. -DWL_PORTABLE=true ¶
* if you want to have a different install directory for "make install" instead of /usr/local ¶

#### 3. Using make ¶
* $ cd ~/widelands/widelands/build-cmake ¶
* go to the build directory ¶
* $ make -j3 ¶
* this compiles the sources ¶
* -j3 tells make to run 3 concurrent tasks, which is recommended for DualCore CPUs. Basic rule is -j(number of cores + 1) as recommendation, but beware, gcc takes lots of RAM. ¶
* $ make install -j3 ¶
* this compiles the sources and then installs in either /usr/local (which you need root privileges for), or in the directory mentioned in 2. with -DCMAKE_INSTALL_PREFIX ¶
* -j3 tells make to run 3 concurrent tasks, which is recommended for DualCore CPUs. Basic rule is -j(number of cores + 1) as recommendation, but beware, gcc takes lots of RAM. ¶
* make install includes make, so "make install" is basically the same like "make && make install" ¶

#### 4. Running freshly built widelands ¶
* if you did just "make" ¶
* From any directory (which is not a different widelands data directory) ¶
* ./build-cmake/src/widelands ¶
* ATTENTION: This is not recommended, since it will be missing some files (locale, consolidated pics...). Use "make install" instead. ¶
* if you did "make install" and were root ¶
* $ /usr/local/bin/widelands ¶
* if you were not root, used "make install" and specified "-DCMAKE_INSTALL_PREFIX" as above ¶
* ~/widelands-cmake-install/bin/widelands ¶

#### What you currently have to do to get a complete build ¶
This section tells you what you are currently (as in BZR trunk latest revision) have to do to get a full build. This is work-in-progress and will change every now and then, so check back. ¶
* cmake (prepares the build directory) ¶
* make install (compiles and installs) ¶
* does make lang ¶
* does make pics ¶
* does make ALL (compile...) ¶

## Identified Tasks ¶
### Transition tasks ¶
* Identify SCons tasks and targets used by widelands, replace using cmake & make ¶
* scons ¶
* make ¶
* scons -c ¶
* make clean ¶
* scons doc ¶
* make doc (no dependency to make) ¶
* make install (no scons target?) ¶
* CMake 2.6 should be used. Do we need CMake 2.8? ¶
* Identify bugs/improvements from bug tracker and mailing list ¶
* Identify additional tasks, build tools etc. ¶
* build/scons-tools/Distribute.py ¶
* Script for packaging a complete binary distribution (Release?) ¶
* Scons and Python tool ¶
* proposal: make package with new CMake script ¶
###Issues ¶
* Running widelands writes to console: "WARNING: either we can not detect your home directory or you do not have one! Please contact the developers. Instead of your home directory, '.' will be used. Set home directory: ./.widelands". There's something missing. ¶
* Found the problem. config.h.cmake is missing #define HAS_GETENV which is done by Scons. Can we set this in any case? How does Windows react to that? ¶
* done in SVN/BZR, awaiting testers ¶
* Changing language doesn't work. English only. ¶
* Found the problem. The locales do not get compiled. Doesn't work on the fly because of out-of-source build (cmake) conflicting with the script which creates the locales (expects to be run from base dir and writes there). Either modify script or find a way to run it out-of-source. ¶
* Hopefully we will use Launchpad translation so this becomes not an issue anymore. ¶
* Finding doxygen works. Test with non-working doxygen and about working doxygen without dot to be done. ¶
* Find some Windows/MinGW system to test. ¶
* Do we really need 3 tools to optimize the PNG files? pngrewrite, optipng and advdef? ¶
* "make pics" needs testers for Windows and Darwin, trying to find pngrewrite and optipng. ¶
* CPack issue with path names and components package, always generating empty assemblies. ¶
* Either we get that sorted out, or we'd have to write own packaging scripts (not nice) ¶

## Build systems for testing ¶
### System1 (maintained by Qcumber-some) ¶
* Intel Core2 Duo, Gentoo Linux 32bit ¶
* gcc 4.3.4, cmake 2.6, libsdl 1.2.13, lua 5.1.4, boost 1.35