-
Notifications
You must be signed in to change notification settings - Fork 117
CMakeBuildSystem
Work in progress
CMake is a cross-platform meta-build system. The tool translates the rules for building, checking and installing the OpenPhdGuiding project, written in the cmake language, into rules specific to your development environment and platform. The same script is used for creating Visual Studio, XCode or Makefile projects. The advantages of cmake are many, among which one can cite:
- the maintenance of only one language for addressing the build of OpenPhdGuiding on all platforms
- the possibility to manage big projects and complex dependencies
- the possibility to add unit tests and installation procedures
This page describes the steps to configure PHD2 (OpenPhdGuiding) for your specific platform, as well as some hints and best practices for new cmake
developers.
If you need more information about CMake, you may first consult the CMake documentation online. Also, a lot of resources are available on the Internet.
The full build of the project in made in three steps
- build and/or install the dependencies
- configure cmake
- build the project
The PHD2 code is hosted on the SVN server located here: http://open-phd-guiding.googlecode.com/svn/.
The branch that supports the cmake configuration is named new_build_system
. The checkout command is then the following
svn checkout http://open-phd-guiding.googlecode.com/svn/branches/new_build_system open-phd-guiding
For that to work, you need an SVN client:
- On Debian/Ubuntu, the installation would be
sudo apt-get install build-essential subversion
- On OSX, the svn client should be shipped with the OS (accessible from the terminal),
- On Windows, there are several free and commercial SVN clients. Popular choices are TortoiseSVN, or the svn command-line tool available with cygwin.
From now on, we suppose the code has been checked out in $PHD2_SRC
(the open-phd-guiding
path above).
The following development environment have been tested with the current cmake
build system:
- Windows: Visual Studio 2013. Express or Community Editions are OK.
- OSX: official builds are done with XCode4. XCode 5 will also work.
- Linux: gcc4.6, make
Currently on Windows and OSX, the supported architecture is 32 bits only. This is because of the external libraries used in the project for driving specific astronomy hardware. Most of this specificity is handled in the cmake script. However, wxWidgets should be built accordingly.
We suppose Visual Studio 2013 installed for Windows developers. The code name in cmake for this version of Visual Studio is Visual Studio 12 ("12" stands for the version, which is Visual Studio 2013).
We suppose XCode 4 or XCode 5 installed for Mac OSX developers.
The cmake construction of !PHD2 depends only on these external dependencies
This means that these dependencies should be available in order to be able to construct the project, and cmake
should know where to find these dependencies.
OpenPhdGuiding has in fact many more dependencies, but they are shipped with the project and built within the project automatically (or chosen from the
system wide installed libraries). These dependencies are:
- openSSAG
- libdc
- libusb
- cfitsio
- and several more
CMake provides binary installers for Windows and OSX. On Linux, you should be able to install cmake
via the package manager
sudo apt-get install cmake
We will assume you have installed the wxWidgets files in a directory $WXWIN. C:\wxWidgets-3.0.2\ is the standard location.
To build the wxWidgets library, open a Visual Studio console ("VS2013 x86 Native Tools Command Prompt") and run the following commands to build both the Debug and Release versions of the libraries.
cd %WXWIN%\build\msw
msbuild wx_vc12.sln /p:configuration=Debug /p:platform=win32 /m:8
msbuild wx_vc12.sln /p:configuration=Release /p:platform=win32 /m:8
The wx_vc12.sln
Visual Studio solution is for Visual Studio 12 (Visual 2013, see here).
We assume you have un-tarred the wxWidgets sources in a directory $WXWIDGETS_SRC
, and will install the headers and libraries in a directory $WXWIN
.
cd $WXWIDGETS_SRC
./configure --enable-universal_binary=i386,x86_64 --disable-shared --with-libpng=builtin --with-cocoa --prefix=$WXWIN \
--with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/ \
--with-macosx-version-min=10.7 \
CXXFLAGS="-stdlib=libc++ -std=c++11" \
OBJCXXFLAGS="-stdlib=libc++ -std=c++11" \
CPPFLAGS="-stdlib=libc++" \
LDFLAGS="-stdlib=libc++" CXX=clang++ CXXCPP="clang++ -E" CC=clang CPP="clang -E"
make
make install
Under Linux, wxWidgets should be available through your package manager. You need the developer package using GTK:
sudo apt-get install libwxgtk3.0-dev wx-common wx3.0-i18n
On Linux, the Indi and Nova library packages should be available for the project. Simply run the following command to install the development version of these packages, as follows:
sudo apt-get install libindi-dev libnova-dev
The cmake
configuration should find these packages. It is required to have libindi-dev >= 0.9.
OpenCV is needed on Win32 platforms only. Nothing needs to be built since the OpenCV zip file contains libraries already built for Windows. Just download and install OpenCV 2.4.10 from the official website or SourceForge.
We assume $OPENCV_DIR
being a variable that points to the location where OpenCV was extracted.
Once the dependencies available on your system, you are able to build the PHD2. For that, you will give the location of the dependencies as options to cmake. The basic scheme is
- open a terminal. Under Windows, the terminal should be the one provided by the Visual Studio command line tool, which has the proper environment variables defining the compiler and the SDKs
- go to the source directory
$PHD2_SRC
and create a subdirectory where the project will be built - type the
cmake
command line with the proper options - open the generated project or build the project in place
We suppose you have
- CMake
- Visual Studio 12 installed (see here for more details)
- wxWidgets and OpenCV built and installed
cd %PHD2_SRC%
mkdir tmp
cd tmp
cmake -G "Visual Studio 12" -DwxWidgets_PREFIX_DIRECTORY=%WXWIN% -DOpenCVRoot=%OPENCV_DIR% ..
PHD2.sln
The last line opens the solution in Visual Studio.
We suppose you have
- CMake
- XCode installed
- wxWidgets built and installed
To construct the XCode project, type the commands below:
cd $PHD2_SRC
mkdir tmp
cd tmp
cmake -G Xcode -DwxWidgets_PREFIX_DIRECTORY=$WXWIN ..
open PhD2.xcodeproj
The last line opens the project in XCode. Note that the project is built only for 32 bit architecture, as some dependencies are not available for 64 bits architecture.
We suppose you have
- CMake
- a compilation toolchain (eg.
gcc
,ld
,make
...) - wxWidgets installed
- Indi and Nova library packages installed
cd $PHD2_SRC
mkdir tmp
cd tmp
cmake ..
make -j 4
As for the other platforms, it is possible to specify another wxWidgets distribution by providing the location of the installation prefix on the cmake
command line:
cmake -DwxWidgets_PREFIX_DIRECTORY=$WXWIN ..
However if the wxWidgets package has been installed properly, the default cmake
command should just run fine.
We provide here some tips for being able to develop with cmake
.
As mentioned earlier, cmake
is a program that generates for you a Visual Studio solution, an XCode workspace or a bunch of Makefiles.
One of the major benefit is that there is only one build configuration to maintain, contained in one or more text files.
To keep the source tree clean from the files generated by the cmake
step, it is a good habit to separate the /cmake binary tree/ from the sources
that are under version control. Also, putting cmake
generated files under version control is discouraged, which means that Visual Studio solutions
or XCode workspaces should not be added to the repository (as they can be generated).
The principal source for generating the build configuration lies inside the cmake
configuration files (CMakeLists.txt, ...). This means that
any regeneration of the Visual Studio solutions or XCode workspace will be based on these cmake
files, and any modification to those will be lost
during the regeneration.
If the cmake
files are modified, the Visual solution or XCode workspace need to be regenerated. In a solution/workspace, all targets depend on
a cmake
specific target called ZERO_CHECK
. This target checks if the solution/workspace needs to be regenerated before continuing the build of the
desired target.
Most of the time, building the ZERO_CHECK
target directly from the solution explorer will bring the cmake
changes to the solution/workspace.
In Visual Studio, each project of the solution that is modified should be unloaded and then reloaded into the solution: these changes are automatically detected by Visual Studio,
so there is no requirement for manual intervention. However, when the number of changed project is high, this unload/reload process can sometimes be time consuming.
To address that issue, it is often more efficient to close the solution, regenerate the cmake
configuration from the command line directly, and reopen the solution.
Note that the changes on the cmake
configuration may have very minimal impact on the changes on the projects, if written that way.
To have minimal impacts on the project,
- avoid changing definitions or include paths that are seen by all targets. For instance, the following line
include_directories(${wxWidgets_INCLUDE_DIRS})
has an incidence on all targets that are defined in the CMakeLists.txt and below by the
add_subdirectory
directive. Instead, once the !PHD2 target is defined, one can do the following:
target_include_directories(PHD2 PRIVATE ${wxWidgets_INCLUDE_DIRS})
which makes the include of the wxWidgets path local to the !PHD2 target.
PUBLIC
visibility (instead ofPRIVATE
as shown here) propagates to the dependent targets.
- Same goes for definitions.
GLOBS in the cmake
files take everything according to a pattern from a directory. This functionality is fine when those files should be included
in every platform the same way. This is however often not the case, and a file is likely to be included when it should not be.
The "Zen of Python" to this regard, in particular "Explicit is better than implicit", is a good principle
to follow.