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"
]
}
}
yaml
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は
jq -S '.' input.json > output.json
これだとrootしかsortしてくれない。つらい。
listまでsortしようとするとめんどい。
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化対象からはずすかもしれない。
commit: Support sudo
- .soを含むものはhostにもapt-getしてもらわないといけない。旧実装のpostinstallが空なのは多分そういうこと
- sysconfig.get_config_vars()を偽装する必要がある。一旦native実行した結果を固めて参照するようにパッチする
- arch埋め込まれているため、distutils/sysconfig.pyにパッチを当てる
MIIMC_CROSS_DISABLE=1
のときはnativeのpythonが呼び出される
-m pip
が含まれている場合はpip用の特殊処理パスに入る
-m 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"