FreeStyleWiki

ReactOSでアプリを作成する

このエントリーをはてなブックマークに追加

[Linux,ReactOS]

ReactOSでアプリを作成する

  作業環境の準備

IP Messanger

https://ipmsg.org/

  • とりあえずこれがあると、ホストPCとゲストの仮想環境でメッセージが送れる

porg

mingwで色々ビルドすることになるので、porgを導入しておく

$ sudo apt-get install gtkmm-3.0

$ sudo su
# curl -L http://jaist.dl.sourceforge.net/project/porg/porg-0.10.tar.gz | tar zxf - -C /usr/local/src
# cd /usr/local/src/porg-0.10/
# ./configure --prefix=/usr/local
# make && make install

導入できたら, root権限で以下のようにパッケージを管理できる

// カレントディレクトリ名をパッケージ名として記録
porg -lD make install

// <package_name> をパッケージ名として記録
porg -lp <package_name> make install

  mingw-w64によるクロスコンパイル

  • Debianではmingw-w64というwindows向けクロスコンパイラのツールチェインが用意されている
  • ReactOSでWindows向けのプログラムを動かしたいので、それを使ってみる試み

Debianでの環境構築

// 以下のパッケージをインストール
$ sudo apt-get install mingw-w64-i686-dev gcc-mingw-w64-i686-win32 g++-mingw-w64-i686-win32 binutils-mingw-w64


// 以下にMinGW用の資材が入る
$ sudo dpkg -L mingw-w64-i686-dev
/.
/usr
/usr/i686-w64-mingw32
/usr/i686-w64-mingw32/include
...

// コンパイラは以下に入る
$ ls -la /usr/bin/i686-w64-mingw32-g++-win32
-rwxr-xr-x 2 root root 1251008  6月 13  2021 /usr/bin/i686-w64-mingw32-g++-win32
$ ls -la /usr/bin/i686-w64-mingw32-gcc-win32
-rwxr-xr-x 2 root root 1160320  6月 13  2021 /usr/bin/i686-w64-mingw32-gcc-win32

C++のプログラム作成

  • main.cpp
#include <iostream>

int main() {
    std::cout << "Hello,World" << std::endl;
    return 0;
}
cmake_minimum_required(VERSION 3.13.0 FATAL_ERROR)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")

# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
set(CMAKE_C_COMPILER   i686-w64-mingw32-gcc-win32)
set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-win32)

# where is the target environment located
set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32/)

# adjust the default behavior of the FIND_XXX() commands:
# search programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# search headers and libraries in the target environment
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# static link https://stackoverflow.com/a/19450987/2565527
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")

project(helloworld VERSION 1.0.0 LANGUAGES CXX)
set(helloworld_SRCS main.cpp)
add_executable(helloworld ${helloworld_SRCS})
  • ninja_rebuild.sh
    • これはただのシェルなので好きにしてよい
#!/bin/bash

rm -rf ./build
mkdir build
cd build
cmake -G "Ninja" ..
ninja [email protected]
$ tree
.
├── CMakeLists.txt
├── main.cpp
└── ninja_rebuild.sh

0 directories, 3 files

てな感じで用意できたらビルド、exeファイルができる

$ ./ninja_rebuild.sh 
cmake version 3.18.4

CMake suite maintained and supported by Kitware (kitware.com/cmake).
-- The CXX compiler identification is GNU 10.0.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/i686-w64-mingw32-g++-win32 - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hiroyuki/git/cpptest/build
[2/2] Linking CXX executable helloworld.exe

$ ls -lha ./build/helloworld.exe 
-rwxr-xr-x 1 hiroyuki hiroyuki 2.0M  5月 22 16:59 ./build/helloworld.exe

デプロイ

さっきのディレクトリをReactOSに公開するためWebrickのワンライナーWEBサーバを立ち上げる

$ ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 8000).start'
  • arp -aを実行するとホストPCのIPアドレスがわかる
  • WEBブラウザでファイルをDLだ
  • Hello,Worldできた

クロスコンパイラが動くということは、この調子でソースがあるものをひたすらクロスコンパイルしていけば使えるアプリは増えそうだ。

良さげなターミナルエミュレーターをクロスコンパイルする試み

 autotoolsを使う場合、全体的にconfigureに以下の文字列をつけてビルドしていく
 --prefix=/usr/i686-w64-mingw32 \
   --build=x86_64-unknown-linux-gnu \
   --host=i686-w64-mingw32 \
   --target=i686-w64-mingw32

今の所

  • ❌ rxvt
  • ❌ mintty
  • ❌ conemu
  • ❌ kitty
  • ❌ sakura
  • ⭕ mlterm

puttyは最初から使えるが…

  rxvt

  • 結論: rxvt-unicodeはlibptyttyに依存しているが、libptyttyはWin32には対応していない。。。
  • 昔のMinGWはrxvtでWindowsで起動していたがどうやっていたのだ?

libptytty

+ libptyttyのビルド

rxvtのビルド

+ rxvtのビルド

  mintty

  ConEmu

動かなかった、ビルドも困難

  Kitty

ビルドできず、もう少し頑張れば動きそうな感はあった

  sakura

https://packages.debian.org/ja/bullseye/sakura

  mlterm

libssh2, opensslに依存する

+ libssh2のビルド

+ opensslのビルド

+ mltermのビルド

  • Debianの/usr/i686-w64-mingw32/をまるごとコピーしてReactOSのC:/以下に入れた、そして起動!