Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
pyconjp2024-wince
Search
らすぴー
September 28, 2024
Technology
0
13
pyconjp2024-wince
らすぴー
September 28, 2024
Tweet
Share
More Decks by らすぴー
See All by らすぴー
kernel-vm-ittekita-yuukousai
raspython3
0
58
kernelvm-brain-net
raspython3
0
790
seccamp2024-edictionary-python-TLS
raspython3
0
15
Other Decks in Technology
See All in Technology
[SRE NEXT 2025] すみずみまで暖かく照らすあなたの太陽でありたい
carnappopper
2
750
Microsoft Defender XDRで疲弊しないためのインシデント対応
sophiakunii
3
380
振り返りTransit Gateway ~VPCをいい感じでつなげるために~
masakiokuda
4
220
安定した基盤システムのためのライブラリ選定
kakehashi
PRO
3
160
The Madness of Multiple Gemini CLIs Developing Simultaneously with Jujutsu
gunta
0
320
CDKコード品質UP!ナイスな自作コンストラクタを作るための便利インターフェース
harukasakihara
2
250
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.7k
Microsoft Fabric ガバナンス設計の一歩目を考える
ryomaru0825
1
160
データ駆動経営の道しるべ:プロダクト開発指標の戦略的活用法
ham0215
2
210
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
39k
How to Quickly Call American Airlines®️ U.S. Customer Care : Full Guide
flyaahelpguide
0
240
20150719_Amazon Nova Canvas Virtual try-onアプリ 作成裏話
riz3f7
0
110
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
51
8.6k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
GraphQLとの向き合い方2022年版
quramy
49
14k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
520
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Agile that works and the tools we love
rasmusluckow
329
21k
A Modern Web Designer's Workflow
chriscoyier
695
190k
Transcript
Python3をWindows CEに 移植した話 らすぴー(@RasPython3) 1
目次 1. 事の発端 2. PythonCEとは 3. Pythonのバージョン選定 4. パッチ適用 5.
Pythonのビルドツール 6. ビルドツールの選定 7. configure.acの改造 8. Makefile.pre.inの改造 9. WinCEに無い関数の実装 10.コンソール問題 11.同名DLL 12.その他の問題 13.追加モジュールについて 2
事の発端 電子辞書でPythonをいじりたかったが、動作するPythonのバー ジョンが2.5と古かった そこでPython3はないのかと調べてみたが無さそう 3
事の発端 …じゃあ移植しちゃえばいいのでは 4
PythonCEとは • 2007年頃まで開発されていた、WinCEで動くCPython • v2.3.4-v2.5まで対応 • 独自コンソールにより対話モードが使用可能 • numarrayなど一部の追加モジュールも https://sourceforge.net/projects/pythonce/
5
Pythonのバージョン選定 移植開始時期 … 2023年4月頃 → v3.10.10 3.9 3.10 3.11 3.12
6
パッチ適用 Python2.5から時が流れ、WinCE用の記述はほぼ消えている そのため、2.5当時の記述を引っ張ってくる必要があった 手がかり • PythonCEのreadme • WinCE用のマクロ等 … _WIN32_WCEやMS_WINCE
• 3.6の時に適用された、WinCE対応の名残を削除するコミット 7
パッチ適用 https://github.com/python/cpython/commit/10108a7b9affa61719a1dc18 63edb2bdb3402fd1 Windows CEのサポートを削除した。 それは完了することはなく、Windows CEは もはやPythonに関連するプラットフォームではない。 8
Pythonのビルドツール • Makefile + gcc … LinuxとMac • VS +
VC++ … Windows • SCons + eVC4 … Windows CE (PythonCE) 9
ビルドツールの選定 当時使用できた環境 • Raspberry Pi 3B & ZeroW • Chromebook
→Windows系のビルドツールの使用が困難 →WinCE向けのgcc「cegcc」を使うしかない 10
ビルドツールの選定 そういえば… 1. Windows用の追加のソースはPC以下にまとまっている 2. Linuxで使うソースファイルの多くはWindowsでも使ってい る →Linuxのビルドスクリプトに手を加えたらどうにかなるのでは 11
configure.acの改造 まずは何も手を加えずに ./configure --host=mingw32ce --target=mingw32ce mingw32ceは非対応とエラー →WinCE用の記述を追加 12
Makefile.pre.inの改造 WinCEで使うソースファイルのリストを記述 • Windowsで使うソースファイル • PythonCEに存在したWinCE用のソースファイル • PC/wince_compatibility.* • PC/WinCE/_tkinter/*
• 今回の移植で新たに作成したファイル • WinCE/* • Modules/_io/winceconsoleio.c 13
WinCEに無い関数の実装 主にPC/wince_compatibility.*で対応 • strerr • wcsnlen • dup • CommandLineToArgvW
• CreateSymbolicLink • GetFileType • *_s 14
コンソール問題 コンソールがない場合(電子辞書など)、Pythonの標準入出力を扱 えない PythonCEでは独自のコンソールを用意していたが、Pythonのプ ログラムによる疑似コンソールだった →Win32APIで窓を作り、readlineやWriteConsoleを独自実装 15
コンソール問題 問題発生 … 電子辞書でstdinやstdoutが使えない stdin, stdout, stderrのファイル記述子は本来は0, 1, 2 そのすべてが無効になっていた(-1)
→filenoやisattyを別に実装して偽装 16
同名DLL WinCEでは、ロードを試みるDLLと同名のDLLをほかのプログラ ムがすでにロードしていた場合、ロード済みのDLLを使いまわす →複数のPythonが入っていると挙動がおかしくなる 例 • Python3の_tkinter.pydを読み込もうとしてPythonCEの _tkinter.pydを使おうとしてしまう • Python3.10.14のpython310.dllを使おうとしてpython3.10.0の
ものを使ってしまう 17
同名DLL 解決策 • *.pyd→*.cp310-wince_arm.pydに変更 • python310.dllとpython3.10.exe双方にハッシュ値を埋め込み、 実行時に検証する 18
その他の問題 • 環境変数がない environ.iniという設定ファイルを作成、また--env-setや--env-pathオプ ションを追加することで対応 • pyファイルを直接実行できない レジストリにpyファイルが登録されないため、pyファイルをダブルク リックしても実行できない →PYTHONASSOCIATEREGという環境変数によって、起動時にレジス
トリ設定をできるように 19
その他の問題 • ModuleNotFoundError: No module named ‘os’ なぜかosがインポートできない(!?) 原因: os.pyがOS.PYになっていた!
→PYTHONCASEOKを設定することにより対応 • python310._pthを使った時の挙動がなんか変 なんかドキュメントに書いてある通りの挙動じゃない… →ドキュメントの日本語訳が間違っていた! 20
追加モジュールについて 現在、以下の3つの追加モジュールが移植されている • cffi • cryptography • 現行バージョンはRust使用のため古いバージョンのみ • PyCryptoDome
21
追加モジュールについて cryptographyや標準のsslモジュールを動作させるためには OpenSSLが必要 海外の方で、OpenSSLをWinCEに移植している人がいた が、電子辞書では動作せず… さらに、そのビルドにはVCを使っていた https://www.hpcfactor.com/forums/forums/thread-view.asp?tid=20731&start=1 22
追加モジュールについて そこで、cegccでOpenSSLをビルドすることを試みた ところが、OpenSSLもerrnoや環境変数を使うためビルドに失敗 これらも独自に実装すると、かなり面倒なことになる →Pythonで使うことを前提に、python310.dllに依存させたら いいのでは 23
追加モジュールについて 結果…うまくいった! これがうまくいかなかった場合、別途フル装備のcoredllを 使わなければならず、ライセンスの問題で配布が困難だった 最終的に、Pythonのビルド途中でOpenSSLもビルドして、 PythonのDLLに変化があっても問題なく動作できるようにした 24