revised
authortz
Thu, 02 Apr 1998 21:02:02 +0200
changeset 1525 ba7044e40ba0
parent 1524 ed8ff581872b
child 1526 eb8814228056
revised
ApplicationBuilder.st
--- a/ApplicationBuilder.st	Thu Apr 02 20:59:17 1998 +0200
+++ b/ApplicationBuilder.st	Thu Apr 02 21:02:02 1998 +0200
@@ -1,10 +1,22 @@
 ToolApplicationModel subclass:#ApplicationBuilder
-	instanceVariableNames:'task shellView'
-	classVariableNames:'Aspects'
+	instanceVariableNames:'task shellView aspects'
+	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Smalltalk'
 !
 
+ApplicationBuilder class instanceVariableNames:'aspects'
+
+"
+ The following class instance variables are inherited by this class:
+
+	ToolApplicationModel - history clipboard settings showHelp
+	ApplicationModel - ClassResources
+	Model - 
+	Object - 
+"
+!
+
 !ApplicationBuilder class methodsFor:'documentation'!
 
 documentation
@@ -12,20 +24,21 @@
     The Application Builder of ST/X allows you to build ST/X-applications by following steps:
 
         0. Clobber the target directory of the application
-        1. Generation of the h-file with symbols
-        2. Generation of the c-file with modules
-        3. Compilation of the modules init file
-        4. Compilation of the startup C-file
-        5. Defining of the symbolic links to the libraries
-        6. Linking of the libraries to the application
-        7. Defining of the symbolic links to the resources
+        1. Generate the h-file with symbols
+        2. Generate the c-file with modules
+        3. Compile the modules init file
+        4. Compile the startup C-file
+        5. Define the symbolic links to the libraries
+        6. Link the libraries to the application
+        7. Define the symbolic links to the resources
+
 
     [instance variables:]
         task           <Process>               task of the running build
         shellView      <ShellView>             shell view for outputing the build results
 
-    [class variables:]
-        Aspects        <IdentityDictionary>    aspects of the settings
+    [instance class variables:]
+        aspects        <IdentityDictionary>    aspects of the settings
 
     [start with:]
         ApplicationBuilder open
@@ -38,6 +51,21 @@
 "
 ! !
 
+!ApplicationBuilder class methodsFor:'accessing'!
+
+aspects
+
+    aspects isNil ifTrue: [aspects := IdentityDictionary new].
+    ^aspects
+
+
+!
+
+aspects: anIdentityDictionary
+
+    aspects := anIdentityDictionary
+! !
+
 !ApplicationBuilder class methodsFor:'help specs'!
 
 helpSpec
@@ -62,7 +90,7 @@
 'Name of the application.'
 
 #build
-'Starts the process of building the application.'
+'Starts the process of building the target.'
 
 #buildDate
 'Build date of the application.'
@@ -73,6 +101,9 @@
 #libraryDirectory
 'Directory of the ST/X libraries.'
 
+#link
+'Starts the process of linking the application.'
+
 #start
 'Start the build application.'
 
@@ -89,7 +120,7 @@
 'Startup module of ST/X for the application.'
 
 #stop
-'Stops the process of application building.'
+'Stops the process of the building.'
 
 #stxLibraries
 'List of the ST/X library names.'
@@ -107,10 +138,10 @@
 'Create symbolic links to the sources of ST/X.'
 
 #systemLibaries
-'Libraries of the operating system needed by the application.'
+'Libraries of the operating system needed by the target.'
 
 #targetDirectory
-'Target directory of the application.'
+'Directory where the target will build.'
 
 #topDirectory
 'Top directory of ST/X.'
@@ -144,11 +175,11 @@
           #window: 
            #(#WindowSpec
               #name: 'Application Builder'
-              #layout: #(#LayoutFrame 37 0 199 0 536 0 658 0)
+              #layout: #(#LayoutFrame 428 0 301 0 927 0 760 0)
               #label: 'Application Builder'
               #min: #(#Point 420 220)
               #max: #(#Point 1152 900)
-              #bounds: #(#Rectangle 37 199 537 659)
+              #bounds: #(#Rectangle 428 301 928 761)
               #menu: #menu
               #usePreferredExtent: false
           )
@@ -158,7 +189,7 @@
                #(
                  #(#ViewSpec
                     #name: 'Box1'
-                    #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 288 0)
+                    #layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 292 0)
                     #component: 
                      #(#SpecCollection
                         #collection: 
@@ -219,7 +250,7 @@
                                         #model: #configuration
                                     )
                                      #(#DividerSpec
-                                        #name: 'divider1'
+                                        #name: 'Separator2'
                                         #layout: #(#LayoutFrame 0 0 102 0 0 1 105 0)
                                     )
                                      #(#ActionButtonSpec
@@ -275,12 +306,12 @@
                                         #model: #startupCFile
                                     )
                                      #(#DividerSpec
-                                        #name: 'divider2'
+                                        #name: 'Separator3'
                                         #layout: #(#LayoutFrame 0 0.0 208 0 0 1.0 211 0)
                                     )
                                      #(#LabelSpec
                                         #name: 'stxLibraryButton'
-                                        #layout: #(#LayoutFrame 4 0 215 0 147 0 239 0)
+                                        #layout: #(#AlignmentOrigin 147 0 227 0 1 0.5)
                                         #label: 'ST/X Libraries:'
                                     )
                                      #(#ComboBoxSpec
@@ -327,6 +358,11 @@
                                   )
                               )
                           )
+                           #(#DividerSpec
+                              #name: 'Separator4'
+                              #layout: #(#LayoutFrame -144 1 0 0.0 -138 1 0 1.0)
+                              #orientation: #vertical
+                          )
                            #(#ViewSpec
                               #name: 'Box3'
                               #layout: #(#LayoutFrame -134 1 0 0.0 0 1.0 0 1.0)
@@ -336,7 +372,7 @@
                                    #(
                                      #(#FramedBoxSpec
                                         #name: 'FramedBox'
-                                        #layout: #(#LayoutFrame -4 0.0 0 0.0 0 1.0 -98 1.0)
+                                        #layout: #(#LayoutFrame -4 0.0 4 0.0 0 1.0 -150 1.0)
                                         #component: 
                                          #(#SpecCollection
                                             #collection: 
@@ -376,7 +412,7 @@
                                     )
                                      #(#VerticalPanelViewSpec
                                         #name: 'VerticalPanel'
-                                        #layout: #(#LayoutFrame 0 0.0 -90 1 -6 1.0 0 1.0)
+                                        #layout: #(#LayoutFrame 0 0.0 -144 1 -6 1.0 -2 1.0)
                                         #component: 
                                          #(#SpecCollection
                                             #collection: 
@@ -386,21 +422,28 @@
                                                   #activeHelpKey: #build
                                                   #label: 'Build'
                                                   #model: #doBuild
-                                                  #extent: #(#Point 128 28)
+                                                  #extent: #(#Point 128 33)
+                                              )
+                                               #(#ActionButtonSpec
+                                                  #name: 'linkButton'
+                                                  #activeHelpKey: #link
+                                                  #label: 'Link'
+                                                  #model: #doLink
+                                                  #extent: #(#Point 128 34)
                                               )
                                                #(#ActionButtonSpec
                                                   #name: 'stopButton'
                                                   #activeHelpKey: #stop
                                                   #label: 'Stop'
                                                   #model: #doStop
-                                                  #extent: #(#Point 128 28)
+                                                  #extent: #(#Point 128 33)
                                               )
                                                #(#ActionButtonSpec
                                                   #name: 'Button1'
                                                   #activeHelpKey: #start
                                                   #label: 'Start'
                                                   #model: #doStart
-                                                  #extent: #(#Point 128 28)
+                                                  #extent: #(#Point 128 33)
                                               )
                                             )
                                         )
@@ -412,21 +455,13 @@
                                   )
                               )
                           )
-                           #(#DividerSpec
-                              #name: 'Separator1'
-                              #layout: #(#LayoutFrame -144 1 0 0.0 -138 1 0 1.0)
-                              #orientation: #vertical
-                          )
                         )
                     )
-                )
-                 #(#DividerSpec
-                    #name: 'Separator2'
-                    #layout: #(#LayoutFrame 0 0.0 290 0 0 1.0 293 0)
+                    #borderWidth: 1
                 )
                  #(#SubCanvasSpec
-                    #name: 'SubCanvas'
-                    #layout: #(#LayoutFrame 0 0.0 296 0 0 1.0 -26 1)
+                    #name: 'shellViewSubCanvas'
+                    #layout: #(#LayoutFrame 0 0.0 294 0 0 1.0 -26 1)
                     #hasHorizontalScrollBar: false
                     #hasVerticalScrollBar: false
                     #clientHolder: #shellView
@@ -475,6 +510,11 @@
                           #activeHelpKey: #build
                       )
                        #(#MenuItem
+                          #label: 'Link'
+                          #value: #doLink
+                          #activeHelpKey: #link
+                      )
+                       #(#MenuItem
                           #label: 'Stop'
                           #value: #doStop
                           #activeHelpKey: #stop
@@ -575,13 +615,13 @@
 doBuild
     "builds the application by doing following tasks:
         0. Clobber the target directory of the application
-        1. Generation of the h-file with symbols
-        2. Generation of the c-file with modules
-        3. Compilation of the modules init file
-        4. Compilation of the startup C-file
-        5. Creating of the symbolic links to the libraries
-        6. Linking of the libraries to the application
-        7. Creating of the symbolic links to the resources
+        1. Generate the h-file with symbols
+        2. Generate the c-file with modules
+        3. Compile the modules init file
+        4. Compile the startup C-file
+        5. Define the symbolic links to the libraries
+        6. Link the libraries to the application
+        7. Define the symbolic links to the resources
     "
     |dir compilerPath compilerFlags block0 block1 block2 block3 block4 block5 block6 block7 priority|
 
@@ -589,7 +629,7 @@
 
     self inform: 'Starting building of application...' asBoldText.
 
-    (dir := self getApplicationDirectory) isNil 
+    (dir := self getTargetDirectory) isNil 
         ifTrue: [^self warn: 'Could not create application directory!!'].
 
     shellView directory: dir.
@@ -598,66 +638,14 @@
         ifTrue: [^self warn:'Define first a system compiler!!'].
     compilerFlags := self getCompilerFlags.
 
-    block0 := 
-    [
-        self inform: 'Clobbering the target directory...'.
-        self clobberTargetDirectory: dir.
-        task := nil
-    ].
-    block1 := 
-    [
-        self inform: 'Starting generation of the h-file with symbols...'.
-        self generateHFileWithSymbolsIn: dir.
-        (dir asFilename construct: 'symbols.h') exists
-            ifTrue:  [task := nil]
-            ifFalse: [self warn:'Could not generate the h-file with symbols!!']
-    ].
-    block2 := 
-    [
-        self inform: 'Starting generation of the C-file with modules...'.
-        self generateCFileWithModulesIn: dir.
-        (dir asFilename construct: 'modulList.c') exists
-            ifTrue:  [task := nil]
-            ifFalse: [self warn:'Could not generate the C-file with libraries!!']
-    ].
-    block3 := 
-    [
-        self inform: 'Starting compilation of the modules init file...'.
-        self compileModulListFileWith: compilerPath, compilerFlags inDirectory: dir.
-        (dir asFilename construct: 'modulList.o') exists
-            ifTrue:  [task := nil]
-            ifFalse: [self warn:'Could not compile the modules file!!']
-    ].
-    block4 := 
-    [
-        ((Aspects at: #startupCFile) value asFilename) exists  
-            ifFalse: [task := nil. self warn: 'Defined startup C-file not found!!'].
-        self inform: 'Starting compilation of the startup C-file...'.
-        self compileStartupCFileWith: compilerPath, compilerFlags inDirectory: dir.
-        (dir asFilename construct: 'main.o') exists
-            ifTrue:  [task := nil]
-            ifFalse: [self warn:'Could not compile the startup C-file!!']
-    ].
-    block5 := 
-    [
-        self inform: 'Starting defining of the symbolic links to the libraries...'.
-        self createSymbolicLinksToTheLibrariesIn: dir.
-        task := nil. 
-    ].
-    block6 := 
-    [
-        self inform: 'Starting linking of the libraries to the application...'.
-        self linkLibrariesToTheApplicationIn: dir. 
-        (dir asFilename construct: (Aspects at: #applicationName) value) exists
-            ifTrue:  [task := nil]
-            ifFalse: [self warn:'Could not build the application!!']
-    ].
-    block7 := 
-    [
-        self inform: 'Starting linking of the resources...'.
-        self createSymbolicLinksToTheResourcesIn: dir. 
-        task := nil.
-    ].
+    block0 := self getBlockForClobberingTargetDirectory: dir.
+    block1 := self getBlockForGeneratingHFileWithSymbolsIn: dir.
+    block2 := self getBlockForGeneratingCFileWithModulesIn: dir.
+    block3 := self getBlockForCompilingModulListFileWith: compilerPath, compilerFlags inDirectory: dir.
+    block4 := self getBlockForCompilingStartupCFileWith: compilerPath, compilerFlags inDirectory: dir.
+    block5 := self getBlockForCreatingSymbolicLinksToTheLibrariesIn: dir.
+    block6 := self getBlockForLinkingLibrariesToTheApplicationIn: dir.
+    block7 := self getBlockForCreatingSymbolicLinksToTheResourcesIn: dir.
 
     priority := Processor userBackgroundPriority.
     task := block0 forkAt: priority.
@@ -698,30 +686,25 @@
                                                             task := block7 forkAt: priority.
                                                             task addExitAction: 
                                                             [
-                                                                task := nil.
-                                                                self inform: 'Application build.' asBoldText.
+                                                                task isNil 
+                                                                    ifTrue: [self inform: 'Application build.' asBoldText]
+                                                                    ifFalse: [self informTargetBuildingFailured].
                                                                 Display beep.
                                                             ]   
-                                                        ]
+                                                        ] ifFalse: [self informTargetBuildingFailured]
                                                     ]
-                                                ]
+                                                ] ifFalse: [self informTargetBuildingFailured]
                                             ]
-                                        ]
+                                        ] ifFalse: [self informTargetBuildingFailured]
                                     ]
-                                ]
+                                ] ifFalse: [self informTargetBuildingFailured]
                             ]
-                        ]
+                        ] ifFalse: [self informTargetBuildingFailured]
                     ]           
-                ]
+                ] ifFalse: [self informTargetBuildingFailured]
             ]
-        ]
+        ] ifFalse: [self informTargetBuildingFailured]
     ]
-
-
-
-
-
-
 !
 
 doDefineApplicationLinkDefines
@@ -730,22 +713,49 @@
     |box|
     box := EnterBox new.
     box label: 'Application Link Defines'.
-    box initialText: (Aspects at: #applicationLinkDefines) value.
+    box initialText: (aspects at: #applicationLinkDefines) value.
     box showAtPointer.
     box accepted
     ifTrue:
     [
-        (Aspects at: #applicationLinkDefines) value: box contents
+        (aspects at: #applicationLinkDefines) value: box contents
     ].
     box destroy
 !
 
+doLink
+    "links the application"
+
+    |dir block priority|
+
+    task notNil ifTrue: [self warn: 'There is already a build running!!'].
+
+    self inform: 'Starting building of application...' asBoldText.
+
+    (dir := self getTargetDirectory) isNil 
+        ifTrue: [^self warn: 'Could not create application directory!!'].
+
+    shellView directory: dir.
+
+    block := self getBlockForLinkingLibrariesToTheApplicationIn: dir.
+
+    priority := Processor userBackgroundPriority.
+    task := block forkAt: priority.
+    task addExitAction: 
+    [
+        task isNil 
+            ifTrue: [self inform: 'Application build.' asBoldText]
+            ifFalse:[self informTargetBuildingFailured].
+        Display beep.
+    ]
+!
+
 doSelectCFile: whichFile
     "opens a FileSelectionBrowser in order to select C-file"
 
     |currentFile selectedFile|
 
-    currentFile := Aspects at: whichFile asLowercaseFirst asSymbol.
+    currentFile := aspects at: whichFile asLowercaseFirst asSymbol.
 
     ((selectedFile := FileSelectionBrowser
         request: 'Select Your ', whichFile, ' File' 
@@ -763,7 +773,7 @@
 
     |currentDir selectedDir|
 
-    currentDir := Aspects at: (whichDir asLowercaseFirst, 'Directory') asSymbol.
+    currentDir := aspects at: (whichDir asLowercaseFirst, 'Directory') asSymbol.
 
     ((selectedDir := FileSelectionBrowser
         request: 'Select Your ', whichDir, ' Directory' 
@@ -781,7 +791,7 @@
 
     |currentFile selectedFile|
 
-    currentFile := Aspects at: whichFile asLowercaseFirst asSymbol.
+    currentFile := aspects at: whichFile asLowercaseFirst asSymbol.
 
     ((selectedFile := FileSelectionBrowser
         request: 'Select Your ', whichFile, ' File' 
@@ -799,11 +809,11 @@
 
     |dir|
     self doStop.
-    (dir := self getApplicationDirectory) isNil 
+    (dir := self getTargetDirectory) isNil 
         ifTrue: [^self warn: 'Application directory does not exists!!'].
 
     shellView directory: dir.
-    shellView executeCommand: (Aspects at: #applicationName) value.
+    shellView executeCommand: (aspects at: #applicationName) value.
 
 !
 
@@ -815,6 +825,46 @@
     shellView executeCommand: 'clear'.
     self inform: ''
 
+!
+
+executeCommand: aCommand inDirectory: dir
+    "executes aCommand in directory dir; put aCommand and the result into the shell view"
+
+    |outStream|
+
+    shellView directory: dir.
+    shellView append: shellView getDirectoryTextString, ' ', aCommand.
+
+    outStream:= PipeStream readingFrom: aCommand errorDisposition:#inline inDirectory: dir.
+    [      
+        outStream canReadWithoutBlocking
+        ifTrue:
+        [
+            outStream readWait.
+            shellView append: shellView getDirectoryTextString, ' ',
+                (Text string: (outStream upTo: Character cr) color: Color red).
+        ].
+    ] doWhile:[outStream atEnd not].
+
+    outStream close
+
+!
+
+inform: aString
+    "outputs aString via shell view as information"
+
+    shellView commandInputField contents: aString
+
+
+
+
+!
+
+informTargetBuildingFailured
+    "informs that something went wrong"
+
+    self inform: 'Application building failured.' asBoldText.
+    task := nil
 ! !
 
 !ApplicationBuilder methodsFor:'aspects'!
@@ -822,14 +872,13 @@
 aspectFor:aKey
     "returns an aspect at aKey"
 
-    ^Aspects at: aKey ifAbsent: [super aspectFor:aKey]
-
+    ^aspects at: aKey ifAbsent: [super aspectFor:aKey]
 !
 
 aspectsAt: aKey putFirst: anObject
     "puts firstly anObject as ValueHolder at aKey and returns it"
 
-    ^Aspects at: aKey ifAbsent: [Aspects at: aKey put: anObject asValue]
+    ^aspects at: aKey ifAbsent: [aspects at: aKey put: anObject asValue]
 
 
 
@@ -863,228 +912,221 @@
 shellView
     "returns a shell view"
 
-    shellView isNil ifTrue: [shellView := ShellView new. shellView directory: (Aspects at: #topDirectory) value]. 
+    shellView isNil ifTrue: [shellView := ShellView new. shellView directory: (aspects at: #topDirectory) value]. 
     ^shellView 
 
 
 
 ! !
 
-!ApplicationBuilder methodsFor:'building'!
-
-clobberTargetDirectory: dir
-    "clobbers the target directory of the application"
+!ApplicationBuilder methodsFor:'building blocks'!
 
-    self executeCommand: 'rm -r *' inDirectory: dir
-
-
-
-
+getBlockForClobberingTargetDirectory: dir
+    "returns the block for clobbering the target directory of the application"
 
-!
-
-compileModulListFileWith: ccPathAndFlags inDirectory: dir
-    "compiles the C-file with the list of the module names"
-
-    |command|
-
-    command := ccPathAndFlags , ' -c -fPIC -O6 -fomit-frame-pointer -m486 -DDEBUG -Di386 modulList.c'.
-
-    self executeCommand: command inDirectory: dir
+    ^
+    [
+        self inform: 'Clobbering the target directory...'.
+        self executeCommand: 'rm -r *' inDirectory: dir.
+        task := nil
+    ]
 
 !
 
-compileStartupCFileWith: ccPathAndFlags inDirectory: dir
-    "compiles the startup file with passing startup class, startup selector, configuration string, and build date"
-
-    |startUpClass cls startUpSelector startupFile command|
+getBlockForCompilingModulListFileWith: compilerPathAndFlags inDirectory: dir
+    "returns the block for compiling the C-file with the list of the module names"
 
-    startUpClass    := ((Aspects at: #startupMessage) value upTo: $ ) asSymbol.
-    (cls := Smalltalk at: startUpClass) isNil ifTrue: [^self warn: 'Defined class not found in system!!'].
-    startUpSelector := ((Aspects at: #startupMessage) value copy reverse upTo: $ ) reverse asSymbol.
-    (cls respondsTo: startUpSelector) ifFalse: [^self warn: 'Defined class does not respond to the defined selector!!'].
-    startupFile     := (Aspects at: #startupCFile) value asFilename.
-    startupFile copyTo: (startupFile := dir asFilename construct: (Aspects at: #startupCFile) value asFilename baseName).
-    command := ccPathAndFlags , ' -o main.o -c -O -O6 -fomit-frame-pointer -m486 -DDEBUG -Di386 ',
-        '-DSTARTUP_CLASS="\"',        startUpClass, '\"" ',
-        '-DSTARTUP_SELECTOR="\"',     startUpSelector, '\"" ',
-        '-DCONFIGURATION_STRING="\"', (Aspects at: #configuration)   value, '\"" ',
-        '-DBUILD_DATE="\"',           (Aspects at: #buildDate)       value, '\"" ',
-        startupFile name.
-
-    self executeCommand: command inDirectory: dir
+    ^
+    [
+        |command|
+        self inform: 'Starting compilation of the modules init file...'.
+        command := compilerPathAndFlags , ' -c -fPIC -O6 -fomit-frame-pointer -m486 -DDEBUG -Di386 modulList.c'.
+        self executeCommand: command inDirectory: dir.
+        (dir asFilename construct: 'modulList.o') exists
+            ifTrue:  [task := nil]
+            ifFalse: [self warn:'Could not compile the modules file!!']
+    ]
 !
 
-compileStartupFileWith: ccPathAndFlags inDirectory: dir
-    "compiles the startup file with passing startup class, startup selector, configuration string, and build date"
+getBlockForCompilingStartupCFileWith: compilerPathAndFlags inDirectory: dir
+    "returns the block for compiling the startup file with passing startup class, startup selector, configuration string, and build date"
 
-    |startUpClass cls startUpSelector startupFile command|
+    ^
+    [
+        |startUpClass cls startUpSelector startupFile command|
+        ((aspects at: #startupCFile) value asFilename) exists  
+        ifFalse: 
+        [
+            self warn: 'Defined startup C-file not found!!'
+        ]
+        ifTrue:
+        [
+            self inform: 'Starting compilation of the startup C-file...'.
 
-    startUpClass    := ((Aspects at: #startupMessage) value upTo: $ ) asSymbol.
-    (cls := Smalltalk at: startUpClass) isNil ifTrue: [^self warn: 'Defined class not found in system!!'].
-    startUpSelector := ((Aspects at: #startupMessage) value copy reverse upTo: $ ) reverse asSymbol.
-    (cls respondsTo: startUpSelector) ifFalse: [^self warn: 'Defined class does not respond to the defined selector!!'].
-    startupFile     := (Aspects at: #startupModule) value asFilename.
-    startupFile copyTo: (startupFile := dir asFilename construct: (Aspects at: #startupModule) value asFilename baseName).
-    command := ccPathAndFlags , ' -o main.o -c -O -O6 -fomit-frame-pointer -m486 -DDEBUG -Di386 ',
-        '-DSTARTUP_CLASS="\"',        startUpClass, '\"" ',
-        '-DSTARTUP_SELECTOR="\"',     startUpSelector, '\"" ',
-        '-DCONFIGURATION_STRING="\"', (Aspects at: #configuration)   value, '\"" ',
-        '-DBUILD_DATE="\"',           (Aspects at: #buildDate)       value, '\"" ',
-        startupFile name.
+            startUpClass    := ((aspects at: #startupMessage) value upTo: $ ) asSymbol.
+            (cls := Smalltalk at: startUpClass) isNil ifTrue: [^self warn: 'Defined class not found in system!!'].
+            startUpSelector := ((aspects at: #startupMessage) value copy reverse upTo: $ ) reverse asSymbol.
+            (cls respondsTo: startUpSelector) ifFalse: [^self warn: 'Defined class does not respond to the defined selector!!'].
+            startupFile     := (aspects at: #startupCFile) value asFilename.
+            startupFile copyTo: (startupFile := dir asFilename construct: (aspects at: #startupCFile) value asFilename baseName).
+            command := compilerPathAndFlags , ' -o main.o -c -O -O6 -fomit-frame-pointer -m486 -DDEBUG -Di386 ',
+                '-DSTARTUP_CLASS="\"',        startUpClass, '\"" ',
+                '-DSTARTUP_SELECTOR="\"',     startUpSelector, '\"" ',
+                '-DCONFIGURATION_STRING="\"', (aspects at: #configuration)   value, '\"" ',
+                '-DBUILD_DATE="\"',           (aspects at: #buildDate)       value, '\"" ',
+                startupFile name.
 
-    self executeCommand: command inDirectory: dir
+            self executeCommand: command inDirectory: dir.
+        ].
+        (dir asFilename construct: 'main.o') exists
+            ifTrue:  [task := nil]
+            ifFalse: [self warn:'Could not compile the startup C-file!!']
+    ]
 !
 
-createSymbolicLinksToTheLibrariesIn: dir
-    "creates the symbolic links to the libraries"
+getBlockForCreatingSymbolicLinksToTheLibrariesIn: dir
+    "returns the block for creating the symbolic links to the libraries"
 
-    self getLibraryFileNames value do:
-    [:libPath|       
-        self executeCommand: 'ln -s ', libPath , ' ', libPath asFilename head inDirectory: dir
+    ^
+    [
+        self inform: 'Starting defining of the symbolic links to the libraries...'.
+        self getLibraryFileNames value do:
+        [:libPath|       
+            self executeCommand: 'ln -s ', libPath , ' ', libPath asFilename head inDirectory: dir
+        ].
+        task := nil. 
     ]
 
-
-
-
 !
 
-createSymbolicLinksToTheResourcesIn: dir
-    "creates the symbolic links to the resources"
+getBlockForCreatingSymbolicLinksToTheResourcesIn: dir
+    "returns the block for creating the symbolic links to the resources"
 
-    (Aspects at: #linkRCFiles) value
-    ifTrue:
-    [                
-        self executeCommand: 
-            'ln -s ', 
-            ((Aspects at: #libraryDirectory) value asFilename construct: '*.rc') name, ' ', 
-            (Aspects at: #targetDirectory) value inDirectory: dir.
-    ].
-    (Aspects at: #linkResources) value
-    ifTrue:
-    [ 
-        self executeCommand: 
-            'cp -r -d ', 
-            ((Aspects at: #libraryDirectory) value asFilename construct: 'resources') name, ' ', 
-            (Aspects at: #targetDirectory) value inDirectory: dir.
-    ].
-    (Aspects at: #linkSources) value
-    ifTrue:
-    [ 
-        self executeCommand: 
-            'cp -r -d ', 
-            ((Aspects at: #libraryDirectory) value asFilename construct: 'source') name, ' ', 
-            (Aspects at: #targetDirectory) value inDirectory: dir.
-    ].
-    (Aspects at: #linkBitmaps) value
-    ifTrue:
-    [ 
-        self executeCommand: 
-            'cp -r -d ', 
-            ((Aspects at: #libraryDirectory) value asFilename construct: 'bitmaps') name, ' ', 
-            (Aspects at: #targetDirectory) value inDirectory: dir.
-    ].
-
-
-!
-
-executeCommand: aCommand inDirectory: dir
-    "executes aCommand in directory dir; put aCommand and the result into the shell view"
-
-    |outStream|
-
-    shellView directory: dir.
-    shellView append: shellView getDirectoryTextString, ' ', aCommand.
-
-    outStream:= PipeStream readingFrom: aCommand errorDisposition:#inline inDirectory: dir.
-    [      
-        outStream canReadWithoutBlocking
+    ^
+    [
+        self inform: 'Starting linking of the resources...'.
+        (aspects at: #linkRCFiles) value
+        ifTrue:
+        [                
+            self executeCommand: 
+                'ln -s ', 
+                ((aspects at: #libraryDirectory) value asFilename construct: '*.rc') name, ' ', 
+                (aspects at: #targetDirectory) value inDirectory: dir.
+        ].
+        (aspects at: #linkResources) value
         ifTrue:
-        [
-            outStream readWait.
-            shellView append: shellView getDirectoryTextString, ' ',
-                (Text string: (outStream upTo: Character cr) color: Color red).
+        [ 
+            self executeCommand: 
+                'cp -r -d ', 
+                ((aspects at: #libraryDirectory) value asFilename construct: 'resources') name, ' ', 
+                (aspects at: #targetDirectory) value inDirectory: dir.
         ].
-    ] doWhile:[outStream atEnd not].
-
-    outStream close
+        (aspects at: #linkSources) value
+        ifTrue:
+        [ 
+            self executeCommand: 
+                'cp -r -d ', 
+                ((aspects at: #libraryDirectory) value asFilename construct: 'source') name, ' ', 
+                (aspects at: #targetDirectory) value inDirectory: dir.
+        ].
+        (aspects at: #linkBitmaps) value
+        ifTrue:
+        [ 
+            self executeCommand: 
+                'cp -r -d ', 
+                ((aspects at: #libraryDirectory) value asFilename construct: 'bitmaps') name, ' ', 
+                (aspects at: #targetDirectory) value inDirectory: dir.
+        ].
+        task := nil.
+    ]
 
 !
 
-generateCFileWithModulesIn: dir
-    "generates a C-file with the modules in directory dir"
+getBlockForGeneratingCFileWithModulesIn: dir
+    "returns the block for generating a C-file with the modules in directory dir"
 
-    |selectionOfLibraries|
+    ^
+    [
+        |selectionOfLibraries|
+
+        self inform: 'Starting generation of the C-file with modules...'.
 
-    selectionOfLibraries := self getModuleNames.
-    self executeCommand: 'echo "#include <stcIntern.h>" > modulList.c' inDirectory: dir.
-    self executeCommand: 'echo "typedef void (*vf)();" >> modulList.c' inDirectory: dir.
-    selectionOfLibraries do:
-    [:lib|
-        self executeCommand: 'echo "extern void _', lib, '_Init();" >> modulList.c' inDirectory: dir.
-    ].
-    self executeCommand: 'echo "static vf modules[] = {" >> modulList.c' inDirectory: dir.
-    selectionOfLibraries do:
-    [:lib|
-        self executeCommand: 'echo "_', lib, '_Init," >> modulList.c' inDirectory: dir.
-    ].
-    self executeCommand: 'echo "(vf)0};" >> modulList.c' inDirectory: dir.
-    self executeCommand: 'echo "vf *__modules__ = modules;" >> modulList.c' inDirectory: dir
+        selectionOfLibraries := self getModuleNames.
+        self executeCommand: 'echo "#include <stcIntern.h>" > modulList.c' inDirectory: dir.
+        self executeCommand: 'echo "typedef void (*vf)();" >> modulList.c' inDirectory: dir.
+        selectionOfLibraries do:
+        [:lib|
+            self executeCommand: 'echo "extern void _', lib, '_Init();" >> modulList.c' inDirectory: dir.
+        ].
+        self executeCommand: 'echo "static vf modules[] = {" >> modulList.c' inDirectory: dir.
+        selectionOfLibraries do:
+        [:lib|
+            self executeCommand: 'echo "_', lib, '_Init," >> modulList.c' inDirectory: dir.
+        ].
+        self executeCommand: 'echo "(vf)0};" >> modulList.c' inDirectory: dir.
+        self executeCommand: 'echo "vf *__modules__ = modules;" >> modulList.c' inDirectory: dir.
 
+        (dir asFilename construct: 'modulList.c') exists
+            ifTrue:  [task := nil]
+            ifFalse: [self warn:'Could not generate the C-file with libraries!!']
+    ]
 
 !
 
-generateHFileWithSymbolsIn: dir
-    "generates a H-file with the symbols in directory dir"
+getBlockForGeneratingHFileWithSymbolsIn: dir
+    "returns the block for generating a H-file with the symbols in directory dir"
+
+    ^
+    [
+        |symbolsFile realInc|
+
+        self inform: 'Starting generation of the h-file with symbols...'.
 
-    |symbolsFile realInc|
-    ByteCodeCompiler stcCompilationIncludes asArrayOfSubstrings do:
-    [:inc|
-        realInc := inc readStream.
-        realInc upTo: $/. 
-        realInc := '/', realInc upToEnd.      
-        (symbolsFile := realInc asFilename construct: 'symbols.stc') exists
-        ifTrue:
-        [   
-            self executeCommand: 'echo "char *__symbols[] = {" > symbols.h' inDirectory: dir.
-            self executeCommand: 'sed ''s/^/"/'' < ', symbolsFile name,' | sed ''s/$/",/'' | sed ''s/\\/\\\\/g'' >> symbols.h' inDirectory: dir.
-            self executeCommand: 'echo "0 };" >> symbols.h' inDirectory: dir.
-        ]
-    ].
-    ^nil
+        ByteCodeCompiler stcCompilationIncludes asArrayOfSubstrings do:
+        [:inc|
+            realInc := inc readStream.
+            realInc upTo: $/. 
+            realInc := '/', realInc upToEnd.      
+            (symbolsFile := realInc asFilename construct: 'symbols.stc') exists
+            ifTrue:
+            [   
+                self executeCommand: 'echo "char *__symbols[] = {" > symbols.h' inDirectory: dir.
+                self executeCommand: 'sed ''s/^/"/'' < ', symbolsFile name,' | sed ''s/$/",/'' | sed ''s/\\/\\\\/g'' >> symbols.h' inDirectory: dir.
+                self executeCommand: 'echo "0 };" >> symbols.h' inDirectory: dir.
+            ]
+        ].
 
-
+        (dir asFilename construct: 'symbols.h') exists
+            ifTrue:  [task := nil]
+            ifFalse: [self warn:'Could not generate the h-file with symbols!!']
+    ]
 
 !
 
-inform: aString
-    "outputs aString via shell view as information"
-
-    shellView commandInputField contents: aString
-
+getBlockForLinkingLibrariesToTheApplicationIn: dir
+    "returns the block for linking the libraries to the application"
 
-
+    ^
+    [
+        |appName command|
 
-!
+        self inform: 'Starting linking of the libraries to the application...'.
 
-linkLibrariesToTheApplicationIn: dir
-    "links the libraries to the application"
+        appName := (aspects at: #applicationName) value.
 
-    |appName command|
-
-    appName := (Aspects at: #applicationName) value.
+        command := ByteCodeCompiler ccPath,
+            ' ', (aspects at: #applicationLinkDefines) value, ' ',
+            ' -o ' , appName,
+            ' modulList.o main.o ', 
+            ((aspects at: #libraryDirectory) value asFilename construct: 'librun', ObjectFileLoader sharedLibraryExtension) name, ' ',
+            ((self getLibraryFileNames, (aspects at: #systemLibraries) value) asStringCollection asStringWith: $ ).
 
-    command := ByteCodeCompiler ccPath,
-        ' ', (Aspects at: #applicationLinkDefines) value, ' ',
-        ' -o ' , appName,
-        ' modulList.o main.o ', 
-        ((Aspects at: #libraryDirectory) value asFilename construct: 'librun', ObjectFileLoader sharedLibraryExtension) name, ' ',
-        ((self getLibraryFileNames, (Aspects at: #systemLibraries) value) asStringCollection asStringWith: $ ).
+        self executeCommand: command inDirectory: dir.
 
-    self executeCommand: command inDirectory: dir
-
-
-
+        (dir asFilename construct: (aspects at: #applicationName) value) exists
+            ifTrue:  [task := nil]
+            ifFalse: [self warn:'Could not build the application!!']
+    ]
 
 ! !
 
@@ -1095,46 +1137,33 @@
 
     |library libraries|
 
-    (changedObject == (Aspects at: #stxLibrary)) 
+    changedObject == (aspects at: #stxLibrary ifAbsent: nil) 
     ifTrue: 
     [                
-        libraries := (Aspects at: #stxLibraries) value.
-        (Aspects at: #stxLibrary) value size = 0 ifTrue: [libraries remove: (Aspects at: #oldSTXLibrary) value ifAbsent: nil].
-        (Aspects at: #oldSTXLibrary) value: (library := (Aspects at: #stxLibrary) value).
-        (libraries includes: library) not &
-        library notEmpty
-        ifTrue:
-        [   
-            libraries addFirst: library
-        ]
+        libraries := (aspects at: #stxLibraries) value.
+        (aspects at: #stxLibrary) value size = 0 ifTrue: [libraries remove: (aspects at: #oldSTXLibrary) value ifAbsent: nil].
+        (aspects at: #oldSTXLibrary) value: (library := (aspects at: #stxLibrary) value).
     ].
-   (changedObject == (Aspects at: #systemLibrary)) 
+    changedObject == (aspects at: #systemLibrary) 
     ifTrue: 
     [                
-        libraries := (Aspects at: #systemLibraries) value.
-        (Aspects at: #systemLibrary) value size = 0 ifTrue: [libraries remove: (Aspects at: #oldSystemLibrary) value ifAbsent: nil].
-        (Aspects at: #oldSystemLibrary) value: (library := (Aspects at: #systemLibrary) value).
-        (libraries includes: library) not &
-        library notEmpty
-        ifTrue:
-        [   
-            libraries addFirst: library
-        ]
+        libraries := (aspects at: #systemLibraries) value.
+        (aspects at: #systemLibrary) value size = 0 ifTrue: [libraries remove: (aspects at: #oldSystemLibrary) value ifAbsent: nil].
+        (aspects at: #oldSystemLibrary) value: (library := (aspects at: #systemLibrary) value).
     ].
-    (changedObject == (Aspects at: #userLibrary)) 
+    changedObject == (aspects at: #userLibrary ifAbsent: nil) 
     ifTrue: 
     [                
-        libraries := (Aspects at: #userLibraries) value.
-        (Aspects at: #userLibrary) value size = 0 ifTrue: [libraries remove: (Aspects at: #oldUserLibrary) value ifAbsent: nil].
-        (Aspects at: #oldUserLibrary) value: (library := (Aspects at: #userLibrary) value).
-        (libraries includes: library) not &
-        library notEmpty
-        ifTrue:
-        [   
-            libraries addFirst: library
-        ]
+        libraries := (aspects at: #userLibraries) value.
+        (aspects at: #userLibrary) value size = 0 ifTrue: [libraries remove: (aspects at: #oldUserLibrary) value ifAbsent: nil].
+        (aspects at: #oldUserLibrary) value: (library := (aspects at: #userLibrary) value).
     ].
-
+    (libraries includes: library) not &
+    library notEmpty
+    ifTrue:
+    [   
+        libraries addFirst: library
+    ]
 
 
 
@@ -1151,55 +1180,48 @@
 
     super initialize.
 
-    Aspects := Aspects ? IdentityDictionary new.
+    aspects := self class aspects.
 
     homeDir := Filename homeDirectory asFilename.
 
+    self aspectsAt: #topDirectory      putFirst: (homeDir construct: 'stx') name.
+    self aspectsAt: #systemLibraries   putFirst: ObjectFileLoader searchedLibraries.
+    (aspects at: #systemLibrary        put: ((aspects at: #systemLibraries) value at: 1 ifAbsent: '') asValue) addDependent: self.
+    self aspectsAt: #oldSystemLibrary putFirst: (aspects at: #systemLibrary) value.
+    self aspectsAt: #configuration     putFirst: Smalltalk configuration.
+
+    self class ~~ ApplicationBuilder ifTrue: [^nil].
+
     self aspectsAt: #applicationName   putFirst: 'application'.
     self aspectsAt: #startupMessage    putFirst: 'Smalltalk start'.
     self aspectsAt: #startupCFile      putFirst: (homeDir construct: 'stx/librun/main.c') name.
-    self aspectsAt: #topDirectory      putFirst: (homeDir construct: 'stx') name.
+
     self aspectsAt: #targetDirectory   putFirst: (homeDir construct: 'stx/projects/application') name.
     self aspectsAt: #libraryDirectory  putFirst: (homeDir construct: 'stx/projects/smalltalk') name.
 
     self aspectsAt: #stxLibraries      putFirst: 
         (ObjectMemory binaryModuleInfo collect: [:binMoInfo| (binMoInfo name copy reverse upTo: $ ) reverse]) asSortedCollection.
-    self aspectsAt: #systemLibraries   putFirst: ObjectFileLoader searchedLibraries.
+
     self aspectsAt: #userLibraries     putFirst: OrderedCollection new.
 
-    Aspects at:     #buildDate         put:      Date today printString, ' ', Time now printString.
-    self aspectsAt: #configuration     putFirst: Smalltalk configuration.
+    aspects at:     #buildDate         put:      Date today printString, ' ', Time now printString.
 
     self aspectsAt: #linkRCFiles       putFirst: true.
     self aspectsAt: #linkResources     putFirst: true.
     self aspectsAt: #linkSources       putFirst: true.
     self aspectsAt: #linkBitmaps       putFirst: true.
 
-    (Aspects at: #stxLibrary           put: ((Aspects at: #stxLibraries)    value at: 1 ifAbsent: '') asValue) addDependent: self.
-    (Aspects at: #systemLibrary        put: ((Aspects at: #systemLibraries) value at: 1 ifAbsent: '') asValue) addDependent: self.
-    (Aspects at: #userLibrary          put: ((Aspects at: #userLibraries)   value at: 1 ifAbsent: '') asValue) addDependent: self.
+    (aspects at: #stxLibrary           put: ((aspects at: #stxLibraries)    value at: 1 ifAbsent: '') asValue) addDependent: self.
+    (aspects at: #userLibrary          put: ((aspects at: #userLibraries)   value at: 1 ifAbsent: '') asValue) addDependent: self.
 
-    self aspectsAt: #oldSTXLibrary    putFirst: (Aspects at: #stxLibrary) value.
-    self aspectsAt: #oldSystemLibrary putFirst: (Aspects at: #systemLibrary) value.
-    self aspectsAt: #oldUserLibrary   putFirst: (Aspects at: #userLibrary) value.
+    self aspectsAt: #oldSTXLibrary    putFirst: (aspects at: #stxLibrary) value.
+    self aspectsAt: #oldUserLibrary   putFirst: (aspects at: #userLibrary) value.
 
     self aspectsAt: #applicationLinkDefines putFirst: '-L/usr/X11/lib -Llib -Lbinary -L. -L/usr/local/lib -L/usr/lib -L/lib -lm -ldl -lXext -lX11'.
 ! !
 
 !ApplicationBuilder methodsFor:'queries'!
 
-getApplicationDirectory
-    "returns the directory of the application; if not present, create it"
-
-    |appDir|
-
-    (appDir := (Aspects at: #targetDirectory) value asFilename) exists ifFalse:[appDir makeDirectory].   
-    (appDir isReadable and:[appDir isWritable]) ifFalse: [^nil].
-
-    ^appDir name
-
-!
-
 getCompilerFlags
     "returns the defines of the OS and the compiler flags of the ByteCodeCompiler"
 
@@ -1225,18 +1247,18 @@
 
     libraryFileNames := OrderedCollection new.
 
-    (Aspects at: #stxLibraries) value do:
+    (aspects at: #stxLibraries) value do:
     [:lib|
         |abbrevLib libPath|
         abbrevLib  := lib.
         lib = 'GLXWorkstation'   ifTrue: [abbrevLib := 'GLXWorkstat'].
         lib = 'XWorkstation'     ifTrue: [abbrevLib := 'XWorkstat'  ].
         lib = 'ObjectFileLoader' ifTrue: [abbrevLib := 'ObjFLoader' ].
-        (libPath := (Aspects at: #libraryDirectory) value asFilename construct: abbrevLib, ObjectFileLoader sharedLibraryExtension) exists
+        (libPath := (aspects at: #libraryDirectory) value asFilename construct: abbrevLib, ObjectFileLoader sharedLibraryExtension) exists
             ifTrue: [libraryFileNames add: libPath name]
     ].
 
-    ^libraryFileNames, (Aspects at: #userLibraries) value
+    ^libraryFileNames, (aspects at: #userLibraries) value
 
 !
 
@@ -1246,12 +1268,25 @@
     |moduleNames|
 
     moduleNames := OrderedCollection new.
-    (Aspects at: #userLibraries) value do:
+    (aspects at: #userLibraries) value do:
     [:lib|
         lib asFilename exists ifTrue: [moduleNames add: (lib asFilename baseName upTo: $.)]
     ].
 
-    ^(Aspects at: #stxLibraries) value, moduleNames
+    ^(aspects at: #stxLibraries) value, moduleNames
+!
+
+getTargetDirectory
+    "returns the directory of the application; if not present, create it"
+
+    |targetDirectory|
+
+    (targetDirectory := (aspects at: #targetDirectory) value asFilename) exists ifFalse:[targetDirectory makeDirectory].   
+    (targetDirectory isReadable and:[targetDirectory isWritable]) ifFalse: [^nil].
+
+    ^targetDirectory name
+
+
 ! !
 
 !ApplicationBuilder methodsFor:'startup / release'!
@@ -1260,7 +1295,7 @@
     "close request; before closing stop the running build, then release the dependents of all aspects"
 
     self doStop.
-    Aspects do: [:aspect| aspect release].
+    aspects do: [:aspect| aspect release].
 
     super closeRequest
 
@@ -1269,5 +1304,5 @@
 !ApplicationBuilder class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/ApplicationBuilder.st,v 1.1 1998-03-31 18:22:48 tz Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/ApplicationBuilder.st,v 1.2 1998-04-02 19:02:02 tz Exp $'
 ! !