ApplicationDefinition.st
author Claus Gittinger <cg@exept.de>
Thu, 14 Sep 2006 20:07:46 +0200
changeset 9889 c480dd24d0b6
parent 9886 6574a17ca51e
child 9890 047b99b0334a
permissions -rw-r--r--
*** empty log message ***

"
 COPYRIGHT (c) 2006 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"

"{ Package: 'stx:libbasic' }"

ProjectDefinition subclass:#ApplicationDefinition
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'System-Support-Projects'
!

!ApplicationDefinition class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 2006 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
! !

!ApplicationDefinition class methodsFor:'accessing'!

applicationName
    |m path|

    m := self moduleDirectory.
    path := m subStrings:$/.
    path last = 'application' ifTrue:[
        path size > 1 ifTrue:[
            path := path copyWithoutLast:1.
        ].
    ].
    ^ path last

    "
     bosch_dapasx_application applicationName     
     stx_projects_smalltalk applicationName     
    "

    "Created: / 08-08-2006 / 20:25:39 / fm"
    "Modified: / 30-08-2006 / 19:29:25 / cg"
! !

!ApplicationDefinition class methodsFor:'defaults'!

defaultDescription
    ^ 'an application'
!

guiClassFileNames_unix
    ^ self guiClasses_unix 
        collect:[:cls | (cls classFilename asFilename withSuffix:'so') baseName].

    "Created: / 14-09-2006 / 18:13:22 / cg"
!

guiClassFileNames_win32
    ^ self guiClasses_win32 
        collect:[:cls | (cls classFilename asFilename withSuffix:'dll') baseName].

    "Created: / 07-09-2006 / 17:23:13 / cg"
    "Modified: / 14-09-2006 / 18:13:46 / cg"
!

guiClasses_unix
    ^ #()

    "Created: / 14-09-2006 / 18:12:58 / cg"
!

guiClasses_win32
    ^ #()
    "/ ^ Array with:XWorkstation

    "Created: / 07-09-2006 / 17:22:27 / cg"
    "Modified: / 14-09-2006 / 18:12:35 / cg"
!

needResources
    ^ self isGUIApplication
! !

!ApplicationDefinition class methodsFor:'description'!

excludedFromPreRequisites  
    "list packages which are to be explicitely excluded from the automatic constructed
     prerequisites list. If empty, everything that is found along the inheritance of any of
     my classes is considered to be a prerequisite package."

    ^ #()

    "Modified: / 17-08-2006 / 19:48:59 / cg"
!

excludedFromSubProjects
    "list packages which are to be explicitely excluded from the automatic constructed
     subProjects list. If empty, every sub-package is included as a prerequisite."

    ^ #()

    "Modified: / 17-08-2006 / 19:49:40 / cg"
!

isGUIApplication
    "Return true, if this is a GUI app. 
     Redefine to return false for non-GUI applications (affects inclusion of Display classes)."

    ^true

    "Created: / 08-08-2006 / 11:15:01 / fm"
    "Modified: / 17-08-2006 / 19:47:36 / cg"
!

isSingleThreadedApplication
    "Return true, if this should be started without multiple threads. 
     (not possible with gui applications)"

    ^false

    "Created: / 05-09-2006 / 13:36:18 / cg"
!

startupClassName
    "The name of the class which provides the entry point for the application."

    self subclassResponsibility

    "Modified: / 17-08-2006 / 20:00:22 / cg"
!

startupSelector
    "The name of the entry point method (in startUpClass) used to start the application."

    ^ #'start'

    "Modified: / 17-08-2006 / 20:01:00 / cg"
! !

!ApplicationDefinition class methodsFor:'description - project information'!

description
    "Returns a description string which will appear in nt.def / bc.def"

    self module = 'stx' ifTrue:[
        ^ 'Smalltalk/X Application'
    ].

    ^ 'Application'

    "Created: / 17-08-2006 / 20:52:48 / cg"
    "Modified: / 18-08-2006 / 16:16:01 / cg"
!

fileDescription
    "Return a description string which will appear in nt.def / bc.def"

    ^self description , ' Application'

    "Created: / 14-09-2006 / 20:08:11 / cg"
! !

!ApplicationDefinition class methodsFor:'file generation'!

basicFileNamesToGenerate
    ^ #( 
          #('Make.spec'         #'generate_make_dot_spec')
"/          #('Make.proto'        #'generate_make_dot_proto')
"
          #('libInit.cc'        #'generate_libInit_dot_cc')
"
          #('bc.def'            #'generate_bc_dot_def')
          #('nt.mak'            #'generate_nt_dot_mak')
          #('modules.stx'       #'generate_modules_dot_stx')
"
          #('nt.def'            #'generate_nt_dot_def')
"
          #('abbrev.stc'        #'generate_abbrev_dot_stc') 
          #('bmake.bat'         #'generate_bmake_dot_mak') 
"/          #('buildDate.h'       #'generate_buildDate_dot_h')   -- done by nt.mak
     )

    "Created: / 14-09-2006 / 14:36:00 / cg"
    "Modified: / 14-09-2006 / 17:51:10 / cg"
!

generateFile:filename
    ^ super generateFile:filename

    "Created: / 22-08-2006 / 18:35:40 / cg"
    "Modified: / 30-08-2006 / 19:23:12 / cg"
!

rcFilename
    ^ self packageName,'WinRC.rc'.

    "Created: / 07-09-2006 / 17:07:08 / cg"
!

resourceFilename
    ^ (self rcFilename asFilename withSuffix:'res') name

    "Created: / 07-09-2006 / 17:12:53 / cg"
! !

!ApplicationDefinition class methodsFor:'file templates'!

bc_dot_def
    "the template code for the bc.def file"

^ 
'DESCRIPTION     %(DESCRIPTION)
CODE            PRELOAD MOVEABLE DISCARDABLE
SEGMENTS
    INITCODE    PRELOAD DISCARDABLE
'

    "Created: / 08-08-2006 / 12:26:58 / fm"
    "Modified: / 08-08-2006 / 19:32:27 / fm"
    "Modified: / 17-08-2006 / 20:05:17 / cg"
!

buildDate_dot_h
    "the template code for the buildDate.h file"

^ 
'#define BUILD_DATE "%(BUILDDATE)"'

    "Created: / 30-08-2006 / 19:18:34 / cg"
!

modules_dot_stx

^ 
'# $','Header','$
#
# DO NOT EDIT 
# automagically generated from the projectDefinition: ',self name,'.
#
# Warning: once you modify this file, do not rerun
# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
#
# This file is (currently) only used with win-95 / win-NT versions of STX.
# It lists the dll''s which are to be loaded at startup time.
#
# All classes loaded at startup time will be present as precompiled classes.
# Others will be autoloaded.
#
%(PREREQUISITE_LIBS)
%(SUBPROJECT_LIBS)
'

    "Created: / 08-08-2006 / 12:26:58 / fm"
    "Modified: / 08-08-2006 / 19:32:27 / fm"
    "Modified: / 16-08-2006 / 17:56:58 / User"
    "Modified: / 17-08-2006 / 20:35:38 / cg"
!

nt_dot_mak
    |def needResources|

    needResources := false "self isGUIApplication".

    def :=
'# $','Header','$
#
# DO NOT EDIT 
# automagically generated from the projectDefinition: ',self name,'.
#
# Warning: once you modify this file, do not rerun
# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
#

TOP=%(TOP)       
INCLUDE_TOP=$(TOP)\..

# CFLAGS1= -WD -w-pro -w-ccc -w-rch -w-aus -w-par -x- -r- -k -y -v -vi- -c -tWDR
CFLAGS1= -w-pro -w-ccc -w-rch -w-aus -w-par -x- -r- -k -y -v -vi- -c

CFLAGS_CONSOLE=
CFLAGS_NOCONSOLE=-tWR -D_NO_VCL;WIN32GUI;WIN32 -DWIN_LOGFILE="\"%(APPLICATION)_%%d.log\""
LFLAGS_CONSOLE=-ap
LFLAGS_NOCONSOLE=-aa
CRT_STARTUP_CONSOLE=c0x32.obj
CRT_STARTUP_NOCONSOLE=c0w32.obj

CFLAGS_APPTYPE=$(CFLAGS_NOCONSOLE)
LFLAGS_APPTYPE=$(LFLAGS_NOCONSOLE)
CRT_STARTUP=$(CRT_STARTUP_NOCONSOLE)

CFLAGS_LOCAL=$(CFLAGS_APPTYPE) \
 -DSTARTUP_CLASS="\"%(STARTUP_CLASS)\"" \
 -DSTARTUP_SELECTOR="\"%(STARTUP_SELECTOR)\"" \
 -DUSE_MODULE_TABLE

#

!!INCLUDE $(TOP)\rules\stdHeader_nt
!!INCLUDE Make.spec

OBJS= $(COMMON_OBJS) $(WIN32_OBJS)

#
LIBNAME=dummy
STCOPT="+optinline"
LOCALINCLUDES=%(LOCAL_INCLUDES)
STCLOCALOPT=''-package=$(PACKAGE)'' $(LOCALINCLUDES) %(HEADEROUTPUTARG) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) $(COMMONSYMFLAG) -varPrefix=$(LIBNAME)

LINKER = ilink32

# LFLAGS = -L$(TOP)\libbc;$(BCB)\lib;$(DEBUGLIBPATH) -H:0x400000 -Hc:0x100000 -S:0x40000 -Sc:0x10000 -ap -Tpe -x -Gn -v -Ao:0x10000
LFLAGS = -L$(TOP)\libbc;$(BCB)\lib -S:0x40000 -Sc:0x10000 $(LFLAGS_APPTYPE) -Tpe -x -Gn -v -Ao:0x10000

PROJECT = %(APPLICATION).exe
ALLOBJFILES = main.obj
RESFILES = %(RESFILENAME)
ALLOBJ = $(CRT_STARTUP) $(ALLOBJFILES) $(OBJS)
DEFFILE=bc.def

LIBFILES=$(TOP)\libbc\librun.lib
ALLLIB=$(LIBFILES) import32.lib $(RT_LIB)

REQUIRED_LIBS=librun.dll %(REQUIRED_LIBS)
REQUIRED_FILES=cs3245.dll symbols.stc $(REQUIRED_LIBS)

REQUIRED_SUPPORT_DIRS=%(REQUIRED_SUPPORT_DIRS)

ALL:: $(OUTDIR) $(OBJS) $(REQUIRED_FILES) show $(PROJECT) $(REQUIRED_SUPPORT_DIRS)

setup: install_%(APPLICATION).exe

# This uses the Nullsoft Installer Package and works in Windows only

install_%(APPLICATION).exe: $(PROJECT) %(APPLICATION).nsi
    makensis %(APPLICATION).nsi

new:
    bmake clean
    bmake

%(RESOURCE_RULES)

%(PREREQUISITES_LIBS)      
%(SUBPROJECTS_LIBS)

show:
    @echo LFLAGS= $(LFLAGS)
    @echo ALLOBJ= $(ALLOBJ)
    @echo PROJECT= $(PROJECT)
    @echo ALLLIB= $(ALLLIB)
    @echo DEFFILE= $(DEFFILE)
    @echo ALLRES= $(ALLRES)

$(PROJECT): $(ALLOBJFILES) $(OBJS) $(RESFILES) $(DEFFILE)
    $(BCB)\BIN\$(LINKER) $(LFLAGS) $(ALLOBJ), $(PROJECT),,  $(ALLLIB),  $(DEFFILE),  $(RESFILES)

#$(PROJECT): $(ALLOBJFILES) $(RESFILES) $(DEFFILE)
#    $(BCB)\BIN\$(LINKER) @&&!!
#    $(LFLAGS) +
#    $(ALLOBJ), +
#    $(PROJECT),, +
#    $(ALLLIB), +
#    $(DEFFILE), +
#    $(RESFILES)
#!!


!!INCLUDE $(TOP)\rules\stdRules_nt

#
# additional rules
#
%(APPLICATION)Win.res: %(APPLICATION)Win.rc %(APPLICATION).ico

main.obj: buildDate.h main.c nt.mak

main.c: $(TOP)\librun\main.c
        copy $(TOP)\librun\main.c main.c

buildDate.h: $(TOP)\librun\genDate.exe
        $(TOP)\librun\genDate.exe

librun.dll: $(TOP)\librun\librun.dll
        copy $(TOP)\librun\librun.dll librun.dll

cs3245.dll: $(TOP)\support\win32\borland\cs3245.dll
        copy $(TOP)\support\win32\borland\cs3245.dll cs3245.dll

symbols.stc: $(TOP)\include\symbols.stc
        copy $(TOP)\include\symbols.stc symbols.stc

clobber::
        -del librun.dll

clean::
        -del genDate.exe
        -del c0x32.dll
        -del c0x32.lib
        -del buildDate.h
        -del $(PROJECT)
        -del install_%(APPLICATION).exe
        -del stx.lib
        -del stx.dll
        -del cs3245.dll
        -del $(REQUIRED_FILES)
        -del main.c
        -del *.log
        -del *.res
        -rmdir /S /Q resources
        -rmdir /S /Q objbc

clobber::
        -del *.dll

# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
%(DEPENDENCIES)
# ENDMAKEDEPEND --- do not remove this line
'.

        ^ def.

    "Modified: / 14-09-2006 / 18:10:02 / cg"
!

nt_dot_mak_resource_rules
    ^ '

RESOURCEFILES: %(APPLICATION)_RESOURCES stx_RESOURCES stx_STYLES stx_BITMAPS

%(APPLICATION)_RESOURCES: resources\%(MODULE)\%(APPLICATION)\NUL
        copy ..\resources\*.rs resources\%(MODULE)\%(APPLICATION)\*.*

stx_RESOURCES: \
        libbasic_RESOURCES \
        libtool_RESOURCES  \
        libtool2_RESOURCES  \
        libview_RESOURCES  \
        libview2_RESOURCES

stx_STYLES: resources\stx\libview\NUL
        copy $(TOP)\libview\styles\mswindowsXP* resources\stx\libview\*.*
        copy $(TOP)\libview\styles\mswindows*.common resources\stx\libview\*.*

stx_BITMAPS: \
        libwidg_BITMAPS

libwidg_BITMAPS: resources\stx\libwidg\bitmaps\NUL
        copy $(TOP)\libwidg\bitmaps\*.xpm resources\stx\libwidg\bitmaps\*.*

libbasic_RESOURCES: resources\stx\libbasic\NUL
        copy $(TOP)\libbasic\resources\*.rs resources\stx\libbasic\*.*

libtool_RESOURCES: resources\stx\libtool\NUL
        copy $(TOP)\libtool\resources\*.rs resources\stx\libtool\*.*

libtool2_RESOURCES: resources\stx\libtool2\NUL
        copy $(TOP)\libtool2\resources\*.rs resources\stx\libtool2\*.*

libview_RESOURCES: resources\stx\libview\NUL
        copy $(TOP)\libview\resources\*.rs resources\stx\libview\*.*

libview2_RESOURCES: resources\stx\libview2\NUL
        copy $(TOP)\libview2\resources\*.rs resources\stx\libview2\*.*

resources\stx\libbasic\NUL: resources\stx\NUL
        mkdir resources\stx\libbasic

resources\stx\libtool\NUL: resources\stx\NUL
        mkdir resources\stx\libtool

resources\stx\libtool2\NUL: resources\stx\NUL
        mkdir resources\stx\libtool2

resources\stx\libview\NUL: resources\stx\NUL
        mkdir resources\stx\libview

resources\stx\libview2\NUL: resources\stx\NUL
        mkdir resources\stx\libview2

resources\stx\libwidg\bitmaps\NUL: resources\stx\libwidg\NUL
        mkdir resources\stx\libwidg\bitmaps

resources\stx\libwidg\NUL: resources\stx\NUL
        mkdir resources\stx\libwidg

resources\stx\NUL: resources\NUL
        mkdir resources\stx

resources\%(MODULE)\%(APPLICATION)\NUL: resources\%(MODULE)\NUL
        mkdir resources\%(MODULE)\%(APPLICATION)

resources\%(MODULE)\NUL: resources\NUL
        mkdir resources\%(MODULE)

resources\NUL:
        mkdir resources

bitmaps\NUL:
        mkdir bitmaps

doc\NUL:
        mkdir doc

'.
!

packageName_dot_rc
    "the template code for the <appname>.rc file"

^ 
'//
// DO NOT EDIT 
// automagically generated from the projectDefinition: ',self name,'.
//
#define IDR_MAINFRAME                   128

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)

%(ICONDEFINITION_LINE)

VS_VERSION_INFO VERSIONINFO
  FILEVERSION     %(FILE_VERSION_COMMASEPARATED)
  PRODUCTVERSION  %(PRODUCT_VERSION_COMMASEPARATED)
//  FILEFLAGSMASK 0x3fL
  FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
  FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
  FILEOS          VOS_NT_WINDOWS32
  FILETYPE        %(FILETYPE)
  FILESUBTYPE     VS_USER_DEFINED

BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    BEGIN
      VALUE "CompanyName", "%(COMPANY_NAME)\0"
      VALUE "FileDescription", "%(FILE_DESCRIPTION)\0"
      VALUE "FileVersion", "%(FILE_VERSION)\0"
//      VALUE "OriginalFilename", "DAPASX.EXE\0"
      VALUE "InternalName", "%(INTERNAL_NAME)\0"
%(LEGAL_COPYRIGHT_LINE)
      VALUE "ProductName", "%(PRODUCT_NAME)\0"
      VALUE "ProductVersion", "%(PRODUCT_VERSION)\0"
      VALUE "ProductDate", "%(PRODUCT_DATE)\0"
    END
  END

  BLOCK "VarFileInfo"
  BEGIN                               //  Language   |    Translation
    VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
  END
END
'
    "
     stx_libbasic3 packageName_dot_rc
     stx_libbasic3 generate_packageName_dot_rc
    "

    "Modified: / 09-08-2006 / 15:10:57 / fm"
    "Created: / 30-08-2006 / 18:41:47 / cg"
!

preRequisiteLine_nt_dot_mak

^'%(FILE_NAME).dll: $(TOP)\%(MODULE_DIRECTORY)\objbc\%(FILE_NAME).dll
        copy $(TOP)\%(MODULE_DIRECTORY)\objbc\%(FILE_NAME).dll *.*
'
!

subProjectLine_nt_dot_mak

^'%(LIBRARY_NAME).dll: $(TOP)\..\%(PATH_TO_SUB_PROJECT)\objbc\%(LIBRARY_NAME).dll
        copy $(TOP)\..\%(PATH_TO_SUB_PROJECT)\objbc\%(LIBRARY_NAME).dll *.*

$(TOP)\..\%(PATH_TO_SUB_PROJECT)\objbc\%(LIBRARY_NAME).dll:
        cd $(TOP)\..\%(PATH_TO_SUB_PROJECT)
        bmake
        -cd $(TOP)\..\%(PATH_TO_MYPROJECT)
'
! !

!ApplicationDefinition class methodsFor:'mappings'!

buildDate_dot_h_mappings
    |d|

    d := Dictionary new.
    d 
        at: 'BUILDDATE' put: (Timestamp now printStringRFC1123Format ). 

    ^ d

    "Created: / 30-08-2006 / 19:19:30 / cg"
    "Modified: / 14-09-2006 / 18:58:31 / cg"
!

modules_dot_stx_mappings
    |d|

    d := Dictionary new.
    d 
        at: 'PREREQUISITE_LIBS' put: (self generatePreRequisiteLibs_modules_dot_stx); 
        at: 'SUBPROJECT_LIBS' put: (self generateSubProjectLines_modules_dot_stx  ). 

    ^ d

    "Modified: / 14-09-2006 / 18:58:41 / cg"
!

nt_dot_mak_mappings
    |d|

    d := super nt_dot_mak_mappings.
    d 
        at: 'LOCAL_INCLUDES' put: (self generateLocalIncludes_win32);
        at: 'APPLICATION' put: (self applicationName);
        at: 'RESFILENAME' put: (self resourceFilename );
        at: 'RCFILENAME' put: (self rcFilename );
        at: 'STARTUP_CLASS' put: ( self startupClassName );
        at: 'STARTUP_SELECTOR' put: (self startupSelector );
        at: 'REQUIRED_LIBS' put: (self generateRequiredLibs_nt_dot_mak); 
        at: 'PREREQUISITES_LIBS' put: (self generatePreRequisiteLines_nt_dot_mak );  
        at: 'DEPENDENCIES' put: (self generateDependencies_win32);
        at: 'SUBPROJECTS_LIBS' put: (self generateSubProjectLines_nt_dot_mak ). 

    self needResources ifTrue:[
        d 
            at: 'REQUIRED_SUPPORT_DIRS' put: 'RESOURCEFILES'.
        d
            at: 'RESOURCE_RULES' put:( self replaceMappings: d 
                                            in: self nt_dot_mak_resource_rules ).
    ].
    ^ d

    "Modified: / 14-09-2006 / 18:58:52 / cg"
!

preRequisiteLine_nt_dot_mak_mappings: aProjectID 

^Dictionary new
    at: 'FILE_NAME' put: (self libraryNameFor: aProjectID );  
    at: 'MODULE_DIRECTORY' put: ( (PackageId from:aProjectID) directory copy replaceAll:$/ with:$\ );     
    yourself

    "Modified: / 14-09-2006 / 18:59:09 / cg"
!

preRequisiteLine_nt_dot_mak_mappingsForClass:aClass

^Dictionary new
    at: 'FILE_NAME' put: ( aClass classFilename asFilename withoutSuffix baseName );  
    at: 'MODULE_DIRECTORY' put: ( (PackageId from:aClass package) directory copy replaceAll:$/ with:$\ );     
    yourself

    "Modified: / 14-09-2006 / 18:59:19 / cg"
!

subProjectLine_nt_dot_mak_mappings: aProjectID 
    ^ Dictionary new
        at: 'LIBRARY_NAME' put: (self libraryNameFor: aProjectID );     
        at: 'PATH_TO_SUB_PROJECT' put: ( (PackageId from:aProjectID) module,'\',(PackageId from:aProjectID) directory copy replaceAll:$/ with:$\ ); 
        at: 'PATH_TO_MYPROJECT' put: (self msdosPathToPackage: self package from: aProjectID); 
        yourself

    "Modified: / 14-09-2006 / 18:59:26 / cg"
! !

!ApplicationDefinition class methodsFor:'mappings support'!

generatePreRequisiteLibs_modules_dot_stx
    ^ String streamContents:[:s |
        self preRequisites do:[:projectID | 
            s nextPutLine:(self libraryNameFor:projectID)
        ].
        self isGUIApplication ifTrue:[
            self guiClassFileNames_win32 do:[:eachFilename |
                s nextPutLine:(eachFilename asFilename withoutSuffix baseName)
            ].
        ].
    ].

    "
     bosch_dapasx_application generatePreRequisiteLibs_modules_dot_stx
    "

    "Modified: / 07-09-2006 / 17:22:58 / cg"
!

generatePreRequisiteLines_nt_dot_mak         

    ^ String streamContents:[:s |
        self preRequisites do:[:eachPackage |
            |mappings newObjectLine|
            mappings := self preRequisiteLine_nt_dot_mak_mappings: eachPackage.
            newObjectLine := self replaceMappings: mappings
                                in: self preRequisiteLine_nt_dot_mak.
            s nextPutAll:newObjectLine. 
            s cr. 
        ].
        self guiClasses_win32 do:[:eachClass |
            |mappings newObjectLine|
            mappings := self preRequisiteLine_nt_dot_mak_mappingsForClass: eachClass.
            newObjectLine := self replaceMappings: mappings
                                in: self preRequisiteLine_nt_dot_mak.
            s nextPutAll:newObjectLine. 
            s cr. 
        ].

    ]
"
    bosch_dapasx_Application generatePreRequisiteLines_make_dot_spec 

"

    "Created: / 09-08-2006 / 11:24:39 / fm"
    "Modified: / 07-09-2006 / 17:21:45 / cg"
!

generateRequiredLibs_nt_dot_mak
    ^ String streamContents:[:s |
        s nextPutLine:' \'.
        self preRequisites do:[:projectID | 
            s space; nextPutAll:(self libraryNameFor:projectID),'.dll'; nextPutLine:' \'.
        ].

        self isGUIApplication ifTrue:[
            self guiClassFileNames_win32 do:[:eachFilename |
                s space; nextPutAll:eachFilename; nextPutLine:' \'.
            ].
        ].
        self subProjects do:[:projectID | 
            s space; nextPutAll:(self libraryNameFor:projectID),'.dll'; nextPutLine:' \'.
        ].
        s cr.
    ].

    "
     bosch_dapasx_application generateRequiredLibs_nt_dot_mak      
    "

    "Modified: / 07-09-2006 / 17:22:51 / cg"
!

generateSubProjectLines_modules_dot_stx
    |string|

    string := String streamContents:[:s |
            self subProjects do:[:projectID | 
                    s nextPutLine:(self libraryNameFor:projectID)
                ].
            ].

    ^ string

    "
     bosch_dapasx_application generateSubProjectLines_modules_dot_stx
    "

    "Modified: / 17-08-2006 / 17:22:37 / cg"
!

generateSubProjectLines_nt_dot_mak         

    ^ String streamContents:[:s |
        self subProjects do:[:projectID |
            |mappings newObjectLine|

            mappings := self subProjectLine_nt_dot_mak_mappings: projectID.
            newObjectLine := self replaceMappings: mappings
                                in: self subProjectLine_nt_dot_mak.
            s nextPutAll:newObjectLine. 
            s cr. 
        ]
    ]
"
    bosch_dapasx_application generateSubProjectLinesnt_dot_mak 

"

    "Created: / 09-08-2006 / 11:24:39 / fm"
    "Modified: / 14-09-2006 / 18:46:09 / cg"
! !

!ApplicationDefinition class methodsFor:'private'!

addReferencesToClassesFromGlobalsIn:aSetOfClasses to:usedClassReasons
    aSetOfClasses
        do:[:aClass |
            aClass methodsDo:[:method | 
                method usedGlobals 
                    do:[:global | |usedClass|        
                        usedClass := Smalltalk at: global asSymbol. 
                        (usedClass notNil and:[usedClass isClass and:[usedClass isNameSpace not]]) 
                            ifTrue:[
                                (usedClassReasons at: usedClass ifAbsentPut:[Set new])
                                    add: (usedClass name, ' - Referenced by ', aClass name,'>>',method name)
                            ]
                    ]
            ]
        ].
!

searchForPreRequisites
    |includedClasses requiredPackageReasons usedClassReasons allSubProjects|

    requiredPackageReasons := Dictionary new.
    usedClassReasons := Dictionary new.

    includedClasses := Set with:self.
    self subProjects do:[:projectID | 
        includedClasses addAll: (self searchForClassesWithProject: projectID asSymbol)
    ].

    "/ only search for locals referred to by my methods (assuming that superclasses'
    "/ requisites are specifief in their package.
    self addReferencesToClassesFromGlobalsIn:includedClasses to:usedClassReasons.

    includedClasses do:[:cls | 
        cls allSuperclassesDo:[:superClass |    
            (usedClassReasons at: superClass ifAbsentPut:[Set new])
                add: (superClass name, ' - Superclass of ', cls name).
        ]
    ].
    includedClasses addAll: (usedClassReasons keys).

    allSubProjects := 
        (self siblingsAreSubProjects)
            ifTrue:[ self searchForSiblingProjects ]
            ifFalse:[ self searchForSubProjects ].

    usedClassReasons 
        keysAndValuesDo:[:usedClass :reasonsPerClass |           
                (allSubProjects includes: usedClass package asString)
                        ifFalse:[
                                usedClass package == Project noProjectID 
                                        ifFalse:[(requiredPackageReasons at:usedClass package ifAbsentPut:[Set new])
                                                    addAll:reasonsPerClass.] 
                        ].
        ].

    Transcript showCR:requiredPackageReasons.
    ^requiredPackageReasons

    "
     self searchForPreRequisites
     bosch_dapasx_Application searchForPreRequisites
     cg_testproject1 searchForPreRequisites
    "

    "Created: / 07-08-2006 / 20:42:39 / fm"
    "Modified: / 07-08-2006 / 21:56:25 / fm"
    "Modified: / 23-08-2006 / 15:38:27 / cg"
! !

!ApplicationDefinition class methodsFor:'queries'!

canHaveExtensions
    "return true, if this class allows extensions from other packages.
     Private classes, namespaces and projectDefinitions dont allow this"

    ^ self == ApplicationDefinition

    "
     Smalltalk allClasses select:[:each | each canHaveExtensions not]
    "

    "Created: / 30-08-2006 / 15:29:49 / cg"
! !

!ApplicationDefinition class methodsFor:'sanity checks'!

validateDescription
    #(
        startupClassName
"/        startupSelector
    ) do:[:sel |
        (self theMetaclass implements:sel) ifFalse:[
            Dialog 
                warn:('The %1-method is missing from the description %2!!' 
                        bindWith:sel allBold
                        with:self name allBold).
            AbortSignal raise.
        ].
        (Error catch:[ self perform:sel ]) ifTrue:[
            Dialog 
                warn:('The %1-method needs to be edited in the description %2!!' 
                        bindWith:sel allBold
                        with:self name allBold).
            AbortSignal raise.
        ].
    ].
! !

!ApplicationDefinition class methodsFor:'testing'!

isApplicationDefinition
    ^ self ~~ ApplicationDefinition

    "Created: / 23-08-2006 / 15:17:38 / cg"
!

isProjectDefinition
    ^ self ~~ ApplicationDefinition

    "Created: / 17-08-2006 / 14:11:56 / cg"
! !

!ApplicationDefinition class methodsFor:'update description'!

forEachMethodsCodeToCompileDo:aTwoArgBlock ignoreOldDefinition:ignoreOldDefinition
    super forEachMethodsCodeToCompileDo:aTwoArgBlock ignoreOldDefinition:ignoreOldDefinition.

    aTwoArgBlock 
        value:self subProjects_code
        value:'description'.

    aTwoArgBlock 
        value:self preRequisites_code
        value:'description'.

    (self class implements:#startupClassName) ifFalse:[
        aTwoArgBlock 
            value:self startupClassName_code
            value:'description - startup'.
    ].
    (self class implements:#startupSelector) ifFalse:[
        aTwoArgBlock 
            value:self startupSelector_code
            value:'description - startup'.
    ].

    "Created: / 10-08-2006 / 16:35:47 / cg"
    "Modified: / 30-08-2006 / 19:03:48 / cg"
!

preRequisites_code
    |preRequisites|

    preRequisites := self preRequisites asSet.
    preRequisites addAll: self searchForPreRequisites keys.
    preRequisites removeAll: self excludedFromPreRequisites.

    ^ String streamContents:[:s |
        s nextPutLine:'preRequisites'.
        s nextPutLine:'    ^ #('.
        preRequisites do:[:eachPackageID |    
            s nextPutLine:eachPackageID asString storeString
        ].      
        s nextPutLine:')'
    ].

"
    bosch_dapasx_Application preRequisites_code
"

    "Modified: / 08-08-2006 / 19:24:34 / fm"
    "Created: / 17-08-2006 / 21:28:09 / cg"
!

startupClassName_code
    ^ 
'startupClassName
    self error:''undefined startupClass''.
    ^ ''<name of class here>''
'
!

startupClassName_codeFor:aClassName
    ^ 
'startupClassName
    ^ ''',aClassName,'''
'

    "Created: / 05-09-2006 / 13:40:32 / cg"
!

startupSelector_code
    ^ 
'startupSelector
    self error:''undefined startupSelector''.
    ^ #''start'' "startupSelector here"
'

    "Created: / 30-08-2006 / 19:02:50 / cg"
!

startupSelector_codeFor:aSelector
    ^ 
'startupSelector
    ^ #''',aSelector,''' 
'

    "Created: / 05-09-2006 / 13:41:01 / cg"
!

subProjects_code        
    |subProjects|

    subProjects := 
        (self siblingsAreSubProjects)
            ifTrue:[ self searchForSiblingProjects ]
            ifFalse:[ self searchForSubProjects ].

    subProjects removeAll: self excludedFromSubProjects.

    ^ String streamContents:[:s |
        s nextPutLine:'subProjects'.
        s nextPutLine:'    ^ #('.
        subProjects do:[:eachPackageID |    
            s nextPutLine:eachPackageID asString storeString
        ].      
        s nextPutLine:')'
    ].

    "
     bosch_dapasx subProjectsGeneratedString
     stx_goodies subProjectsGeneratedString
    "

    "Modified: / 08-08-2006 / 19:24:34 / fm"
    "Created: / 17-08-2006 / 21:26:51 / cg"
! !

!ApplicationDefinition class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libbasic/ApplicationDefinition.st,v 1.29 2006-09-14 18:07:46 cg Exp $'
! !