ReactOSでアプリを作成する
作業環境の準備
IP Messanger
- とりあえずこれがあると、ホスト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; }
- CMakeLists.txt
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 $@
$ 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のビルド
- minttyが使えないとなるとrxvtが良さそうなのでクロスコンパイルする
+ | rxvtのビルド |
mintty
- minttyはCygwin上で動いてる(cygwin.dllに依存するということ)、そのためReactOSで動作させるのは困難
- Is it possible to start mintty on Linux with wine64? #1096
- 上記issueの中でGTK上にminttyを移植できればいいねという話が上がっている
ConEmu
動かなかった、ビルドも困難
Kitty
ビルドできず、もう少し頑張れば動きそうな感はあった
sakura
https://packages.debian.org/ja/bullseye/sakura
- libc6 (>= 2.17)
- libc6 (>= 2.4)
- libglib2.0-0 (>= 2.35.9)
- libgtk-3-0 (>= 3.21.5)
- libpango-1.0-0 (>= 1.14.0)
- libvte-2.91-0 (>= 0.51.90)
- libvteは素晴らしいライブラリだが、Win32に対応していない
mlterm
libssh2, opensslに依存する
+ | libssh2のビルド |
+ | opensslのビルド |
+ | mltermのビルド |
- Debianの/usr/i686-w64-mingw32/をまるごとコピーしてReactOSのC:/以下に入れた、そして起動!
mlterm-reactos.jpeg
reactos-arp.png
reactos-firefox.png
reactos-helloworld.png