factor/basis/tools/deploy/shaker/shaker.factor

411 lines
11 KiB
Factor
Raw Normal View History

! Copyright (C) 2007, 2008 Slava Pestov.
2007-10-06 13:37:47 -04:00
! See http://factorcode.org/license.txt for BSD license.
2008-10-02 04:38:36 -04:00
USING: accessors qualified io.backend io.streams.c init fry
namespaces make assocs kernel parser lexer strings.parser
tools.deploy.config vocabs sequences words words.private memory
kernel.private continuations io prettyprint vocabs.loader
debugger system strings sets vectors quotations byte-arrays
sorting compiler.units definitions generic generic.standard ;
QUALIFIED: bootstrap.stage2
QUALIFIED: classes
2008-04-04 11:11:31 -04:00
QUALIFIED: command-line
2008-11-16 14:46:30 -05:00
QUALIFIED: compiler.errors
QUALIFIED: continuations
QUALIFIED: definitions
QUALIFIED: init
QUALIFIED: layouts
QUALIFIED: prettyprint.config
QUALIFIED: source-files
QUALIFIED: vocabs
2007-10-06 13:37:47 -04:00
IN: tools.deploy.shaker
2008-07-02 16:57:38 -04:00
! This file is some hairy shit.
2007-10-06 13:37:47 -04:00
: strip-init-hooks ( -- )
"Stripping startup hooks" show
2008-07-02 16:57:38 -04:00
"cpu.x86" init-hooks get delete-at
2007-10-09 02:07:59 -04:00
"command-line" init-hooks get delete-at
"libc" init-hooks get delete-at
"system" init-hooks get delete-at
deploy-threads? get [
"threads" init-hooks get delete-at
] unless
native-io? [
"io.thread" init-hooks get delete-at
] unless
strip-io? [
"io.files" init-hooks get delete-at
"io.backend" init-hooks get delete-at
] when
strip-dictionary? [
"compiler.units" init-hooks get delete-at
2008-08-05 05:38:01 -04:00
"tools.vocabs" 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
2008-07-28 23:03:13 -04:00
"resource:basis/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
2008-07-28 23:03:13 -04:00
"resource:basis/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
2008-07-28 23:03:13 -04:00
"resource:basis/tools/deploy/shaker/strip-cocoa.factor"
2007-10-06 13:37:47 -04:00
run-file
] when ;
: strip-word-names ( words -- )
"Stripping word names" show
2008-06-30 17:06:14 -04:00
[ f >>name f >>vocabulary drop ] each ;
2007-10-06 13:37:47 -04:00
: strip-word-defs ( words -- )
2008-01-07 16:14:21 -05:00
"Stripping symbolic word definitions" show
2008-06-19 00:29:56 -04:00
[ "no-def-strip" word-prop not ] filter
2008-06-30 17:06:14 -04:00
[ [ ] >>def drop ] each ;
2007-10-06 13:37:47 -04:00
2008-07-02 16:57:38 -04:00
: sift-assoc ( assoc -- assoc' ) [ nip ] assoc-filter ;
2008-06-25 21:47:07 -04:00
: strip-word-props ( stripped-props words -- )
2007-10-06 13:37:47 -04:00
"Stripping word properties" show
[
swap '[
[
[ drop _ member? not ] assoc-filter sift-assoc
>alist f like
] change-props drop
] each
] [
2008-10-02 07:41:17 -04:00
"Remaining word properties:\n" show
[ props>> keys ] gather unparse show
2008-08-05 05:38:01 -04:00
] [
H{ } clone '[
[ [ _ [ ] cache ] map ] change-props drop
] each
] tri ;
2007-10-06 13:37:47 -04:00
2008-06-25 21:47:07 -04:00
: stripped-word-props ( -- seq )
2007-10-06 13:37:47 -04:00
[
2008-06-25 21:47:07 -04:00
strip-dictionary? [
{
2008-08-05 05:38:01 -04:00
"alias"
"boa-check"
2008-08-31 20:17:04 -04:00
"cannot-infer"
2008-06-25 21:47:07 -04:00
"coercer"
"combination"
2008-06-25 21:47:07 -04:00
"compiled-effect"
2008-08-31 20:17:04 -04:00
"compiled-generic-uses"
2008-06-25 21:47:07 -04:00
"compiled-uses"
"constraints"
"custom-inlining"
2008-06-25 21:47:07 -04:00
"declared-effect"
2008-07-05 04:07:10 -04:00
"default"
"default-method"
2008-06-25 21:47:07 -04:00
"default-output-classes"
2008-07-05 04:07:10 -04:00
"derived-from"
2008-08-31 20:17:04 -04:00
"engines"
"forgotten"
"identities"
2008-06-25 21:47:07 -04:00
"if-intrinsics"
"infer"
"inferred-effect"
2008-08-31 20:17:04 -04:00
"inline"
"inlined-block"
2008-07-12 02:08:30 -04:00
"input-classes"
2008-06-25 21:47:07 -04:00
"interval"
"intrinsics"
2008-08-31 20:17:04 -04:00
"lambda"
2008-06-25 21:47:07 -04:00
"loc"
2008-08-31 20:17:04 -04:00
"local-reader"
"local-reader?"
"local-writer"
"local-writer?"
"local?"
"macro"
"members"
2008-08-31 20:17:04 -04:00
"memo-quot"
"methods"
"mixin"
2008-07-05 04:07:10 -04:00
"method-class"
"method-generic"
"modular-arithmetic"
2008-07-05 04:07:10 -04:00
"no-compile"
2008-06-25 21:47:07 -04:00
"optimizer-hooks"
2008-08-31 20:17:04 -04:00
"outputs"
2008-06-25 21:47:07 -04:00
"participants"
"predicate"
"predicate-definition"
"predicating"
"primitive"
2008-08-31 20:17:04 -04:00
"reader"
"reading"
"recursive"
2008-08-05 05:38:01 -04:00
"register"
"register-size"
2008-08-31 20:17:04 -04:00
"shuffle"
2008-06-25 21:47:07 -04:00
"slot-names"
2008-08-31 20:17:04 -04:00
"slots"
"special"
2008-06-25 21:47:07 -04:00
"specializer"
"step-into"
"step-into?"
2008-08-31 20:17:04 -04:00
"transform-n"
"transform-quot"
"tuple-dispatch-generic"
2008-06-25 21:47:07 -04:00
"type"
2008-08-31 20:17:04 -04:00
"writer"
"writing"
2008-06-25 21:47:07 -04:00
} %
] when
strip-prettyprint? [
{
2008-07-05 04:07:10 -04:00
"break-before"
"break-after"
2008-06-25 21:47:07 -04:00
"delimiter"
"flushable"
"foldable"
"inline"
"lambda"
"macro"
"memo-quot"
"parsing"
"word-style"
} %
2007-10-06 13:37:47 -04:00
] 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-vocab-globals ( except names -- words )
[ child-vocabs [ words ] map concat ] map concat swap diff ;
: stripped-globals ( -- seq )
[
2008-07-02 01:20:01 -04:00
"inspector-hook" "inspector" lookup ,
{
continuations:error
continuations:error-continuation
continuations:error-thread
continuations:restarts
init:init-hooks
source-files:source-files
input-stream
output-stream
error-stream
} %
"io-thread" "io.thread" lookup ,
2008-07-30 11:23:33 -04:00
"mallocs" "libc.private" lookup ,
deploy-threads? [
"initial-thread" "threads" lookup ,
] unless
2008-10-02 04:38:36 -04:00
strip-io? [ io-backend , ] when
2008-06-25 21:47:07 -04:00
{ } {
"alarms"
"tools"
"io.launcher"
2008-08-05 05:38:01 -04:00
"random"
"compiler"
"stack-checker"
"bootstrap"
"listener"
2008-06-25 21:47:07 -04:00
} strip-vocab-globals %
strip-dictionary? [
2008-08-05 05:38:01 -04:00
"libraries" "alien" lookup ,
{ } { "cpu" } strip-vocab-globals %
{
2008-04-04 11:11:31 -04:00
gensym
name>char-hook
classes:next-method-quot-cache
2008-03-24 21:15:42 -04:00
classes:class-and-cache
classes:class-not-cache
classes:class-or-cache
2008-05-02 03:51:38 -04:00
classes:class<=-cache
2008-03-24 21:15:42 -04:00
classes:classes-intersect-cache
classes:implementors-map
2008-03-24 21:15:42 -04:00
classes:update-map
2008-04-04 11:11:31 -04:00
command-line:main-vocab-hook
2008-03-24 21:15:42 -04:00
compiled-crossref
2008-08-31 20:17:04 -04:00
compiled-generic-crossref
2008-10-02 04:38:36 -04:00
recompile-hook
update-tuples-hook
remake-generics-hook
2008-10-02 04:38:36 -04:00
definition-observers
2008-03-24 21:15:42 -04:00
definitions:crossref
interactive-vocabs
layouts:num-tags
layouts:num-types
layouts:tag-mask
layouts:tag-numbers
layouts:type-numbers
2008-03-24 21:15:42 -04:00
lexer-factory
2008-11-20 22:54:07 -05:00
print-use-hook
2008-03-24 21:15:42 -04:00
root-cache
vocab-roots
2008-03-24 21:15:42 -04:00
vocabs:dictionary
vocabs:load-vocab-hook
word
parser-notes
} %
2008-09-02 23:40:18 -04:00
{ } { "math.partial-dispatch" } strip-vocab-globals %
2008-09-27 13:44:55 -04:00
"peg-cache" "peg" lookup ,
] when
strip-prettyprint? [
{
prettyprint.config:margin
prettyprint.config:string-limit?
prettyprint.config:boa-tuples?
prettyprint.config:tab-size
} %
] when
strip-debugger? [
{
2008-11-16 14:46:30 -05:00
compiler.errors:compiler-errors
continuations:thread-error-hook
} %
] when
deploy-c-types? get [
"c-types" "alien.c-types" lookup ,
] unless
deploy-ui? get [
"ui-error-hook" "ui.gadgets.worlds" lookup ,
] when
2008-04-04 11:05:52 -04:00
"windows-messages" "windows.messages" lookup [ , ] when*
] { } make ;
: strip-globals ( stripped-globals -- )
2007-10-31 01:09:24 -04:00
strip-globals? [
"Stripping globals" show
global swap
2008-09-10 23:11:40 -04:00
'[ drop _ member? not ] assoc-filter
[ drop string? not ] assoc-filter ! strip CLI args
2008-07-02 16:57:38 -04:00
sift-assoc
2008-03-16 03:21:51 -04:00
dup keys unparse show
21 setenv
2007-10-06 13:37:47 -04:00
] [ drop ] if ;
2008-10-02 04:38:36 -04:00
: strip-c-io ( -- )
2008-10-05 23:00:52 -04:00
deploy-io get 2 = os windows? or [
2008-10-02 04:38:36 -04:00
[
c-io-backend forget
"io.streams.c" forget-vocab
] with-compilation-unit
] unless ;
2008-07-05 04:07:10 -04:00
: compress ( pred string -- )
"Compressing " prepend show
instances
dup H{ } clone [ [ ] cache ] curry map
become ; inline
: compress-byte-arrays ( -- )
[ byte-array? ] "byte arrays" compress ;
: compress-quotations ( -- )
[ quotation? ] "quotations" compress ;
: compress-strings ( -- )
[ string? ] "strings" compress ;
2007-10-06 13:37:47 -04:00
: 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
2008-10-02 07:41:17 -04:00
] [ ] make "Boot quotation: " show dup unparse show
2007-10-06 13:37:47 -04:00
set-boot-quot ;
2008-10-02 07:41:17 -04:00
: init-stripper ( -- )
t "quiet" set-global
f output-stream set-global ;
: compute-next-methods ( -- )
[ standard-generic? ] instances [
"methods" word-prop [
nip
dup next-method-quot "next-method-quot" set-word-prop
] assoc-each
] each
"resource:basis/tools/deploy/shaker/next-methods.factor" run-file ;
2008-01-07 16:14:21 -05:00
: strip ( -- )
2008-10-02 07:41:17 -04:00
init-stripper
2008-01-07 16:14:21 -05:00
strip-libc
2007-10-06 13:37:47 -04:00
strip-cocoa
strip-debugger
compute-next-methods
2007-10-06 13:37:47 -04:00
strip-init-hooks
2008-10-02 07:41:17 -04:00
strip-c-io
f 5 setenv ! we can't use the Factor debugger or Factor I/O anymore
2007-10-06 13:37:47 -04:00
deploy-vocab get vocab-main set-boot-quot*
2008-06-25 21:47:07 -04:00
stripped-word-props >r
stripped-globals strip-globals
2008-07-05 04:07:10 -04:00
r> strip-words
compress-byte-arrays
compress-quotations
compress-strings ;
2007-10-06 13:37:47 -04:00
: (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