configファイルの形式について考える
現在はjsonだが、変更がまぁまぁつらいので見直す。
一部抜粋からChatGPTに比較対象出してもらう
{ "apt": { "useCustomFunction": true }, "base-files": {}, "fdisk": {}, "git": {}, "gcc-11": { "isCrossTool": true }, "gcc-11-aarch64-linux-gnu": { "blockList": [ "/usr/lib/gcc-cross/aarch64-linux-gnu/11/collect2", "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper", "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto1" ] } }
apt: useCustomFunction: true base-files: {} fdisk: {} git: {} gcc-11: isCrossTool: true gcc-11-aarch64-linux-gnu: blockList: - /usr/lib/gcc-cross/aarch64-linux-gnu/11/collect2 - /usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper - /usr/lib/gcc-cross/aarch64-linux-gnu/11/lto1
toml
[apt] useCustomFunction = true [base-files] [fdisk] [git] [gcc-11] isCrossTool = true [gcc-11-aarch64-linux-gnu] blockList = [ "/usr/lib/gcc-cross/aarch64-linux-gnu/11/collect2", "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper", "/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto1" ]
キーのソート
キーのソートと、ソートされているかの確認ができると嬉しい。 json, yaml, tomlそれぞれのキーのソートができるCLIは
json
jq -S '.' input.json > output.json
これだとrootしかsortしてくれない。つらい。
listまでsortしようとするとめんどい。
yaml
yq -i -P 'sort_keys(..)' input.yml > output.yaml
jqと違ったので困惑した。 jqと同じくlistまでsortしようとするとめんどい。
toml
taploでできそうなのだが、reorder_keysにして実行してもうまく動作する気配がない…
結論
listのsortはチェックだけ自動にできれば、編集自体はまぁ手動でいいかという気持ち。 daxで読むのが楽だからjsonのままでいいや
mimic-cross実装
クロスツールチェーン対応
isCrossToolというオプションを足して実装した。
binutilsのexampleがビルドできるようになった。一回とりあえず流してみて34.4sで旧実装と同等の速度。
commit: Support cross tool chain
sudoのサポート追加
sudoは自前dlopenする系コマンドで特別対応をする必要がある。
旧実装でサポートしているので対応した。
モジュールの依存パスが/usr/lib/sudoから/usr/libexec/sudoにどこかのタイミングで変わっているっぽい。
サポートするアーキテクチャを増やすときに対応が必要そう。
実装したからサポート追加したが、こういう系はコストに合わなくなると思うのでmimic化対象からはずすかもしれない。
pythonの旧実装整理
- .soを含むものはhostにもapt-getしてもらわないといけない。旧実装のpostinstallが空なのは多分そういうこと
- sysconfig.get_config_vars()を偽装する必要がある。一旦native実行した結果を固めて参照するようにパッチする
- arch埋め込まれているため、distutils/sysconfig.pyにパッチを当てる
MIIMC_CROSS_DISABLE=1
のときはnativeのpythonが呼び出される-m pip
が含まれている場合はpip用の特殊処理パスに入る- hostにも同時にpipする
-m venv
が含まれるときも特殊処理- hostにも対応するvenvを用意
python3 -c "import xxx; print(xxx.__path__)"
へのworkaroundとしてpathが含まれていたらnative呼び出ししている- これは-cでinline呼び出しされるときはnativeがいいように思う
- PYTHONPATHとLD_LIBRARY_PATHの先頭にhostのrootをprefixしたものをつけることでhost側にあるものが使われるようにする
- venvに対応するため呼び出し元の$0をキープして実行される必要がある
- exec -a "$0"
- qemu-user-static -0 "$0"