home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / DEVELOP / EPRO104 / epro.cmd next >
OS/2 REXX Batch file  |  1997-01-28  |  43KB  |  1,180 lines

  1. /* REXX
  2. ┌──────────────────────────────────────────────────────────────────────────────┐
  3. │                            EditProject Version 1.04                          │
  4. │                                                                              │
  5. │                          Makefile maintenance utility                        │
  6. │                                                                              │
  7. │                               Bernhard Bablok                                │
  8. │                                                                              │
  9. │                                January, 1997                                 │
  10. │                                                                              │
  11. │   See the file license.txt for details on the legal stuff. See the file      │
  12. │   epro.doc for details on usage.                                             │
  13. │                                                                              │
  14. └──────────────────────────────────────────────────────────────────────────────┘
  15. */
  16.  
  17. SIGNAL ON ERROR   NAME cleanup
  18. SIGNAL ON FAILURE NAME cleanup
  19. SIGNAL ON HALT    NAME cleanup
  20. SIGNAL ON SYNTAX  NAME cleanup
  21.  
  22. PARSE ARG Project.file
  23. CALL startup
  24. CALL VDialogPos 50, 50
  25.  
  26. IF Project.file = '' THEN
  27.   CALL SelectProject
  28. ELSE DO
  29.   Project.file = STRIP(Project.file)
  30.   CALL SysFileTree Project.file, 'count', 'FO'
  31.   IF count.0 = 0 THEN DO                       /* project file doesn't exist! */
  32.     extension = SUBSTR(Project.file,LASTPOS('.',Project.file)+1)
  33.     IF extension = Project.file THEN
  34.        Project.file = Project.file'.emx'       /* default extension is emx    */
  35.     SelectProject.template = Project.file
  36.     CALL SelectProject
  37.     IF RESULT > 0 THEN DO
  38.       Project.name = '.unnamed'
  39.       SelectProject.template = '*.emx'
  40.       main.vstring = 1
  41.     END
  42.   END
  43.   ELSE DO
  44.      CALL ReadProject
  45.      IF RESULT > 0 THEN DO
  46.        Project.name = '.unnamed'
  47.        SelectProject.template = '*.emx'
  48.        main.vstring = 1
  49.      END
  50.   END
  51. END
  52. CALL MainMenu
  53. CALL cleanup                     /* exits this REXX!  ----------------------- */
  54.  
  55. /*----------------------------------------------------------------------------*/
  56. /* PutLine: Write a line to the project file                                  */
  57. /*----------------------------------------------------------------------------*/
  58. PutLine:
  59.  
  60. PARSE ARG text
  61. IF text = '' THEN
  62.   text = ' '
  63.  
  64. DO WHILE LENGTH(text) > 78
  65.   splitpos = LASTPOS(' ',text,78)
  66.   CALL LINEOUT Project.file, SUBSTR(text,1,splitpos-1) '\'
  67.   text = COPIES(' ',11) SUBSTR(text,splitpos+1)
  68. END
  69. CALL LINEOUT Project.file, text
  70. RETURN
  71.  
  72. /*----------------------------------------------------------------------------*/
  73. /* FindIncludes: Search file for all included user files                      */
  74. /*----------------------------------------------------------------------------*/
  75. FindIncludes: PROCEDURE EXPOSE user_includes Project.dir
  76.  
  77. ARG name
  78.  
  79. IF STREAM(name,'C','query exists') = '' THEN
  80.    RETURN
  81.  
  82. CALL SysFileSearch '#include', name,'includes.'         /* search for include */
  83. DO j = 1 TO includes.0                                  /* in all files       */
  84.   word2 = WORD(includes.j,2)
  85.   IF SUBSTR(word2,1,1) = '"' &,                         /* user include file  */
  86.                  VERIFY(word2,'/\','M') = 0 THEN DO     /* in project dir     */
  87.     include_file = STRIP(word2,'B','"')
  88.     IF WORDPOS(include_file,user_includes) = 0 THEN DO  /* add only if not    */
  89.        user_includes = user_includes include_file       /* already in list    */
  90.        CALL FindIncludes Project.dir||include_file      /* recursive call     */
  91.     END
  92.   END
  93. END
  94.  
  95. extension = SUBSTR(name,LASTPOS('.',name)+1)
  96. IF WORDPOS(extension,'C CC CPP CXX H XIH XH HPP') = 0 THEN DO
  97.  
  98.   /* the rest is for resource files only */
  99.  
  100.   DROP includes.
  101.   CALL SysFileSearch 'RCINCLUDE', name,'includes.'      /* RCINCLUDE          */
  102.   DO j = 1 TO includes.0
  103.      word2 = WORD(includes.j,2)
  104.      IF VERIFY(word2,'/\ ','M') = 0 THEN DO             /* in project dir     */
  105.        include_file = STRIP(word2,'B','"')
  106.        IF WORDPOS(include_file,user_includes) = 0 THEN DO
  107.           user_includes = user_includes include_file
  108.           CALL FindIncludes Project.dir||include_file
  109.        END
  110.     END
  111.   END
  112.  
  113.   DROP includes.
  114.   CALL SysFileSearch 'DLGINCLUDE', name,'includes.'     /* DLGINCLUDE         */
  115.   DO j = 1 TO includes.0
  116.      word3 = WORD(includes.j,3)
  117.      IF VERIFY(word3,'/\ ','M') = 0 THEN DO             /* in project dir     */
  118.        include_file = STRIP(word3,'B','"')
  119.        IF WORDPOS(include_file,user_includes) = 0 THEN DO
  120.           user_includes = user_includes include_file
  121.           CALL FindIncludes Project.dir||include_file
  122.        END
  123.     END
  124.   END
  125.  
  126.   DROP includes.
  127.   CALL SysFileSearch 'BITMAP', name,'includes.'         /* BITMAP             */
  128.   DO j = 1 TO includes.0
  129.      lastword = WORD(includes.j,WORDS(includes.j))
  130.      IF VERIFY(lastword,'/\ ','M') = 0 THEN DO          /* in project dir     */
  131.        include_file = STRIP(lastword,'B','"')
  132.        IF WORDPOS(include_file,user_includes) = 0 THEN DO
  133.           user_includes = user_includes include_file
  134.           CALL FindIncludes Project.dir||include_file
  135.        END
  136.     END
  137.   END
  138.  
  139.   DROP includes.
  140.   CALL SysFileSearch 'ICON', name,'includes.'           /* ICON               */
  141.   DO j = 1 TO includes.0
  142.      lastword = WORD(includes.j,WORDS(includes.j))
  143.      IF VERIFY(lastword,'/\ ','M') = 0 THEN DO          /* in project dir     */
  144.        include_file = STRIP(lastword,'B','"')
  145.        IF WORDPOS(include_file,user_includes) = 0 THEN DO
  146.           user_includes = user_includes include_file
  147.           CALL FindIncludes Project.dir||include_file
  148.        END
  149.     END
  150.   END
  151.  
  152.   DROP includes.
  153.   CALL SysFileSearch 'POINTER', name,'includes.'        /* POINTER            */
  154.   DO j = 1 TO includes.0
  155.      lastword = WORD(includes.j,WORDS(includes.j))
  156.      IF VERIFY(lastword,'/\ ','M') = 0 THEN DO          /* in project dir     */
  157.        include_file = STRIP(lastword,'B','"')
  158.        IF WORDPOS(include_file,user_includes) = 0 THEN DO
  159.           user_includes = user_includes include_file
  160.           CALL FindIncludes Project.dir||include_file
  161.        END
  162.     END
  163.   END
  164.  
  165. END
  166.  
  167. RETURN
  168.  
  169. /*----------------------------------------------------------------------------*/
  170. /* startup: Initialize functions and variables                                */
  171. /*----------------------------------------------------------------------------*/
  172. startup:
  173.  
  174. EditProject.version  = 1.04
  175. EditProject.make     = 'make'
  176. UserAddedCode.0      = 0
  177.  
  178. main.0       = 10
  179. main.1       = 'Select project'
  180. main.2       = 'Select target type'
  181. main.3       = 'Resource file'
  182. main.4       = 'Module definition file'
  183. main.5       = 'Add files'
  184. main.6       = 'Delete files'
  185. main.7       = 'Build options'
  186. main.8       = 'Compiler options'
  187. main.9       = 'Link options'
  188. main.10      = 'Make'
  189.  
  190. SelectProject.title    = 'Select project'
  191. SelectProject.template = '*.emx'
  192.  
  193. SelectTargetType.title   = 'Select target type'
  194. SelectTargetType.0       = 4
  195. SelectTargetType.1       = 'EXE'
  196. SelectTargetType.2       = 'PM-EXE'
  197. SelectTargetType.3       = 'DLL'
  198. SelectTargetType.4       = 'LIB'
  199. SelectTargetType.vstring = SelectTargetType.1
  200.  
  201. ResourceFile.title    = 'Resource File'
  202. ResourceFile.width    = 40
  203. ResourceFile.0        = 2
  204. ResourceFile.1        = 'Enter the name of the resource file  '
  205. ResourceFile.2        = 'or clear the entry field:'
  206.  
  207. ModuleFile.title    = 'Module definition file'
  208. ModuleFile.width    = 45
  209. ModuleFile.0        = 2
  210. ModuleFile.1        = 'Enter the name of the module definition  '
  211. ModuleFile.2        = 'file or clear the entry field: '
  212.  
  213. AddFiles.title    = 'Add file'
  214. AddFiles.template = '*.c'
  215.  
  216. sources.0      = 0
  217. sources.title  = 'Added files'
  218. sources.back   = 'BLUE'
  219. sources.fore   = 'WHITE'
  220. sources.type   = 'SYSTEM'                             /* font                 */
  221. sources.size   = 10                                   /* pitch                */
  222. sources.left   = 1                                    /* position of window   */
  223. sources.bottom = 5
  224. sources.right  = 20
  225. sources.top    = 95
  226. sources.diff   = 25                                   /* distance betw. lines */
  227. sources.all    = ''                                   /* all sources          */
  228.  
  229. DeleteFiles.title  = 'Delete files'
  230. DeleteFiles.width  = 20
  231. DeleteFiles.height = 10
  232.  
  233. BuildOption.title  = 'Build-Mode'
  234. BuildOption.0      = 2
  235. BuildOption.1      = 'Debug'
  236. BuildOption.2      = 'Production'
  237.  
  238. CompilerOptions.title    = 'Compiler options'
  239. CompilerOptions.prompt.0 = 3
  240. CompilerOptions.prompt.1 = 'Global options:'
  241. CompilerOptions.prompt.2 = 'Debug options:'
  242. CompilerOptions.prompt.3 = 'Production options:'
  243.  
  244. CompilerOptions.width.0  = 3
  245. CompilerOptions.width.1  = 60
  246. CompilerOptions.width.2  = 60
  247. CompilerOptions.width.3  = 60
  248.  
  249. CompilerOptions.hide.    = 0
  250. CompilerOptions.hide.0   = 3
  251.  
  252. CompilerOptions.return.0 = 3
  253.  
  254. LinkOptions.title    = 'Link options'
  255. LinkOptions.prompt.0 = 3
  256. LinkOptions.prompt.1 = 'Global options:'
  257. LinkOptions.prompt.2 = 'Debug options:'
  258. LinkOptions.prompt.3 = 'Production options:'
  259.  
  260. LinkOptions.width.0  = 3
  261. LinkOptions.width.1  = 60
  262. LinkOptions.width.2  = 60
  263. LinkOptions.width.3  = 60
  264.  
  265. LinkOptions.hide.    = 0
  266. LinkOptions.hide.0   = 3
  267.  
  268. LinkOptions.return.0 = 3
  269.  
  270. /*----------------------------------------------------------------------------*/
  271. /* Definitions for message boxes                                              */
  272. /*----------------------------------------------------------------------------*/
  273.  
  274. SaveProject.title  = 'Save project'
  275. SaveProject.0      = 2
  276. SaveProject.1      = 'Project information has changed.'
  277. SaveProject.2      = 'Save information?'
  278.  
  279. NotImplemented.title = 'Sorry!'
  280. NotImplemented.0     = 1
  281. NotImplemented.1     = 'Option not implemented'
  282.  
  283. WrongVersion.title = 'Sorry!'
  284. WrongVersion.0     = 1
  285. WrongVersion.1     = 'No EditProject makefile or wrong version'
  286. WrongVersion.2     = 'wrong version'
  287.  
  288. DeleteFileProblem.title = 'Problem!'
  289. DeleteFileProblem.0 = 2
  290. DeleteFileProblem.1 = 'Could not delete old makefile!'
  291. DeleteFileProblem.2 = 'Change access flags and try again.'
  292.  
  293. UnnamedProject.title = 'Problem!'
  294. UnnamedProject.0     = 2
  295. UnnamedProject.1     = 'No name defined for project!'
  296. UnnamedProject.2     = 'Define a name and try again.'
  297.  
  298. /*----------------------------------------------------------------------------*/
  299. /* Initialize REXX-function-package                                           */
  300. /*----------------------------------------------------------------------------*/
  301.  
  302. IF RxFuncQuery('SysLoadFuncs') THEN DO
  303.   CALL RxFuncAdd 'SysLoadFuncs','RexxUtil','SysLoadFuncs'
  304.   CALL SysLoadFuncs
  305. END
  306.  
  307. /*----------------------------------------------------------------------------*/
  308. /* Initialize VREXX-function-package                                          */
  309. /*----------------------------------------------------------------------------*/
  310.  
  311. CALL RxFuncAdd 'VInit', 'VREXX', 'VInit'
  312. RC = VInit()
  313. IF RC = 'ERROR' THEN
  314.   SIGNAL cleanup
  315.  
  316. OK       = 1
  317. CANCEL   = 2
  318. OKCANCEL = 3
  319. YES      = 4
  320. NO       = 5
  321. YESNO    = 6
  322.  
  323. RETURN
  324.  
  325. /*----------------------------------------------------------------------------*/
  326. /* SetDefaults: Set project-defaults for a new project                        */
  327. /*----------------------------------------------------------------------------*/
  328. SetDefaults:
  329.  
  330. Project.mode                      = SUBSTR(BuildOption.1,1,1)
  331. Project.TargetType                = 'EXE'
  332. Project.ResourceFile              = ''
  333. Project.ModuleFile                = ''
  334. Project.GlobalCompilerOptions     = ''
  335. Project.DebugCompilerOptions      = ''
  336. Project.ProductionCompilerOptions = ''
  337. Project.GlobalLinkOptions         = ''
  338. Project.DebugLinkOptions          = ''
  339. Project.ProductionLinkOptions     = ''
  340. Project.status                    = 'SAVED'          /* no changes yet!       */
  341. sources.all                       = ''
  342. sources.0                         = 0
  343.  
  344. RETURN 0
  345.  
  346. /*----------------------------------------------------------------------------*/
  347. /* SetupRules: Define rules (depending on compiler)                           */
  348. /*----------------------------------------------------------------------------*/
  349. SetupRules: PROCEDURE EXPOSE target.
  350.  
  351. ARG environment
  352.  
  353. SELECT
  354.    WHEN environment = 'EMX' THEN DO
  355.       TT = 'MAKE_VARS'
  356.       target.TT.1  = 'ifeq ($(findstring -Zomf,$($(MODE)_CFLAGS)',
  357.                                                            '$(G_CFLAGS)),-Zomf)'
  358.       target.TT.2  = 'O  = .obj'
  359.       target.TT.3  = 'AR = emxomfar'
  360.       target.TT.4  = 'else'
  361.       target.TT.5  = 'O = .o'
  362.       target.TT.6  = 'AR = ar'
  363.       target.TT.7  = 'endif'
  364.       target.TT.8  = 'CC = gcc'
  365.       target.TT.0  = 8
  366.  
  367.       TT = 'PM-EXE'
  368.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  369.       target.TT.2  = 'ifeq ($(O),.obj)'
  370.       target.TT.3  = '$(PROJECT).exe :: $(OBJECTS) $(MODULE_FILE)'
  371.       target.TT.4  = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  372.                             '$($(MODE)_LFLAGS) $(MODULE_FILE) -o $(PROJECT).exe'
  373.       target.TT.5  = 'ifneq ($(strip $(RC_FILE)),)'
  374.       target.TT.6  = '$(PROJECT).exe :: $(RES_FILE)'
  375.       target.TT.7  = '    rc $(RES_FILE) $(PROJECT).exe'
  376.       target.TT.8  = 'endif'
  377.       target.TT.9  = 'else'
  378.       target.TT.10 = 'ifneq ($(strip $(RC_FILE)),)'
  379.       target.TT.11 = '$(PROJECT).exe : $(PROJECT).out $(RES_FILE)',
  380.                                                                  '$(MODULE_FILE)'
  381.       target.TT.12 = '    emxbind -b -d$(MODULE_FILE)',
  382.                                                '-r$(RES_FILE) $(PROJECT).out'
  383.       target.TT.13 = ' '
  384.       target.TT.14 = '$(PROJECT).out : $(OBJECTS)'
  385.       target.TT.15 = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  386.                                            '$($(MODE)_LFLAGS) -o $(PROJECT).out'
  387.       target.TT.16 = 'else'
  388.       target.TT.17 = '$(PROJECT).exe : $(OBJECTS)'
  389.       target.TT.18 = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  390.                                            '$($(MODE)_LFLAGS) -o $(PROJECT).exe'
  391.       target.TT.19 = 'endif'
  392.       target.TT.20 = 'endif'
  393.       target.TT.0  = 20
  394.  
  395.       TT = 'EXE'
  396.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  397.       target.TT.2 = '$(PROJECT).exe : $(OBJECTS) $(MODULE_FILE)'
  398.       target.TT.3 = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  399.                             '$($(MODE)_LFLAGS) $(MODULE_FILE) -o $(PROJECT).exe'
  400.       target.TT.0 = 3
  401.  
  402.       TT = 'DLL'
  403.       target.TT.1  = 'mainTarget : $(PROJECT).dll'
  404.       target.TT.2 = '$(PROJECT).dll :: $(OBJECTS) $(MODULE_FILE)'
  405.       target.TT.3 = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  406.                             '$($(MODE)_LFLAGS) $(MODULE_FILE) -o $(PROJECT).dll'
  407.       target.TT.4  = 'ifneq ($(strip $(RC_FILE)),)'
  408.       target.TT.5  = '$(PROJECT).dll :: $(RES_FILE)'
  409.       target.TT.6  = '    rc $(RES_FILE) $(PROJECT).dll'
  410.       target.TT.7  = 'endif'
  411.       target.TT.0 = 7
  412.  
  413.       TT = 'LIB'
  414.       target.TT.1  = 'mainTarget : $(PROJECT).lib'
  415.       target.TT.2 = '$(PROJECT).lib : $(OBJECTS)'
  416.       target.TT.3 = '    $(AR) rc $(PROJECT).lib $?'
  417.       target.TT.0 = 3
  418.  
  419.       TT = 'RESOURCE'
  420.       target.TT.1 = '%.RES : %.rc'
  421.       target.TT.2 = '    rc -r $<'
  422.       target.TT.0 = 2
  423.  
  424.       TT = 'OBJECTS'
  425.       target.TT.1 = '    $(CC) $(G_CFLAGS) $($(MODE)_CFLAGS) -c $< -o $(OBJ_DIR)$(@F)'
  426.       target.TT.0 = 1
  427.    END
  428.    WHEN environment = 'GCC' THEN DO
  429.       TT = 'MAKE_VARS'
  430.       target.TT.1  = 'O  = .obj'
  431.       target.TT.2  = 'AR = glib'
  432.       target.TT.3  = 'CC = gcc'
  433.       target.TT.0  = 3
  434.  
  435.       TT = 'PM-EXE'
  436.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  437.       target.TT.2  = '$(PROJECT).exe :: $(OBJECTS) $(MODULE_FILE)'
  438.       target.TT.3  = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  439.                             '$($(MODE)_LFLAGS) $(MODULE_FILE) -o $(PROJECT).exe'
  440.       target.TT.4  = 'ifneq ($(strip $(RC_FILE)),)'
  441.       target.TT.5  = '$(PROJECT).exe :: $(RES_FILE)'
  442.       target.TT.6  = '    rc $(RES_FILE) $(PROJECT).exe'
  443.       target.TT.7  = 'endif'
  444.       target.TT.0  = 7
  445.  
  446.       TT = 'EXE'
  447.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  448.       target.TT.2 = '$(PROJECT).exe : $(OBJECTS) $(MODULE_FILE)'
  449.       target.TT.3 = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  450.                             '$($(MODE)_LFLAGS) $(MODULE_FILE) -o $(PROJECT).exe'
  451.       target.TT.0 = 3
  452.  
  453.       TT = 'DLL'
  454.       target.TT.1  = 'mainTarget : $(PROJECT).dll'
  455.       target.TT.2 = '$(PROJECT).dll :: $(OBJECTS) $(MODULE_FILE)'
  456.       target.TT.3 = '    $(CC) $(OBJECTS:%=$(OBJ_DIR)%) $(G_LFLAGS)',
  457.                             '$($(MODE)_LFLAGS) $(MODULE_FILE) -o $(PROJECT).dll'
  458.       target.TT.4  = 'ifneq ($(strip $(RC_FILE)),)'
  459.       target.TT.5  = '$(PROJECT).dll :: $(RES_FILE)'
  460.       target.TT.6  = '    rc $(RES_FILE) $(PROJECT).dll'
  461.       target.TT.7  = 'endif'
  462.       target.TT.0 = 7
  463.  
  464.       TT = 'LIB'
  465.       target.TT.1  = 'mainTarget : $(PROJECT).lib'
  466.       target.TT.2 = '$(PROJECT).lib : $(OBJECTS)'
  467.       target.TT.3 = '    $(AR) $(PROJECT).lib $(patsubst %,-a %,$?)'
  468.       target.TT.0 = 3
  469.  
  470.       TT = 'RESOURCE'
  471.       target.TT.1 = '%.RES : %.rc'
  472.       target.TT.2 = '    rc -r $<'
  473.       target.TT.0 = 2
  474.  
  475.       TT = 'OBJECTS'
  476.       target.TT.1 = '    $(CC) $(G_CFLAGS) $($(MODE)_CFLAGS) -c $< -o $(OBJ_DIR)$(@F)'
  477.       target.TT.0 = 1
  478.    END
  479.    WHEN environment = 'ICC' | environment = 'VA' THEN DO
  480.       TT = 'MAKE_VARS'
  481.       target.TT.1  = 'O  = .obj'
  482.       IF environment = 'ICC THEN
  483.          target.TT.2  = 'AR = lib'
  484.       ELSE
  485.          target.TT.2  = 'AR = ilib'
  486.       target.TT.3  = 'CC = icc'
  487.       target.TT.0  = 3
  488.  
  489.       TT = 'PM-EXE'
  490.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  491.       target.TT.2  = '$(PROJECT).exe :: $(OBJECTS) $(MODULE_FILE)'
  492.       target.TT.3  = '    $(CC) $(G_LFLAGS) $($(MODE)_LFLAGS) /Fe$(PROJECT).exe',
  493.                           '$(subst /,\,$(OBJECTS:%=$(OBJ_DIR)%)) $(MODULE_FILE)'
  494.       target.TT.4  = 'ifneq ($(strip $(RC_FILE)),)'
  495.       target.TT.5  = '$(PROJECT).exe :: $(RES_FILE)'
  496.       target.TT.6  = '    rc $(RES_FILE) $(PROJECT).exe'
  497.       target.TT.7  = 'endif'
  498.       target.TT.0  = 7
  499.  
  500.       TT = 'EXE'
  501.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  502.       target.TT.2 = '$(PROJECT).exe : $(OBJECTS) $(MODULE_FILE)'
  503.       target.TT.3  = '    $(CC) $(G_LFLAGS) $($(MODE)_LFLAGS) /Fe$(PROJECT).exe',
  504.                           '$(subst /,\,$(OBJECTS:%=$(OBJ_DIR)%)) $(MODULE_FILE)'
  505.       target.TT.0 = 3
  506.  
  507.       TT = 'DLL'
  508.       target.TT.1 = 'mainTarget : $(PROJECT).dll'
  509.       target.TT.2 = '$(PROJECT).dll :: $(OBJECTS) $(MODULE_FILE)'
  510.       target.TT.3 = '    $(CC) $(G_LFLAGS) $($(MODE)_LFLAGS) /Fe$(PROJECT).dll',
  511.                           '$(subst /,\,$(OBJECTS:%=$(OBJ_DIR)%)) $(MODULE_FILE)'
  512.       target.TT.4 = '    implib $(PROJECT).lib $(MODULE_FILE)'
  513.       target.TT.5  = 'ifneq ($(strip $(RC_FILE)),)'
  514.       target.TT.6  = '$(PROJECT).dll :: $(RES_FILE)'
  515.       target.TT.7  = '    rc $(RES_FILE) $(PROJECT).dll'
  516.       target.TT.8  = 'endif'
  517.       target.TT.0 = 8
  518.  
  519.       TT = 'LIB'
  520.       target.TT.1 = 'mainTarget : delLibRespFile $(PROJECT).lib'
  521.       target.TT.2 = 'delLibRespFile:'
  522.       target.TT.3 = '    -DEL $(PROJECT).tmp 1>NUL 2>NUL'
  523.       target.TT.4 = ''
  524.       target.TT.5 = '$(PROJECT).lib : $(OBJECTS)'
  525.       target.TT.6 = '    $(AR) /NOI /NOLOGO $(PROJECT).lib @$(PROJECT).tmp ,,;'
  526.       target.TT.0 = 6
  527.  
  528.       TT = 'RESOURCE'
  529.       target.TT.1 = '%.RES : %.rc'
  530.       target.TT.2 = '    rc -r $<'
  531.       target.TT.0 = 2
  532.  
  533.       TT = 'OBJECTS'
  534.       target.TT.1 = '    $(CC) /C+ $(G_CFLAGS) $($(MODE)_CFLAGS)',
  535.                                                          '/Fo$(OBJ_DIR)$(@F) $<'
  536.       target.TT.2 = '    ECHO -+$(subst /,\,$(OBJ_DIR)$(@F)) ^& >> $(PROJECT).tmp'
  537.       target.TT.0 = 2
  538.    END
  539.    WHEN environment = 'BCC' THEN DO
  540.       TT = 'MAKE_VARS'
  541.       target.TT.1  = 'O  = .obj'
  542.       target.TT.2  = 'AR = tlib'
  543.       target.TT.3  = 'CC = bcc'
  544.       target.TT.0  = 3
  545.  
  546.       TT = 'PM-EXE'
  547.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  548.       target.TT.2  = '$(PROJECT).exe :: $(OBJECTS) $(MODULE_FILE)'
  549.       target.TT.3  = '    $(CC) $(G_LFLAGS) $($(MODE)_LFLAGS) -e$(PROJECT)',
  550.                       '$(subst /,\,$(OBJECTS:%=$(OBJ_DIR)%)) -sD=$(MODULE_FILE)'
  551.       target.TT.4  = 'ifneq ($(strip $(RC_FILE)),)'
  552.       target.TT.5  = '$(PROJECT).exe :: $(RES_FILE)'
  553.       target.TT.6  = '    rc $(RES_FILE) $(PROJECT).exe'
  554.       target.TT.7  = 'endif'
  555.       target.TT.0  = 7
  556.  
  557.       TT = 'EXE'
  558.       target.TT.1  = 'mainTarget : $(PROJECT).exe'
  559.       target.TT.2 = '$(PROJECT).exe : $(OBJECTS)'
  560.       target.TT.3  = '    $(CC) $(G_LFLAGS) $($(MODE)_LFLAGS) -e$(PROJECT)',
  561.                                          '$(subst /,\,$(OBJECTS:%=$(OBJ_DIR)%))'
  562.       target.TT.0 = 3
  563.  
  564.       TT = 'DLL'
  565.       target.TT.1  = 'mainTarget : $(PROJECT).dll'
  566.       target.TT.2 = '$(PROJECT).dll : $(OBJECTS) $(MODULE_FILE)'
  567.       target.TT.3  = '    $(CC) $(G_LFLAGS) $($(MODE)_LFLAGS) -e$(PROJECT)',
  568.                       '$(subst /,\,$(OBJECTS:%=$(OBJ_DIR)%)) -sD=$(MODULE_FILE)'
  569.       target.TT.4  = 'ifneq ($(strip $(RC_FILE)),)'
  570.       target.TT.5  = '$(PROJECT).dll :: $(RES_FILE)'
  571.       target.TT.6  = '    rc $(RES_FILE) $(PROJECT).dll'
  572.       target.TT.7  = 'endif'
  573.       target.TT.0 = 7
  574.  
  575.       TT = 'LIB'
  576.       target.TT.1  = 'mainTarget : $(PROJECT).lib'
  577.       target.TT.2 = '$(PROJECT).lib : $(OBJECTS)'
  578.       target.TT.3 = '    $(AR) /C $(PROJECT).lib',
  579.                                           '$(patsubst %,-+%,$(subst /,\,$?)),,;'
  580.       target.TT.0 = 3
  581.  
  582.       TT = 'RESOURCE'
  583.       target.TT.1 = '%.RES : %.rc'
  584.       target.TT.2 = '    rc -r $<'
  585.       target.TT.0 = 2
  586.  
  587.       TT = 'OBJECTS'
  588.       target.TT.1 = '    $(CC) -c $(G_CFLAGS) $($(MODE)_CFLAGS)',
  589.                                               '-o$(OBJ_DIR)$(basename $(@F)) $<'
  590.       target.TT.0 = 1
  591.    END
  592.    OTHERWISE
  593.       NOP
  594. END
  595. RETURN
  596.  
  597. /*----------------------------------------------------------------------------*/
  598. /* ReadProject: Read makefile of existing project                             */
  599. /*----------------------------------------------------------------------------*/
  600. ReadProject:
  601.  
  602. DROP UserAddedCode.
  603. UserAddedCode.0 = 0
  604.  
  605. line = LINEIN(Project.file)
  606. line = LINEIN(Project.file)
  607. IF WORD(line,5) <> 'EditProject' | WORD(line,7) < 0.6 THEN DO
  608.   CALL VMsgBox WrongVersion.title, WrongVersion, OK
  609.   DROP makefile.
  610.   RETURN 16
  611. END
  612.  
  613. CALL SetDefaults
  614. DO WHILE LINES(Project.file) > 0
  615.   line = LINEIN(Project.file)
  616.   IF LENGTH(line) = 0 THEN
  617.     ITERATE
  618.   DO WHILE SUBSTR(line,LENGTH(line),1) = '\'
  619.      line = SUBSTR(line,1,LENGTH(line)-1) LINEIN(Project.file)
  620.   END
  621.   SELECT
  622.     WHEN WORD(line,1) = 'MODE' THEN
  623.       Project.mode = SUBSTR(line,WORDINDEX(line,3),1)
  624.  
  625.     WHEN WORD(line,1) = 'G_CFLAGS' THEN DO
  626.       IF WORD(line,3) <> '' THEN
  627.         Project.GlobalCompilerOptions = SUBSTR(line,WORDINDEX(line,3))
  628.       ELSE
  629.         Project.GlobalCompilerOptions = ''
  630.     END
  631.     WHEN WORD(line,1) = 'D_CFLAGS' THEN DO
  632.       IF WORD(line,3) <> '' THEN
  633.         Project.DebugCompilerOptions = SUBSTR(line,WORDINDEX(line,3))
  634.       ELSE
  635.         Project.DebugCompilerOptions = ''
  636.     END
  637.     WHEN WORD(line,1) = 'P_CFLAGS' THEN DO
  638.       IF WORD(line,3) <> '' THEN
  639.         Project.ProductionCompilerOptions = SUBSTR(line,WORDINDEX(line,3))
  640.       ELSE
  641.         Project.ProductionCompilerOptions = ''
  642.     END
  643.  
  644.     WHEN WORD(line,1) = 'G_LFLAGS' THEN DO
  645.       IF WORD(line,3) <> '' THEN
  646.         Project.GlobalLinkOptions = SUBSTR(line,WORDINDEX(line,3))
  647.       ELSE
  648.         Project.GlobalLinkOptions = ''
  649.     END
  650.     WHEN WORD(line,1) = 'D_LFLAGS' THEN DO
  651.       IF WORD(line,3) <> '' THEN
  652.         Project.DebugLinkOptions = SUBSTR(line,WORDINDEX(line,3))
  653.       ELSE
  654.         Project.DebugLinkOptions = ''
  655.     END
  656.     WHEN WORD(line,1) = 'P_LFLAGS' THEN DO
  657.       IF WORD(line,3) <> '' THEN
  658.         Project.ProductionLinkOptions = SUBSTR(line,WORDINDEX(line,3))
  659.       ELSE
  660.         Project.ProductionLinkOptions = ''
  661.     END
  662.  
  663.     WHEN WORD(line,1) = 'RC_FILE' THEN DO
  664.       IF WORD(line,3) <> '' THEN
  665.         Project.ResourceFile = SUBSTR(line,WORDINDEX(line,3))
  666.       ELSE
  667.         Project.ResourceFile = ''
  668.     END
  669.  
  670.     WHEN WORD(line,1) = 'MODULE_FILE' THEN DO
  671.       IF WORD(line,3) <> '' THEN
  672.         Project.ModuleFile = SUBSTR(line,WORDINDEX(line,3))
  673.       ELSE
  674.         Project.ModuleFile = ''
  675.     END
  676.  
  677.     WHEN WORD(line,1) = 'TARGET_TYPE' THEN DO
  678.       IF WORD(line,3) <> '' THEN
  679.         Project.TargetType = SUBSTR(line,WORDINDEX(line,3))
  680.       ELSE
  681.         Project.TargetType = ''
  682.     END
  683.  
  684.     WHEN WORD(line,1) = 'SOURCES' THEN DO
  685.       IF WORD(line,3) <> '' THEN
  686.         sources.all = SPACE(SUBSTR(line,WORDINDEX(line,3)))
  687.       ELSE
  688.         sources.all = ''
  689.       sources.0 = STRIP(WORDS(sources.all))
  690.       DO i = 1 TO sources.0
  691.         sources.i = STRIP(WORD(sources.all,i))
  692.       END
  693.     END
  694.  
  695.     WHEN WORD(line,1) = 'VPATH' THEN DO
  696.       Project.dir = TRANSLATE(WORD(line,3)'/','\','/')
  697.     END
  698.  
  699.     WHEN POS('User added code after this line is preserved.',line) > 0 THEN DO
  700.       i = 0
  701.       DO WHILE LINES(Project.file) > 0
  702.          i = i + 1
  703.          UserAddedCode.i = LINEIN(Project.file)
  704.       END
  705.       UserAddedCode.0 = i
  706.     END
  707.     OTHERWISE NOP
  708.   END
  709. END
  710. CALL LINEOUT Project.file
  711.  
  712. main.vstring   = main.5
  713. Project.name   = FILESPEC("name",Project.file)
  714. PARSE VALUE Project.name WITH Project.Project '.' Project.environment
  715. Project.environment = TRANSLATE(Project.environment)
  716. CALL SetupRules Project.environment
  717. SelectProject.template = Project.dir'*.'Project.environment
  718.  
  719. RETURN 0
  720.  
  721. /*----------------------------------------------------------------------------*/
  722. /* cleanup: Release of VREXX-resources                                        */
  723. /*----------------------------------------------------------------------------*/
  724. cleanup:
  725.  
  726. IF CONDITION() <> '' THEN DO
  727.    SAY 'Internal error in REXX. Please communicate the following information'
  728.    SAY 'as well as any information on how to reproduce the error to the author:'
  729.    SAY '  B.Bablok, Internet: ua302cb@sunmail.lrz-muenchen.de'
  730.    SAY 'Thank you!'
  731.    SAY 'Error in line' SIGL '(RC='RC'):' ERRORTEXT(RC)
  732.    SAY 'Condition:  ' CONDITION('C')
  733.    SAY 'Description:' CONDITION('D')
  734.    TRACE ?R
  735. END
  736. CALL VExit
  737. EXIT
  738.  
  739. /*----------------------------------------------------------------------------*/
  740. /* MainMenu: Show a dialog-box until CANCEL                                   */
  741. /*----------------------------------------------------------------------------*/
  742. MainMenu:
  743.  
  744. DO FOREVER
  745.   CALL VRadioBox  'Project 'project.name, main, OKCANCEL
  746.   IF RESULT = 'CANCEL' THEN DO
  747.     IF project.status = 'CHANGED' THEN DO
  748.       CALL VMsgBox SaveProject.title, SaveProject, YESNO
  749.       IF RESULT = 'YES' THEN DO
  750.         CALL WriteProject
  751.         IF RESULT = 0 THEN
  752.           LEAVE
  753.       END
  754.       ELSE
  755.         LEAVE
  756.     END
  757.     ELSE
  758.       LEAVE
  759.   END
  760.   ELSE DO
  761.     SELECT
  762.       WHEN main.vstring = main.1 THEN
  763.         CALL SelectProject
  764.       WHEN main.vstring = main.2 THEN
  765.         CALL SelectTargetType
  766.       WHEN main.vstring = main.3 THEN
  767.         CALL ResourceFile
  768.       WHEN main.vstring = main.4 THEN
  769.         CALL ModuleFile
  770.       WHEN main.vstring = main.5 THEN
  771.         CALL AddFiles
  772.       WHEN main.vstring = main.6 THEN
  773.         CALL DeleteFiles
  774.       WHEN main.vstring = main.7 THEN
  775.         CALL DefineBuildOption
  776.       WHEN main.vstring = main.8 THEN
  777.         CALL DefineCompilerOptions
  778.       WHEN main.vstring = main.9 THEN
  779.         CALL DefineLinkOptions
  780.       WHEN main.vstring = main.10 THEN
  781.         CALL ExecuteMakefile
  782.       OTHERWISE DO
  783.         CALL VMsgBox NotImplemented.title, NotImplemented, OK
  784.       END    /* OTHERWISE DO */
  785.     END    /* SELECT */
  786.   END    /* ELSE DO */
  787. END    /* DO FOREVER */
  788.  
  789. RETURN
  790.  
  791. /*----------------------------------------------------------------------------*/
  792. /* SelectProject: Display a file selection box for the makefile               */
  793. /*----------------------------------------------------------------------------*/
  794. SelectProject:
  795.  
  796. IF project.status = 'CHANGED' THEN DO
  797.   CALL VMsgBox SaveProject.title, SaveProject, YESNO
  798.   IF RESULT = 'YES' THEN DO
  799.     CALL WriteProject
  800.     IF RESULT > 0 THEN
  801.       RETURN
  802.   END
  803. END
  804.  
  805. Project.vstring = Project.file
  806. CALL VFileBox SelectProject.title, SelectProject.template, 'Project'
  807. IF RESULT <> 'CANCEL' THEN DO
  808.    Project.status = 'CHANGED'
  809.    Project.file   = Project.vstring
  810.  
  811.    Project.name   = FILESPEC("name",Project.vstring)
  812.    PARSE VALUE Project.name WITH Project.project '.' Project.environment
  813.    Project.environment = TRANSLATE(Project.environment)
  814.  
  815.    Project.dir    = FILESPEC("drive",Project.vstring) ||,
  816.                     FILESPEC("path",Project.vstring)
  817.    SelectProject.template = Project.dir'*.'Project.environment
  818.  
  819.    CALL SysFileTree Project.file, 'count', 'FO'
  820.    IF count.0 = 0 THEN DO                      /* project file doesn't exist! */
  821.      CALL SetDefaults
  822.      CALL SetupRules Project.environment
  823.    END
  824.    ELSE DO
  825.      CALL ReadProject
  826.      IF RESULT > 0 THEN DO
  827.        Project.name = '.unnamed'
  828.        SelectProject.template = '*.emx'
  829.        main.vstring = 1
  830.      END
  831.    END
  832.    DROP count.
  833.    RETURN 0
  834. END
  835. RETURN 1
  836.  
  837. /*----------------------------------------------------------------------------*/
  838. /* SelectTargetType: Select type of target                                    */
  839. /*----------------------------------------------------------------------------*/
  840. SelectTargetType:
  841.  
  842. SelectTargetType.vstring = Project.TargetType
  843. CALL VRadioBox  SelectTargetType.title, SelectTargetType, OKCANCEL
  844. IF RESULT <> 'CANCEL' THEN DO
  845.    Project.status = 'CHANGED'
  846.    Project.TargetType = SelectTargetType.vstring
  847. END
  848.  
  849. RETURN
  850.  
  851. /*----------------------------------------------------------------------------*/
  852. /* ResourceFile: Select resource file for the application                     */
  853. /*----------------------------------------------------------------------------*/
  854. ResourceFile:
  855.  
  856. ResourceFile.vstring = Project.ResourceFile
  857. CALL VInputBox ResourceFile.title,'ResourceFile', ResourceFile.width, OKCANCEL
  858. IF RESULT <> 'CANCEL' THEN DO
  859.    Project.status = 'CHANGED'
  860.    Project.ResourceFile = FILESPEC("name",ResourceFile.vstring)
  861.    IF POS('.RC',TRANSLATE(Project.ResourceFile)) = 0 THEN
  862.      Project.ResourceFile = Project.ResourceFile'.rc'
  863. END
  864. RETURN
  865.  
  866. /*----------------------------------------------------------------------------*/
  867. /* ModuleFile: Select module definition file for the application              */
  868. /*----------------------------------------------------------------------------*/
  869. ModuleFile:
  870.  
  871. ModuleFile.vstring = Project.ModuleFile
  872. CALL VInputBox ModuleFile.title,'ModuleFile', ModuleFile.width, OKCANCEL
  873. IF RESULT <> 'CANCEL' THEN DO
  874.    Project.status = 'CHANGED'
  875.    Project.ModuleFile = FILESPEC("name",ModuleFile.vstring)
  876.    IF POS('.DEF',TRANSLATE(Project.ModuleFile)) = 0 THEN
  877.      Project.ModuleFile = Project.ModuleFile'.def'
  878. END
  879. RETURN
  880.  
  881. /*----------------------------------------------------------------------------*/
  882. /* AddFiles: Add source-files to the project                                  */
  883. /*----------------------------------------------------------------------------*/
  884. AddFiles:
  885.  
  886. sources.id = VOpenWindow(sources.title,sources.back,sources)
  887. CALL VSetFont sources.id, sources.type, sources.size
  888. sources.linenr = 1000
  889.  
  890. CALL VForeColor sources.id, sources.fore
  891. DO i = 1 TO sources.0
  892.   sources.linenr = sources.linenr - sources.diff
  893.   CALL VSay sources.id, 5, sources.linenr, sources.i
  894. END
  895.  
  896. DO FOREVER
  897.    CALL VFileBox AddFiles.title, Project.dir||AddFiles.template, 'AddFiles'
  898.    IF RESULT = 'CANCEL' THEN
  899.      LEAVE
  900.    ELSE IF WORDPOS(FILESPEC("name",AddFiles.vstring),sources.all) = 0 THEN DO
  901.      Project.status = 'CHANGED'
  902.      sources.0      = sources.0 + 1
  903.      i              = sources.0
  904.      sources.i      = FILESPEC("name",AddFiles.vstring)
  905.      sources.all    = sources.all sources.i
  906.      sources.linenr = sources.linenr - sources.diff
  907.      CALL VForeColor sources.id, sources.fore
  908.      CALL VSay       sources.id, 5, sources.linenr, sources.i
  909.      AddFiles.template = "*" || SUBSTR(sources.i,LASTPOS(".",sources.i))
  910.    END   /* ELSE DO */
  911. END    /* DO FOREVER */
  912.  
  913. CALL VCloseWindow sources.id
  914. RETURN
  915.  
  916. /*----------------------------------------------------------------------------*/
  917. /* DeleteFiles: Remove files from project list                                */
  918. /*----------------------------------------------------------------------------*/
  919. DeleteFiles:
  920.  
  921. DO FOREVER
  922.   IF words(sources.all) = 0 THEN
  923.     LEAVE
  924.   CALL VListBox DeleteFiles.title, sources, DeleteFiles.width,,
  925.                 DeleteFiles.height, OKCANCEL
  926.   IF RESULT = 'CANCEL' THEN
  927.     LEAVE
  928.   ELSE DO
  929.     Project.status = 'CHANGED'
  930.     IF WORDS(sources.all) = 1 THEN
  931.       sources.all = ''
  932.     ELSE
  933.       sources.all = DELWORD(sources.all,WORDPOS(sources.vstring,sources.all),1)
  934.     DO i=1 TO sources.0
  935.       IF sources.i <> sources.vstring THEN
  936.         ITERATE
  937.       ELSE DO
  938.         IF sources.0 = 1 THEN DO
  939.           sources.0 = 0
  940.           sources.1 = ''
  941.         END
  942.         ELSE DO
  943.           sources.0 = sources.0 - 1
  944.           DO i=i TO sources.0
  945.             nexti = i + 1
  946.             sources.i = sources.nexti
  947.           END
  948.         END          /* ELSE DO (IF sources.0 = 1)               */
  949.         LEAVE        /* DO i=1 TO sources.0                      */
  950.       END          /* ELSE DO  (IF sources.i <> sources.vstring) */
  951.     END          /* DO i=1 TO sources.0                          */
  952.   END          /* ELSE DO                                        */
  953. END          /* DO FOREVER                                       */
  954.  
  955. RETURN
  956.  
  957. /*----------------------------------------------------------------------------*/
  958. /* DefineBuildOption: Choose between debug- and production-mode               */
  959. /*----------------------------------------------------------------------------*/
  960. DefineBuildOption:
  961.  
  962. IF Project.mode = 'D' THEN
  963.   BuildOption.vstring = BuildOption.1
  964. ELSE
  965.   BuildOption.vstring = BuildOption.2
  966. CALL VRadioBox BuildOption.title, BuildOption, OKCANCEL
  967. IF RETURN <> 'CANCEL' THEN DO
  968.   Project.status = 'CHANGED'
  969.   IF BuildOption.vstring = BuildOption.1 THEN
  970.     Project.mode = 'D'
  971.   ELSE
  972.     Project.mode = 'P'
  973. END
  974. RETURN
  975.  
  976. /*----------------------------------------------------------------------------*/
  977. /* DefineCompilerOptions: Define compiler options (global, debug, production) */
  978. /*----------------------------------------------------------------------------*/
  979. DefineCompilerOptions:
  980.  
  981. CompilerOptions.return.1 = Project.GlobalCompilerOptions
  982. CompilerOptions.return.2 = Project.DebugCompilerOptions
  983. CompilerOptions.return.3 = Project.ProductionCompilerOptions
  984.  
  985. CALL VMultBox CompilerOptions.title, CompilerOptions.prompt, CompilerOptions.width,,
  986.               CompilerOptions.hide, CompilerOptions.return, OKCANCEL
  987. IF RESULT <> 'CANCEL' THEN DO
  988.   Project.status                    = 'CHANGED'
  989.   Project.GlobalCompilerOptions     = CompilerOptions.return.1
  990.   Project.DebugCompilerOptions      = CompilerOptions.return.2
  991.   Project.ProductionCompilerOptions = CompilerOptions.return.3
  992. END
  993. RETURN
  994.  
  995. /*----------------------------------------------------------------------------*/
  996. /* DefineLinkOptions: flags and libs for the linker                           */
  997. /*----------------------------------------------------------------------------*/
  998. DefineLinkOptions:
  999.  
  1000. LinkOptions.return.1 = Project.GlobalLinkOptions
  1001. LinkOptions.return.2 = Project.DebugLinkOptions
  1002. LinkOptions.return.3 = Project.ProductionLinkOptions
  1003.  
  1004. CALL VMultBox LinkOptions.title, LinkOptions.prompt, LinkOptions.width,,
  1005.               LinkOptions.hide, LinkOptions.return, OKCANCEL
  1006. IF RESULT <> 'CANCEL' THEN DO
  1007.   Project.status                = 'CHANGED'
  1008.   Project.GlobalLinkOptions     = LinkOptions.return.1
  1009.   Project.DebugLinkOptions      = LinkOptions.return.2
  1010.   Project.ProductionLinkOptions = LinkOptions.return.3
  1011. END
  1012. RETURN
  1013.  
  1014. /*----------------------------------------------------------------------------*/
  1015. /* WriteProject: Generate the makefile                                        */
  1016. /*----------------------------------------------------------------------------*/
  1017. WriteProject:
  1018.  
  1019. IF Project.name = '.unnamed' THEN DO
  1020.   CALL VMsgBox UnnamedProject.title, UnnamedProject, OK
  1021.   RETURN 1
  1022. END
  1023.  
  1024. /* check for user-includes   ------------------------------------------------ */
  1025.  
  1026. DO i = 1 TO sources.0
  1027.   user_includes = ''
  1028.   CALL FindIncludes Project.dir||sources.i
  1029.   dependents.i = sources.i user_includes
  1030. END
  1031.  
  1032. /* check for includes and dlgincludes   ------------------------------------- */
  1033.  
  1034. IF Project.ResourceFile <> '' THEN DO
  1035.    user_includes = ''
  1036.    CALL FindIncludes Project.dir||Project.ResourceFile
  1037.    ResourceDependents = Project.ResourceFile user_includes
  1038. END
  1039.  
  1040. IF SysFileDelete(Project.file) > 2 THEN DO
  1041.   CALL VMsgBox DeleteFileProblem.title, DeleteFileProblem, OK
  1042.   RETURN 1
  1043. END
  1044.  
  1045. CALL PutLine '# ============== Do not edit between these lines! ================'
  1046. CALL PutLine '# Makefile generated by EditProject Version' EditProject.version
  1047. CALL PutLine '# Project:' Project.project
  1048. CALL PutLine '# Date:   ' DATE()
  1049. CALL PutLine '# Time:   ' TIME()
  1050. CALL PutLine ' '
  1051. CALL PutLine 'PROJECT =' Project.project
  1052. CALL PutLine 'MODE =' Project.mode
  1053.  
  1054. CALL PutLine 'G_CFLAGS =' Project.GlobalCompilerOptions
  1055. CALL PutLine 'D_CFLAGS =' Project.DebugCompilerOptions
  1056. CALL PutLine 'P_CFLAGS =' Project.ProductionCompilerOptions
  1057.  
  1058. CALL PutLine 'G_LFLAGS =' Project.GlobalLinkOptions
  1059. CALL PutLine 'D_LFLAGS =' Project.DebugLinkOptions
  1060. CALL PutLine 'P_LFLAGS =' Project.ProductionLinkOptions
  1061.  
  1062. TT = 'MAKE_VARS'                    /*  make-variables (environment specific) */
  1063. DO i = 1 TO target.TT.0
  1064.   CALL PutLine target.TT.i
  1065. END
  1066.  
  1067. CALL PutLine 'SOURCES =' sources.all
  1068. CALL PutLine 'RC_FILE =' Project.ResourceFile
  1069. CALL PutLine 'RES_FILE = $(subst .rc,.RES,$(RC_FILE))'
  1070. CALL PutLine 'MODULE_FILE =' Project.ModuleFile
  1071. CALL PutLine 'TARGET_TYPE =' Project.TargetType
  1072.  
  1073. CALL PutLine 'C_OBJECTS   = $(patsubst %.c,%$(O),$(filter %.c,$(SOURCES)))'
  1074. CALL PutLine 'CC_OBJECTS  = $(patsubst %.cc,%$(O),$(filter %.cc,$(SOURCES)))'
  1075. CALL PutLine 'CPP_OBJECTS = $(patsubst %.cpp,%$(O),$(filter %.cpp,$(SOURCES)))'
  1076. CALL PutLine 'OBJECTS    := $(C_OBJECTS) $(CC_OBJECTS) $(CPP_OBJECTS)'
  1077.  
  1078. CALL PutLine 'VPATH   =' STRIP(TRANSLATE(Project.dir,'/','\'),'T','/')
  1079. CALL PutLine 'OBJ_DIR = $(VPATH)/obj$(MODE)/'
  1080. CALL PutLine 'vpath %$(O) $(OBJ_DIR)'
  1081. CALL PutLine 'vpath %.h $(subst :,;,$(subst /,\,$(INCLUDE)))'
  1082. CALL PutLine 'vpath %.hpp $(subst :,;,$(subst /,\,$(INCLUDE)))'
  1083. CALL PutLine 'vpath %.lib $(subst :,;,$(subst /,\,$(LIB)))'
  1084. CALL PutLine ' '
  1085. CALL PutLine '# ============== Do not edit between these lines! ================'
  1086. CALL PutLine ' '
  1087.  
  1088. CALL PutLine '.PHONY : all subProjects mainTarget'
  1089. CALL PutLine 'all: subProjects mainTarget'
  1090.  
  1091. CALL PutLine ' '
  1092. CALL PutLine 'subProjects:'
  1093. CALL SysFileTree '*.'Project.Environment,'makeFiles.','FSO'
  1094. dirLength = LENGTH(DIRECTORY()) + 1
  1095. DO i = 1 TO makeFiles.0
  1096.    makeFiles.i = RIGHT(makeFiles.i,LENGTH(makeFiles.i)-dirLength)
  1097.    IF POS('\',makeFiles.i) > 0 THEN DO
  1098.       PARSE VALUE makeFiles.i WITH makeDir '\' makeFile
  1099.       IF POS('\',makeFile) = 0 THEN
  1100.          CALL PutLine '    $(MAKE) -f' makeFile '-C $(VPATH)/'makeDir
  1101.    END
  1102. END                                                /* DO i = 1 TO makeFiles.0 */
  1103. CALL PutLine ' '
  1104.  
  1105. TT = Project.TargetType            /* main target rule (environment specific) */
  1106. DO i = 1 TO target.TT.0
  1107.   CALL PutLine target.TT.i
  1108. END
  1109.  
  1110. TT = 'OBJECTS'                         /* object rules (environment specific) */
  1111. IF POS(".c ",sources.all" ") > 0 THEN DO
  1112.    CALL PutLine ' '
  1113.    CALL PutLine '$(C_OBJECTS) : %$(O) : %.c'
  1114.    DO i = 1 TO target.TT.0
  1115.      CALL PutLine target.TT.i
  1116.    END
  1117. END
  1118. IF POS(".cc ",sources.all" ") > 0 THEN DO
  1119.    CALL PutLine ' '
  1120.    CALL PutLine '$(CC_OBJECTS) : %$(O) : %.cc'
  1121.    DO i = 1 TO target.TT.0
  1122.      CALL PutLine target.TT.i
  1123.    END
  1124. END
  1125. IF POS(".cpp ",sources.all" ") > 0 THEN DO
  1126.    CALL PutLine ' '
  1127.    CALL PutLine '$(CPP_OBJECTS) : %$(O) : %.cpp'
  1128.    DO i = 1 TO target.TT.0
  1129.      CALL PutLine target.TT.i
  1130.    END
  1131. END
  1132.  
  1133. IF Project.ResourceFile <> '' THEN DO
  1134.    TT = 'RESOURCE'
  1135.    CALL PutLine ' '
  1136.    DO i = 1 TO target.TT.0
  1137.      CALL PutLine target.TT.i
  1138.    END
  1139.    CALL PutLine ' '
  1140.    CALL PutLine,
  1141.             SUBSTR(Project.ResourceFile,1,LASTPOS('.',Project.ResourceFile)) ||,
  1142.                                                       "RES :" ResourceDependents
  1143. END
  1144.  
  1145. DO i=1 TO sources.0                      /* generated dependencies            */
  1146.   CALL PutLine ' '
  1147.   CALL PutLine SUBSTR(sources.i,1,LASTPOS('.',sources.i)-1)'$(O) :' dependents.i
  1148. END
  1149.  
  1150. CALL PutLine ' '
  1151. CALL PutLine '# == Do not delete this line.',
  1152.                               'User added code after this line is preserved. =='
  1153. IF UserAddedCode.0 > 0 & UserAddedCode.1 <> '' THEN
  1154.    CALL PutLine ' '
  1155. DO i = 1 TO UserAddedCode.0
  1156.   CALL PutLine UserAddedCode.i
  1157. END
  1158. CALL LINEOUT Project.file
  1159.  
  1160. Project.status = 'SAVED'
  1161. RETURN 0
  1162.  
  1163. /*----------------------------------------------------------------------------*/
  1164. /* ExecuteMakeFile: Run MAKE with current build option                        */
  1165. /*----------------------------------------------------------------------------*/
  1166. ExecuteMakeFile:
  1167.  
  1168. IF project.status = 'CHANGED' THEN DO
  1169.   CALL VMsgBox SaveProject.title, SaveProject, YESNO
  1170.   IF RESULT = 'YES' THEN DO
  1171.     CALL WriteProject
  1172.     IF RESULT > 0 THEN
  1173.       RETURN
  1174.   END
  1175. END
  1176.  
  1177. "START /b /win" EditProject.make,
  1178.       "-k -f" TRANSLATE(Project.file,'/','\') "MODE="Project.mode
  1179. RETURN
  1180.