Kick Out the World

技術的なメモとかポエムを書きます。

【Moddable】manifest.jsonで定義した値が適用されているか確認する

manifest.jsonconfigdefine といった設定値が定義されていますが、Exampleのアプリケーションを動かしてたり、新しいボード対応とかをしていると、ここで定義した値通りに動いてないのでは、みたいな場面に遭遇することが稀によくあります。

ということで、いくつか確認できたものを例に紹介する

確認する場所

mcconfig コマンドでビルドされた生成物は以下フォルダに格納されている。 ${MODDABLE}/build/tmp/$(platform)/$(subplatform)/debug/$(Application)

esp32/m5stackhelloworldアプリを動かしたなら moddable/build/tmp/esp32/m5stack/debug/helloworld

結論としてはここにあるヘッダファイルが自動生成され、ビルド時に参照される。

define

例えば以下のようにI2Cのデフォルトsda,sclピンとかが定義されていると、

"defines": {
    "i2c": {
        "sda_pin": 21,
        "scl_pin": 22
    }

mc.defines.hのヘッダファイル内で以下のような定義に自動生成される。

#define MODDEF_I2C_SDA_PIN (21)
#define MODDEF_I2C_SCL_PIN (22)

この定義はmodules/pins/i2c/esp/modI2C.cで参照されており、I2Cコンストラクタでsda,sclが指定されていない場合のデフォルト値として利用されていることがわかる。

#if defined(MODDEF_I2C_SDA_PIN) && defined(MODDEF_I2C_SCL_PIN)
    conf.sda_io_num = (-1 == config->sda) ? MODDEF_I2C_SDA_PIN : config->sda;
    conf.scl_io_num = (-1 == config->scl) ? MODDEF_I2C_SCL_PIN : config->scl;
#else

config

アプリケーションで利用する際にはimport config from "mc/config";でインポートして参照する設定値。

"config": {
    "screen": "m5stack/screen",
    "rotation": 90,
    "touch": "",
}

mc.config.jsを見たらだいだい見たまんま

mc.rotation.h

画面出力する場合は本ファイルで定義されるkPocoRotationが画面の向きを決定する。実際この値が変わると参照しているcommodettoやpiuは再ビルドが走る。

ここに適用される値は、config.rotaionが適用されるが、mcconfig-rオプションを指定していた場合はその値が優先される。

複数のmanifest.jsonで同じ定義が衝突したとき

ApplicationやPlatformやModuleごとに定義されるmanifest.jsonファイルで同じ定義がされていた場合は、(恐らく)定義が読み込まれてた順で後勝ちになっていそう。

例えばM5stackのアプリケーションでexamples/manifest_base.jsonを読み込んだ場合は、 includeで以下のように辿って読み込まれていく。

(アプリケーションのmanifest.json)
┗ $(MODDABLE)/examples/manifest_base.json
  ┗$(BUILD)/devices/esp32/manifest.json
  ┗$(BUILD)/devices/esp32/targets/m5stack/manifest.json
   ┗(以下略)

ただし、includeで先読みしてくため、下から上に向かってdeinfeやconfigは読み込まれていく(アプリケーションのmanifest.jsonでで定義したものが最終的に後勝ちになる)ので、意図しない定義値が適用されているときは、manifestの読み込み順にも注意したほうがよい。

まとめ

Platformで定義した値をSubPlatformで上書きできない点がモヤモヤする(嵌った)ところですが、意図する値となってないと思ったら値を確認してみましょう。