cg@2596: "{ Package: 'stx:libtool2' }" cg@2596: cg@2635: "{ NameSpace: Tools }" cg@2635: cg@2596: Object subclass:#ProjectBuilder cg@2596: instanceVariableNames:'package projectDefinitionClass sourceCodeManager buildDirectory cg@2673: myWorkingDirectory mySTXTopDirectory myTopDirectory outputStream cg@2673: makeExeOnly' cg@2596: classVariableNames:'PreviousBuildDirectory' cg@2596: poolDictionaries:'' cg@2596: category:'System-Support-Projects' cg@2596: ! cg@2596: cg@2596: cg@2633: !ProjectBuilder class methodsFor:'accessing'! cg@2633: cg@2633: previousBuildDirectory cg@2633: ^ PreviousBuildDirectory cg@2633: ! cg@2633: cg@2633: previousBuildDirectory:something cg@2633: PreviousBuildDirectory := something. cg@2633: ! ! cg@2633: cg@2596: !ProjectBuilder class methodsFor:'examples'! cg@2596: cg@2644: example1 cg@2644: Smalltalk loadPackage:'stx:projects/helloWorldApp' asAutoloaded:true. cg@2644: cg@2644: self new cg@2644: package:'stx:projects/helloWorldApp'; cg@2644: build cg@2622: ! cg@2622: cg@2644: example2 cg@2644: |builder| cg@2644: cg@2644: Smalltalk loadPackage:'stx:clients/Demos/foxCalcApplication' asAutoloaded:true. cg@2644: cg@2644: builder := self new. cg@2644: builder package:'stx:clients/Demos/foxCalcApplication'. cg@2644: builder build. cg@2644: cg@2644: UserPreferences fileBrowserClass openOnDirectory:builder packageBuildDirectory. cg@2596: ! ! cg@2596: cg@2596: !ProjectBuilder methodsFor:'accessing'! cg@2596: cg@2644: buildDirectory cg@2644: ^ buildDirectory cg@2622: ! cg@2622: cg@2634: buildDirectory:something cg@2634: buildDirectory := something. cg@2634: ! cg@2634: cg@2673: makeExeOnly:aBoolean cg@2673: makeExeOnly := aBoolean. cg@2673: ! cg@2673: cg@2644: package:aPackageIDOrSymbol cg@2644: package := aPackageIDOrSymbol asPackageId. cg@2596: ! cg@2596: cg@2644: packageBuildDirectory cg@2644: "the directoray, where the deployable binary is created (xxxSetup.exe)" cg@2622: cg@2622: ^ buildDirectory / (package asPackageId module) / (package asPackageId directory) cg@2635: ! cg@2635: cg@2644: projectDefinitionClass:something cg@2644: projectDefinitionClass := something. cg@2596: ! ! cg@2596: cg@2596: !ProjectBuilder methodsFor:'building'! cg@2596: cg@2644: build cg@2644: "/ intermediate - this will move into a commonly used utility class cg@2635: "/ (where all the project code support will be collected). cg@2635: cg@2647: |makeOutput| cg@2647: cg@2647: makeOutput := TextStream on:(Text new:10000). cg@2647: self buildWithColorizedOutputTo:makeOutput. cg@2647: cg@2647: TextView openWith:makeOutput contents. cg@2647: ! cg@2647: cg@2647: buildWithColorizedOutputTo:makeOutput cg@2647: "/ intermediate - this will move into a commonly used utility class cg@2647: "/ (where all the project code support will be collected). cg@2647: cg@2647: |stdOut stdErr lock| cg@2635: cg@2644: lock := Semaphore forMutualExclusion. cg@2647: cg@2644: stdErr := ActorStream new cg@2644: nextPutBlock:[:char | cg@2644: lock critical:[ cg@2644: makeOutput emphasis:{#backgroundColor->Color red. #color->Color white.}. cg@2644: makeOutput nextPut:char. cg@2644: makeOutput emphasis:nil. cg@2644: ] cg@2644: ]; cg@2644: nextPutAllBlock:[:char | cg@2644: lock critical:[ cg@2644: makeOutput emphasis:{#backgroundColor->Color red. #color->Color white.}. cg@2644: makeOutput nextPutAll:char. cg@2644: makeOutput emphasis:nil. cg@2644: ] cg@2644: ]. cg@2644: stdOut := ActorStream new cg@2644: nextPutBlock:[:char | cg@2644: lock critical:[ cg@2644: makeOutput nextPut:char. cg@2644: ] cg@2644: ]; cg@2644: nextPutAllBlock:[:char | cg@2644: lock critical:[ cg@2644: makeOutput nextPutAll:char. cg@2644: ] cg@2644: ]. cg@2635: cg@2644: self buildWithOutputTo:stdOut errorTo:stdErr. cg@2611: ! cg@2611: cg@2611: buildWithOutputTo:stdOut errorTo:stdErr cg@2611: "/ intermediate - this will move into a commonly used utility class cg@2611: "/ (where all the project code support will be collected). cg@2611: cg@2596: |module directory| cg@2596: cg@2596: projectDefinitionClass := ProjectDefinition definitionClassForPackage:package. cg@2596: projectDefinitionClass isNil ifTrue:[ cg@2596: self error:('Missing ProjectDefinition class for "',package asString,'"') cg@2596: ]. cg@2596: cg@2596: "/ ensure that everything is loaded... cg@2596: projectDefinitionClass loadAsAutoloaded:false. cg@2596: projectDefinitionClass loadExtensions. cg@2596: projectDefinitionClass loadAllClassesAsAutoloaded:false. cg@2596: cg@2596: module := package module. cg@2596: directory := package directory. cg@2596: cg@2596: buildDirectory isNil ifTrue:[ cg@2634: buildDirectory := PreviousBuildDirectory ifNil:[ UserPreferences current buildDirectory ]. cg@2634: buildDirectory isNil ifTrue:[ cg@2634: buildDirectory := Filename tempDirectory construct:'stx_build'. cg@2634: ]. cg@2596: ]. cg@2596: buildDirectory := buildDirectory asFilename. cg@2596: cg@2596: "/ self validateBuildDirectoryIsPresent. cg@2596: cg@2596: PreviousBuildDirectory := buildDirectory. cg@2596: cg@2596: "/ UserPreferences current localBuild:true cg@2596: UserPreferences current localBuild ifFalse:[ cg@2596: SourceCodeManager notNil ifTrue:[ cg@2596: sourceCodeManager := SourceCodeManagerUtilities sourceCodeManagerFor:projectDefinitionClass. cg@2596: ] cg@2596: ]. cg@2596: sourceCodeManager := nil. cg@2596: cg@2598: myTopDirectory := cg@2596: Smalltalk packagePath cg@2596: detect:[:aPath | cg@2596: (aPath asFilename / 'stx' / 'include') exists cg@2596: and: [ (aPath asFilename / 'stx' / 'rules') exists ]] cg@2596: ifNone:nil. cg@2598: myTopDirectory isNil ifTrue:[ cg@2598: self error:('Cannot figure out my top directory (where stx/include and stx/rules are)') cg@2596: ]. cg@2598: myTopDirectory := myTopDirectory asFilename. cg@2598: mySTXTopDirectory := myTopDirectory / 'stx'. cg@2613: cg@2596: self setupBuildDirectory. cg@2628: self activityNotification:'Generating stc directory...'. cg@2599: self copySTCDirectoryForBuild. cg@2628: self activityNotification:'Generating source files...'. cg@2596: self generateSourceFiles. cg@2672: self activityNotification:'Copying dlls for linkage...'. cg@2600: self copyDLLsForLinkage. cg@2672: self activityNotification:'Copying support files for linkage...'. cg@2600: self copySupportFilesForLinkage. cg@2600: self copyStartupFilesFromSmalltalk. cg@2596: cg@2628: self activityNotification:'Executing make...'. cg@2611: self makeWithOutputTo:stdOut errorTo:stdErr. cg@2596: ! cg@2596: cg@2644: copyDLLsForLinkage cg@2644: |targetBuildDir| cg@2644: cg@2644: targetBuildDir := buildDirectory / package module / package directory. cg@2644: cg@2644: (projectDefinitionClass allPreRequisites) cg@2644: do:[:eachPackageToFileout | cg@2644: |packageId packageDef packageModule packageDirectory packageTargetDir cg@2644: dllSource dllSourceDir libraryName dllRelativePath| cg@2644: cg@2644: packageId := eachPackageToFileout asPackageId. cg@2644: packageModule := packageId module. cg@2644: packageDirectory := packageId directory. cg@2644: packageTargetDir := (buildDirectory / packageModule / packageDirectory) recursiveMakeDirectory. cg@2644: cg@2644: packageDef := packageId projectDefinitionClass. cg@2644: libraryName := packageDef libraryName. cg@2644: cg@2644: "/ mhmh - take them from my tree or from the projects/smalltalk execution directory ?? cg@2644: dllSourceDir := myTopDirectory / packageModule / packageDirectory. cg@2644: OperatingSystem isMSWINDOWSlike ifTrue:[ cg@2644: "/ dllRelativePath := 'objvc','/',(libraryName,'.dll'). cg@2644: "/ (dllSourceDir / dllRelativePath) exists cg@2644: false ifFalse:[ cg@2644: dllRelativePath := 'objbc','/',(libraryName,'.dll'). cg@2644: ] cg@2644: ] ifFalse:[ cg@2644: dllRelativePath := libraryName,'.so'. cg@2644: ]. cg@2644: ((packageTargetDir / dllRelativePath) exists cg@2644: and:[ (dllSourceDir / dllRelativePath) fileSize = (packageTargetDir / dllRelativePath) fileSize cg@2644: and:[ (dllSourceDir / dllRelativePath) modificationTime < (packageTargetDir / dllRelativePath) modificationTime cg@2644: "/ and:[ (dllSourceDir / dllRelativePath) sameContentsAs:(packageTargetDir / dllRelativePath) ] cg@2644: ]]) ifFalse:[ cg@2644: (packageTargetDir / dllRelativePath) directory recursiveMakeDirectory. cg@2644: (dllSourceDir / dllRelativePath) copyTo:(packageTargetDir / dllRelativePath). cg@2644: ] cg@2644: ]. cg@2644: ! cg@2644: cg@2644: copyDirectory:relativepath cg@2644: "/ need rules in stx cg@2644: ((Smalltalk projectDirectoryForPackage:'stx') asFilename construct:relativepath) cg@2644: recursiveCopyTo:(buildDirectory construct:'stx'). cg@2644: ! cg@2644: cg@2644: copyDirectoryForBuild:subdir cg@2644: |targetDir targetFile| cg@2644: cg@2644: targetDir := buildDirectory / 'stx' / subdir. cg@2644: targetDir exists ifFalse:[ cg@2644: targetDir makeDirectory. cg@2644: ]. cg@2644: (mySTXTopDirectory / subdir) directoryContentsAsFilenamesDo:[:eachFile | cg@2644: eachFile isDirectory ifFalse:[ cg@2644: targetFile := targetDir / eachFile baseName. cg@2644: (targetFile exists not cg@2644: or:[ targetFile modificationTime < eachFile modificationTime ]) ifTrue:[ cg@2644: self activityNotification:'copying ',eachFile pathName,'...'. cg@2644: eachFile copyTo:(targetDir construct:eachFile baseName) cg@2644: ] cg@2644: ]. cg@2644: ]. cg@2644: self activityNotification:nil cg@2644: ! cg@2644: cg@2644: copyResourcesForPackage:aPackage cg@2644: |module directory| cg@2644: cg@2644: module := aPackage asPackageId module. cg@2644: directory := aPackage asPackageId directory. cg@2644: cg@2644: (myTopDirectory / module / directory / 'resources' ) exists ifTrue:[ cg@2644: (myTopDirectory / module / directory / 'resources' ) cg@2644: recursiveCopyTo:(buildDirectory / module / directory) cg@2644: ]. cg@2644: (myTopDirectory / module / directory / 'styles' ) exists ifTrue:[ cg@2644: (myTopDirectory / module / directory / 'styles' ) cg@2644: recursiveCopyTo:(buildDirectory / module / directory) cg@2644: ]. cg@2644: ! cg@2644: cg@2644: copySTCDirectoryForBuild cg@2644: |targetDir stc files| cg@2644: cg@2644: targetDir := buildDirectory / 'stx' / 'stc'. cg@2644: targetDir exists ifFalse:[ targetDir makeDirectory ]. cg@2644: cg@2644: stc := OperatingSystem isMSWINDOWSlike cg@2644: ifTrue:[ 'stc.exe' ] cg@2644: ifFalse:[ 'stc' ]. cg@2644: cg@2644: files := #( ) copyWith:stc. cg@2644: cg@2644: files do:[:eachFile | cg@2644: |sourceFile targetFile| cg@2644: cg@2644: sourceFile := mySTXTopDirectory / 'stc' / eachFile. cg@2644: targetFile := targetDir / eachFile. cg@2644: (targetFile exists not cg@2644: or:[ targetFile modificationTime < sourceFile modificationTime ]) ifTrue:[ cg@2644: self activityNotification:'copying ',sourceFile pathName,'...'. cg@2644: sourceFile copyTo:targetFile cg@2644: ]. cg@2644: ]. cg@2644: self activityNotification:nil cg@2644: ! cg@2644: cg@2644: copyStartupFilesFromSmalltalk cg@2644: (buildDirectory / 'stx' / 'projects/smalltalk' ) exists ifFalse:[ cg@2644: (buildDirectory / 'stx' / 'projects/smalltalk' ) recursiveMakeDirectory. cg@2644: ]. cg@2644: cg@2644: #( 'keyboard.rc' 'keyboardMacros.rc' 'display.rc' 'd_win32.rc' cg@2644: 'host.rc' 'h_win32.rc' cg@2644: ) do:[:fn | cg@2644: (myTopDirectory / 'stx' / 'projects/smalltalk' / fn) cg@2644: copyTo: (buildDirectory / 'stx' / 'projects/smalltalk' / fn) cg@2644: ] cg@2644: ! cg@2644: cg@2644: copySupportFilesForLinkage cg@2644: |files| cg@2644: cg@2644: OperatingSystem isMSWINDOWSlike ifTrue:[ cg@2644: files := #( cg@2644: 'support/win32/borland/cs3245.dll' cg@2644: 'support/win32/X11.dll' cg@2644: 'support/win32/Xext.dll' cg@2644: 'librun/librun.dll' cg@2644: 'libbc/librun.lib' cg@2644: 'libbc/cs32i.lib' cg@2644: 'librun/genDate.exe' cg@2644: 'librun/main.c' cg@2673: 'projects/smalltalk/stx_16x16.ico' cg@2673: 'projects/smalltalk/stx_32x32.ico' cg@2673: 'projects/smalltalk/stx_splash.bmp' cg@2644: ). cg@2644: ] ifFalse:[ cg@2644: files := #( cg@2644: 'librun/genDate' cg@2644: 'librun/main.c' cg@2644: 'librun/librun.so' cg@2644: ) cg@2644: ]. cg@2644: cg@2644: files do:[:dllRelativePath | cg@2644: ((buildDirectory / 'stx' / dllRelativePath) exists cg@2644: and:[ (mySTXTopDirectory / dllRelativePath) fileSize = (buildDirectory / 'stx' / dllRelativePath) fileSize cg@2644: and:[ (mySTXTopDirectory / dllRelativePath) modificationTime < (buildDirectory / 'stx' / dllRelativePath) modificationTime cg@2644: "/ and:[ (mySTXTopDirectory / dllRelativePath) sameContentsAs:(targetBuildDir / dllRelativePath) ] cg@2644: ]]) ifFalse:[ cg@2644: (buildDirectory / 'stx' / dllRelativePath) directory recursiveMakeDirectory. cg@2644: (mySTXTopDirectory / dllRelativePath) copyTo:(buildDirectory / 'stx' / dllRelativePath). cg@2614: ] cg@2614: ]. cg@2600: ! cg@2600: cg@2644: createHeaderFileFor:aClass in:packageTargetDir cg@2644: |instVarList classInstVarList classVarList bindings superclassFilename cg@2644: template file newContents oldContents| cg@2644: cg@2644: instVarList := StringCollection new. cg@2644: aClass instVarNames do:[:v | cg@2644: instVarList add:('OBJ %1;' bindWith:v) cg@2644: ]. cg@2644: classInstVarList := StringCollection new. cg@2644: aClass class instVarNames do:[:v | cg@2644: (v includes:$_) ifTrue:[self halt]. cg@2644: classInstVarList add:('OBJ %1;' bindWith:v) cg@2644: ]. cg@2644: classVarList := StringCollection new. cg@2644: aClass classVarNames do:[:v | cg@2644: classVarList add:('extern OBJ %1_%2;' bindWith:aClass name with:v) cg@2644: ]. cg@2614: cg@2644: bindings := Dictionary new. cg@2644: bindings at:'ClassName' put:aClass name. cg@2644: aClass superclass isNil ifTrue:[ cg@2644: bindings at:'SuperclassName' put:'-'. cg@2644: bindings at:'SuperclassFileInclude' put:nil. cg@2644: ] ifFalse:[ cg@2644: bindings at:'SuperclassName' put:aClass superclass name. cg@2644: bindings at:'SuperclassFileName' put:(superclassFilename := Smalltalk fileNameForClass:aClass superclass). cg@2644: bindings at:'SuperclassFileInclude' put:('#include "%1.STH"' bindWith:superclassFilename). cg@2644: ]. cg@2644: bindings at:'InstVarList' put:instVarList asString. cg@2644: bindings at:'ClassVarList' put:classVarList asString. cg@2644: bindings at:'ClassInstVarList' put:classInstVarList asString. cg@2644: cg@2644: template := cg@2644: '/* This file was generated by ProjectBuilder. */ cg@2644: /* !!!!!!!! Do not change by hand !!!!!!!! */ cg@2644: cg@2644: /* Class: %(ClassName) */ cg@2644: /* Superclass: %(SuperclassName) */ cg@2644: cg@2644: %(SuperclassFileInclude) cg@2644: cg@2644: /* INDIRECTGLOBALS */ cg@2644: #ifdef _HEADER_INST_ cg@2644: %(InstVarList) cg@2644: #endif /* _HEADER_INST_ */ cg@2644: cg@2644: #ifdef _HEADER_CLASS_ cg@2644: %(ClassVarList) cg@2644: #endif /* _HEADER_CLASS_ */ cg@2644: cg@2644: #ifdef _HEADER_CLASSINST_ cg@2644: %(ClassInstVarList) cg@2644: #endif /* _HEADER_CLASSINST_ */ cg@2644: '. cg@2644: newContents := template bindWithArguments:bindings. cg@2644: file := packageTargetDir asFilename / ((Smalltalk fileNameForClass:aClass),'.STH'). cg@2644: (file exists not cg@2644: or:[ (oldContents := file contents) ~= newContents ]) ifTrue:[ cg@2644: file contents: newContents. cg@2644: ]. cg@2614: ! cg@2614: cg@2644: generateSourceFiles cg@2644: sourceCodeManager notNil ifTrue:[ cg@2644: "/ check out / generate files there cg@2644: self generateSourceFilesByCheckingOutUsing:sourceCodeManager cg@2644: ] ifFalse:[ cg@2644: "/ local build cg@2644: "/ fileout the project cg@2644: self generateSourceFilesByFilingOut cg@2644: ] cg@2599: ! cg@2599: cg@2644: generateSourceFilesByCheckingOutUsing:aSourceCodeManager cg@2644: "/ will no longer be needed/supported cg@2644: cg@2644: |repository stxRepository module directory| cg@2644: cg@2644: self halt. cg@2644: "/ check out / generate files there cg@2644: repository := (aSourceCodeManager repositoryNameForModule:module) ifNil:[aSourceCodeManager repositoryName]. cg@2644: stxRepository := aSourceCodeManager repositoryName. cg@2600: cg@2644: (buildDirectory construct:'stx') exists ifFalse:[ cg@2644: (module ~= 'stx') ifTrue:[ cg@2644: OperatingSystem cg@2644: executeCommand:('cvs -d ',stxRepository,' co stx') cg@2644: inputFrom:nil cg@2644: outputTo:Transcript cg@2644: errorTo:Transcript cg@2644: inDirectory:buildDirectory cg@2644: onError:[:status| self error:'cvs update stx failed']. cg@2644: ]. cg@2644: ]. cg@2635: cg@2644: ((buildDirectory construct:module) construct:'CVS') exists ifFalse:[ cg@2644: OperatingSystem cg@2644: executeCommand:('cvs -d ',repository,' co -l ',directory) cg@2644: inputFrom:nil cg@2644: outputTo:Transcript cg@2644: errorTo:Transcript cg@2644: inDirectory:buildDirectory cg@2644: onError:[:status| self error:'cvs update failed']. cg@2644: ]. cg@2644: OperatingSystem cg@2644: executeCommand:'cvs upd -d' cg@2644: inputFrom:nil cg@2644: outputTo:Transcript cg@2644: errorTo:Transcript cg@2644: inDirectory:(buildDirectory construct:module) cg@2644: onError:[:status| self error:'cvs update failed']. cg@2644: self halt. cg@2600: ! cg@2600: cg@2644: generateSourceFilesByFilingOut cg@2644: "/ local build cg@2644: "/ fileout the project cg@2644: cg@2644: (package module ~= 'stx') ifTrue:[ cg@2644: (buildDirectory / package module) makeDirectory. cg@2644: ]. cg@2644: cg@2644: "/ file out the package(s) which are to be built cg@2644: ((Array with:package)) cg@2644: do:[:eachPackageToFileout | cg@2644: |packageId packageModule packageDirectory packageTargetDir packageDef| cg@2644: cg@2644: packageId := eachPackageToFileout asPackageId. cg@2644: packageModule := packageId module. cg@2644: packageDirectory := packageId directory. cg@2644: packageTargetDir := (buildDirectory / packageModule / packageDirectory) recursiveMakeDirectory. cg@2644: cg@2644: packageDef := packageId projectDefinitionClass. cg@2644: (packageDef compiled_classNames_common , cg@2644: packageDef compiled_classNamesForPlatform) do:[:eachClassName | cg@2644: |cls fileName newSource| cg@2644: cg@2644: cls := Smalltalk classNamed:eachClassName. cg@2644: self assert:cls isLoaded. cg@2644: fileName := (Smalltalk fileNameForClass:cls),'.st'. cg@2644: fileName := packageTargetDir asFilename construct:fileName. cg@2644: fileName exists ifTrue:[ cg@2644: newSource := String streamContents:[:s | cls fileOutOn:s withTimeStamp:false]. cg@2644: newSource = fileName contentsAsString ifFalse:[ cg@2644: fileName contents:newSource cg@2644: ]. cg@2644: ] ifFalse:[ cg@2644: cls fileOutIn:packageTargetDir withTimeStamp:false cg@2644: ]. cg@2644: ]. cg@2596: cg@2644: "/ (Smalltalk allClassesInPackage:eachPackageToFileout) do:[:cls | cg@2644: "/ cls isPrivate ifFalse:[ cg@2644: "/ cls isLoaded ifFalse:[ cg@2644: "/ self halt. cg@2644: "/ cls autoload. cg@2644: "/ ]. cg@2644: "/ cls fileOutIn:packageTargetDir cg@2644: "/ ] cg@2644: "/ ]. cg@2644: cg@2644: projectDefinitionClass forEachFileNameAndGeneratedContentsDo:[:fileName :fileContents | cg@2644: ((packageTargetDir / fileName) exists cg@2644: and:[ (packageTargetDir / fileName) contents = fileContents ]) ifFalse:[ cg@2644: (packageTargetDir / fileName) contents:fileContents. cg@2644: ]. cg@2644: ]. cg@2644: ]. cg@2596: cg@2644: "/ generate header files in prerequisite packages... cg@2644: (projectDefinitionClass allPreRequisites) cg@2644: do:[:eachPackageToFileout | cg@2644: |packageId packageDef packageModule packageDirectory packageTargetDir| cg@2644: cg@2644: packageId := eachPackageToFileout asPackageId. cg@2644: packageModule := packageId module. cg@2644: packageDirectory := packageId directory. cg@2644: packageTargetDir := (buildDirectory / packageModule / packageDirectory) recursiveMakeDirectory. cg@2644: cg@2644: packageDef := packageId projectDefinitionClass. cg@2644: (packageDef compiled_classNames_common , cg@2644: packageDef compiled_classNamesForPlatform) do:[:eachClassName | cg@2644: |cls| cg@2644: cg@2644: cls := Smalltalk classNamed:eachClassName. cg@2644: "/ self assert:cls isLoaded. cg@2644: cls isLoaded ifTrue:[ cg@2644: self createHeaderFileFor:cls in:packageTargetDir cg@2644: ]. cg@2644: ]. cg@2644: self copyResourcesForPackage:eachPackageToFileout. cg@2644: ]. cg@2644: cg@2644: "/ stx_libbasic2 preRequisitesForBuilding#(#'stx:libbasic') cg@2596: ! cg@2596: cg@2644: makeWithOutputTo:stdOut errorTo:stdErr cg@2644: |module directory| cg@2644: cg@2644: module := package module. cg@2644: directory := package directory. cg@2644: cg@2644: projectDefinitionClass isLibraryDefinition ifTrue:[ cg@2644: OperatingSystem cg@2644: executeCommand:(ParserFlags makeCommand,' classLibRule') cg@2644: inputFrom:nil cg@2644: outputTo:stdOut cg@2644: errorTo:stdErr cg@2644: inDirectory:(buildDirectory / module / directory) cg@2644: onError:[:status| self error:'make failed']. cg@2644: ] ifFalse:[ cg@2644: OperatingSystem cg@2644: executeCommand:(ParserFlags makeCommand,' exe') cg@2644: inputFrom:nil cg@2644: outputTo:stdOut cg@2644: errorTo:stdErr cg@2644: inDirectory:(buildDirectory / module / directory) cg@2644: onError:[:status| self error:'make failed']. cg@2644: cg@2673: (makeExeOnly ? false) ifFalse:[ cg@2673: OperatingSystem cg@2673: executeCommand:(ParserFlags makeCommand,' setup') cg@2673: inputFrom:nil cg@2673: outputTo:stdOut cg@2673: errorTo:stdErr cg@2673: inDirectory:(buildDirectory / module / directory) cg@2673: onError:[:status| self error:'make failed']. cg@2673: ] cg@2644: ] cg@2596: ! cg@2596: cg@2644: setupBuildDirectory cg@2644: buildDirectory exists ifFalse:[ cg@2644: buildDirectory recursiveMakeDirectory. cg@2644: ]. cg@2644: (buildDirectory / 'stx') exists ifFalse:[ cg@2644: (buildDirectory / 'stx') makeDirectory. cg@2644: ]. cg@2644: cg@2644: self copyDirectoryForBuild:'include'. cg@2644: self copyDirectoryForBuild:'rules'. cg@2611: ! cg@2611: cg@2644: validateBuildDirectoryIsPresent cg@2644: cg@2644: ^ self. cg@2596: cg@2644: "/ [ cg@2644: "/ |default directoryIsOKForMe stc | cg@2644: "/ cg@2644: "/ default := (buildDirectory ? cg@2644: "/ PreviousBuildDirectory) cg@2644: "/ ifNil:[ UserPreferences current buildDirectory]. cg@2644: "/ cg@2644: "/ buildDirectory := Dialog requestDirectoryName:'Temporary Work-ROOT for build:' cg@2644: "/ default:default. cg@2644: "/ cg@2644: "/ buildDirectory isEmptyOrNil ifTrue:[^ self]. cg@2644: "/ buildDirectory := buildDirectory asFilename. cg@2644: "/ directoryIsOKForMe := true. cg@2644: "/ cg@2644: "/ buildDirectory exists ifFalse:[ cg@2644: "/ Dialog warn:(self classResources string:'Work directory %1 does not exist.' with:buildDirectory). cg@2644: "/ directoryIsOKForMe := false. cg@2644: "/ ] ifTrue:[ cg@2644: "/ (buildDirectory construct:'stx') exists ifFalse:[ cg@2644: "/ Dialog warn:(self classResources stringWithCRs:'Work directory must contain an stx subDirectory,\which contains (at least) the stc and include subdirectories.'). cg@2644: "/ directoryIsOKForMe := false. cg@2644: "/ ] ifTrue:[ cg@2644: "/ stc := (OperatingSystem isMSDOSlike) ifTrue:['stc.exe'] ifFalse:['stc']. cg@2644: "/ (((buildDirectory construct:'stx')construct:'stc')construct:stc) exists ifFalse:[ cg@2644: "/ Dialog warn:(self classResources stringWithCRs:'Work directory must contain an stc compiler in the stx/stc subDirectory.'). cg@2644: "/ directoryIsOKForMe := false. cg@2644: "/ ]. cg@2644: "/ ((buildDirectory construct:'stx')construct:'include') exists ifFalse:[ cg@2644: "/ Dialog warn:(self classResources stringWithCRs:'Work directory must have had a make run before (for include files to exists).'). cg@2644: "/ directoryIsOKForMe := false. cg@2644: "/ ]. cg@2644: "/ ] cg@2644: "/ ]. cg@2644: "/ directoryIsOKForMe cg@2644: "/ ] whileFalse cg@2596: ! ! cg@2596: cg@2596: !ProjectBuilder class methodsFor:'documentation'! cg@2596: cg@2596: version_CVS cg@2596: ^ '$Header$' cg@2596: ! !