RTK_Everywhere Firmware No Longer Builds For ME

I discovered last night that my RTK_Everywhere firmware builds using the compile_with_docker.bat script fail. All of my builds, even the V2.3, v3.0, and the current github repository.

If you have built RTK_Everywhere firmware, in the past, could you see if your builds still work?

I’m getting compiler errors, such as:

/RTK_Everywhere/GNSS_Mosaic.ino:2924:50: error: 'sempSbfPreamble' was not declared in this scope
105.4  2924 |     SEMP_PARSE_ROUTINE const sbfParserTable[] = {sempSbfPreamble};

I suspect that some recent change in the Arduino-CLI software has broken the build.

Thanks!

Len

Hi @LenS - Thanks for compiling from the source! You are one of a special few!

Which branch are you trying to compile? Main should always compile, whereas release-candidate is highly volatile.

From your error, it looks SEMP related. On the RC, we recently updated to SEMP v2.0.0. As a rule of thumb, if you’re compiling RC you should update your local libraries to match the versions listed in the RC dockerfile.

Let us know what problems you hit, and we would love any and all feedback. The issues section of the repo is the best place for technical reports. The forum is a good place for general discussions.

Hi @sparky - Thanks for the response. I am trying to build the current Main branch. I even went to another PC, installed Docker, and tried a completely fresh build, but the build fails there also. And, I have uncommented docker builder prune -f in the bat file so that I download all libraries each time.

So, it appears that I am the only one having this issue. However, the fact that it fails the same on two different PCs puzzles me. I will investigate further.

Thanks!

Hmmm… I just looked in the github Main branch and the Dockerfile shows:

RUN arduino-cli lib install "SparkFun Extensible Message Parser"@1.0.8

Is that expected?

So, it appears that the version number specified is being ignored and that v2.0.0 is being installed, even for my custom V2.3 build. Are the earlier versions no longer available? It not, then I’m doomed as I can no longer build my version (based on V2.3 of the Firmware).

RUN arduino-cli lib install “SparkFun Extensible Message Parser”@1.0.8

Is that expected?

Yes, for the main branch. Once the RC settles, and we do a formal release, the main branch will update with new library version numbers.

The current LG290P and UM980 libraries now rely on SEMP v2.0 so if you have those loaded, I suspect there are dependencies driving the SEMP version forward. Review your local library versions and, if you’re trying to compile v2.3, be sure those versions match the versions from the docker file from v2.3.

Firmware v3.1 is out with binaries. If possible, please move to this version. Work is actively on release candidate v3.2 (with binaries also available).

I am very confused. The Dockerfile for V2.3 specifies SEMP 1.0.4. However, V2.0.0 gets installed. The dockerfile for the current Main branch specifies V1.0.8. However, V2.0.0 gets installed and the build fails. How can I ensure that the correct version gets installed if the arduino-cli lib install command ignores the version specification?

Hi Len (@LenS ),

Please try the following:

In Docker Desktop, select the Images tab and then delete the rtk_everywhere_firmware image using the red waste bin icon.

Edit the compile_with_docker.bat file and remove the two colons from the start of line 3:

docker builder prune -f

Edit line 4 and add --progress=plain :

docker build -t rtk_everywhere_firmware --progress=plain --no-cache-filter deployment .

Save compile_with_docker.bat

Run compile_with_docker.bat

The code should compile normally. If it doesn’t, please tell us what you see.

If it does compile normally, edit compile_with_docker.bat again and replace those two colons (to avoid clearing the cache next time you compile).

Best wishes,
Paul

Hi, Paul -

Building V2.3 fails. Even though the correct version of SEMP initially gets installed…

#27 [upstream 22/32] RUN arduino-cli lib install “SparkFun Extensible Message Parser”@1.0.4
#27 1.142 Downloading SparkFun Extensible Message Parser@1.0.4…
SparkFun Extensible Message Parser@1.0.4 downloaded1 KiB 0.00%
#27 1.592 Installing SparkFun Extensible Message Parser@1.0.4…
#27 1.615 Installed SparkFun Extensible Message Parser@1.0.4
#27 DONE 2.2s

…it then gets replaced…

#32 [upstream 27/32] RUN arduino-cli lib install “SparkFun UM980 Triband RTK GNSS Arduino Library”@1.0.5
#32 1.185 Downloading SparkFun Extensible Message Parser@2.0.1…
SparkFun Extensible Message Parser@2.0.1 downloaded06 KiB 0.00%
#32 1.661 Installing SparkFun Extensible Message Parser@2.0.1…
#32 1.661 Replacing SparkFun Extensible Message Parser@1.0.4 with SparkFun Extensible Message Parser@2.0.1…
#32 1.698 Installed SparkFun Extensible Message Parser@2.0.1

Even your latest stable release of the firmware, V3.1, fails since it installs the wrong libs:

#31 [upstream 26/33] RUN arduino-cli lib install “SparkFun UM980 Triband RTK GNSS Arduino Library”@1.0.10
#31 1.210 Downloading SparkFun Extensible Message Parser@2.0.1…
SparkFun Extensible Message Parser@2.0.1 downloaded06 KiB 0.00%
#31 1.669 Installing SparkFun Extensible Message Parser@2.0.1…
#31 1.669 Replacing SparkFun Extensible Message Parser@1.0.8 with SparkFun Extensible Message Parser@2.0.1…

Thanks Len,

I suspect we’ve got a strange inter-dependency in here somewhere. If you have a look at the library.properties for the LG290P it depends=SparkFun Extensible Message Parser (>=2.0.0) , so arduino-cli will make sure an appropriate version of SEMP gets installed.

I don’t see the same issue here. But I spend most of my time working with release_candidate, not main. And I never go back to previous versions…

Please work your way through your Dockerfile:
Check the GNSS library versions (LG290P, UM980, etc.)
Check the library.properties in each library, looking for depends

The solution will be finding the thing that is depending on the latest SEMP.

I’ll start doing the same thing here and will let you know if I find anything.

Best,
Paul

Hi Len,

I may have found it:

The Dockerfile for v2.3 calls for:

RUN arduino-cli lib install "SparkFun UM980 Triband RTK GNSS Arduino Library"@1.0.5
RUN arduino-cli lib install "SparkFun LG290P Quadband RTK GNSS Arduino Library"@1.0.8

If I pull those libraries at those versions, they both contain:

depends=SparkFun Extensible Message Parser

In the latest versions of those libraries, the depends has been changed to:

depends=SparkFun Extensible Message Parser (>=2.0.0)

I’m trying to remember if depends has a quirk, where if you do not specify a particular version, the latest version is assumed…

I’ll think about this some more. There may be a way to avoid this dependency, letting you get back to where you were…

Apologies for the hassle,
Paul

Hi, Paul -

To get my V2.3-based firmware to finally build, I needed to move…

RUN arduino-cli lib install ArduinoJson@7.0.4
RUN arduino-cli lib install “SparkFun Extensible Message Parser”@1.0.4

…to the end of the list in the Dockerfile.

However, I view this as only a temporary fix that will work until some other dependant library gets updated.

My guess that this all occurs because the libs that depend on SEMP, do not specify the exact version of SEMP to use. You can see that if you have a local install of the Arduino IDE and look in the \Users\\AppData\Local\Arduino15\library_index.json file.

The only library that I found that specifies the version of SEMP is:

  "repository": "https://github.com/sparkfun/SparkFun_Unicore_GNSS_Arduino_Library.git",
  "dependencies": [
    {
      "name": "SparkFun Extensible Message Parser",
      "version": "\u003e=2.0.0"
    }
  ],

LOL I see that we have, independently, arrived at the same conclusion.

Nice one Len - glad you’re able to compile again…!

I found this gem in the Arduino Library specification

So, strictly, we should have been specifying versions / version ranges all along…

The depends=SparkFun Extensible Message Parser causes the latest version to be installed - and that is not backward-compatible with your version of 2.3…

Sorry about that… At least you’ve got a workaround!

Best,
Paul

So, currently, recently released V3.1 of the firmware does not build for the same reason. Will that be corrected?

Will that be corrected?

Almost certainly not… Sorry! It compiled correctly on the day, using the library versions that were required at the time. We use the exact same Dockerfile in the GitHub Action to compile each release binary. There are no hidden tricks. Backward temporal compatibility is not something we take into consideration… (Sorry - that sounds like something Dr. Who would say…!)

Please try the same fix on 3.1.

If you have a better suggestion, we’re all ears.

Best,
Paul

That’s unfortunate. It’s sad that you have this wonderful Docker-based build system that is only guaranteed to work on the day of release. The fix, obviously, is to correctly specify the versions of all of the dependancies. However, since it is only me and perhaps a very small number of other people who are affected by this, I can understand the unwillingness to expend that effort. [Personally, I am such a perfectionist that it would forever bother me that none of the previous releases will actually build. But, that’s me :slight_smile: ]

Please, though, as you go forward, take the steps needed to ensure that all future releases will continue to build. Your build system is so good, even with its “temporal” limitations.
Thanks for all the help!

Thanks Len,

I’m really not sure what the correct solution is…

Take today’s LG290P library. The library.properties specify:

depends=SparkFun Extensible Message Parser (>=2.0.0)

Then, looking at the Library specification examples:

The arduino-cli will always install whatever the latest version of SEMP is, because, that version will always be “>=2.0.0”. Today’s version is v2.0.1. So that will be installed.

If I understand correctly, we would need to retrospectively re-release each version of each library that depends on SEMP with very well defined version ranges for the dependency…?

I can’t help feeling I’m missing something obvious. But I don’t know what that is…

Best,
Paul

Hi, Paul!

I understand, re-releasing all previous Firmware is probably not appropriate. You will just need to be aware that if anyone attempts to download a previous release, it will not build for them.

In my previous life as a SW Engineer, we viewed each release as a complete snapshot. We would never have any ambiguous dependancies such as “>=2.0.0” since there is no guarantee that V2.0.1 would be compatible. The dependency for the release would be “=2.0.0”.

I do not know the mechanics of maintaining Arduino libs. If it is not possible to correct the dependency version in existing libs used by Arduino CLI then, going forward, I would suggest just re-releasing those libs that depend on SEMP (UM980 & LG290P ?) so that they call out only one specific version of SEMP.

And, of course, this should apply to any other dependencies.

Just my thoughts! Again, thanks for all the help.

Best regards, Len

BTW, moving the SEMP install to the bottom of the list in the Dockerfile DID allow V3.1 to build.