'From Squeakland.396-Nihongo7.29 of 18 March 2005 [latest update: #80] on 26 September 2005 at 1:15:09 am'! "Change Set: ExeBuilder Date: 25 September 2005 Author: Takashi Yamamiya Build exe file from squeak image. Try EXE!! button in the Navigator. "! Object subclass: #ExeBuilder instanceVariableNames: 'vmName imageName' classVariableNames: '' poolDictionaries: '' category: 'ExeBuilder'! !ExeBuilder methodsFor: 'accessing' stamp: 'tak 9/25/2005 13:43'! exeName ^ Project current name , '.exe'! ! !ExeBuilder methodsFor: 'accessing' stamp: 'tak 9/25/2005 12:49'! imageName: aString imageName _ aString! ! !ExeBuilder methodsFor: 'accessing' stamp: 'tak 9/25/2005 12:49'! vmName: aString vmName _ aString! ! !ExeBuilder methodsFor: 'building' stamp: 'tak 9/25/2005 14:31'! build | vm image sqexe footer sizes dist | Cursor write showWhile: [dist := FileDirectory default forceNewFileNamed: self exeName. vm := self readFile: vmName. image := self readFile: imageName. sqexe := self class sqexe. footer := String new: 100. sizes := '{1} {2} {3} {4}' format: {sqexe size asString. vm size asString. (sqexe size + vm size) asString. image size asString}. footer := sizes , (String new: 100 - sizes size). dist binary. [dist nextPutAll: sqexe. dist nextPutAll: vm. dist nextPutAll: image. dist nextPutAll: footer] ensure: [dist close]]! ! !ExeBuilder methodsFor: 'building' stamp: 'tak 9/25/2005 13:19'! readFile: fileName | f contents | f := FileDirectory default readOnlyFileNamed: fileName. f binary. [contents := f contentsOfEntireFile] ensure: [f close]. ^ contents! ! !ExeBuilder class methodsFor: 'building' stamp: 'tak 9/26/2005 00:43'! buildExe "self buildExe" | builder savedName | savedName := self saveImage. savedName = SmalltalkImage current imageName ifTrue: [builder := self newCurrentEnvironment. builder build]! ! !ExeBuilder class methodsFor: 'building' stamp: 'tak 9/25/2005 18:56'! newCurrentEnvironment "self newCurrentEnvironment" | builder | builder _ ExeBuilder new. builder imageName: SmalltalkImage current imageName. builder vmName: self vmName. ^ builder ! ! !ExeBuilder class methodsFor: 'building' stamp: 'tak 9/26/2005 00:46'! saveImage "self saveImage" | newName image newImageName newChangesName | image := SmalltalkImage current. newName := Project current name. newImageName := image fullNameForImageNamed: newName. newChangesName := image fullNameForChangesNamed: newName. image imageName = newImageName ifTrue: [image saveSession] ifFalse: [newName isNil ifTrue: [^ self]. (SourceFiles at: 2) ifNotNil: [image closeSourceFiles; saveChangesInFileNamed: newChangesName "so copying the changes file will always work"]. image saveImageInFileNamed: newImageName]. ^ newImageName! ! !ExeBuilder class methodsFor: 'building' stamp: 'tak 9/25/2005 18:15'! vmName "self vmName" | str | str := SmalltalkImage current getSystemAttribute: 0. ^ (FilePath pathName: str isEncoded: true) asSqueakPathName! ! !ExeBuilder class methodsFor: 'constants' stamp: 'tak 9/25/2005 18:53'! buildExeBinary "self buildExeBinary" | f binName binary gzipped base64 | binName := 'sqexe.exe'. f := FileDirectory default readOnlyFileNamed: binName. f binary. [binary := f contents. gzipped := GZipWriteStream on: (RWBinaryOrTextStream on: '') binary. gzipped nextPutAll: binary. gzipped close. base64 := Base64MimeConverter mimeEncode: gzipped encodedStream. Transcript cr; show: base64 contents printString] ensure: [f close]. Transcript cr; show: 'in: [:src | (GZipReadStream on: (Base64MimeConverter mimeDecodeToBytes: src readStream)) contents]'! ! !ExeBuilder class methodsFor: 'constants' stamp: 'tak 9/25/2005 18:57'! sqexe "self sqexe" ^ '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' in: [:src | (GZipReadStream on: (Base64MimeConverter mimeDecodeToBytes: src readStream)) contents]! ! !ExeBuilder class methodsFor: 'class initialization' stamp: 'tak 9/26/2005 01:15'! initialize TheWorldMenu registerOpenCommand: {'Build Exe File'. {self. #buildExe}}! ! !ProjectNavigationMorph methodsFor: 'the buttons' stamp: 'tak 9/25/2005 18:19'! buttonExe "self new buttonExe" | button | button := self makeButton: 'EXE!!' balloonText: 'Build exe file' for: #buildExe. button target: ExeBuilder. ^ button! ! !ProjectNavigationMorph methodsFor: 'buttons' stamp: 'tak 9/25/2005 12:45'! makeTheSimpleButtons ^{ self buttonNewProject. self buttonPrev. self buttonNext. self buttonPublish. self buttonFind. self buttonFullScreen. self buttonPaint. self buttonUndo. self buttonExe. self buttonQuit. } ! ! ExeBuilder initialize! !ExeBuilder class reorganize! ('building' buildExe newCurrentEnvironment saveImage vmName) ('constants' buildExeBinary sqexe) ('class initialization' initialize) ! "Postscript: Leave the line above, and replace the rest of this comment by a useful one. Executable statements should follow this comment, and should be separated by periods, with no exclamation points (!!). Be sure to put any further comments in double-quotes, like this one." Preferences disable: #securityChecksEnabled. Preferences disable: #warnIfNoSourcesFile. Preferences disable: #warnIfNoChangesFile. Flaps disableGlobalFlaps: false. Flaps addAndEnableEToyFlaps. ActiveWorld addGlobalFlaps. !