Cross development Linux-Windows

Sudah lama tidak berkubang di pengembangan aplikasi untuk Windows tiba-tiba ada permintaan untuk membuat aplikasi kecil untuk Windows. Dulu saya biasa menggunakan Visual C++ tapi sekarang lingkungan kerja saya adalah Linux jadi saya putuskan untuk tetap kerja di Linux.
Tools yang saya siapkan adalah mingw untuk cross compiling dan wxwidgets sebagai framework multi platform GUI. Design layout GUI-nya jatuh pada wxformbuilder sedangkan IDE-nya jatuh ke codeblocks, pertimbangannya keduanya jalan di Windows.
Pengembangan pertama dilakukan untuk native Linux, lancar tidak ada masalah.
Tiba gilirannya harus compile untuk Windows, ternyata rada repot cross compiling menggunakan codeblocks, pilihan berikutnya langsung di compile di windows.
Pekerjaan yang harus dilakukan lebih dulu ada compile beberapa library yang dibutuhkan, lancar. Berikutnya mencoba konfigur codeblocks ternyata tidak lebih mudah, terpaksa mikir alternatif solusi lain.
Alternatif menggunakan cmake ternyata menarik dan cukup mudah. Hanya satu file CMakeLists.txt untuk native compiling dan tambahan satu lagi Toolchain-i586-mingw32msvc.cmake untuk cross compiling ke Windows.
File CMakeLists.txt yang saya siapkan adalah seperti di bawah :

1 PROJECT ( namaproj )

2 SET ( SRCS file1cpp file2cppfile3cpp )

3 FIND_PACKAGE(wxWidgets REQUIRED )
4 FIND_PACKAGE(CURL REQUIRED )
5 INCLUDE(${wxWidgets_USE_FILE})
6 INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS})

7 ADD_EXECUTABLE ( namaproj ${SRCS} )
8 TARGET_LINK_LIBRARIES(namproj ${wxWidgets_LIBRARIES} ${CURL_LIBRARIES})

Baris paling atas (1) menunjukkan nama project, berikutnya baris (2) daftar source file yang kita miliki. Baris (3) dan (4) untuk pengecekan beberapa library yang kita butuhkan kebetulan untuk project terakhir saya memerlukan libcurl dan wxwidgets. Kedua baris tersebut akan menghasilan path untuk include file dan library yang kita butuhkan. Baris (5) dan (6) untuk memasukkan hasil (3) dan (4) ke project kita. Baris (7) untuk menunjukkan hasil project kita berupa executable, kalau hasilnya library digunakan ADD_LIBRARY, sedangkan baris terakhir untuk melinking object file kita dengan library yang dibutuhkan.

Setelah pembuatan file tersebut selesai tinggal jalankan proses sebagai berikut :

$ cd build_path
$ cmake source_path
$ make
$ make install # option : default akan menginstall ke /usr/local

Tahap di atas akan membuat aplikasi untuk native. Untuk process cross compiling ke Windows siapkan satu file lagi Toolchain-i586-mingw32msvc.cmake :

1 # this one is important
2 SET(CMAKE_SYSTEM_NAME Windows)

3 # specify the cross compiler
4 SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
5 SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)

6 # where is the target environment
7 SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc /home/sugeng/win32)

8 # search for programs in the build host directories
9 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
10 # for libraries and headers in the target directories
11 SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
12 SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Semua baris nampak jelas maksudnya, khusus baris (7) menunjukkan ke cmake dimana harus menemukan file-file library yang dibutuhkan dalam hal ini library standar mingw32 dan library libcurl dan wxwidgets yang sudah di cross compile.
Proses compiling aplikasi tidak berbeda banyak :

$ cd build_path
$ cmake -DCMAKE_TOOLCHAIN_FILE=Toolchain-i586-mingw32msvc.cmake source_path
$ make

Begitulah ternyata sangat mudah berkerja dengan cmake baik untuk native compiling maupun cross compiling.

Semoga berguna !