! 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 io.launcher words.private ; IN: tools.deploy SYMBOL: strip-globals? SYMBOL: strip-word-props? SYMBOL: strip-word-names? SYMBOL: strip-dictionary? SYMBOL: strip-debugger? SYMBOL: strip-prettyprint? SYMBOL: strip-c-types? SYMBOL: deploy-math? SYMBOL: deploy-compiled? SYMBOL: deploy-io? SYMBOL: deploy-ui? SYMBOL: deploy-vm SYMBOL: deploy-image : default-config ( -- assoc ) V{ { strip-prettyprint? t } { strip-globals? t } { strip-word-props? t } { strip-word-names? t } { strip-dictionary? t } { strip-debugger? t } { strip-c-types? t } { deploy-math? t } { deploy-compiled? t } { deploy-io? f } { deploy-ui? f } ! default value for deploy.app { "stop-after-last-window?" t } } clone ; : deploy-config-path ( vocab -- string ) vocab-dir "deploy.factor" path+ ; : deploy-config ( vocab -- assoc ) default-config swap dup deploy-config-path vocab-file-contents parse-fresh dup empty? [ drop ] [ first union ] if ; : set-deploy-config ( assoc vocab -- ) >r unparse-use string-lines r> dup deploy-config-path set-vocab-file-contents ; : set-deploy-flag ( value key vocab -- ) [ deploy-config [ set-at ] keep ] keep set-deploy-config ; r V{ } set-datastack r> V{ } set-retainstack V{ } set-callstack V{ } set-namestack V{ } set-catchstack "Saving final image" show [ save-image-and-exit ] call ; SYMBOL: deploy-vocab : set-boot-quot* ( word -- ) [ \ boot , init-hooks get values concat % , "io.backend" init-hooks get at [ \ flush , ] when ] [ ] make "Boot quotation: " write dup . flush set-boot-quot ; : retained-globals ( -- seq ) [ builtins , io-backend , strip-dictionary? get [ { builtins dictionary inspector-hook lexer-factory load-vocab-hook num-tags num-types tag-bits tag-mask tag-numbers typemap vocab-roots } % ] unless strip-prettyprint? get [ { tab-size margin } % ] unless strip-c-types? get not deploy-ui? get or [ "c-types" "alien.c-types" lookup , ] when 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 . ; : normalize-strip-flags strip-prettyprint? get [ strip-word-names? off ] unless strip-dictionary? get [ strip-prettyprint? off strip-word-names? off strip-word-props? off ] unless ; : strip ( -- ) normalize-strip-flags strip-cocoa strip-debugger 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 parse-hook get >r parse-hook off deploy-vocab get require r> call 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) ; : (copy-lines) ( stream -- stream ) dup stream-readln [ print flush (copy-lines) ] when* ; : copy-lines ( stream -- ) [ (copy-lines) ] [ stream-close ] [ ] cleanup ; : stage2 ( vm flags -- ) [ "\"" % swap % "\" -i=boot." % cpu % ".image" % [ " " % % ] each ] "" make dup print copy-lines ; : profile-string ( config -- string ) { { deploy-math? "math" } { deploy-compiled? "compiler" } { deploy-ui? "ui" } { deploy-io? "io" } } swap [ nip at ] curry assoc-subset values " " join ; : deploy-command-line ( vm image vocab config -- vm flags ) [ "\"-include=" swap profile-string "\"" 3append , "-deploy-vocab=" swap append , "\"-output-image=" swap "\"" 3append , "-no-stack-traces" , "-no-user-init" , ] { } make ; PRIVATE> : deploy* ( vm image vocab config -- ) deploy-command-line stage2 ; : deploy ( vocab -- ) vm over ".image" append rot dup deploy-config deploy* ; MAIN: do-deploy