factor/extra/tools/deploy/shaker/shaker.factor

189 lines
4.9 KiB
Factor
Raw Normal View History

2007-10-06 13:37:47 -04:00
! Copyright (C) 2007 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: namespaces continuations.private kernel.private init
assocs kernel vocabs words sequences memory io system arrays
continuations math definitions mirrors splitting parser classes
inspector layouts vocabs.loader prettyprint.config prettyprint
debugger io.streams.c io.streams.duplex io.files io.backend
quotations words.private tools.deploy.config ;
2007-10-06 13:37:47 -04:00
IN: tools.deploy.shaker
: show ( msg -- )
#! Use primitives directly so that we can print stuff even
#! after most of the image has been stripped away
"\r\n" append stdout fwrite stdout fflush ;
: strip-init-hooks ( -- )
"Stripping startup hooks" show
2007-10-09 02:07:59 -04:00
"command-line" init-hooks get delete-at
2007-11-04 21:24:08 -05:00
"mallocs" init-hooks get delete-at
2007-10-31 01:09:24 -04:00
strip-io? [ "io.backend" init-hooks get delete-at ] when ;
2007-10-06 13:37:47 -04:00
: strip-debugger ( -- )
2007-10-31 01:09:24 -04:00
strip-debugger? [
2007-10-06 13:37:47 -04:00
"Stripping debugger" show
2007-10-09 02:07:59 -04:00
"resource:extra/tools/deploy/shaker/strip-debugger.factor"
2007-10-06 13:37:47 -04:00
run-file
] when ;
: strip-libc ( -- )
"libc" vocab [
"Stripping manual memory management debug code" show
"resource:extra/tools/deploy/shaker/strip-libc.factor"
run-file
2007-10-06 13:37:47 -04:00
] when ;
: strip-cocoa ( -- )
"cocoa" vocab [
"Stripping unused Cocoa methods" show
2007-10-09 02:07:59 -04:00
"resource:extra/tools/deploy/shaker/strip-cocoa.factor"
2007-10-06 13:37:47 -04:00
run-file
] when ;
: strip-assoc ( retained-keys assoc -- newassoc )
swap [ nip member? ] curry assoc-subset ;
: strip-word-names ( words -- )
"Stripping word names" show
[ f over set-word-name f swap set-word-vocabulary ] each ;
: strip-word-defs ( words -- )
2008-01-07 16:14:21 -05:00
"Stripping symbolic word definitions" show
[ [ ] swap set-word-def ] each ;
2007-10-06 13:37:47 -04:00
: strip-word-props ( retain-props words -- )
"Stripping word properties" show
[
[ word-props strip-assoc f assoc-like ] keep
set-word-props
] curry* each ;
: retained-props ( -- seq )
[
"class" ,
"metaclass" ,
"slot-names" ,
deploy-ui? get [
"gestures" ,
"commands" ,
{ "+nullary+" "+listener+" "+description+" }
[ "ui.commands" lookup , ] each
] when
] { } make ;
: strip-words ( props -- )
[ word? ] instances
deploy-word-props? get [ 2dup strip-word-props ] unless
deploy-word-defs? get [ dup strip-word-defs ] unless
2007-10-31 01:09:24 -04:00
strip-word-names? [ dup strip-word-names ] when
2drop ;
2007-10-06 13:37:47 -04:00
: strip-environment ( retain-globals -- )
2007-10-31 01:09:24 -04:00
strip-globals? [
"Stripping environment" show
2007-10-06 13:37:47 -04:00
global strip-assoc 21 setenv
] [ drop ] if ;
: finish-deploy ( final-image -- )
"Finishing up" show
>r { } set-datastack r>
{ } set-retainstack
V{ } set-namestack
V{ } set-catchstack
"Saving final image" show
[ save-image-and-exit ] call-clear ;
SYMBOL: deploy-vocab
: set-boot-quot* ( word -- )
[
\ boot ,
init-hooks get values concat %
,
2007-10-31 01:09:24 -04:00
strip-io? [ \ flush , ] unless
2007-10-06 13:37:47 -04:00
] [ ] make "Boot quotation: " write dup . flush
set-boot-quot ;
: retained-globals ( -- seq )
[
builtins ,
2007-10-31 01:09:24 -04:00
strip-io? [ io-backend , ] unless
2007-10-06 13:37:47 -04:00
2007-10-31 01:09:24 -04:00
strip-dictionary? [
2007-10-06 13:37:47 -04:00
{
dictionary
inspector-hook
lexer-factory
load-vocab-hook
num-tags
num-types
tag-bits
tag-mask
tag-numbers
typemap
vocab-roots
} %
] unless
2007-10-31 01:09:24 -04:00
strip-prettyprint? [
2007-10-06 13:37:47 -04:00
{
tab-size
margin
} %
] unless
deploy-c-types? get [
2007-10-06 13:37:47 -04:00
"c-types" "alien.c-types" lookup ,
] when
2007-11-21 03:19:06 -05:00
native-io? [
"default-buffer-size" "io.nonblocking" lookup ,
] when
2007-10-06 13:37:47 -04:00
deploy-ui? get [
"ui" child-vocabs
"cocoa" child-vocabs
deploy-vocab get child-vocabs 3append
global keys [ word? ] subset
swap [ >r word-vocabulary r> member? ] curry
subset %
] when
] { } make dup . ;
2008-01-07 16:14:21 -05:00
: strip-recompile-hook ( -- )
[ [ f ] { } map>assoc ] recompile-hook set-global ;
: strip ( -- )
strip-libc
2007-10-06 13:37:47 -04:00
strip-cocoa
strip-debugger
2008-01-07 16:14:21 -05:00
strip-recompile-hook
2007-10-06 13:37:47 -04:00
strip-init-hooks
deploy-vocab get vocab-main set-boot-quot*
retained-props >r
retained-globals strip-environment
r> strip-words ;
: (deploy) ( final-image vocab config -- )
#! Does the actual work of a deployment in the slave
#! stage2 image
[
[
deploy-vocab set
deploy-vocab get require
strip
finish-deploy
] [
print-error flush 1 exit
] recover
] bind ;
: do-deploy ( -- )
"output-image" get
"deploy-vocab" get
"Deploying " write dup write "..." print
dup deploy-config dup .
(deploy) ;
MAIN: do-deploy