衝撃のわからなさ

わかってません

2024/02/03日報

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

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化対象からはずすかもしれない。

commit: Support sudo

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"