Po-util: a Toolchain Installer / Helper for Linux and OSX


#29

I have added support for Atom Build shortcuts for po-util. The shortcuts are interpreted by the atom build package, and the corresponding po-util command is run.

Atom Build Shortcuts:
  Build        CTRL-ALT-1   These shortcuts allow you     This requires the
  Flash        CTRL-ALT-2   to run common po-util         "build" package for
  Clean        CTRL-ALT-3   commands quickly while        Atom.  Get it with:
  DFU          CTRL-ALT-4   using Atom.                   "apm install build"
  OTA          CTRL-ALT-5

As always, po-util can be installed with:

curl -fsSLO https://raw.githubusercontent.com/nrobinson2000/po-util/master/po-util.sh
./po-util.sh install

Or if you already have po-util just run:

po update

#30

UPDATE:

Po-util now supports building firmware for Raspberry Pi and easily flashing it Over The Air.


#31

UPDATE:

Po-util can now be installed with Homebrew. I recommend all users on macOS to switch to the Homebrew version. It can be installed by doing:

$ brew tap nrobinson2000/po
$ brew install po
$ po install

Delete ~/po-util.sh and the po alias in your ~/.bashrc to use the new version.


#32

I have just written a nice manpage for the Homebrew Edition of po-util.


#33

I have updated the library manager commands to automatically add and remove includes to and from the firmware/main.cpp file when a library is added to a project, just like how the Web IDE adds includes when libraries are added.


#34

Hi,
First, thanks a lot for this amazing tool. I finally managed to get everything as I wanted : to be able to work off-line.
Three requests/questions regarding your tool:

  1. When adding a library that has more than one set of .cpp/.h, only the files named by the library is imported. Example: I’m fetching Adafruit_SSD1306 from https://github.com/pkourany/Adafruit_SSD1306.git and I had to manually add the symbolic links to the Adafruit_GFX.* files.
  2. Not sure if you can do something about this one. The following library: Adafruit_GFX has its file within a firware directory which doesnt’t seem to be consistent with what you’re expecting. As I want to kept the “git” update available, I don’t want to mess with the directory in ~.po-util/lib.
  3. Adding automatically the header may be fine for some user but in my case, and I shouldn’t be the only one ;), the main.cpp is not where I want to add the headers. So maybe keep this as an option ?

Once again, your tools is pretty amazing, and really usefull !

Yannick


#35

Hi @YbuQc,

It is possible to break up a library into multiple folders. Just cd to ~/.po-util/lib/Adafruit_SSD1306, and run:

$ po lib create

In order to get updates from git you would have to delete the extra libraries created:

$ po lib rm LibName

Update all of your libraries:

$ po lib update

And run:

$ po lib create

Inside of ~/.po-util/lib/Adafruit_SSD1306.

Adding headers automatically was a new feature that I implemented yesterday. I’m sorry it inconveniences you. I will make it a configurable option.

UPDATE:
I have made automatically adding headers to main.cpp an option that can be opted into with po config.

Just do:

$ po update

To update po-util.


#36

Update:

The po manpage is now available on Linux as well.

Common library routines have been made into functions to optimize the script and reduce length.

Any comments or feature requests can be made on this thread or you can create an issue on GitHub.

Po-util: Classic

Po-util: Homebrew Edition


#37

po-util can now download libraries from Particle Libraries 2.0 using particle-cli.

Libraries can be downloaded using the po lib get command, supplying the name of the library instead of a URL to a repository.

Libraries are added to the central library folder ~/.po-util/lib just like Git libraries.

Example:

$ po lib get neopixel

po-util will use particle-cli to download the library because the argument is not a URL.

If you enter an invalid library name, po-util will use particle-cli to search for libraries instead, so that you can find the library you want.

Example:

$ po lib get liquid

Attempting to download liquid using Particle Libraries 2.0...

Checking library liquid...
Library liquid not found

> Found 4 libraries matching liquid
LiquidCrystal 0.0.3 1121 LiquidCrystal on Spark Core
LiquidCrystal_I2C_Spark 1.1.0 816 LiquidCrystal_I2C ported for Spark Core
Adafruit_LiquidCrystal 1.0.2 125 A fork of Adafruit LiquidCrystal library that support i2c / SPI character LCD backpack.
liquid-crystal-spi 0.0.1 88 A Hardware and Software SPI driven LiquidCrystal library for Spark Core.

You can add a library to a project the same way you would add a Git library:

$ po lib add neopixel

Update po-util to get this feature:

$ po update

#38

I’m trying out PO-util, and first off thanks for making this!

I can’t seem to build my project though:

root@tombuntu-VirtualBox:/media/sf_PARTICLE_LOCAL/JazaHub Controller# po init electron mainMashPO

Directory initialized as a po-util project for electron

root@tombuntu-VirtualBox:/media/sf_PARTICLE_LOCAL/JazaHub Controller# ls
binaries  Datasheets  Main  mainMash  mainMashPO  Purgatory  Testing
root@tombuntu-VirtualBox:/media/sf_PARTICLE_LOCAL/JazaHub Controller# cd mainMashPO
root@tombuntu-VirtualBox:/media/sf_PARTICLE_LOCAL/JazaHub Controller/mainMashPO# po electron build

                                                     __      __  __
                                                    /  |    /  |/  |
              ______    ______           __    __  _██ |_   ██/ ██ |
             /      \  /      \  ______ /  |  /  |/ ██   |  /  |██ |
            /██████  |/██████  |/      |██ |  ██ |██████/   ██ |██ |
            ██ |  ██ |██ |  ██ |██████/ ██ |  ██ |  ██ | __ ██ |██ |
            ██ |__██ |██ \__██ |        ██ \__██ |  ██ |/  |██ |██ |
            ██    ██/ ██    ██/         ██    ██/   ██  ██/ ██ |██ |
            ███████/   ██████/           ██████/     ████/  ██/ ██/
            ██ |
            ██ |
            ██/         Building firmware for electron...
    
../../../build/module.mk:229: warning: overriding recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:222: warning: ignoring old recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:229: warning: overriding recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//JazaHub'
../../../build/module.mk:222: warning: ignoring old recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//JazaHub'
../../../build/module.mk:238: warning: overriding recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:229: warning: ignoring old recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:238: warning: overriding recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//JazaHub'
../../../build/module.mk:229: warning: ignoring old recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//JazaHub'
../../../build/module.mk:262: warning: overriding recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:238: warning: ignoring old recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:261: *** mixed implicit and normal rules: deprecated syntax
../../../build/module.mk:267: warning: overriding recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:262: warning: ignoring old recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:266: *** mixed implicit and normal rules: deprecated syntax
../../../build/module.mk:267: warning: overriding recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//obj/%.o'
../../../build/module.mk:262: warning: ignoring old recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//obj/%.o'
../../../build/module.mk:283: warning: overriding recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:267: warning: ignoring old recipe for target '/media/sf_PARTICLE_LOCAL/JazaHub'
../../../build/module.mk:282: *** mixed implicit and normal rules: deprecated syntax
../../../build/module.mk:283: warning: overriding recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//obj/%.o'
../../../build/module.mk:267: warning: ignoring old recipe for target '/root/github/particle/firmware/main/Controller/mainMashPO/bin//obj/%.o'
make[1]: Circular /media/sf_PARTICLE_LOCAL/JazaHub <- /media/sf_PARTICLE_LOCAL/JazaHub dependency dropped.
make[1]: Circular /media/sf_PARTICLE_LOCAL/JazaHub <- /media/sf_PARTICLE_LOCAL/JazaHub dependency dropped.
make[1]: Circular /media/sf_PARTICLE_LOCAL/JazaHub <- /media/sf_PARTICLE_LOCAL/JazaHub dependency dropped.
make[1]: Circular /media/sf_PARTICLE_LOCAL/JazaHub <- /media/sf_PARTICLE_LOCAL/JazaHub dependency dropped.
build.mk:63: *** "No sources found in /media/sf_PARTICLE_LOCAL/JazaHub Controller/mainMashPO/firmware/".  Stop.
../../../build/recurse.mk:11: recipe for target 'user' failed
make[1]: *** [user] Error 2
../build/recurse.mk:11: recipe for target 'modules/electron/user-part' failed
make: *** [modules/electron/user-part] Error 2
root@tombuntu-VirtualBox:/media/sf_PARTICLE_LOCAL/JazaHub Controller/mainMashPO# 

_
_
Any idea what I might be doing wrong?

I haven’t made any changes to the default main.cpp file that po init created


#39

@jaza_tom
It could be that it doesn’t like that your folder has a space in it. Never really seen this error before but I would definitely try renaming JazaHub Controller.

Update:
I just confirmed this on my machine, a directory path with a space in it will produce this error. I’ll try to find a fix for this. In the meantime I think po-util will work if you rename the JazaHub Controller directory to something more friendly like JazaHub-Controller.


#40

That did it. Thanks!!!


#41

Hope you enjoy using po-util for your projects! I’d recomend looking into the library manager. It’s pretty slick, and it can use libraries from GitHub or Particle Libraries 2.0.


#42

I’m having a problem with my #include statements still as mentioned in this other post: Local build including header files in sub-directoriess`

It would appear that it still wants me to specify full paths to my included headers.

My structure is like:

firmware

  • folder1
    • folder1.h
  • main.cpp

and in main.cpp i have

#include "folder1.h"

but it throws an error unless I use

#include "folder1/folder1.h"

any was to support flatenning the file structure?


#43

Not that I know of really. Po-util will intelligently create the #include "folder1/folder1.h" statements when adding a library to a project however. I’m not sure how to flatten the file structure without making po-util do unnecessary work.


#44

Might be getting a bit off this thread’s topic but how would I go about making a file structure like this work if files in one subfolder need to include files in another subfolder?

For example

firmware

  • folder1
    • folder1.h
    • folder1.cpp
      -folder2
    • folder2.h
    • folder2.cpp
  • main.cpp

and then in folder2.cpp I have:

#include "../folder1/folder1.h"

but I sense that doing things this way with the “…/” appended to the front of the file path is frowned upon. What is the correct way?


#45

Does:

#include "folder1/folder1.h"

Work in folder2.cpp/.h to include folder1? Works for me when using libraries that depend on each other in the same project.


#46

Right you are :wink: Cheers, this is awesome


#47

Even more awesome is that po-util will automatically try to download libraries that a library or project depends on. Also it has an example manager that will list avaliable examples for an installed library and allow you to load them into your project.

Here is an example, using particle-BNO055:

$ po init DEVICE_TYPE BNO055
$ cd BNO055
$ po lib get https://github.com/nrobinson2000/particle-BNO055
$ po lib ex ls particle-BNO055
$ po lib ex load particle-BNO055 simple

#48

You are welcome to join the po-util community on Gitter for extended discussion.