#PDR15 - waf, wscript and Your Pebble App

Pebble Technology
Pebble TechnologyPebble Technology
2015 Pebble Developer Retreat
waf, wscript & Your Pebble App
Cherie Williams - Troublemaker
Agenda
• Why modify my wscript?
• Pebble SDK & Fat PBW
• What is this “waf” thing?
• Why is Pebble using waf?
• wscript
• Why do I care about waf?
• wscript Recipes
• Debugging
Why modify my wscript?
Making the Pebble SDK build system work for you
You can…
• Add C compiler flags
• Add custom defines for your apps (eg. #ifdef
NOLOG)
• Concatenate multiple JS files or do other file
manipulations at build time
You can…
• Collect & build source from a non-standard
project
• Add a linter (or two!)
• Run arbitrary scripts at build time to modify
resources or other files
You can…
• Add automatic testing
• Profile builds or add build visualizations
• Read in arbitrary text at build (eg. appinfo.json)
You can…
• Include an external library
• Build libraries for distribution
…the possibilities are endless!
Fine Print
Recipes + content from today’s talk are
*not* compatible with CloudPebble
Pebble SDK & Fat PBW
SDK: Capabilities Today
• Builds for up to 3 Pebble platforms
• Can build apps, as well as workers
• Handles platform-specific resources
• Packages a single PBW for distribution
aplite
Pebble Classic
Pebble Steel
basalt
Pebble Time
Pebble Time Steel
chalk Pebble Time Round
#PDR15 - waf, wscript and Your Pebble App
What is this “waf” thing?
A brief introduction to the Pebble build system
Introducing waf, a Python build system
• Open source, actively maintained
• Active community on Google Groups
• Task parallelization & dependency handling
• Language agnostic, but includes C compiler support
• Integrates with Eclipse, Visual Studio and Xcode
• Includes framework to build & distribute custom build
systems
Why is Pebble using waf?
This guy
Why Pebble uses waf
• Efficiently handles dependencies for large, complex
projects (such as Pebble firmware)
• Python!!
• Easy method overriding
• Can package & distribute additional scripts in the SDK
• Convenience modules for Logs, Node and methods
for easy file substitutions
wscript
The build script behind waf
Basic wscript (non-Pebble)
def configure(ctx):
print "Configure"
def build(ctx):
print "Build"
Basic wscript
$ waf configure build
Setting top to : /Users/cherie/waf-demo/
default
Setting out to : /Users/cherie/waf-demo/
default/build
Configure
'configure' finished successfully (0.009s)
Waf: Entering directory '/Users/cherie/waf-demo/default/build'
Build
Waf: Leaving directory '/Users/cherie/waf-demo/default/build'
'build' finished successfully (0.009s)
Invoking waf via the pebble-tool
pebble clean waf distclean
pebble build waf configure build (-v)
pebble build (-- --other-flags) waf configure build (--other-flags)
Standard Pebble wscript
def options(ctx):
ctx.load('pebble_sdk')
def configure(ctx):
ctx.load('pebble_sdk')
def build(ctx):
ctx.load('pebble_sdk')
build_worker = os.path.exists('worker_src')
binaries = []
for p in ctx.env.TARGET_PLATFORMS:
ctx.set_env(ctx.all_envs[p])
ctx.set_group(ctx.env.PLATFORM_NAME)
app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)
ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'), target=app_elf)
if build_worker:
worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)
binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})
ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'), target=worker_elf)
else:
binaries.append({'platform': p, 'app_elf': app_elf})
ctx.set_group('bundle')
ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))
Read in command line options
Configure environment for build
Run build
For each HW platform:
• Create app binary
• Create worker binary (optional)
Bundle into PBW
#PDR15 - waf, wscript and Your Pebble App
#PDR15 - waf, wscript and Your Pebble App
Why do I care about waf?
Understanding how your Pebble project is built
wscript
The build script behind waf
Basic wscript (non-Pebble)
def configure(ctx):
print "Configure"
def build(ctx):
print "Build"
Glossary
Context
An object for each command executed that stores all the
information necessary for the command execution
BuildContext
The build context holds all the information necessary for a
build
Basic wscript (non-Pebble)
def configure(ctx):
print "Configure"
def build(ctx):
print "Build"
Modified Basic wscript
def configure(ctx):
ctx.env.MESSAGE = "Hello World"
def build(ctx):
pass
Glossary
Environment
A group of settings and variables that are stored in a
Context and that is cached between execution of
commands
NOTE: A single Context can have many, arbitrary
environments
build/c4che/*.py
AR = 'arm-none-eabi-gcc-ar'
ARFLAGS = 'rcs'
AS = 'arm-none-eabi-gcc'
BINDIR = '/usr/local/bin'
BUILD_DIR = 'basalt'
CC = ['arm-none-eabi-gcc']
CCLNK_SRC_F = []
CCLNK_TGT_F = ['-o']
CC_NAME = 'gcc'
CC_SRC_F = []
CC_TGT_F = ['-c', '-o']
CC_VERSION = ('4', '8', '4')
CFLAGS = ['-std=c99', '-mcpu=cortex-m3', '-mthumb', '-ffunction-sections', '-
fdata-sections', '-g', '-Os', '-D_TIME_H_', '-Wall', '-Wextra', '-Werror', '-Wno-
unused-parameter', '-Wno-error=unused-function', '-Wno-error=unused-variable']
CFLAGS_MACBUNDLE = ['-fPIC']
CFLAGS_cshlib = ['-fPIC']
CPPPATH_ST = '-I%s'
DEFINES = ['RELEASE', 'PBL_PLATFORM_BASALT', 'PBL_COLOR', 'PBL_RECT', 'PBL_SDK_3']
DEFINES_ST = '-D%s'
DEST_BINFMT = 'elf'
DEST_CPU = 'arm'
DEST_OS = 'darwin'
INCLUDES = ['basalt']
LD = 'arm-none-eabi-ld'
LIBDIR = '/usr/local/lib'
LIBPATH_ST = '-L%s'
LIB_ST = ‘-l%s'
LINKFLAGS = ['-mcpu=cortex-m3', '-mthumb', '-Wl,--gc-sections', '-Wl,--warn-
common', '-Os']
LINKFLAGS_MACBUNDLE = ['-bundle', '-undefined', 'dynamic_lookup']
LINKFLAGS_cshlib = ['-shared']
LINKFLAGS_cstlib = ['-Wl,-Bstatic']
LINK_CC = ['arm-none-eabi-gcc']
MESSAGE = ‘Hello World'
PBW_BIN_DIR = 'basalt'
PEBBLE_SDK = '/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/basalt'
PEBBLE_SDK_COMMON = '/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/common'
PLATFORM = {'PBW_BIN_DIR': 'basalt', 'TAGS': ['basalt', 'color', 'rect'],
'ADDITIONAL_TEXT_LINES_FOR_PEBBLE_H': [], 'MAX_APP_BINARY_SIZE': 65536,
'MAX_RESOURCES_SIZE': 1048576, 'MAX_APP_MEMORY_SIZE': 65536,
'MAX_WORKER_MEMORY_SIZE': 10240, 'NAME': 'basalt', 'BUILD_DIR': 'basalt',
'MAX_RESOURCES_SIZE_APPSTORE': 262144, 'DEFINES': ['PBL_PLATFORM_BASALT',
'PBL_COLOR', 'PBL_RECT']}
PLATFORM_NAME = 'basalt'
PREFIX = '/usr/local'
RPATH_ST = '-Wl,-rpath,%s'
SDK_VERSION_MAJOR = 5
SDK_VERSION_MINOR = 70
SHLIB_MARKER = None
SIZE = 'arm-none-eabi-size'
SONAME_ST = '-Wl,-h,%s'
STLIBPATH_ST = '-L%s'
STLIB_MARKER = None
STLIB_ST = '-l%s'
TARGET_PLATFORMS = [u'basalt', u'aplite']
cprogram_PATTERN = '%s'
cshlib_PATTERN = 'lib%s.so'
cstlib_PATTERN = 'lib%s.a'
macbundle_PATTERN = '%s.bundle'
Modified Basic wscript
def configure(ctx):
ctx.env.MESSAGE = "Hello World"
def build(ctx):
ctx(rule="echo ${MESSAGE}",
source='', target='')
Glossary
Task Generator
An object that handles the creation of task instances, and
helps simplify the creation of ordering constraints
Task
An object that represents the production of something
during the build (files, in general) and may be executed in
sequence or in parallel
${MESSAGE} is shorthand for ctx.env.MESSAGE
Modified Basic wscript
$ ../Pebble/waf configure build
Setting top to : /Users/cherie/waf-demo/
default
Setting out to : /Users/cherie/waf-demo/
default/build
'configure' finished successfully (0.002s)
Waf: Entering directory '/Users/cherie/waf-demo/default/build'
[1/1] echo ${MESSAGE}:
Hello World
Waf: Leaving directory '/Users/cherie/waf-demo/default/build'
'build' finished successfully (0.030s)
Modified Basic wscript w/Dependency
def build(ctx):
ctx(rule="echo 'hello' > ${TGT}",
source='',
target='message.txt')
ctx(rule="cp ${SRC} ${TGT}",
source='message.txt',
target='copy.txt')
Glossary
Build Order
The sequence in which tasks must be executed.
Dependency
A dependency represents the conditions by which a task can be
considered up-to-date or not, and can be explicit (dependency
on file inputs & outputs) or abstract (dependency on a value). waf
uses dependencies to determine whether tasks need to be run
(changed checksum of source files) and the build order of tasks.
${SRC} and ${TGT} are shorthand for source and target
Pebble Project Build
Let’s see how dependencies work
#PDR15 - waf, wscript and Your Pebble App
Glossary
Node
A data structure used to represent the filesystem. Nodes
may represent files or folders. File nodes are associated
with signatures, which can be hashes of the file contents
(source files) or task signatures (build files)
Node != Existing File
Glossary
Command
A function defined in the wscript file that is executed
when its name is given on the command-line, and can be
chained with other commands
Ex:
waf distclean (`pebble clean`)
waf configure build (`pebble build`)
#PDR15 - waf, wscript and Your Pebble App
Agenda
• Why modify my wscript?
• Pebble SDK & Fat PBW
• What is this “waf” thing?
• Why is Pebble using waf?
• wscript
• Why do I care about waf?
• wscript Recipes
• Debugging
wscript Recipes
https://developer.getpebble.com/build
Recipe #1
Add compile time flags
Create waftools/pedantic.py
def configure(ctx):
ctx.env.append_value('CFLAGS', '-pedantic')
def configure(ctx):
ctx.load('pebble_sdk')
+ ctx.load('pedantic', tooldir='waftools')
Add to wscript
[23/35] c: src/default.c -> build/src/default.c.18.o
In file included from ../src/default.c:1:0:
/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/aplite/include/pebble.h:
974:33: error: ISO C does not permit named variadic macros [-
Werror=variadic-macros]
#define APP_LOG(level, fmt, args...) 
^
/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/aplite/include/pebble.h:
1121:3: error: type of bit-field 'type' is a GCC extension [-
Werror=pedantic]
TupleType type:8;
^
/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/aplite/include/pebble.h:
1132:13: error: ISO C forbids zero-size array 'data' [-Werror=pedantic]
uint8_t data[0];
^
Recipe #2
Add build options & associated defines
Create waftools/defines.py
def options(ctx):
ctx.add_option('--no-log', action='store_true', default=False,
help="Mark a build to exclude app logging output")
def configure(ctx):
if ctx.options.no_log:
ctx.env.append_value('DEFINES', 'NOLOG')
Add to wscript for options & configure
ctx.load('defines', tooldir='waftools')
Add to main project.c file
#include <pebble.h>
#if defined(NOLOG)
#undef APP_LOG
#define APP_LOG(...)
#endif
Before
$ pebble install --emulator aplite --logs
Installing app...
App install succeeded.
[22:45:45] default.c:60> Done initializing, pushed window: 0x2001a5fc
[22:45:50] javascript> Ready!
$ pebble build -- --no-logs
…
$ pebble install --emulator aplite --logs
Installing app...
App install succeeded.
[22:49:34] javascript> Ready!
After
Recipe #3
Add a linter
Create waftools/linter.py
def options(ctx):
ctx.add_option('--jshint', action='store_true',
help="Run JSHint on the JS files in the build")
def configure(ctx):
if ctx.options.jshint:
try:
ctx.find_program('jshint', var='JSHINT')
except ctx.errors.ConfigurationError:
print "jshint was not found"
def build(ctx):
if ctx.env.JSHINT:
ctx(rule='${JSHINT} ${SRC}', source=ctx.path.ant_glob('src/**/*.js'))
Add to wscript
def options(ctx):
ctx.load('pebble_sdk')
+ ctx.load('linter', tooldir='waftools')
def configure(ctx):
ctx.load(‘pebble_sdk')
+ ctx.load('linter', tooldir='waftools')
def build(ctx):
ctx.load('pebble_sdk')
+ ctx.load('linter', tooldir='waftools')
$ pebble build -- --jshint
[25/36] jshint ${SRC}: src/js/another.js src/js/pebble-js-
app.js
../src/js/pebble-js-app.js: line 2, col 24, Missing semicolon.
1 error
Waf: Leaving directory `/Users/cherie/pebble-apps/default/
build'
Build failed
-> task in '' failed (exit status 2):
{task 4343355600: jshint ${SRC} another.js,pebble-js-
app.js -> }
' jshint ../src/js/another.js ../src/js/pebble-js-app.js '
Recipe #4
Use source code from multiple folders (2.x + 3.x)
Modify wscript
def build(ctx):
for p in ctx.env.TARGET_PLATFORMS:
- ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),
target=app_elf)
+ ctx.pbl_program(source=ctx.path.ant_glob('src/{}/**/*.c'.format(p)),
target=app_elf)
if build_worker:
- ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),
target=worker_elf)
+ ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/{}/'
'**/*.c'.format(p)),
target=worker_elf)
Recipe #5
Concatenate multiple JS files
Modify wscript
def build(ctx):
ctx.set_group('bundle')
+ js_files = ctx.path.ant_glob('src/**/*.js')
+ if js_files:
+ ctx(rule='cat ${SRC} > ${TGT}', source=js_files, target='pebble-js-
app.js')
- ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/
*.js'))
+ ctx.pbl_bundle(binaries=binaries, js='pebble-js-app.js' if js_files else
[])
A Word on Future
Proofing
Sometimes the SDK default wscript will be updated, but by
abstracting code out of wscript and into waf tools, it will be
much easier to maintain customizations!
Debugging
When your wscript changes go wrong
`pebble -v` (waf -v) for command-lines
[ 6/41] c: src/concentricity.c -> build/src/concentricity.c.16.o
21:27:05 runner ['arm-none-eabi-gcc', '-std=c99', '-mcpu=cortex-m3', '-
mthumb', '-ffunction-sections', '-fdata-sections', '-g', '-Os', '-D_TIME_H_',
'-Wall', '-Wextra', '-Werror', '-Wno-unused-parameter', '-Wno-error=unused-
function', '-Wno-error=unused-variable', '-fPIE', '-I/Users/cherie/pebble-
apps/pebble-dev/PebbleSDK-dev/Pebble/chalk/include', '-I/Users/cherie/pebble-
dev/PebbleSDK-dev/Pebble/chalk/include', '-I/Users/cherie/pebble-apps/
concentricity/build', '-I/Users/cherie/pebble-apps/concentricity', '-I/Users/
cherie/pebble-apps/concentricity/build/src', '-I/Users/cherie/pebble-apps/
concentricity/src', '-I/Users/cherie/pebble-apps/concentricity/build/chalk',
'-I/Users/cherie/pebble-apps/concentricity/chalk', '-DRELEASE', '-
DPBL_PLATFORM_CHALK', '-DPBL_COLOR', '-DPBL_ROUND', '-DPBL_SDK_3', '-
D__FILE_NAME__="concentricity.c"', '../src/concentricity.c', '-c', '-o',
'src/concentricity.c.16.o']
`pebble -vvv` (waf -vvv) for complete
21:51:50 preproc reading file '/Users/cherie/pebble-apps/
concentricity/build/chalk/src/resource_ids.auto.h'
21:51:50 deps deps for [/Users/cherie/pebble-apps/concentricity/
build/chalk/appinfo.auto.c]: [/Users/cherie/pebble-apps/
concentricity/build/chalk/src/resource_ids.auto.h]; unresolved
['pebble_process_info.h']
21:51:50 task task {task 4344651216: c appinfo.auto.c ->
appinfo.auto.c.16.o} must run as it was never run before or the
task code changed
21:51:50 runner_env kw={'shell': False, 'cwd': '/Users/cherie/
pebble-apps/concentricity/build', 'env': None}
21:51:50 envhash d751713988987e9331980363e24189ce []
Zone Description
runner command-lines executed (same as -v)
deps implicit dependencies found
task_gen task creation & task generator method execution
action functions to execute for building the targets
env environment contents
envhash hashes of the environment objects
build build context operations, like filesystem access
preproc preprocessor execution
group groups & task generators
$ pebble build -- --zones=deps
23:01:45 deps deps for [/Users/cherie/pebble-apps/concentricity/src/
concentricity.c]: [/Users/cherie/pebble-apps/concentricity/src/ui.h];
unresolved ['pebble.h']
Helpful waf Links
• Pebble Recipes
• https://developer.getpebble.com/build
• GitHub Project
• https://github.com/waf-project/waf
• Google Group
• https://groups.google.com/forum/#!forum/waf-users
• Book
• https://waf.io/book/
2015 Pebble Developer Retreat
Questions?
https://developer.getpebble.com/build
1 of 68

Recommended

#PDR15 - Pebble Graphics by
#PDR15 - Pebble Graphics#PDR15 - Pebble Graphics
#PDR15 - Pebble GraphicsPebble Technology
2.1K views61 slides
Introducing Pebble SDK 2.0 by
Introducing Pebble SDK 2.0Introducing Pebble SDK 2.0
Introducing Pebble SDK 2.0Cherie Williams
3.8K views62 slides
Overlay & Libraries | Pebble Meetup Oct. 2014 by
Overlay & Libraries | Pebble Meetup Oct. 2014Overlay & Libraries | Pebble Meetup Oct. 2014
Overlay & Libraries | Pebble Meetup Oct. 2014Pebble Technology
358 views14 slides
#PDR15 Creating Pebble Apps for Aplite, Basalt, and Chalk by
#PDR15 Creating Pebble Apps for Aplite, Basalt, and Chalk#PDR15 Creating Pebble Apps for Aplite, Basalt, and Chalk
#PDR15 Creating Pebble Apps for Aplite, Basalt, and ChalkPebble Technology
2.6K views69 slides
Overlay Technique | Pebble Developer Retreat 2014 by
Overlay Technique | Pebble Developer Retreat 2014Overlay Technique | Pebble Developer Retreat 2014
Overlay Technique | Pebble Developer Retreat 2014Pebble Technology
1.2K views21 slides
An Introduction to CMake by
An Introduction to CMakeAn Introduction to CMake
An Introduction to CMakeICS
1.5K views54 slides

More Related Content

What's hot

Going to Mars with Groovy Domain-Specific Languages by
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGuillaume Laforge
90.5K views162 slides
Gradle in a Polyglot World by
Gradle in a Polyglot WorldGradle in a Polyglot World
Gradle in a Polyglot WorldSchalk Cronjé
1.6K views52 slides
Developing IT infrastructures with Puppet by
Developing IT infrastructures with PuppetDeveloping IT infrastructures with Puppet
Developing IT infrastructures with PuppetAlessandro Franceschi
4.2K views30 slides
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015) by
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)ngotogenome
11.9K views42 slides
Golang Project Layout and Practice by
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and PracticeBo-Yi Wu
19.3K views94 slides
Scripting Embulk Plugins by
Scripting Embulk PluginsScripting Embulk Plugins
Scripting Embulk PluginsSadayuki Furuhashi
2.6K views14 slides

What's hot(20)

Going to Mars with Groovy Domain-Specific Languages by Guillaume Laforge
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
Guillaume Laforge90.5K views
Gradle in a Polyglot World by Schalk Cronjé
Gradle in a Polyglot WorldGradle in a Polyglot World
Gradle in a Polyglot World
Schalk Cronjé1.6K views
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015) by ngotogenome
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
ngotogenome11.9K views
Golang Project Layout and Practice by Bo-Yi Wu
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
Bo-Yi Wu19.3K views
carrow - Go bindings to Apache Arrow via C++-API by Yoni Davidson
carrow - Go bindings to Apache Arrow via C++-APIcarrow - Go bindings to Apache Arrow via C++-API
carrow - Go bindings to Apache Arrow via C++-API
Yoni Davidson452 views
Practical Testing of Ruby Core by Hiroshi SHIBATA
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby Core
Hiroshi SHIBATA16.6K views
Fluentd - road to v1 - by N Masahiro
Fluentd - road to v1 -Fluentd - road to v1 -
Fluentd - road to v1 -
N Masahiro17.7K views
Writing Ansible Modules (CLT'19) by Martin Schütte
Writing Ansible Modules (CLT'19)Writing Ansible Modules (CLT'19)
Writing Ansible Modules (CLT'19)
Martin Schütte1.3K views
Modules of the twenties by Puppet
Modules of the twentiesModules of the twenties
Modules of the twenties
Puppet848 views
Bolt C++ Standard Template Libary for HSA by Ben Sanders, AMD by HSA Foundation
Bolt C++ Standard Template Libary for HSA  by Ben Sanders, AMDBolt C++ Standard Template Libary for HSA  by Ben Sanders, AMD
Bolt C++ Standard Template Libary for HSA by Ben Sanders, AMD
HSA Foundation14.1K views
Build microservice with gRPC in golang by Ting-Li Chou
Build microservice with gRPC in golangBuild microservice with gRPC in golang
Build microservice with gRPC in golang
Ting-Li Chou630 views
MongoDB & Hadoop: Flexible Hourly Batch Processing Model by Takahiro Inoue
MongoDB & Hadoop: Flexible Hourly Batch Processing ModelMongoDB & Hadoop: Flexible Hourly Batch Processing Model
MongoDB & Hadoop: Flexible Hourly Batch Processing Model
Takahiro Inoue6.1K views
Experiments in Sharing Java VM Technology with CRuby by Matthew Gaudet
Experiments in Sharing Java VM Technology with CRubyExperiments in Sharing Java VM Technology with CRuby
Experiments in Sharing Java VM Technology with CRuby
Matthew Gaudet17.7K views

Similar to #PDR15 - waf, wscript and Your Pebble App

An introduction to maven gradle and sbt by
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbtFabio Fumarola
8.2K views45 slides
Road to sbt 1.0 paved with server by
Road to sbt 1.0   paved with serverRoad to sbt 1.0   paved with server
Road to sbt 1.0 paved with serverEugene Yokota
4.9K views53 slides
Gradle como alternativa a maven by
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a mavenDavid Gómez García
7.4K views79 slides
Cloud Foundry V2 | Intermediate Deep Dive by
Cloud Foundry V2 | Intermediate Deep DiveCloud Foundry V2 | Intermediate Deep Dive
Cloud Foundry V2 | Intermediate Deep DiveKazuto Kusama
3.7K views69 slides
Continuous Integration/Deployment with Docker and Jenkins by
Continuous Integration/Deployment with Docker and JenkinsContinuous Integration/Deployment with Docker and Jenkins
Continuous Integration/Deployment with Docker and JenkinsFrancesco Bruni
4.6K views33 slides
Road to sbt 1.0: Paved with server (2015 Amsterdam) by
Road to sbt 1.0: Paved with server (2015 Amsterdam)Road to sbt 1.0: Paved with server (2015 Amsterdam)
Road to sbt 1.0: Paved with server (2015 Amsterdam)Eugene Yokota
2.8K views54 slides

Similar to #PDR15 - waf, wscript and Your Pebble App(20)

An introduction to maven gradle and sbt by Fabio Fumarola
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
Fabio Fumarola8.2K views
Road to sbt 1.0 paved with server by Eugene Yokota
Road to sbt 1.0   paved with serverRoad to sbt 1.0   paved with server
Road to sbt 1.0 paved with server
Eugene Yokota4.9K views
Cloud Foundry V2 | Intermediate Deep Dive by Kazuto Kusama
Cloud Foundry V2 | Intermediate Deep DiveCloud Foundry V2 | Intermediate Deep Dive
Cloud Foundry V2 | Intermediate Deep Dive
Kazuto Kusama3.7K views
Continuous Integration/Deployment with Docker and Jenkins by Francesco Bruni
Continuous Integration/Deployment with Docker and JenkinsContinuous Integration/Deployment with Docker and Jenkins
Continuous Integration/Deployment with Docker and Jenkins
Francesco Bruni4.6K views
Road to sbt 1.0: Paved with server (2015 Amsterdam) by Eugene Yokota
Road to sbt 1.0: Paved with server (2015 Amsterdam)Road to sbt 1.0: Paved with server (2015 Amsterdam)
Road to sbt 1.0: Paved with server (2015 Amsterdam)
Eugene Yokota2.8K views
Testing NodeJS with Mocha, Should, Sinon, and JSCoverage by mlilley
Testing NodeJS with Mocha, Should, Sinon, and JSCoverageTesting NodeJS with Mocha, Should, Sinon, and JSCoverage
Testing NodeJS with Mocha, Should, Sinon, and JSCoverage
mlilley20.5K views
Dockercon EU 2014 by Rafe Colton
Dockercon EU 2014Dockercon EU 2014
Dockercon EU 2014
Rafe Colton1.1K views
SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe by Sencha
SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe
SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe
Sencha1.3K views
introduction to node.js by orkaplan
introduction to node.jsintroduction to node.js
introduction to node.js
orkaplan3.7K views
Scala, docker and testing, oh my! mario camou by J On The Beach
Scala, docker and testing, oh my! mario camouScala, docker and testing, oh my! mario camou
Scala, docker and testing, oh my! mario camou
J On The Beach2.8K views
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration by Erica Windisch
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, OrchestrationThe Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration
Erica Windisch2.3K views
Kolla talk at OpenStack Summit 2017 in Sydney by Vikram G Hosakote
Kolla talk at OpenStack Summit 2017 in SydneyKolla talk at OpenStack Summit 2017 in Sydney
Kolla talk at OpenStack Summit 2017 in Sydney
Vikram G Hosakote1.4K views
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl... by Docker, Inc.
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
Docker, Inc.10.2K views
OSCON 2011 - Node.js Tutorial by Tom Croucher
OSCON 2011 - Node.js TutorialOSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js Tutorial
Tom Croucher5.3K views
Programming in Linux Environment by Dongho Kang
Programming in Linux EnvironmentProgramming in Linux Environment
Programming in Linux Environment
Dongho Kang400 views
Setting Up a TIG Stack for Your Testing by Jet Liu
Setting Up a TIG Stack for Your TestingSetting Up a TIG Stack for Your Testing
Setting Up a TIG Stack for Your Testing
Jet Liu252 views
Cloud Foundry Summit Europe 2018 - Deveveloper Experience with Cloud Foundry ... by Neven Cvetković
Cloud Foundry Summit Europe 2018 - Deveveloper Experience with Cloud Foundry ...Cloud Foundry Summit Europe 2018 - Deveveloper Experience with Cloud Foundry ...
Cloud Foundry Summit Europe 2018 - Deveveloper Experience with Cloud Foundry ...
Neven Cvetković107 views
Build Your Own CaaS (Container as a Service) by HungWei Chiu
Build Your Own CaaS (Container as a Service)Build Your Own CaaS (Container as a Service)
Build Your Own CaaS (Container as a Service)
HungWei Chiu727 views

More from Pebble Technology

#PDR15 - Awesome Appstore Assets by
#PDR15 - Awesome Appstore Assets#PDR15 - Awesome Appstore Assets
#PDR15 - Awesome Appstore AssetsPebble Technology
2.7K views13 slides
#PDR15 - Smartstrap Workshop by
#PDR15 - Smartstrap Workshop#PDR15 - Smartstrap Workshop
#PDR15 - Smartstrap WorkshopPebble Technology
1.9K views37 slides
#PDR15 - Data Analytics and Pebble by
#PDR15 - Data Analytics and Pebble#PDR15 - Data Analytics and Pebble
#PDR15 - Data Analytics and PebblePebble Technology
1.5K views30 slides
#PDR15 - Best Use Cases For Timeline by
#PDR15 - Best Use Cases For Timeline#PDR15 - Best Use Cases For Timeline
#PDR15 - Best Use Cases For TimelinePebble Technology
2K views31 slides
#PDR15 - PebbleKit iOS 3.0 by
#PDR15 - PebbleKit iOS 3.0#PDR15 - PebbleKit iOS 3.0
#PDR15 - PebbleKit iOS 3.0Pebble Technology
1.8K views36 slides
#PDR15 - Voice API by
#PDR15 - Voice API#PDR15 - Voice API
#PDR15 - Voice APIPebble Technology
2K views29 slides

More from Pebble Technology(18)

Guest Presentation - Strap | Pebble Developer Retreat 2014 by Pebble Technology
Guest Presentation - Strap | Pebble Developer Retreat 2014Guest Presentation - Strap | Pebble Developer Retreat 2014
Guest Presentation - Strap | Pebble Developer Retreat 2014
Pebble Technology893 views
Battery Life | Pebble Developer Retreat 2014 by Pebble Technology
Battery Life | Pebble Developer Retreat 2014Battery Life | Pebble Developer Retreat 2014
Battery Life | Pebble Developer Retreat 2014
Pebble Technology2.5K views
Thomas Sarlandie Kickoff Talk | Pebble Developer Retreat 2014 by Pebble Technology
Thomas Sarlandie Kickoff Talk | Pebble Developer Retreat 2014Thomas Sarlandie Kickoff Talk | Pebble Developer Retreat 2014
Thomas Sarlandie Kickoff Talk | Pebble Developer Retreat 2014
Pebble Technology921 views
Advanced Techniques: Size | Pebble Developer Retreat 2014 by Pebble Technology
Advanced Techniques: Size | Pebble Developer Retreat 2014Advanced Techniques: Size | Pebble Developer Retreat 2014
Advanced Techniques: Size | Pebble Developer Retreat 2014
Pebble Technology2.5K views
Advanced Techniques: Graphics | Pebble Developer Retreat 2014 by Pebble Technology
Advanced Techniques: Graphics | Pebble Developer Retreat 2014Advanced Techniques: Graphics | Pebble Developer Retreat 2014
Advanced Techniques: Graphics | Pebble Developer Retreat 2014
Pebble Technology2.5K views

Recently uploaded

State of the Union - Rohit Yadav - Apache CloudStack by
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStackShapeBlue
145 views53 slides
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueShapeBlue
96 views7 slides
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc
77 views29 slides
Data Integrity for Banking and Financial Services by
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial ServicesPrecisely
56 views26 slides
Network Source of Truth and Infrastructure as Code revisited by
Network Source of Truth and Infrastructure as Code revisitedNetwork Source of Truth and Infrastructure as Code revisited
Network Source of Truth and Infrastructure as Code revisitedNetwork Automation Forum
42 views45 slides
20231123_Camunda Meetup Vienna.pdf by
20231123_Camunda Meetup Vienna.pdf20231123_Camunda Meetup Vienna.pdf
20231123_Camunda Meetup Vienna.pdfPhactum Softwareentwicklung GmbH
46 views73 slides

Recently uploaded(20)

State of the Union - Rohit Yadav - Apache CloudStack by ShapeBlue
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStack
ShapeBlue145 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue96 views
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc77 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely56 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue54 views
DRBD Deep Dive - Philipp Reisner - LINBIT by ShapeBlue
DRBD Deep Dive - Philipp Reisner - LINBITDRBD Deep Dive - Philipp Reisner - LINBIT
DRBD Deep Dive - Philipp Reisner - LINBIT
ShapeBlue62 views
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue57 views
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院 by IttrainingIttraining
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
【USB韌體設計課程】精選講義節錄-USB的列舉過程_艾鍗學院
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ... by Jasper Oosterveld
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
ShapeBlue85 views
Five Things You SHOULD Know About Postman by Postman
Five Things You SHOULD Know About PostmanFive Things You SHOULD Know About Postman
Five Things You SHOULD Know About Postman
Postman40 views
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ... by ShapeBlue
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
ShapeBlue65 views
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online by ShapeBlue
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineKVM Security Groups Under the Hood - Wido den Hollander - Your.Online
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online
ShapeBlue102 views
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue74 views
Business Analyst Series 2023 - Week 4 Session 7 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 7Business Analyst Series 2023 -  Week 4 Session 7
Business Analyst Series 2023 - Week 4 Session 7
DianaGray1080 views

#PDR15 - waf, wscript and Your Pebble App

  • 1. 2015 Pebble Developer Retreat waf, wscript & Your Pebble App Cherie Williams - Troublemaker
  • 2. Agenda • Why modify my wscript? • Pebble SDK & Fat PBW • What is this “waf” thing? • Why is Pebble using waf? • wscript • Why do I care about waf? • wscript Recipes • Debugging
  • 3. Why modify my wscript? Making the Pebble SDK build system work for you
  • 4. You can… • Add C compiler flags • Add custom defines for your apps (eg. #ifdef NOLOG) • Concatenate multiple JS files or do other file manipulations at build time
  • 5. You can… • Collect & build source from a non-standard project • Add a linter (or two!) • Run arbitrary scripts at build time to modify resources or other files
  • 6. You can… • Add automatic testing • Profile builds or add build visualizations • Read in arbitrary text at build (eg. appinfo.json)
  • 7. You can… • Include an external library • Build libraries for distribution …the possibilities are endless!
  • 8. Fine Print Recipes + content from today’s talk are *not* compatible with CloudPebble
  • 9. Pebble SDK & Fat PBW
  • 10. SDK: Capabilities Today • Builds for up to 3 Pebble platforms • Can build apps, as well as workers • Handles platform-specific resources • Packages a single PBW for distribution aplite Pebble Classic Pebble Steel basalt Pebble Time Pebble Time Steel chalk Pebble Time Round
  • 12. What is this “waf” thing? A brief introduction to the Pebble build system
  • 13. Introducing waf, a Python build system • Open source, actively maintained • Active community on Google Groups • Task parallelization & dependency handling • Language agnostic, but includes C compiler support • Integrates with Eclipse, Visual Studio and Xcode • Includes framework to build & distribute custom build systems
  • 14. Why is Pebble using waf?
  • 16. Why Pebble uses waf • Efficiently handles dependencies for large, complex projects (such as Pebble firmware) • Python!! • Easy method overriding • Can package & distribute additional scripts in the SDK • Convenience modules for Logs, Node and methods for easy file substitutions
  • 18. Basic wscript (non-Pebble) def configure(ctx): print "Configure" def build(ctx): print "Build"
  • 19. Basic wscript $ waf configure build Setting top to : /Users/cherie/waf-demo/ default Setting out to : /Users/cherie/waf-demo/ default/build Configure 'configure' finished successfully (0.009s) Waf: Entering directory '/Users/cherie/waf-demo/default/build' Build Waf: Leaving directory '/Users/cherie/waf-demo/default/build' 'build' finished successfully (0.009s)
  • 20. Invoking waf via the pebble-tool pebble clean waf distclean pebble build waf configure build (-v) pebble build (-- --other-flags) waf configure build (--other-flags)
  • 21. Standard Pebble wscript def options(ctx): ctx.load('pebble_sdk') def configure(ctx): ctx.load('pebble_sdk') def build(ctx): ctx.load('pebble_sdk') build_worker = os.path.exists('worker_src') binaries = [] for p in ctx.env.TARGET_PLATFORMS: ctx.set_env(ctx.all_envs[p]) ctx.set_group(ctx.env.PLATFORM_NAME) app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR) ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'), target=app_elf) if build_worker: worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR) binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf}) ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'), target=worker_elf) else: binaries.append({'platform': p, 'app_elf': app_elf}) ctx.set_group('bundle') ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js')) Read in command line options Configure environment for build Run build For each HW platform: • Create app binary • Create worker binary (optional) Bundle into PBW
  • 24. Why do I care about waf? Understanding how your Pebble project is built
  • 26. Basic wscript (non-Pebble) def configure(ctx): print "Configure" def build(ctx): print "Build"
  • 27. Glossary Context An object for each command executed that stores all the information necessary for the command execution BuildContext The build context holds all the information necessary for a build
  • 28. Basic wscript (non-Pebble) def configure(ctx): print "Configure" def build(ctx): print "Build"
  • 29. Modified Basic wscript def configure(ctx): ctx.env.MESSAGE = "Hello World" def build(ctx): pass
  • 30. Glossary Environment A group of settings and variables that are stored in a Context and that is cached between execution of commands NOTE: A single Context can have many, arbitrary environments
  • 31. build/c4che/*.py AR = 'arm-none-eabi-gcc-ar' ARFLAGS = 'rcs' AS = 'arm-none-eabi-gcc' BINDIR = '/usr/local/bin' BUILD_DIR = 'basalt' CC = ['arm-none-eabi-gcc'] CCLNK_SRC_F = [] CCLNK_TGT_F = ['-o'] CC_NAME = 'gcc' CC_SRC_F = [] CC_TGT_F = ['-c', '-o'] CC_VERSION = ('4', '8', '4') CFLAGS = ['-std=c99', '-mcpu=cortex-m3', '-mthumb', '-ffunction-sections', '- fdata-sections', '-g', '-Os', '-D_TIME_H_', '-Wall', '-Wextra', '-Werror', '-Wno- unused-parameter', '-Wno-error=unused-function', '-Wno-error=unused-variable'] CFLAGS_MACBUNDLE = ['-fPIC'] CFLAGS_cshlib = ['-fPIC'] CPPPATH_ST = '-I%s' DEFINES = ['RELEASE', 'PBL_PLATFORM_BASALT', 'PBL_COLOR', 'PBL_RECT', 'PBL_SDK_3'] DEFINES_ST = '-D%s' DEST_BINFMT = 'elf' DEST_CPU = 'arm' DEST_OS = 'darwin' INCLUDES = ['basalt'] LD = 'arm-none-eabi-ld' LIBDIR = '/usr/local/lib' LIBPATH_ST = '-L%s' LIB_ST = ‘-l%s' LINKFLAGS = ['-mcpu=cortex-m3', '-mthumb', '-Wl,--gc-sections', '-Wl,--warn- common', '-Os'] LINKFLAGS_MACBUNDLE = ['-bundle', '-undefined', 'dynamic_lookup'] LINKFLAGS_cshlib = ['-shared'] LINKFLAGS_cstlib = ['-Wl,-Bstatic'] LINK_CC = ['arm-none-eabi-gcc'] MESSAGE = ‘Hello World' PBW_BIN_DIR = 'basalt' PEBBLE_SDK = '/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/basalt' PEBBLE_SDK_COMMON = '/Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/common' PLATFORM = {'PBW_BIN_DIR': 'basalt', 'TAGS': ['basalt', 'color', 'rect'], 'ADDITIONAL_TEXT_LINES_FOR_PEBBLE_H': [], 'MAX_APP_BINARY_SIZE': 65536, 'MAX_RESOURCES_SIZE': 1048576, 'MAX_APP_MEMORY_SIZE': 65536, 'MAX_WORKER_MEMORY_SIZE': 10240, 'NAME': 'basalt', 'BUILD_DIR': 'basalt', 'MAX_RESOURCES_SIZE_APPSTORE': 262144, 'DEFINES': ['PBL_PLATFORM_BASALT', 'PBL_COLOR', 'PBL_RECT']} PLATFORM_NAME = 'basalt' PREFIX = '/usr/local' RPATH_ST = '-Wl,-rpath,%s' SDK_VERSION_MAJOR = 5 SDK_VERSION_MINOR = 70 SHLIB_MARKER = None SIZE = 'arm-none-eabi-size' SONAME_ST = '-Wl,-h,%s' STLIBPATH_ST = '-L%s' STLIB_MARKER = None STLIB_ST = '-l%s' TARGET_PLATFORMS = [u'basalt', u'aplite'] cprogram_PATTERN = '%s' cshlib_PATTERN = 'lib%s.so' cstlib_PATTERN = 'lib%s.a' macbundle_PATTERN = '%s.bundle'
  • 32. Modified Basic wscript def configure(ctx): ctx.env.MESSAGE = "Hello World" def build(ctx): ctx(rule="echo ${MESSAGE}", source='', target='')
  • 33. Glossary Task Generator An object that handles the creation of task instances, and helps simplify the creation of ordering constraints Task An object that represents the production of something during the build (files, in general) and may be executed in sequence or in parallel
  • 34. ${MESSAGE} is shorthand for ctx.env.MESSAGE
  • 35. Modified Basic wscript $ ../Pebble/waf configure build Setting top to : /Users/cherie/waf-demo/ default Setting out to : /Users/cherie/waf-demo/ default/build 'configure' finished successfully (0.002s) Waf: Entering directory '/Users/cherie/waf-demo/default/build' [1/1] echo ${MESSAGE}: Hello World Waf: Leaving directory '/Users/cherie/waf-demo/default/build' 'build' finished successfully (0.030s)
  • 36. Modified Basic wscript w/Dependency def build(ctx): ctx(rule="echo 'hello' > ${TGT}", source='', target='message.txt') ctx(rule="cp ${SRC} ${TGT}", source='message.txt', target='copy.txt')
  • 37. Glossary Build Order The sequence in which tasks must be executed. Dependency A dependency represents the conditions by which a task can be considered up-to-date or not, and can be explicit (dependency on file inputs & outputs) or abstract (dependency on a value). waf uses dependencies to determine whether tasks need to be run (changed checksum of source files) and the build order of tasks.
  • 38. ${SRC} and ${TGT} are shorthand for source and target
  • 39. Pebble Project Build Let’s see how dependencies work
  • 41. Glossary Node A data structure used to represent the filesystem. Nodes may represent files or folders. File nodes are associated with signatures, which can be hashes of the file contents (source files) or task signatures (build files)
  • 43. Glossary Command A function defined in the wscript file that is executed when its name is given on the command-line, and can be chained with other commands Ex: waf distclean (`pebble clean`) waf configure build (`pebble build`)
  • 45. Agenda • Why modify my wscript? • Pebble SDK & Fat PBW • What is this “waf” thing? • Why is Pebble using waf? • wscript • Why do I care about waf? • wscript Recipes • Debugging
  • 47. Recipe #1 Add compile time flags
  • 48. Create waftools/pedantic.py def configure(ctx): ctx.env.append_value('CFLAGS', '-pedantic') def configure(ctx): ctx.load('pebble_sdk') + ctx.load('pedantic', tooldir='waftools') Add to wscript
  • 49. [23/35] c: src/default.c -> build/src/default.c.18.o In file included from ../src/default.c:1:0: /Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/aplite/include/pebble.h: 974:33: error: ISO C does not permit named variadic macros [- Werror=variadic-macros] #define APP_LOG(level, fmt, args...) ^ /Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/aplite/include/pebble.h: 1121:3: error: type of bit-field 'type' is a GCC extension [- Werror=pedantic] TupleType type:8; ^ /Users/cherie/pebble-dev/PebbleSDK-dev/Pebble/aplite/include/pebble.h: 1132:13: error: ISO C forbids zero-size array 'data' [-Werror=pedantic] uint8_t data[0]; ^
  • 50. Recipe #2 Add build options & associated defines
  • 51. Create waftools/defines.py def options(ctx): ctx.add_option('--no-log', action='store_true', default=False, help="Mark a build to exclude app logging output") def configure(ctx): if ctx.options.no_log: ctx.env.append_value('DEFINES', 'NOLOG') Add to wscript for options & configure ctx.load('defines', tooldir='waftools')
  • 52. Add to main project.c file #include <pebble.h> #if defined(NOLOG) #undef APP_LOG #define APP_LOG(...) #endif
  • 53. Before $ pebble install --emulator aplite --logs Installing app... App install succeeded. [22:45:45] default.c:60> Done initializing, pushed window: 0x2001a5fc [22:45:50] javascript> Ready! $ pebble build -- --no-logs … $ pebble install --emulator aplite --logs Installing app... App install succeeded. [22:49:34] javascript> Ready! After
  • 54. Recipe #3 Add a linter
  • 55. Create waftools/linter.py def options(ctx): ctx.add_option('--jshint', action='store_true', help="Run JSHint on the JS files in the build") def configure(ctx): if ctx.options.jshint: try: ctx.find_program('jshint', var='JSHINT') except ctx.errors.ConfigurationError: print "jshint was not found" def build(ctx): if ctx.env.JSHINT: ctx(rule='${JSHINT} ${SRC}', source=ctx.path.ant_glob('src/**/*.js'))
  • 56. Add to wscript def options(ctx): ctx.load('pebble_sdk') + ctx.load('linter', tooldir='waftools') def configure(ctx): ctx.load(‘pebble_sdk') + ctx.load('linter', tooldir='waftools') def build(ctx): ctx.load('pebble_sdk') + ctx.load('linter', tooldir='waftools')
  • 57. $ pebble build -- --jshint [25/36] jshint ${SRC}: src/js/another.js src/js/pebble-js- app.js ../src/js/pebble-js-app.js: line 2, col 24, Missing semicolon. 1 error Waf: Leaving directory `/Users/cherie/pebble-apps/default/ build' Build failed -> task in '' failed (exit status 2): {task 4343355600: jshint ${SRC} another.js,pebble-js- app.js -> } ' jshint ../src/js/another.js ../src/js/pebble-js-app.js '
  • 58. Recipe #4 Use source code from multiple folders (2.x + 3.x)
  • 59. Modify wscript def build(ctx): for p in ctx.env.TARGET_PLATFORMS: - ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'), target=app_elf) + ctx.pbl_program(source=ctx.path.ant_glob('src/{}/**/*.c'.format(p)), target=app_elf) if build_worker: - ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'), target=worker_elf) + ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/{}/' '**/*.c'.format(p)), target=worker_elf)
  • 61. Modify wscript def build(ctx): ctx.set_group('bundle') + js_files = ctx.path.ant_glob('src/**/*.js') + if js_files: + ctx(rule='cat ${SRC} > ${TGT}', source=js_files, target='pebble-js- app.js') - ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/ *.js')) + ctx.pbl_bundle(binaries=binaries, js='pebble-js-app.js' if js_files else [])
  • 62. A Word on Future Proofing Sometimes the SDK default wscript will be updated, but by abstracting code out of wscript and into waf tools, it will be much easier to maintain customizations!
  • 63. Debugging When your wscript changes go wrong
  • 64. `pebble -v` (waf -v) for command-lines [ 6/41] c: src/concentricity.c -> build/src/concentricity.c.16.o 21:27:05 runner ['arm-none-eabi-gcc', '-std=c99', '-mcpu=cortex-m3', '- mthumb', '-ffunction-sections', '-fdata-sections', '-g', '-Os', '-D_TIME_H_', '-Wall', '-Wextra', '-Werror', '-Wno-unused-parameter', '-Wno-error=unused- function', '-Wno-error=unused-variable', '-fPIE', '-I/Users/cherie/pebble- apps/pebble-dev/PebbleSDK-dev/Pebble/chalk/include', '-I/Users/cherie/pebble- dev/PebbleSDK-dev/Pebble/chalk/include', '-I/Users/cherie/pebble-apps/ concentricity/build', '-I/Users/cherie/pebble-apps/concentricity', '-I/Users/ cherie/pebble-apps/concentricity/build/src', '-I/Users/cherie/pebble-apps/ concentricity/src', '-I/Users/cherie/pebble-apps/concentricity/build/chalk', '-I/Users/cherie/pebble-apps/concentricity/chalk', '-DRELEASE', '- DPBL_PLATFORM_CHALK', '-DPBL_COLOR', '-DPBL_ROUND', '-DPBL_SDK_3', '- D__FILE_NAME__="concentricity.c"', '../src/concentricity.c', '-c', '-o', 'src/concentricity.c.16.o']
  • 65. `pebble -vvv` (waf -vvv) for complete 21:51:50 preproc reading file '/Users/cherie/pebble-apps/ concentricity/build/chalk/src/resource_ids.auto.h' 21:51:50 deps deps for [/Users/cherie/pebble-apps/concentricity/ build/chalk/appinfo.auto.c]: [/Users/cherie/pebble-apps/ concentricity/build/chalk/src/resource_ids.auto.h]; unresolved ['pebble_process_info.h'] 21:51:50 task task {task 4344651216: c appinfo.auto.c -> appinfo.auto.c.16.o} must run as it was never run before or the task code changed 21:51:50 runner_env kw={'shell': False, 'cwd': '/Users/cherie/ pebble-apps/concentricity/build', 'env': None} 21:51:50 envhash d751713988987e9331980363e24189ce []
  • 66. Zone Description runner command-lines executed (same as -v) deps implicit dependencies found task_gen task creation & task generator method execution action functions to execute for building the targets env environment contents envhash hashes of the environment objects build build context operations, like filesystem access preproc preprocessor execution group groups & task generators $ pebble build -- --zones=deps 23:01:45 deps deps for [/Users/cherie/pebble-apps/concentricity/src/ concentricity.c]: [/Users/cherie/pebble-apps/concentricity/src/ui.h]; unresolved ['pebble.h']
  • 67. Helpful waf Links • Pebble Recipes • https://developer.getpebble.com/build • GitHub Project • https://github.com/waf-project/waf • Google Group • https://groups.google.com/forum/#!forum/waf-users • Book • https://waf.io/book/
  • 68. 2015 Pebble Developer Retreat Questions? https://developer.getpebble.com/build