Cross Compilation - cmake

compilation cross-compilation

On va cette fois se servir de deux fichiers sources, d'un fichier en-tête et d'un fichier cmake pour construire notre binaire cppdata

Sources

  • Le fichier main.cpp

    #include <iostream>  
    #include "data.hpp"  
    
    using namespace std;  
    
    int main()  
    {  
      Data data;  
      data.set( 99 );  
      cout << "data: " << data.get() << endl;  
      return 0;  
    }
  • Le fichier en-tête data.hpp qui déclare notre class Data

    #ifndef _DATA_HPP_  
    #define _DATA_HPP_  
    
    class Data  
    {  
    public:  
      Data();  
      ~Data();  
      void set( int number );  
      int get() const;  
    
    protected:  
      int _number;  
    };  
    
    int get();  
    
    #endif //_DATA_HPP_  
  • Le fichier data.cpp, qui est l'implémentation de la class Data

    #include "data.hpp"  
    Data::Data() :  
      _number( 0 )  
    {  
    }  
    Data::~Data()  
    {  
    }  
    
    void Data::set( int number )  
    {  
      _number = number;  
    }  
    
    int Data::get() const  
    {  
      return _number;  
    }
  • Le fichier CMakeLists.txt

    cmake_minimum_required(VERSION 2.6)  
    project(testdata)  
    add_executable(cppdata main.cpp data.cpp)

La chaine de construction

Afin de se simplifier la tâche, on va écrire un fichier buildchain pour chaque architecture. Ces fichiers, utilisables uniquement par cmake, nous permettront de nous affranchir de longues ligne de définition cmake.

Le buildchain windows 32bits

set(CMAKE_SYSTEM_NAME Windows)  

set( WIN_BUILD_ARCH "i686" )  
set( WIN_ARCH_BITS "32" )  
set( WIN_ARCH "x86" )  
set(COMPILER_PREFIX "${WIN_BUILD_ARCH}-w64-mingw32")  

# Which compilers to use for C and C++  
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)  
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)  
set(CMAKE_RC_COMPILER ${COMPILER_PREFIX}-windres)  

# Here is the target environment located  
set(CMAKE_FIND_ROOT_PATH /usr/${COMPILER_PREFIX} /usr/${COMPILER_PREFIX}/sys-root/mingw)  

# Adjust the default behaviour of the FIND_XXX() commands:  
# search headers and libraries in the target environment, search   
# programs in the host environment  
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)  
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)  
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Le buildchain windows 64 bits

set(CMAKE_SYSTEM_NAME Windows)  

set( WIN_BUILD_ARCH "x86_64" )  
set( WIN_ARCH_BITS "64" )  
set( WIN_ARCH "x64" )  
set(COMPILER_PREFIX "${WIN_BUILD_ARCH}-w64-mingw32")  

# Which compilers to use for C and C++  
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)  
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)  
set(CMAKE_RC_COMPILER ${COMPILER_PREFIX}-windres)  

# Here is the target environment located  
set(CMAKE_FIND_ROOT_PATH /usr/${COMPILER_PREFIX} /usr/${COMPILER_PREFIX}/sys-root/mingw)  

# Adjust the default behaviour of the FIND_XXX() commands:  
# search headers and libraries in the target environment, search   
# programs in the host environment  
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)  
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)  
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Construction

Comme habituellement avec cmake, on créé un répertoire dédié à la construction.

Linux

mkdir linux  
cd linux  
cmake ..  
make

Wind@uze

Version 32 bits

mkdir win32  
cmake -D CMAKE_TOOLCHAIN_FILE=../win32.cmake ..  
make

Version 64 bits

mkdir win64  
cmake -D CMAKE_TOOLCHAIN_FILE=../win64.cmake ..  
make

Article précédent Article suivant