2010-05-04

CMake と クロスコンパイル

Get MinGW Cross Compiler at SourceForge.net. Fast, secure and Free Open Source software downloads
CMake を利用して、Linux 上で GTK+ のサンプルプログラムをビルドしてみました。使用マシン / OS は Fedora 13 β版 x86_64, 使用したサンプルは、以下のソース hello_gtk.c です。

#include <gtk/gtk.h>
 
static void
hello (GtkWidget * widget, gpointer data)
{
g_print ("Hello World!\n");
}
 
static gboolean
delete_event (GtkWidget * widget, GdkEvent * event, gpointer data)
{
g_print ("delete event occurred\n");
 
return TRUE;
}
 
static void
destroy (GtkWidget * widget, gpointer data)
{
gtk_main_quit ();
}
 
int
main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button;
 
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
 
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("こんにちは、世界!");
 
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL);
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (window));
 
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);
 
gtk_main ();
 
return 0;
}

CMake 用に以下の CMakeLists.txt というテキストファイルを用意して、hello_gtk.c と同じディレクトリに保存します。

project(Hello)
cmake_minimum_required(VERSION 2.8)
 
include(FindPkgConfig)
pkg_check_modules(GLIB2 glib-2.0)
pkg_check_modules(GTK2 gtk+-2.0)
 
include_directories(${GTK2_INCLUDE_DIRS})
link_directories(${GTK2_LIBRARY_DIRS})
link_libraries(${GTK2_LIBRARIES})
 
if(MINGW)
set(CMAKE_C_FLAGS -mms-bitfields)
set(CMAKE_CXX_FLAGS -mms-bitfields)
set(CMAKE_EXE_LINKER_FLAGS -mwindows)
endif(MINGW)
 
add_executable(hello hello_gtk.c)

Linux ネイティブなビルド


まずは、Linux ネイティブなビルドをしてみましょう。カレントディレクトリが hello_gtk.c と同じとします。

$ mkdir unix
$ cd unix
$ cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/lib64/ccache/gcc
-- Check for working C compiler: /usr/lib64/ccache/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- checking for module 'glib-2.0'
-- found glib-2.0, version 2.24.0
-- checking for module 'gtk+-2.0'
-- found gtk+-2.0, version 2.20.0
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bitwalk/work/gtk_hello/unix
$ make
Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/hello_gtk.c.o
Linking C executable hello
[100%] Built target hello
$ ./hello
Hello World!
$ cd ..


MinGW 用クロスビルド


まず、MinGW クロスコンパイル環境に対応した CMake 用設定ファイル Toolchain-i686-mingw32.cmake を用意し、適当なディレクトリ(ここでは、$HOME/work/cmake)に保存しておきます。

set(CMAKE_SYSTEM_NAME Windows)
 
# specify the cross compiler
set(CMAKE_C_COMPILER /usr/bin/i686-pc-mingw32-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/i686-pc-mingw32-g++)
 
# set PKG_CONFIG_PATH for MinGW Cross Compile Environment
set(ENV{PKG_CONFIG_PATH} /usr/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig)
 
# where is the target environment
set(CMAKE_FIND_ROOT_PATH /usr/i686-pc-mingw32/sys-root/mingw)

その上で、次のようにして cmake を実行して Makefile を生成して、make します。

$ mkdir win
$ cd win
$ cmake -DCMAKE_TOOLCHAIN_FILE=~/work/cmake/Toolchain-i686-mingw32.cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/i686-pc-mingw32-gcc
-- Check for working C compiler: /usr/bin/i686-pc-mingw32-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/i686-pc-mingw32-g++
-- Check for working CXX compiler: /usr/bin/i686-pc-mingw32-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- checking for module 'glib-2.0'
-- found glib-2.0, version 2.23.4
-- checking for module 'gtk+-2.0'
-- found gtk+-2.0, version 2.19.6
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bitwalk/work/gtk_hello/win
$ make
Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/hello_gtk.c.obj
Linking C executable hello.exe
[100%] Built target hello
$ wine hello.exe
Hello World!
$ cd ..


まだまだ CMake を使いこなせてはいませんが、とにかく、クロスコンパイル環境でも CMake が使える事を確認できました。
 

参考サイト


[1] CMake Cross Compiling - KitwarePublic
 

0 件のコメント: