Testers Needed: Added support for AnyLinux™, SoonOSX™, and MaybeChromeOS™ for Parallax Tooling.
__red__
Posts: 470
in Propeller 1
OH HAI! - tl;dr
Nix is a cross-platform package manager which works in much the same way as "brew" does for OSX (for those who are familiar)
I've been working on getting the parallax tooling into the official nix/nixos repos. Once it's in there officially there will be automatically built packages that will work on any Linux distribution, Mac OSX, and I believe also ChromeOS.
Nix deals with all dependencies OUTSIDE of the native OS which means that ChromeOS should come "for free"™ with no additional development.
Before I push the remaining packages to the official repos, I need some testing. Just because it compiles, doesn't mean I should ship it.
TODO
* Have people who have used the tooling test its functionality.
* Identify which version / tag I should be packaging (I'm currently master on almost everything).
* Complete the port to Mac OSX (currently only openspin is ported to OSX).
* Testing for ChromeOS.
* Push to the Official Distribution.
* What packages (if any) am I missing? Requests?
How can I help?
If you are running on *ANY* Linux, you can help. Really - any. It should work on anything that has a shell, curl... even ridiculously cut-down distributions.
So how does this work?
You install the package manager from an unprivileged user. The only places it writes will be in your user profile and a new directory called /nix where it stores the packages (it does this so if you have multiple users on a system you only have one copy).
To uninstall it, you just remove those. Unlike brew, it doesn't hose your base OS by writing in global locations like /usr/local
The first package (openspin) was accepted upstream which means that THAT package is already compiled and available as a binary package for both Linux and OSX.
Here's the page for the Linux build in Nix infrastructure:https://hydra.nixos.org/job/nixpkgs/trunk/openspin.x86_64-linux#tabs-status
So, just the Package Manager, right?
When everything is accepted upstream, installation will be two commands for end-users. One to install the package manager, one to install whatever tooling you want.
However, since I'm in development you'll need to install the package manager, and the build instructions for the propeller tooling (which is what I'm writing).
Show me!
Okay, this is a fresh minimal ubuntu build. This is how we install the package manager:
Next up, installing the data needed to build the packages:
To install openspin (this is now an official package):
To install spinsim (this hasn't been accepted upstream so will be compiled locally):
Installing spin2cpp (which includes fastspin):
... and really, the mother-lode:
Get a coffee for this one, it takes a while ;-)
Thanks,
Red
Nix is a cross-platform package manager which works in much the same way as "brew" does for OSX (for those who are familiar)
I've been working on getting the parallax tooling into the official nix/nixos repos. Once it's in there officially there will be automatically built packages that will work on any Linux distribution, Mac OSX, and I believe also ChromeOS.
Nix deals with all dependencies OUTSIDE of the native OS which means that ChromeOS should come "for free"™ with no additional development.
Before I push the remaining packages to the official repos, I need some testing. Just because it compiles, doesn't mean I should ship it.
TODO
* Have people who have used the tooling test its functionality.
* Identify which version / tag I should be packaging (I'm currently master on almost everything).
* Complete the port to Mac OSX (currently only openspin is ported to OSX).
* Testing for ChromeOS.
* Push to the Official Distribution.
* What packages (if any) am I missing? Requests?
How can I help?
If you are running on *ANY* Linux, you can help. Really - any. It should work on anything that has a shell, curl... even ridiculously cut-down distributions.
So how does this work?
You install the package manager from an unprivileged user. The only places it writes will be in your user profile and a new directory called /nix where it stores the packages (it does this so if you have multiple users on a system you only have one copy).
To uninstall it, you just remove those. Unlike brew, it doesn't hose your base OS by writing in global locations like /usr/local
The first package (openspin) was accepted upstream which means that THAT package is already compiled and available as a binary package for both Linux and OSX.
Here's the page for the Linux build in Nix infrastructure:https://hydra.nixos.org/job/nixpkgs/trunk/openspin.x86_64-linux#tabs-status
So, just the Package Manager, right?
When everything is accepted upstream, installation will be two commands for end-users. One to install the package manager, one to install whatever tooling you want.
However, since I'm in development you'll need to install the package manager, and the build instructions for the propeller tooling (which is what I'm writing).
Show me!
Okay, this is a fresh minimal ubuntu build. This is how we install the package manager:
red@ubuntut0:~$ sudo apt install curl # because ubuntu doesn't have curl/git by default. ⋮ Setting up curl (7.58.0-2ubuntu3.5) ... red@ubuntut0:~$ curl https://nixos.org/nix/install | sh ⋮ Installation finished! To ensure that the necessary environment variables are set, either log in again, or type . /home/red/.nix-profile/etc/profile.d/nix.sh in your shell. red@ubuntut0:~$ . /home/red/.nix-profile/etc/profile.d/nix.sh
Next up, installing the data needed to build the packages:
red@ubuntut0:~$ cd ~/.config red@ubuntut0:~/.config$ mkdir -p nixpkgs/overlays red@ubuntut0:~/.config$ cd nixpkgs/overlays red@ubuntut0:~/.config/nixpkgs/overlays$ red@ubuntut0:~/.config/nixpkgs/overlays$ git clone https://github.com/redvers/parallax-tooling Cloning into 'parallax-tooling'... remote: Enumerating objects: 17, done. remote: Counting objects: 100% (17/17), done. remote: Compressing objects: 100% (15/15), done. remote: Total 17 (delta 0), reused 14 (delta 0), pack-reused 0 Unpacking objects: 100% (17/17), done.
To install openspin (this is now an official package):
red@ubuntut0:~/.config/nixpkgs/overlays$ nix-env -iA nixpkgs.openspin installing 'openspin-unstable-2018-10-02' building '/nix/store/1dfgz7m7qfsarkvwq8z3cpg035nk4n88-user-environment.drv'... created 19 symlinks in user environment red@ubuntut0:~/.config/nixpkgs/overlays$ openspin Propeller Spin/PASM Compiler 'OpenSpin' (c)2012-2018 Parallax Inc. DBA Parallax Semiconductor. Version 1.00.81 Compiled on Jan 1 1970 00:00:01 usage: openspin [ -h ] display this help [ -L or -I <path> ] add a directory to the include path [ -o <path> ] output filename [ -b ] output binary file format [ -e ] output eeprom file format [ -c ] output only DAT sections [ -d ] dump out doc mode [ -t ] output just the object file tree [ -f ] output a list of filenames for use in archiving [ -q ] quiet mode (suppress banner and non-error text) [ -v ] verbose output [ -p ] disable the preprocessor [ -a ] use alternative preprocessor rules [ -D <define> ] add a define [ -M <size> ] size of eeprom (up to 16777216 bytes) [ -s ] dump PUB & CON symbol information for top object [ -u ] enable unused method elimination <name.spin> spin file to compile
To install spinsim (this hasn't been accepted upstream so will be compiled locally):
red@ubuntut0:~$ nix-env -iA nixpkgs.spinsim installing 'spinsim-2018-06-19' these derivations will be built: /nix/store/zmnm9fj8vpn451fxp352fyxrkg5b6ij7-source.drv /nix/store/4lajikrdwxz4h731gjyvfjy8a1x2f7a4-spinsim-2018-06-19.drv these paths will be fetched (0.12 MiB download, 0.47 MiB unpacked): /nix/store/2y2xzxbxsj1mbn77zyjwra3c0mgkr007-unzip-6.0 copying path '/nix/store/2y2xzxbxsj1mbn77zyjwra3c0mgkr007-unzip-6.0' from 'https://cache.nixos.org'... building '/nix/store/zmnm9fj8vpn451fxp352fyxrkg5b6ij7-source.drv'... ⋮ [code] checking for references to /tmp/nix-build-spinsim-2018-06-19.drv-0 in /nix/store/30x5cgip7wncz35md4bw10nhpljdna4x-spinsim-2018-06-19... building '/nix/store/7pb41a1p22hs0wd0gkgrbfvfhwyr7jw0-user-environment.drv'... created 19 symlinks in user environment red@ubuntut0:~$ spinsim Spinsim Version 0.99 usage: spinsim [options] file The options are as follows: -v# Set verbosity level -l <filename> List executed instructions to <filename> -p Use PASM Spin interpreter -# Execute # instructions -P Profile Spin opcode usage -m# Set the hub memory size to # K-bytes -t# Enable the Prop 2 mode. # specifies options -b# Enable the serial port and set the baudrate to # (default 115200) -gdb Operate as a GDB target over stdin/stdout -L <filename> Log GDB remote comm to <filename> -r <filename> Replay GDB session from <filename> -e Use eeprom.dat -d Use debugger -pst Use PST mode
Installing spin2cpp (which includes fastspin):
red@ubuntut0:~$ nix-env -iA nixpkgs.spin2cpp installing 'spin2cpp-2018-11-03' these derivations will be built: /nix/store/83hqyzcs06iap5r6rapyr24kfzl2fgrf-source.drv /nix/store/ra9sb1hhhcmsq6dzpskkvclxhd2pz1yb-spin2cpp-2018-11-03.drv building '/nix/store/83hqyzcs06iap5r6rapyr24kfzl2fgrf-source.drv'... ⋮ patching script interpreter paths in /nix/store/k8dj1n54jmb084m3gpap2yyy64hrn8d3-spin2cpp-2018-11-03 checking for references to /tmp/nix-build-spin2cpp-2018-11-03.drv-0 in /nix/store/k8dj1n54jmb084m3gpap2yyy64hrn8d3-spin2cpp-2018-11-03... building '/nix/store/6mlrayd0xvmyapq5v5nyzk5psjczcibf-user-environment.drv'... created 22 symlinks in user environment red@ubuntut0:~$ fastspin Propeller Spin/PASM Compiler 'FastSpin' (c) 2011-2018 Total Spectrum Software Inc. Version 3.9.9-beta- Compiled on: Jan 1 1970 usage: fastspin [options] filename.spin | filename.bas [ -h ] display this help [ -L or -I <path> ] add a directory to the include path [ -o <name> ] set output filename to <name> [ -b ] output binary file format [ -e ] output eeprom file format [ -c ] output only DAT sections [ -l ] output DAT as a listing file [ -f ] output list of file names [ -q ] quiet mode (suppress banner and non-error text) [ -p ] disable the preprocessor [ -D <define> ] add a define [ -u ] ignore for openspin compatibility (unused method elimination always enabled) [ -2 ] compile for Prop2 [ -O# ] set optimization level: -O0 = no optimization -O1 = basic optimization -O2 = all optimization [ -w ] compile for COG with Spin wrappers [ --code=cog ] compile for COG mode instead of LMM [ --fcache=N ] set FCACHE size to N (0 to disable) [ --fixedreal ] use 16.16 fixed point in place of floats red@ubuntut0:~$ spin2cpp Spin to C++ converter version 3.9.9-beta- Usage: spin2cpp [options] file.spin Options: --asm: output (user readable) PASM code --binary: create binary file for download --cogspin: create PASM based Spin object (translate Spin to PASM) --ccode: output C code instead of C++ --cse: perform common subexpression optimizations on C code --cc=CC: use CC as the C++ compiler instead of PropGCC --code=x : PASM output only: control placement of code x can be cog (default) or hub (for LMM) --ctypes : use inferred pointer (and other) types in generated C/C++ code --data=x : PASM output only: control placement of data x can be cog or hub (default is hub) --dat: output binary blob of DAT section only --eeprom: create EEPROM binary file for download --elf: create executable ELF file with propgcc --files: print list of .cpp files to stdout --fixed: use 16.16 fixed point in place of float --fcache=N: set size of FCACHE area --gas: create inline assembly out of DAT area; with --dat, create gas .S file from DAT area --list: produce a listing file --main: include C++ main() function --noheader: skip the normal comment about spin2cpp version --nocse: disable common subexpression optimizations on PASM code --noopt: turn off all optimization in PASM output --nopre: do not run preprocessor on the .spin file --nofcache: disable FCACHE (same as --fcache=0) --normalize: normalize case of all identifiers --p2: use Propeller 2 instructions (experimental) --require: require a specific version (or later) of spin2cpp --side: create a SimpleIDE file for the C/C++ outputs -Dname=val: define a preprocessor symbol -g: add debug info to output (original source for PASM output) -I dir: add dir to the object search path -L dir: same as -I -o file: place final output in file -y: debug parser --version: print version and exit
... and really, the mother-lode:
red@ubuntut0:~$ nix-env -iA nixpkgs.propeller-gcc ⋮
Get a coffee for this one, it takes a while ;-)
Thanks,
Red
Comments
The install will drop it in profile.d for those distributions that support that (hence the "To ensure that the necessary environment variables are set, either log in again, or type")
What I love and adore about it is that even though the compile needs gcc, make, yacc, bison, texinfo... and all these other things... at the end of the compile, NONE of them persist so there's no danger of polluting your existing OS.
The applications your add end up as symlinks in: ~/.nix-profile/bin/
So, in my current example:
I don't actually have a Mac so for developing it I had been reliant on uploading code and letting Nix's CI infrastructure build it for me. Confirmation that it works on a Mac would would be awesome!
To test that you only need to:
Do whatever ". /home/red/.nix-profile/etc/profile.d/nix.sh" equivalent it asks you to do.
For the record, this just changed. I just acquired a mac.
I ran the commands to configure nix and installed openspin on a macOS Mojave (10.14.1) system and it appears to work as you expected!
dgately
Oh, this is just GLORIOUS! Thank you!
Making sure it's actually functional is the big deal. I could only compile it, without the other platforms I couldn't actually test that it didn't core-dump / crash when running.
Thanks for testing it - I'm going to commit to keeping it current AND...
I've been digging into the chromebook porting aspect. It seems that the chromebooks are slowly getting project crostini rolled out which will allow this to run in chromebooks that have NOT been put into developer mode.
Unfortunately, the chromebook I own is one that will never get that update so I can't test it against the "production" chromebooks, just the developer-mode ones.
The chromebook stuff may fall back a little, but there is light on the horizon.