【Moddable】manifest.jsonで定義した値が適用されているか確認する
manifest.jsonにconfig
やdefine
といった設定値が定義されていますが、Exampleのアプリケーションを動かしてたり、新しいボード対応とかをしていると、ここで定義した値通りに動いてないのでは、みたいな場面に遭遇することが稀によくあります。
ということで、いくつか確認できたものを例に紹介する
確認する場所
mcconfig
コマンドでビルドされた生成物は以下フォルダに格納されている。
${MODDABLE}/build/tmp/$(platform)/$(subplatform)/debug/$(Application)
esp32/m5stack
でhelloworld
アプリを動かしたなら
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で上書きできない点がモヤモヤする(嵌った)ところですが、意図する値となってないと思ったら値を確認してみましょう。