I have software I want to build!
I have software I want to build!
use!
───
compile!
okay, patch!
then compile and use!
and share..!
(there are many different ways to go about this)
What’s tricky isn’t bulding.
We have build tools.
What’s tricky is
integrating.
What’s tricky is connecting
different build processes together.
What’s tricky is composing systems.
What’s tricky is
integrating.
The best way to figure out how to integrate�something is… to break it apart, first.
What is a “build”?
Files go in…
{
"inputs": {
"/": "ipfs:Qm6q7G4hWr26q7G4hWTa5Lf89p"
"/app/gcc": "ipfs:Qmr283FpTaSL883FpL8"
“/task/src”: “git:7c554c3ae7bee8e3b42”
}
}
What is a “build”?
Files go in…
Files go out…
{
"inputs": {
"/": "ipfs:Qm6q7G4hWr26q7G4hWTa5Lf89p"
"/app/gcc": "ipfs:Qmr283FpTaSL883FpL8"
“/task/src”: “git:7c554c3ae7bee8e3b42”
},
"outputs": {
"/task/out": {"packtype": "ipfs"}
}
}
What is a “build”?
Files go in…
Files go out…
An action in the middle.
{
"inputs": {
"/": "ipfs:Qm6q7G4hWr26q7G4hWTa5Lf89p"
"/app/gcc": "ipfs:Qmr283FpTaSL883FpL8"
“/task/src”: “git:7c554c3ae7bee8e3b42”
},
"action": {
"exec": [
"/app/gcc/bin/gcc",
"/task/src/cool.c",
"-o", "/task/out/cool.exe" ]
},
"outputs": {
"/task/out": {"packtype": "ipfs"}
}
}
What can we do if…
we do this with IPLD?
{
"inputs": {
"/": "ipfs:Qm6q7G4hWr26q7G4hWTa5Lf89p"
"/app/gcc": "ipfs:Qmr283FpTaSL883FpL8"
“/task/src”: “git:7c554c3ae7bee8e3b42”
},
"action": {
"exec": [
"/app/gcc/bin/gcc",
"/task/src/cool.c",
"-o", "/task/out/cool.exe" ]
},
"outputs": {
"/task/out": {"packtype": "ipfs"}
}
}
“Computation-
addressable”
{
"inputs": {
"/": "ipfs:Qm6q7G4hWr26q7G4hWTa5Lf89p"
"/app/gcc": "ipfs:Qmr283FpTaSL883FpL8"
“/task/src”: “git:7c554c3ae7bee8e3b42”
},
"action": {
"exec": [
"/app/gcc/bin/gcc",
"/task/src/cool.c",
"-o", "/task/out/cool.exe" ]
},
"outputs": {
"/task/out": {"packtype": "ipfs"}
}
}
{
"formulaID": "QmVdAD3v91JWPjZXGkTKD6",
"exitCode": 0,
"results": {
"/task/out": "ipfs:QmD9AjmrdCY4QUquhiQ"
}
}
This is a useful building block.
Now let’s try to integrate.
Now let’s try to integrate.
...
Now let’s try to integrate.
Now let’s try to integrate.
“describe multiple steps and relate them in advance”.....
We have a naming problem.
So break it down again.
Distributed naming problems are hard.
So let’s try to break down the problem into component parts…
(until suddenly none of them look like “naming” anymore!)
and then integrate again afterwards.
So break it down again.
So break it down again.
So break it down again.
locally scoped naming is easy
Lesson for any distributed system design:
If you can turn a distributed naming problem into a locally scoped naming problem, do it. It’s easier.�(Then try to make it composable.)
"imports": {
"root-builder": "catalog:early.polydawn.io/monolith/debian-gcc-plus:v1.2017.01.04:linux-amd64",
"app-smsh": "catalog:early.radix.polydawn.io/smsh:candidate:bin-linux-amd64",
"src-gzip": "catalog:early.hyphae.polydawn.io/sources/gzip:v1.9:src",
"autoconfesque": "ingest:pack:tar:../../../shared/autoconfesque"
"steps": {
"build": {
"operation": {
"inputs": {
"/": "root-builder",
"/app/smsh": "app-smsh",
"/task/raw": "src-gzip",
"/radix/autoconfesque": "autoconfesque"
"action": {
"userinfo": {"uid":0},
"exec": [
"/app/smsh/bin/smsh",
"ln -s raw/* src",
"ls -lah",
"/radix/autoconfesque/build.sh",
"mkdir out2"
"mv out/usr/local/bin out2"
"outputs": {
"bin": "/task/out2"
"busybash": {
"operation": {
"inputs": {
"/": "root-busybash",
"/app/smsh": "app-smsh",
"/task": "subject"
"action": {
"exec": [
"/app/smsh/bin/smsh",
"ldd ./bin/gzip",
"./bin/gzip -h"
"rich": {
"operation": {
"inputs": {
"/": "root-debian",
"/app/smsh": "app-smsh",
"/task": "subject"
"action": {
"exec": [
"/app/smsh/bin/smsh",
"ldd ./bin/gzip",
"./bin/gzip -h"
"exports": {
"bin-amd64-linux": "build.bin"
locally scoped naming is easy
… so what do we do when we want to collaborate and integrate with other people and other authors?
"imports": {
"root-builder": "catalog:early.polydawn.io/monolith/debian-gcc-plus:v1.2017.01.04:linux-amd64",
"app-smsh": "catalog:early.radix.polydawn.io/smsh:candidate:bin-linux-amd64",
"src-gzip": "catalog:early.hyphae.polydawn.io/sources/gzip:v1.9:src",
"autoconfesque": "ingest:pack:tar:../../../shared/autoconfesque"
"steps": {
"build": {
"operation": {
"inputs": {
"/": "root-builder",
"/app/smsh": "app-smsh",
"/task/raw": "src-gzip",
"/radix/autoconfesque": "autoconfesque"
"action": {
"userinfo": {"uid":0},
"exec": [
"/app/smsh/bin/smsh",
"ln -s raw/* src",
"ls -lah",
"/radix/autoconfesque/build.sh",
"mkdir out2"
"mv out/usr/local/bin out2"
"outputs": {
"bin": "/task/out2"
"busybash": {
"operation": {
"inputs": {
"/": "root-busybash",
"/app/smsh": "app-smsh",
"/task": "subject"
"action": {
"exec": [
"/app/smsh/bin/smsh",
"ldd ./bin/gzip",
"./bin/gzip -h"
"rich": {
"operation": {
"inputs": {
"/": "root-debian",
"/app/smsh": "app-smsh",
"/task": "subject"
"action": {
"exec": [
"/app/smsh/bin/smsh",
"ldd ./bin/gzip",
"./bin/gzip -h"
"exports": {
"bin-amd64-linux": "build.bin"
connect things with content-addressable (IPLD?) messages
… so what do we do when we want to collaborate and integrate with other people and other authors?
Can we keep extending the defn of “locally scoped” gradually?
"formulaID": "QmVdAD3v91JWPjZXGkTKD6",
"exitCode": 0,
"results": {
"/task/out": "ipfs:QmD9AjmrdCY4QUquhiQ"
"imports": {
"root-builder": "catalog:early.polydawn.io/monolith/debian-gcc-plus:v1.2017.01.04:linux-amd64",
"app-smsh": "catalog:early.radix.polydawn.io/smsh:candidate:bin-linux-amd64",
"src-gzip": "catalog:early.hyphae.polydawn.io/sources/gzip:v1.9:src",
"autoconfesque": "ingest:pack:tar:../../../shared/autoconfesque"
"steps": {
"build": {
"operation": {
"inputs": {
"/": "root-builder",
"/app/smsh": "app-smsh",
"/task/raw": "src-gzip",
"/radix/autoconfesque": "autoconfesque"
"action": {
"userinfo": {"uid":0},
"exec": [
"/app/smsh/bin/smsh",
"ln -s raw/* src",
"ls -lah",
"/radix/autoconfesque/build.sh",
"mkdir out2"
"mv out/usr/local/bin out2"
"outputs": {
"bin": "/task/out2"
"busybash": {
"operation": {
"inputs": {
"/": "root-busybash",
"/app/smsh": "app-smsh",
"/task": "subject"
"action": {
"exec": [
"/app/smsh/bin/smsh",
"ldd ./bin/gzip",
"./bin/gzip -h"
"rich": {
"operation": {
"inputs": {
"/": "root-debian",
"/app/smsh": "app-smsh",
"/task": "subject"
"action": {
"exec": [
"/app/smsh/bin/smsh",
"ldd ./bin/gzip",
"./bin/gzip -h"
"exports": {
"bin-amd64-linux": "build.bin"
"formulaID": "QmVdAD3v91JWPjZXGkTKD6",
"exitCode": 0,
"results": {
"/task/out": "ipfs:QmD9AjmrdCY4QUquhiQ"
"formulaID": "QmVdAD3v91JWPjZXGkTKD6",
"exitCode": 0,
"results": {
"/task/out": "ipfs:QmD9AjmrdCY4QUquhiQ"
"formulaID": "QmVdAD3v91JWPjZXGkTKD6",
"exitCode": 0,
"results": {
"/task/out": "ipfs:QmD9AjmrdCY4QUquhiQ"
"formulaID": "QmVdAD3v91JWPjZXGkTKD6",
"exitCode": 0,
"results": {
"/task/out": "ipfs:QmD9AjmrdCY4QUquhiQ"
Docs, more docs, and prototypes