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

458 lines
12 KiB
Factor
Raw Normal View History

! Copyright (C) 2007, 2009 Slava Pestov.
2007-10-06 13:37:47 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors io.backend io.streams.c init fry
2008-12-08 15:58:00 -05:00
namespaces make assocs kernel parser lexer strings.parser vocabs
sequences words words.private memory kernel.private
continuations io vocabs.loader system strings sets
vectors quotations byte-arrays sorting compiler.units
definitions generic generic.standard tools.deploy.config ;
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: 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-12-01 20:51:01 -05:00
{ "cpu.x86" "command-line" "libc" "system" "environment" }
[ init-hooks get delete-at ] each
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 ( -- )
2008-12-08 15:58:00 -05:00
strip-debugger? "debugger" vocab and [
2007-10-06 13:37:47 -04:00
"Stripping debugger" show
2009-02-15 20:53:21 -05:00
"vocab: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
2009-02-15 20:53:21 -05:00
"vocab:tools/deploy/shaker/strip-libc.factor"
run-file
2007-10-06 13:37:47 -04:00
] when ;
: strip-call ( -- )
"Stripping stack effect checking from call( and execute(" show
"vocab:tools/deploy/shaker/strip-call.factor" run-file ;
2007-10-06 13:37:47 -04:00
: strip-cocoa ( -- )
"cocoa" vocab [
"Stripping unused Cocoa methods" show
2009-02-15 20:53:21 -05:00
"vocab: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-08-05 05:38:01 -04:00
] [
H{ } clone '[
[ [ _ [ ] cache ] map ] change-props drop
] each
2008-12-08 15:58:00 -05:00
] bi ;
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"
"compiled-status"
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"
"ebnf-parser"
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"
2009-03-17 19:53:44 -04:00
"instances"
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?"
! UI needs this
! "superclass"
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? [
{
"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-default-methods ( -- )
strip-debugger? [
"Stripping default methods" show
[
[ generic? ] instances
[ "No method" throw ] (( -- * )) define-temp
dup t "default" set-word-prop
'[
[ _ "default-method" set-word-prop ] [ make-generic ] bi
] each
] with-compilation-unit
] when ;
: strip-vocab-globals ( except names -- words )
2009-03-23 23:36:51 -04:00
[ child-vocabs [ words ] map concat ] map concat
swap [ first2 lookup ] map sift 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"
"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 ,
2009-03-23 23:36:51 -04:00
{ { "yield-hook" "compiler.utilities" } }
{ "cpu" "compiler" } 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
compiler-impl
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
vocabs:dictionary
vocabs:load-vocab-hook
word
parser-notes
} %
2008-09-02 23:40:18 -04:00
{ } { "math.partial-dispatch" } strip-vocab-globals %
{ } { "peg" } strip-vocab-globals %
] when
strip-prettyprint? [
2008-12-08 15:58:00 -05:00
{ } { "prettyprint.config" } strip-vocab-globals %
] 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
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 ;
: compress ( pred post-process string -- )
2008-07-05 04:07:10 -04:00
"Compressing " prepend show
[ instances dup H{ } clone [ [ ] cache ] curry map ] dip call
2008-07-05 04:07:10 -04:00
become ; inline
: compress-byte-arrays ( -- )
[ byte-array? ] [ ] "byte arrays" compress ;
: remain-compiled ( old new -- old new )
#! Quotations which were formerly compiled must remain
#! compiled.
2dup [
2dup [ compiled>> ] [ compiled>> not ] bi* and
[ nip jit-compile ] [ 2drop ] if
] 2each ;
2008-07-05 04:07:10 -04:00
: compress-quotations ( -- )
2009-03-17 19:53:44 -04:00
[ quotation? ] [ remain-compiled ] "quotations" compress
[ quotation? ] instances [ f >>cached-effect f >>cache-counter drop ] each ;
2008-07-05 04:07:10 -04:00
: compress-strings ( -- )
[ string? ] [ ] "strings" compress ;
2008-07-05 04:07:10 -04:00
: compress-wrappers ( -- )
[ wrapper? ] [ ] "wrappers" compress ;
2007-10-06 13:37:47 -04:00
: finish-deploy ( final-image -- )
"Finishing up" show
V{ } set-namestack
V{ } set-catchstack
"Saving final image" show
[ save-image-and-exit ] call-clear ;
SYMBOL: deploy-vocab
: [:c] ( -- word ) ":c" "debugger" lookup ;
: [print-error] ( -- word ) "print-error" "debugger" lookup ;
: deploy-boot-quot ( word -- )
2007-10-06 13:37:47 -04:00
[
[ boot ] %
2007-10-06 13:37:47 -04:00
init-hooks get values concat %
strip-debugger? [ , ] [
! Don't reference try directly
[:c]
[print-error]
'[
[ _ execute ] [
_ execute nl
_ execute
] recover
] %
] if
strip-io? [ [ flush ] % ] unless
[ 0 exit ] %
2008-12-08 15:58:00 -05:00
] [ ] make
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
2009-02-15 20:53:21 -05:00
"vocab: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
strip-default-methods
2008-01-07 16:14:21 -05:00
strip-libc
strip-call
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
deploy-vocab get vocab-main deploy-boot-quot
stripped-word-props
stripped-globals strip-globals
2008-07-05 04:07:10 -04:00
compress-byte-arrays
compress-quotations
compress-strings
2008-12-08 22:24:45 -05:00
compress-wrappers
strip-words ;
2007-10-06 13:37:47 -04:00
: deploy-error-handler ( quot -- )
[
strip-debugger?
[ error-continuation get call>> callstack>array die ]
! Don't reference these words literally, if we're stripping the
! debugger out we don't want to load the prettyprinter at all
[ [:c] execute nl [print-error] execute flush ] if
1 exit
] recover ; inline
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
[
[
strip-debugger? [
"debugger" require
"inspector" require
] unless
2007-10-06 13:37:47 -04:00
deploy-vocab set
deploy-vocab get require
deploy-vocab get vocab-main [
"Vocabulary has no MAIN: word." print flush 1 exit
] unless
2007-10-06 13:37:47 -04:00
strip
finish-deploy
] deploy-error-handler
2007-10-06 13:37:47 -04:00
] bind ;
: do-deploy ( -- )
"output-image" get
"deploy-vocab" get
"Deploying " write dup write "..." print
2008-12-08 15:58:00 -05:00
"deploy-config" get parse-file first
2007-10-06 13:37:47 -04:00
(deploy) ;
MAIN: do-deploy