ProjectBuilder.st
changeset 2613 b8d38caaa884
parent 2612 2e735008a4d8
child 2614 ff815b56c808
equal deleted inserted replaced
2612:2e735008a4d8 2613:b8d38caaa884
   117     myTopDirectory isNil ifTrue:[
   117     myTopDirectory isNil ifTrue:[
   118         self error:('Cannot figure out my top directory (where stx/include and stx/rules are)')
   118         self error:('Cannot figure out my top directory (where stx/include and stx/rules are)')
   119     ].
   119     ].
   120     myTopDirectory := myTopDirectory asFilename.
   120     myTopDirectory := myTopDirectory asFilename.
   121     mySTXTopDirectory := myTopDirectory / 'stx'.
   121     mySTXTopDirectory := myTopDirectory / 'stx'.
   122 self halt.
   122 
   123     self setupBuildDirectory.
   123     self setupBuildDirectory.
   124     self copySTCDirectoryForBuild.
   124     self copySTCDirectoryForBuild.
   125     self generateSourceFiles.
   125     self generateSourceFiles.
   126     self copyDLLsForLinkage.
   126     self copyDLLsForLinkage.
   127     self copySupportFilesForLinkage.
   127     self copySupportFilesForLinkage.
   128     self copyStartupFilesFromSmalltalk.
   128     self copyStartupFilesFromSmalltalk.
   129 
   129 
   130     self makeWithOutputTo:stdOut errorTo:stdErr.
   130     self makeWithOutputTo:stdOut errorTo:stdErr.
   131 !
   131 !
   132 
   132 
   133 copyDLLsForLinkage
   133 stdErr.
   134     |targetBuildDir|
   134 !
   135 
   135 
   136     targetBuildDir := buildDirectory / package module / package directory.
   136 ].
   137 
   137 !
   138     (projectDefinitionClass allPreRequisites)
   138 
   139     do:[:eachPackageToFileout |
   139 'stx').
   140         |packageId packageDef packageModule packageDirectory packageTargetDir
   140 !
   141          dllSource dllSourceDir libraryName dllRelativePath|
   141 
   142 
   142 ion:nil
   143         packageId := eachPackageToFileout asPackageId.
   143 !
   144         packageModule := packageId module.
   144 
   145         packageDirectory := packageId directory.
   145 ].
   146         packageTargetDir := (buildDirectory / packageModule / packageDirectory) recursiveMakeDirectory.
   146 !
   147 
   147 
   148         packageDef := packageId projectDefinitionClass.
   148 ion:nil
   149         libraryName := packageDef libraryName.
   149 !
   150 
   150 
   151         "/ mhmh - take them from my tree or from the projects/smalltalk execution directory ??
   151 ]
   152         dllSourceDir := myTopDirectory / packageModule / packageDirectory.
   152 !
   153         OperatingSystem isMSWINDOWSlike ifTrue:[
   153 
   154 "/            dllRelativePath := 'objvc','/',(libraryName,'.dll').
   154 ].
   155 "/            (dllSourceDir / dllRelativePath) exists 
   155 !
   156             false ifFalse:[
   156 
   157                 dllRelativePath := 'objbc','/',(libraryName,'.dll').
   157 ].
   158             ]
   158 !
   159         ] ifFalse:[
   159 
   160             dllRelativePath := libraryName,'.so'.
   160 ]
   161         ].
   161 !
   162         ((packageTargetDir / dllRelativePath) exists
   162 
   163         and:[ (dllSourceDir / dllRelativePath) fileSize = (packageTargetDir / dllRelativePath) fileSize
   163 f halt.
   164         and:[ (dllSourceDir / dllRelativePath) modificationTime < (packageTargetDir / dllRelativePath) modificationTime
       
   165         "/ and:[ (dllSourceDir / dllRelativePath) sameContentsAs:(packageTargetDir / dllRelativePath) ]
       
   166         ]]) ifFalse:[
       
   167             (packageTargetDir / dllRelativePath) directory recursiveMakeDirectory.
       
   168             (dllSourceDir / dllRelativePath) copyTo:(packageTargetDir / dllRelativePath).    
       
   169         ]
       
   170     ].
       
   171 !
       
   172 
       
   173 copyDirectory:relativepath
       
   174     "/ need rules in stx
       
   175     ((Smalltalk projectDirectoryForPackage:'stx') asFilename construct:relativepath)
       
   176         recursiveCopyTo:(buildDirectory construct:'stx').
       
   177 !
       
   178 
       
   179 copyDirectoryForBuild:subdir
       
   180     |targetDir targetFile|
       
   181 
       
   182     targetDir := buildDirectory / 'stx' / subdir.
       
   183     targetDir exists ifFalse:[
       
   184         targetDir makeDirectory.
       
   185     ].
       
   186     (mySTXTopDirectory / subdir) directoryContentsAsFilenamesDo:[:eachFile |
       
   187         eachFile isDirectory ifFalse:[
       
   188             targetFile := targetDir / eachFile baseName.
       
   189             (targetFile exists not
       
   190             or:[ targetFile modificationTime < eachFile modificationTime ]) ifTrue:[
       
   191                 self activityNotification:'copying ',eachFile pathName,'...'.
       
   192                 eachFile copyTo:(targetDir construct:eachFile baseName)
       
   193             ]
       
   194         ].
       
   195     ].
       
   196     self activityNotification:nil
       
   197 !
       
   198 
       
   199 copyResourcesForPackage:aPackage
       
   200     |module directory|
       
   201 
       
   202     module := aPackage asPackageId module.
       
   203     directory := aPackage asPackageId directory.
       
   204 
       
   205     (myTopDirectory / module / directory / 'resources' ) exists ifTrue:[
       
   206         (myTopDirectory / module / directory / 'resources' )
       
   207             recursiveCopyTo:(buildDirectory / module / directory)
       
   208     ].
       
   209     (myTopDirectory / module / directory / 'styles' ) exists ifTrue:[
       
   210         (myTopDirectory / module / directory / 'styles' )
       
   211             recursiveCopyTo:(buildDirectory / module / directory)
       
   212     ].
       
   213 !
       
   214 
       
   215 copySTCDirectoryForBuild
       
   216     |targetDir stc files|
       
   217 
       
   218     targetDir := buildDirectory / 'stx' / 'stc'.
       
   219     targetDir exists ifFalse:[ targetDir makeDirectory ].
       
   220 
       
   221     stc := OperatingSystem isMSWINDOWSlike 
       
   222                 ifTrue:[ 'stc.exe' ]
       
   223                 ifFalse:[ 'stc' ].
       
   224 
       
   225     files := #( ) copyWith:stc.
       
   226 
       
   227     files do:[:eachFile |
       
   228         |sourceFile targetFile|
       
   229 
       
   230         sourceFile := mySTXTopDirectory / 'stc' / eachFile.
       
   231         targetFile := targetDir / eachFile.
       
   232         (targetFile exists not
       
   233         or:[ targetFile modificationTime < sourceFile modificationTime ]) ifTrue:[
       
   234             self activityNotification:'copying ',sourceFile pathName,'...'.
       
   235             sourceFile copyTo:targetFile
       
   236         ].
       
   237     ].
       
   238     self activityNotification:nil
       
   239 !
       
   240 
       
   241 copyStartupFilesFromSmalltalk
       
   242     (buildDirectory / 'stx' / 'projects/smalltalk' ) exists ifFalse:[
       
   243         (buildDirectory / 'stx' / 'projects/smalltalk' ) recursiveMakeDirectory.
       
   244     ].
       
   245 
       
   246     #( 'keyboard.rc' 'keyboardMacros.rc' 'display.rc' 'd_win32.rc'
       
   247        'host.rc' 'h_win32.rc'  
       
   248     ) do:[:fn |
       
   249         (myTopDirectory / 'stx' / 'projects/smalltalk' / fn)
       
   250             copyTo: (buildDirectory / 'stx' / 'projects/smalltalk' / fn)
       
   251     ]
       
   252 !
       
   253 
       
   254 copySupportFilesForLinkage
       
   255     |files|
       
   256 
       
   257     OperatingSystem isMSWINDOWSlike ifTrue:[
       
   258         files := #( 
       
   259                     'support/win32/borland/cs3245.dll' 
       
   260                     'support/win32/X11.dll'
       
   261                     'support/win32/Xext.dll'
       
   262                     'librun/librun.dll'
       
   263                     'libbc/librun.lib'
       
   264                     'libbc/cs32i.lib'
       
   265                     'librun/genDate.exe'
       
   266                     'librun/main.c'
       
   267                  ).
       
   268     ] ifFalse:[
       
   269         files := #(
       
   270                     'librun/genDate'
       
   271                     'librun/main.c'
       
   272                     'librun/librun.so'
       
   273                 )
       
   274     ].
       
   275 
       
   276     files do:[:dllRelativePath |
       
   277         ((buildDirectory / 'stx' / dllRelativePath) exists
       
   278         and:[ (mySTXTopDirectory / dllRelativePath) fileSize = (buildDirectory / 'stx' / dllRelativePath) fileSize
       
   279         and:[ (mySTXTopDirectory / dllRelativePath) modificationTime < (buildDirectory / 'stx' / dllRelativePath) modificationTime
       
   280         "/ and:[ (mySTXTopDirectory / dllRelativePath) sameContentsAs:(targetBuildDir / dllRelativePath) ]
       
   281         ]]) ifFalse:[
       
   282             (buildDirectory / 'stx' / dllRelativePath) directory recursiveMakeDirectory.
       
   283             (mySTXTopDirectory / dllRelativePath) copyTo:(buildDirectory / 'stx' / dllRelativePath).    
       
   284         ]
       
   285     ].
       
   286 !
       
   287 
       
   288 createHeaderFileFor:aClass in:packageTargetDir
       
   289     |instVarList classInstVarList classVarList bindings superclassFilename
       
   290      template file newContents oldContents|
       
   291 
       
   292     instVarList := StringCollection new.
       
   293     aClass instVarNames do:[:v |
       
   294         instVarList add:('OBJ %1;' bindWith:v)
       
   295     ].
       
   296     classInstVarList := StringCollection new.
       
   297     aClass class instVarNames do:[:v |
       
   298 (v includes:$_) ifTrue:[self halt].
       
   299         classInstVarList add:('OBJ %1;' bindWith:v)
       
   300     ].
       
   301     classVarList := StringCollection new.
       
   302     aClass classVarNames do:[:v |
       
   303         classVarList add:('extern OBJ %1_%2;' bindWith:aClass name with:v)
       
   304     ].
       
   305 
       
   306     bindings := Dictionary new.
       
   307     bindings at:'ClassName' put:aClass name. 
       
   308     aClass superclass isNil ifTrue:[
       
   309         bindings at:'SuperclassName' put:'-'. 
       
   310         bindings at:'SuperclassFileInclude' put:nil.
       
   311     ] ifFalse:[
       
   312         bindings at:'SuperclassName' put:aClass superclass name. 
       
   313         bindings at:'SuperclassFileName' put:(superclassFilename := Smalltalk fileNameForClass:aClass superclass).
       
   314         bindings at:'SuperclassFileInclude' put:('#include "%1.STH"' bindWith:superclassFilename).
       
   315     ].
       
   316     bindings at:'InstVarList' put:instVarList asString. 
       
   317     bindings at:'ClassVarList' put:classVarList asString. 
       
   318     bindings at:'ClassInstVarList' put:classInstVarList asString. 
       
   319 
       
   320     template := 
       
   321 '/* This file was generated by ProjectBuilder. */
       
   322 /* !!!!!!!! Do not change by hand !!!!!!!! */
       
   323 
       
   324 /* Class: %(ClassName) */
       
   325 /* Superclass: %(SuperclassName) */
       
   326 
       
   327 %(SuperclassFileInclude)
       
   328 
       
   329 /* INDIRECTGLOBALS */
       
   330 #ifdef _HEADER_INST_
       
   331 %(InstVarList)
       
   332 #endif /* _HEADER_INST_ */
       
   333 
       
   334 #ifdef _HEADER_CLASS_
       
   335 %(ClassVarList)
       
   336 #endif /* _HEADER_CLASS_ */
       
   337 
       
   338 #ifdef _HEADER_CLASSINST_
       
   339 %(ClassInstVarList)
       
   340 #endif /* _HEADER_CLASSINST_ */
       
   341 '.
       
   342     newContents := template bindWithArguments:bindings.
       
   343     file := packageTargetDir asFilename / ((Smalltalk fileNameForClass:aClass),'.STH').
       
   344     (file exists not
       
   345     or:[ (oldContents := file contents) ~= newContents ]) ifTrue:[
       
   346         file contents: newContents.
       
   347     ].
       
   348 !
       
   349 
       
   350 generateSourceFiles
       
   351     sourceCodeManager notNil ifTrue:[
       
   352         "/ check out / generate files there
       
   353         self generateSourceFilesByCheckingOutUsing:sourceCodeManager
       
   354     ] ifFalse:[
       
   355         "/ local build
       
   356         "/ fileout the project
       
   357         self generateSourceFilesByFilingOut
       
   358     ]
       
   359 !
       
   360 
       
   361 generateSourceFilesByCheckingOutUsing:aSourceCodeManager
       
   362     "/ will no longer be needed/supported
       
   363 
       
   364     |repository stxRepository module directory|
       
   365 
       
   366 self halt.
       
   367     "/ check out / generate files there
       
   368     repository := (aSourceCodeManager repositoryNameForModule:module) ifNil:[aSourceCodeManager repositoryName].
       
   369     stxRepository := aSourceCodeManager repositoryName.
       
   370 
       
   371     (buildDirectory construct:'stx') exists ifFalse:[
       
   372         (module ~= 'stx') ifTrue:[
       
   373             OperatingSystem
       
   374                 executeCommand:('cvs -d ',stxRepository,' co stx')
       
   375                 inputFrom:nil
       
   376                 outputTo:Transcript
       
   377                 errorTo:Transcript
       
   378                 inDirectory:buildDirectory
       
   379                 onError:[:status| self error:'cvs update stx failed'].
       
   380         ].
       
   381     ].
       
   382 
       
   383     ((buildDirectory construct:module) construct:'CVS') exists ifFalse:[
       
   384         OperatingSystem
       
   385             executeCommand:('cvs -d ',repository,' co -l ',directory)
       
   386             inputFrom:nil
       
   387             outputTo:Transcript
       
   388             errorTo:Transcript
       
   389             inDirectory:buildDirectory
       
   390             onError:[:status| self error:'cvs update failed'].
       
   391     ].
       
   392     OperatingSystem
       
   393         executeCommand:'cvs upd -d'
       
   394         inputFrom:nil
       
   395         outputTo:Transcript
       
   396         errorTo:Transcript
       
   397         inDirectory:(buildDirectory construct:module)
       
   398         onError:[:status| self error:'cvs update failed'].
       
   399 self halt.
       
   400 !
       
   401 
       
   402 generateSourceFilesByFilingOut
       
   403     "/ local build
       
   404     "/ fileout the project
       
   405 
       
   406     (package module ~= 'stx') ifTrue:[
       
   407         (buildDirectory / package module) makeDirectory.
       
   408     ].
       
   409 
       
   410     "/ file out the package(s) which are to be built
       
   411     ((Array with:package))
       
   412     do:[:eachPackageToFileout |
       
   413         |packageId packageModule packageDirectory packageTargetDir packageDef|
       
   414 
       
   415         packageId := eachPackageToFileout asPackageId.
       
   416         packageModule := packageId module.
       
   417         packageDirectory := packageId directory.
       
   418         packageTargetDir := (buildDirectory / packageModule / packageDirectory) recursiveMakeDirectory.
       
   419 
       
   420         packageDef := packageId projectDefinitionClass.
       
   421         (packageDef compiled_classNames_common ,
       
   422         packageDef compiled_classNamesForPlatform) do:[:eachClassName |
       
   423             |cls|
       
   424 
       
   425             cls := Smalltalk classNamed:eachClassName.
       
   426             self assert:cls isLoaded.
       
   427             cls fileOutIn:packageTargetDir
       
   428         ].
       
   429 
       
   430 "/        (Smalltalk allClassesInPackage:eachPackageToFileout) do:[:cls |
       
   431 "/            cls isPrivate ifFalse:[
       
   432 "/                cls isLoaded ifFalse:[
       
   433 "/                    self halt.
       
   434 "/                    cls autoload.
       
   435 "/                ].
       
   436 "/                cls fileOutIn:packageTargetDir
       
   437 "/            ]
       
   438 "/        ].
       
   439 
       
   440         projectDefinitionClass forEachFileNameAndGeneratedContentsDo:[:fileName :fileContents |
       
   441             ((packageTargetDir / fileName) exists
       
   442             and:[ (packageTargetDir / fileName) contents = fileContents ]) ifFalse:[
       
   443                 (packageTargetDir / fileName) contents:fileContents.
       
   444             ].
       
   445         ].    
       
   446     ].
       
   447 
       
   448     "/ generate header files in prerequisite packages...
       
   449     (projectDefinitionClass allPreRequisites)
       
   450     do:[:eachPackageToFileout |
       
   451         |packageId packageDef packageModule packageDirectory packageTargetDir|
       
   452 
       
   453         packageId := eachPackageToFileout asPackageId.
       
   454         packageModule := packageId module.
       
   455         packageDirectory := packageId directory.
       
   456         packageTargetDir := (buildDirectory / packageModule / packageDirectory) recursiveMakeDirectory.
       
   457 
       
   458         packageDef := packageId projectDefinitionClass.
       
   459         (packageDef compiled_classNames_common ,
       
   460         packageDef compiled_classNamesForPlatform) do:[:eachClassName |
       
   461             |cls|
       
   462 
       
   463             cls := Smalltalk classNamed:eachClassName.
       
   464             "/ self assert:cls isLoaded.
       
   465             cls isLoaded ifTrue:[    
       
   466                 self createHeaderFileFor:cls in:packageTargetDir
       
   467             ].
       
   468         ].
       
   469         self copyResourcesForPackage:eachPackageToFileout.
       
   470     ].
       
   471 
       
   472 "/    stx_libbasic2 preRequisitesForBuilding#(#'stx:libbasic')
       
   473 !
   164 !
   474 
   165 
   475 makeWithOutputTo:stdOut errorTo:stdErr
   166 makeWithOutputTo:stdOut errorTo:stdErr
   476     |module directory|
   167     |module directory|
   477 
   168 
   503             inDirectory:(buildDirectory / module / directory)
   194             inDirectory:(buildDirectory / module / directory)
   504             onError:[:status| self error:'make failed'].
   195             onError:[:status| self error:'make failed'].
   505     ]
   196     ]
   506 !
   197 !
   507 
   198 
   508 setupBuildDirectory
   199 errorTo:stdErr
   509     buildDirectory exists ifFalse:[
   200             inDirectory:(buildDirectory / module / directory)
   510         buildDirectory recursiveMakeDirectory.
   201             onError:[:status| self error:'make failed'].
   511     ].
   202 
   512     (buildDirectory / 'stx') exists ifFalse:[
   203         OperatingSystem
   513         (buildDirectory / 'stx') makeDirectory.
   204             executeCommand:(ParserFlags makeCommand,' setup')
   514     ].
   205             inputFrom:nil
   515 
   206             outputTo:stdOut
   516     self copyDirectoryForBuild:'include'.
   207             errorTo:stdErr
   517     self copyDirectoryForBuild:'rules'.
   208             inDirectory:(buildDirectory / module / directory)
   518 !
   209             onError:[:status| self error:'make failed'].
   519 
   210     ]
   520 validateBuildDirectoryIsPresent
   211 !
   521 
   212 
   522     ^ self.
   213 :stdErr
   523 
   214             inDirectory:(buildDirectory / module / directory)
   524 "/    [
   215             onError:[:status| self error:'make failed'].
   525 "/        |default directoryIsOKForMe stc |
   216     ]
   526 "/
       
   527 "/        default := (buildDirectory ?
       
   528 "/                          PreviousBuildDirectory)
       
   529 "/                          ifNil:[ UserPreferences current buildDirectory].
       
   530 "/
       
   531 "/        buildDirectory := Dialog requestDirectoryName:'Temporary Work-ROOT for build:'
       
   532 "/                                 default:default.
       
   533 "/
       
   534 "/        buildDirectory isEmptyOrNil ifTrue:[^ self].
       
   535 "/        buildDirectory := buildDirectory asFilename.
       
   536 "/        directoryIsOKForMe := true.
       
   537 "/
       
   538 "/        buildDirectory exists ifFalse:[
       
   539 "/            Dialog warn:(self classResources string:'Work directory %1 does not exist.' with:buildDirectory).
       
   540 "/            directoryIsOKForMe := false.
       
   541 "/        ] ifTrue:[
       
   542 "/            (buildDirectory construct:'stx') exists ifFalse:[
       
   543 "/                Dialog warn:(self classResources stringWithCRs:'Work directory must contain an stx subDirectory,\which contains (at least) the stc and include subdirectories.').
       
   544 "/                directoryIsOKForMe := false.
       
   545 "/            ] ifTrue:[
       
   546 "/                stc := (OperatingSystem isMSDOSlike) ifTrue:['stc.exe'] ifFalse:['stc'].
       
   547 "/                (((buildDirectory construct:'stx')construct:'stc')construct:stc) exists ifFalse:[
       
   548 "/                    Dialog warn:(self classResources stringWithCRs:'Work directory must contain an stc compiler in the stx/stc subDirectory.').
       
   549 "/                    directoryIsOKForMe := false.
       
   550 "/                ].
       
   551 "/                ((buildDirectory construct:'stx')construct:'include') exists ifFalse:[
       
   552 "/                    Dialog warn:(self classResources stringWithCRs:'Work directory must have had a make run before (for include files to exists).').
       
   553 "/                    directoryIsOKForMe := false.
       
   554 "/                ].
       
   555 "/            ]
       
   556 "/        ].
       
   557 "/        directoryIsOKForMe
       
   558 "/    ] whileFalse
       
   559 ! !
   217 ! !
   560 
   218 
   561 !ProjectBuilder class methodsFor:'documentation'!
   219 !ProjectBuilder class methodsFor:'documentation'!
   562 
   220 
   563 version_CVS
   221 version_CVS