Resolving Hex dependencies... Resolution completed in 0.08s Unchanged: backoff 1.1.6 circular_buffer 1.0.0 conn_grpc 0.4.3 cowboy 2.14.2 cowlib 2.16.0 elixir_make 0.9.0 flow 1.2.4 gen_stage 1.3.2 googleapis 0.1.0 greptimex 0.2.6 grpc 0.11.5 gun 2.2.0 hpax 1.0.3 interactive_cmd 0.1.4 jason 1.4.4 mint 1.7.1 nerves 1.14.1 nerves_discovery 0.1.2 nerves_logging 0.2.4 nerves_runtime 0.13.12 nerves_system_bbb 2.29.3 nerves_system_br 1.33.5 nerves_system_grisp2 0.17.3 nerves_system_mangopi_mq_pro 0.15.3 nerves_system_osd32mp1 0.24.3 nerves_system_qemu_aarch64 0.3.3 nerves_system_rpi 2.0.2 nerves_system_rpi0 2.0.2 nerves_system_rpi0_2 2.0.2 nerves_system_rpi2 2.0.2 nerves_system_rpi3 2.0.2 nerves_system_rpi4 2.0.2 nerves_system_rpi5 2.0.2 nerves_system_x86_64 1.33.3 nerves_toolchain_aarch64_nerves_linux_gnu 13.2.0 nerves_toolchain_armv6_nerves_linux_gnueabihf 13.2.0 nerves_toolchain_armv7_nerves_linux_gnueabihf 13.2.0 nerves_toolchain_ctng 1.10.0 nerves_toolchain_riscv64_nerves_linux_gnu 13.2.0 nerves_toolchain_x86_64_nerves_linux_musl 13.2.0 nerves_uevent 0.1.5 property_table 0.3.3 protobuf 0.16.0 ranch 2.2.0 ring_logger 0.11.5 shoehorn 0.9.3 tablet 0.3.2 telemetry 1.4.1 toolshed 0.4.2 uboot_env 1.0.2 All dependencies have been fetched ==> jason Compiling 10 files (.ex) Generated jason app ==> tablet Compiling 2 files (.ex) Generated tablet app ==> elixir_make Compiling 8 files (.ex) Generated elixir_make app ==> nerves_discovery Compiling 5 files (.ex) Generated nerves_discovery app ==> interactive_cmd Compiling 1 file (.ex) Generated interactive_cmd app ==> nerves HOST_CC port.o HOST_LD port Compiling 50 files (.ex) Generated nerves app ==> nerves_compatibility_test Nerves environment MIX_TARGET: x86_64 MIX_ENV: prod Checking for prebuilt Nerves artifacts... Found nerves_system_x86_64 in cache /home/nerves/.nerves/artifacts/nerves_system_x86_64-portable-1.33.3 Found nerves_toolchain_x86_64_nerves_linux_musl in cache /home/nerves/.nerves/artifacts/nerves_toolchain_x86_64_nerves_linux_musl-linux_aarch64-13.2.0 ==> nerves ==> nerves_system_br Generated nerves_system_br app ==> nerves_toolchain_ctng Compiling 1 file (.ex) Generated nerves_toolchain_ctng app ==> nerves_toolchain_x86_64_nerves_linux_musl Generated nerves_toolchain_x86_64_nerves_linux_musl app ==> nerves_system_x86_64 Generated nerves_system_x86_64 app ==> nerves_compatibility_test Nerves environment MIX_TARGET: x86_64 MIX_ENV: prod ==> gen_stage Compiling 10 files (.ex) Generated gen_stage app ==> circular_buffer Compiling 1 file (.ex) Generated circular_buffer app ==> hpax Compiling 4 files (.ex) Generated hpax app ==> mint Compiling 1 file (.erl) Compiling 20 files (.ex) Generated mint app ==> nerves_compatibility_test ===> Analyzing applications... ===> Compiling ranch ==> protobuf Compiling 46 files (.ex) warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ ctx | comments: Protobuf.Protoc.Generator.Comment.parse(desc), syntax: syntax(desc.syntax), package: desc.package, dep_type_mapping: get_dep_type_mapping(ctx, desc.dependency, desc.name) } but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/generator.ex:35:36 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 37 │ %Context{ │ ~ │ └─ lib/protobuf/protoc/generator.ex:37:7: Protobuf.Protoc.Generator.generate_module_definitions/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ Protobuf.Protoc.Context.append_comment_path(ctx, <<"6.", to_string(index)::binary>>) | namespace: ctx.namespace ++ [Macro.camelize(desc.name)] } but got type: dynamic(%{..., current_comment_path: term()}) where "ctx" was given the type: # type: dynamic(%Protobuf.Protoc.Context{}) # from: lib/protobuf/protoc/generator/extension.ex:84:48 %Protobuf.Protoc.Context{} = ctx where "index" was given the type: # type: dynamic() # from: lib/protobuf/protoc/generator/extension.ex {desc, index} you must assign "Protobuf.Protoc.Context.append_comment_path(ctx, <<"6.", String.Chars.to_string(index)::binary>>)" to variable and pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 90 │ %Context{ │ ~ │ └─ lib/protobuf/protoc/generator/extension.ex:90:11: Protobuf.Protoc.Generator.Extension.get_extensions_from_messages/3 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | plugins: String.split(plugins, "+")} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/cli.ex:105:43 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 106 │ %Context{ctx | plugins: String.split(plugins, "+")} │ ~ │ └─ lib/protobuf/protoc/cli.ex:106:5: Protobuf.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | gen_descriptors?: true} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/cli.ex:109:49 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 112 │ %Context{ctx | gen_descriptors?: true} │ ~ │ └─ lib/protobuf/protoc/cli.ex:112:9: Protobuf.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | package_prefix: package} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/cli.ex:119:50 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 123 │ %Context{ctx | package_prefix: package} │ ~ │ └─ lib/protobuf/protoc/cli.ex:123:7: Protobuf.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | transform_module: Module.concat([module])} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/cli.ex:127:51 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 128 │ %Context{ctx | transform_module: Module.concat([module])} │ ~ │ └─ lib/protobuf/protoc/cli.ex:128:5: Protobuf.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | one_file_per_module?: true} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/cli.ex:131:53 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 134 │ %Context{ctx | one_file_per_module?: true} │ ~ │ └─ lib/protobuf/protoc/cli.ex:134:9: Protobuf.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | include_docs?: true} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/protobuf/protoc/cli.ex:141:46 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 144 │ %Context{ctx | include_docs?: true} │ ~ │ └─ lib/protobuf/protoc/cli.ex:144:9: Protobuf.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | optional?: optional?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:328:31 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 329 │ %FieldProps{acc | optional?: optional?} │ ~ │ └─ lib/protobuf/dsl.ex:329:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | proto3_optional?: proto3_optional?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:331:45 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 332 │ %FieldProps{acc | proto3_optional?: proto3_optional?} │ ~ │ └─ lib/protobuf/dsl.ex:332:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | required?: required?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:334:31 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 335 │ %FieldProps{acc | required?: required?} │ ~ │ └─ lib/protobuf/dsl.ex:335:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | enum?: enum?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:337:23 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 338 │ %FieldProps{acc | enum?: enum?} │ ~ │ └─ lib/protobuf/dsl.ex:338:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | map?: map?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:340:21 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 341 │ %FieldProps{acc | map?: map?} │ ~ │ └─ lib/protobuf/dsl.ex:341:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | repeated?: repeated?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:343:31 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 344 │ %FieldProps{acc | repeated?: repeated?} │ ~ │ └─ lib/protobuf/dsl.ex:344:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | embedded?: embedded} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:346:30 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 347 │ %FieldProps{acc | embedded?: embedded} │ ~ │ └─ lib/protobuf/dsl.ex:347:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | deprecated?: deprecated?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:349:35 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 350 │ %FieldProps{acc | deprecated?: deprecated?} │ ~ │ └─ lib/protobuf/dsl.ex:350:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | packed?: packed?} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:352:27 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 353 │ %FieldProps{acc | packed?: packed?} │ ~ │ └─ lib/protobuf/dsl.ex:353:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | type: type} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:355:22 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 356 │ %FieldProps{acc | type: type} │ ~ │ └─ lib/protobuf/dsl.ex:356:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | default: default} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:358:28 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 359 │ %FieldProps{acc | default: default} │ ~ │ └─ lib/protobuf/dsl.ex:359:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | oneof: oneof} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:361:24 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 362 │ %FieldProps{acc | oneof: oneof} │ ~ │ └─ lib/protobuf/dsl.ex:362:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{acc | json_name: json_name} but got type: dynamic() where "acc" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:364:32 acc when defining the variable "acc", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 365 │ %FieldProps{acc | json_name: json_name} │ ~ │ └─ lib/protobuf/dsl.ex:365:9: Protobuf.DSL.parse_field_opts_to_field_props/2 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{props | json_name: props.name} but got type: dynamic() where "props" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:390:22 props when defining the variable "props", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 390 │ defp cal_json_name(props), do: %FieldProps{props | json_name: props.name} │ ~ │ └─ lib/protobuf/dsl.ex:390:34: Protobuf.DSL.cal_json_name/1 warning: a struct for Protobuf.FieldProps is expected on struct update: %Protobuf.FieldProps{props | packed?: false} but got type: dynamic() where "props" was given the type: # type: dynamic() # from: lib/protobuf/dsl.ex:426:19 props when defining the variable "props", you must also pattern match on "%Protobuf.FieldProps{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 426 │ defp cal_packed(props, _syntax), do: %FieldProps{props | packed?: false} │ ~ │ └─ lib/protobuf/dsl.ex:426:40: Protobuf.DSL.cal_packed/2 Generated protobuf app ==> nerves_logging CC kmsg_tailer.o LD kmsg_tailer Compiling 5 files (.ex) Generated nerves_logging app ==> nerves_compatibility_test ===> Analyzing applications... ===> Compiling cowlib ===> Analyzing applications... ===> Compiling gun ==> ring_logger Compiling 7 files (.ex) Generated ring_logger app ==> shoehorn Compiling 8 files (.ex) Generated shoehorn app ==> googleapis Compiling 45 files (.ex) Generated googleapis app ==> nerves_compatibility_test ===> Analyzing applications... ===> Compiling telemetry ==> flow Compiling 9 files (.ex) Generated flow app ==> nerves_compatibility_test ===> Analyzing applications... ===> Compiling cowboy ==> grpc Compiling 1 file (.erl) Compiling 65 files (.ex) warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ ctx | syntax: syntax(desc.syntax), package: desc.package, dep_type_mapping: get_dep_type_mapping(ctx, desc.dependency, desc.name) } but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/grpc/protoc/generator.ex:43:36 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 45 │ %Context{ │ ~ │ └─ lib/grpc/protoc/generator.ex:45:7: GRPC.Protoc.Generator.generate_module_definitions/2 warning: a struct for GRPC.Client.Connection is expected on struct update: %GRPC.Client.Connection{ base_state | lb_mod: lb_mod, lb_state: new_lb_state, virtual_channel: ch, real_channels: real_channels } but got type: dynamic() where "base_state" was given the type: # type: dynamic() # from: lib/grpc/client/connection.ex:397:29 base_state when defining the variable "base_state", you must also pattern match on "%GRPC.Client.Connection{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 423 │ %__MODULE__{ │ ~ │ └─ lib/grpc/client/connection.ex:423:12: GRPC.Client.Connection.build_balanced_state/6 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | plugins: String.split(plugins, "+")} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/grpc/protoc/cli.ex:86:43 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 87 │ %Context{ctx | plugins: String.split(plugins, "+")} │ ~ │ └─ lib/grpc/protoc/cli.ex:87:5: GRPC.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | gen_descriptors?: true} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/grpc/protoc/cli.ex:90:49 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 93 │ %Context{ctx | gen_descriptors?: true} │ ~ │ └─ lib/grpc/protoc/cli.ex:93:9: GRPC.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | package_prefix: package} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/grpc/protoc/cli.ex:100:50 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 104 │ %Context{ctx | package_prefix: package} │ ~ │ └─ lib/grpc/protoc/cli.ex:104:7: GRPC.Protoc.CLI.parse_param/2 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | transform_module: Module.concat([module])} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/grpc/protoc/cli.ex:108:51 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 109 │ %Context{ctx | transform_module: Module.concat([module])} │ ~ │ └─ lib/grpc/protoc/cli.ex:109:5: GRPC.Protoc.CLI.parse_param/2 warning: a struct for GRPC.Client.Connection is expected on struct update: %GRPC.Client.Connection{ base_state | virtual_channel: ch, real_channels: %{<> => ch} } but got type: dynamic() where "base_state" was given the type: # type: dynamic() # from: lib/grpc/client/connection.ex:439:27 base_state when defining the variable "base_state", you must also pattern match on "%GRPC.Client.Connection{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 446 │ %__MODULE__{ │ ~ │ └─ lib/grpc/client/connection.ex:446:10: GRPC.Client.Connection.build_direct_state/4 warning: a struct for Protobuf.Protoc.Context is expected on struct update: %Protobuf.Protoc.Context{ctx | one_file_per_module?: true} but got type: dynamic() where "ctx" was given the type: # type: dynamic() # from: lib/grpc/protoc/cli.ex:112:53 ctx when defining the variable "ctx", you must also pattern match on "%Protobuf.Protoc.Context{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 115 │ %Context{ctx | one_file_per_module?: true} │ ~ │ └─ lib/grpc/protoc/cli.ex:115:9: GRPC.Protoc.CLI.parse_param/2 warning: a struct for GRPC.Channel is expected on struct update: %GRPC.Channel{virtual_channel | host: host, port: port} but got type: dynamic() where "virtual_channel" was given the type: # type: dynamic() # from: lib/grpc/client/connection.ex:457:39 virtual_channel when defining the variable "virtual_channel", you must also pattern match on "%GRPC.Channel{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 460 │ %Channel{virtual_channel | host: host, port: port}, │ ~ │ └─ lib/grpc/client/connection.ex:460:14: GRPC.Client.Connection.build_real_channels/4 warning: a struct for GRPC.Channel is expected on struct update: %GRPC.Channel{vc | host: host, port: port} but got type: dynamic() where "vc" was given the type: # type: dynamic() # from: lib/grpc/client/connection.ex:525:29 vc when defining the variable "vc", you must also pattern match on "%GRPC.Channel{}". hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of: user = some_function() %User{user | name: "John Doe"} it is enough to write: %User{} = user = some_function() %{user | name: "John Doe"} typing violation found at: │ 526 │ %Channel{vc | host: host, port: port} │ ~ │ └─ lib/grpc/client/connection.ex:526:5: GRPC.Client.Connection.connect_real_channel/5 Generated grpc app ==> nerves_compatibility_test ===> Analyzing applications... ===> Compiling backoff ==> conn_grpc Compiling 5 files (.ex) Generated conn_grpc app ==> greptimex Compiling 134 files (.ex) warning: CAStore.file_path/0 is undefined (module CAStore is not available or is yet to be defined). Make sure the module name is correct and has been specified in full (or that an alias has been defined) │ 113 │ cacertfile = System.get_env("HEX_CACERTS_PATH", CAStore.file_path()) │ ~ │ └─ lib/mix/tasks/greptimex/sync_pb.ex:113:61: Mix.Tasks.Greptimex.SyncPb.do_http_request/1 Generated greptimex app ==> uboot_env Compiling 5 files (.ex) Generated uboot_env app ==> property_table Compiling 8 files (.ex) Generated property_table app ==> nerves_uevent CC uevent.o LD uevent Compiling 5 files (.ex) Generated nerves_uevent app ==> nerves_runtime Compiling 14 files (.ex) Generated nerves_runtime app ==> toolshed Compiling 5 files (.ex) Generated toolshed app ==> nerves_compatibility_test Compiling 2 files (.ex) Generated nerves_compatibility_test app |nerves| Building OTP Release... * [Nerves] validating vm.args * skipping runtime configuration (config/runtime.exs not found) * creating _build/x86_64/rel/nerves_compatibility_test/releases/0.1.0/vm.args Updating base firmware image with Erlang release... Copying rootfs_overlay: /work/proj/_build/x86_64/nerves/rootfs_overlay Copying rootfs_overlay: /work/proj/rootfs_overlay Building /work/proj/_build/x86_64/nerves/images/nerves_compatibility_test.fw... Firmware UUID: bless-rug (1bc36d01-d2e6-567c-7bdc-55a05818d02f) Firmware built successfully! 🎉 Now you may install it to a MicroSD card using `mix burn` or upload it to a device with `mix upload` or `mix firmware.gen.script`+`./upload.sh`. * Cleaning greptimex ==> nerves ==> nerves_compatibility_test Nerves environment MIX_TARGET: x86_64 MIX_ENV: prod ==> greptimex Compiling 134 files (.ex) warning: CAStore.file_path/0 is undefined (module CAStore is not available or is yet to be defined). Make sure the module name is correct and has been specified in full (or that an alias has been defined) │ 113 │ cacertfile = System.get_env("HEX_CACERTS_PATH", CAStore.file_path()) │ ~ │ └─ lib/mix/tasks/greptimex/sync_pb.ex:113:61: Mix.Tasks.Greptimex.SyncPb.do_http_request/1 Generated greptimex app ==> nerves_compatibility_test Generated nerves_compatibility_test app |nerves| Building OTP Release... * [Nerves] validating vm.args * skipping runtime configuration (config/runtime.exs not found) * creating _build/x86_64/rel/nerves_compatibility_test/releases/0.1.0/vm.args Updating base firmware image with Erlang release... Copying rootfs_overlay: /work/proj/_build/x86_64/nerves/rootfs_overlay Copying rootfs_overlay: /work/proj/rootfs_overlay Building /work/proj/_build/x86_64/nerves/images/nerves_compatibility_test.fw... Firmware UUID: scrap-bar (b61eb797-1124-5363-5004-2896b908453c) Firmware built successfully! 🎉 Now you may install it to a MicroSD card using `mix burn` or upload it to a device with `mix upload` or `mix firmware.gen.script`+`./upload.sh`.