MK386.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:23k
源码类别:

编译器/解释器

开发平台:

Others

  1. //
  2. //  Compile with Borland C/C++ v3.1 : bcc -v- -ml cl386.c
  3. //  Compile with Watcom C/C++ v10.6 : wcl -y -ox -ml cl386.c
  4. //
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <dos.h>
  9. #include <process.h>
  10. #ifdef __TURBOC__
  11.   #include <dir.h>
  12. #else
  13.   #include <direct.h>
  14. #endif
  15. #define VERSION "1.0"
  16. static char usage[] = /* Usage */ 
  17. "MK386 Version " VERSION " (c) Kirill Joss. Compile " __DATE__ "n"
  18. "Usage: MK386.EXE [options] filesn"
  19. "Options:       (default parameters if first)n"
  20. "/l[-|+]  dump listing file        /w-xxx   disable a warning       n"
  21. "/i[-|+]  dump preprocessed file   /Dxxx    define something        n"
  22. "/e[+|-]  dump errors to file      /Ennn    max number of errors    n"
  23. "/k[+|-]  keep generate files      /Ipath   specify include path    n"
  24. "/K[-|+]  keep response files      /Lpath   specify .LIB & .OBJ dir n"
  25. "/A[+|-]  disable extensions       /Cxxx    codegen parameters      n"
  26. "/v[-|+]  debug info               /Oxxx    optimzer parameters     n"
  27. "/m[-|+]  generate .MAP file       /Tp      use TLINK & PMODE       n"
  28. "/n[-|+]  no default .LIB & .OBJ   /Tl      use TLINK & PMODE(low)  n"
  29. "/M[+|-]  run MAKE                 /Tw      use WLINK & PMODE/W     n"
  30. "/B[-|+]  build all                /Td      use WLINK & DOS/4GW     n"
  31. "/a       generate .ASM file       /c       generate .OBJ file      n"
  32. "/ename   set name of .EXE file    /opath   set out path .OBJ files n"
  33. "/?,/h,/H this help                @fname   specify response file   n";
  34. #define FALSE 0
  35. #define TRUE  1
  36. #define MAX_STR 256 /* Max len of string in .CFG file */
  37. // is param ?
  38. #define isparam(s) ( *(s) == '-' || *(s) == '/' || *(s) == '+' )
  39. // check for NOT NULL !!!
  40. #define chkNULL(exp, msg )  if ( !(exp) ) error( ERR_FATAL, msg )
  41. // empty string ?
  42. #define empty_string(s)  ( (s) == NULL || *(s) == '' )
  43. typedef struct _Item {
  44.     struct _Item *next;
  45.     char data[1];
  46. } Item;
  47. typedef struct _List {
  48.     Item *head;
  49.     Item *tail;
  50.     unsigned count;
  51. } List;
  52. Item *ItemCreate( char *dat );
  53. #define ItemDelete(item) free(item)
  54. void ListAdd( List *list, char *data );
  55. void ListDelete( List *list );
  56. int  ListFind( List *list, char *data );
  57. void ListIter( List *list, void (*iter)( Item *) );
  58. #define FileAdd(list, file) ListAdd((list),(file))
  59. #define ParamAdd(list, param) ListAdd((list),(param));
  60. List files; // list of all files
  61. List l_inc; // list of INCLUDE path
  62. List l_def; // list of DEFINE var
  63. List l_cc386; // list of CC386 options
  64. int _compile  = TRUE;
  65. int _assemble = TRUE;
  66. int _link     = TRUE;
  67. int _dump_cpp = FALSE; // dump preprocessed file
  68. int _dump_err =  TRUE; // dump error file
  69. int _dump_lst = FALSE; // dump listing file
  70. int _ansi     =  TRUE; // ANSI
  71. int _map_file = FALSE; // map file
  72. int _nodef_lib= FALSE; // no default lib
  73. int _debug    = FALSE; // debug info
  74. int _keep_rsp = FALSE; // keep response files
  75. int _keep_gen = TRUE;  // keep generate files
  76. int _make_run = TRUE;
  77. int _build_all = FALSE;
  78. int _output = 'p';     // Output format, same /Tx, can be 'p', 'l', 'w', 'd'
  79. char path_lib[ _MAX_PATH ]; // path for default LIB & OBJ
  80. char path_obj[ _MAX_PATH ]; // path for output .OBJ files
  81. char name_exe[ _MAX_PATH ]; // name of .EXE file
  82.  // For error()
  83. #define ERR_NO        0  /* no error ! */
  84. #define ERR_FATAL   128  /* fatal error */
  85. #define ERR_RUNTIME 129  /* stdlib error - see 'errno' */
  86.  // output errmsg & exit()
  87. void error( int exitcode, char *msg );
  88.  // output help & exit(0)
  89. void help( void );
  90.  // get parameters from <name>.CFG, CL386, cmdline ...
  91. void get_param( char *exe_name, char *env_var, int argc, char *argv[] );
  92.  // get parameters from file
  93. int get_param_file( char *file );
  94.  // get parameters from string
  95. void get_param_str( char *str );
  96.  // check ONE parameter
  97. void get_one_param( char *param );
  98.  // get ONE options
  99. void get_option( char *param );
  100.  // get ONE file ( can '*' & '?' )
  101. void get_source( char *filename );
  102.  // get ONE file without '*' & '?'
  103. void get_one_source( char *filename );
  104.  // find source files
  105. void find_source( char *fpath, char *fname );
  106.  // clear all list
  107. void cleanup( void );
  108.  // generate MAKEFILE.
  109. void gen_makefile( void );
  110.  // run overlay MAKE
  111. void make( char *maker );
  112. void main( int argc, char *argv[] ) {
  113.     if ( argc == 1 ) // no argument
  114.         help();
  115.     get_param( argv[0], "CL386", argc - 1, argv + 1 );
  116.     atexit( cleanup );  // set exit function
  117.     if ( files.count == 0 ) // no files
  118.         help();
  119.     gen_makefile();
  120.     cleanup();
  121.     if ( _make_run )
  122.         make( "MAKE.EXE" );
  123. }
  124. void help( void ) {
  125.     printf( usage ); exit( 0 );
  126. }
  127. static char _file[ _MAX_PATH  ];
  128. static char fdisk[ _MAX_DRIVE ];
  129. static char fpath[ _MAX_DIR   ];
  130. static char fname[ _MAX_FNAME ];
  131. static char fext [ _MAX_EXT   ];
  132. void get_param( char *exe_name, char *env_var, int argc, char *argv[] ) {
  133.     static char _cfg[] = ".CFG";
  134.     int i;
  135.     char *env;
  136.     _splitpath( exe_name, fdisk, fpath, fname, fext );
  137.     _makepath( _file, NULL, NULL, fname, _cfg );
  138.     if ( ! get_param_file( _file ) ) {
  139.         _makepath( _file, fdisk, fpath, fname, _cfg );
  140.         get_param_file( _file );
  141.     }
  142.     if ( (env = getenv( env_var ) ) != NULL )
  143.         get_param_str( env );
  144.     for ( i = 0; i < argc; i++ )
  145.         get_one_param( argv[ i ] );
  146. }
  147. int get_param_file( char *file ) {
  148.     static char str[ MAX_STR ];
  149.     FILE *f = fopen( file, "rt" );
  150.     if ( f == NULL )
  151.         return FALSE;
  152.     while( fgets( str, MAX_STR - 1, f) != NULL )
  153.         get_param_str( str );
  154.     fclose( f );
  155.     return TRUE;
  156. }
  157. void get_param_str( char *s ) {
  158.     char arg[ MAX_STR ];
  159.     int  len;
  160.     for ( len = 0; *s; s++ ) {
  161.         if ( *s == ' ' || *s == 't' || *s == 'n' ) {
  162.             if ( len > 0 ) {
  163.                 arg[ len ] = '';
  164.                 get_one_param( arg );
  165.             }
  166.             arg[ len = 0 ] = '';
  167.         }
  168.         else {
  169.             arg[ len++ ] = *s;
  170.         }
  171.     }
  172.     if ( len > 0 ) {
  173.         arg[ len ] = '';
  174.         get_one_param( arg );
  175.     }
  176. }
  177. void get_one_param( char *arg ) {
  178.     if ( isparam( arg ) )                 // -X , +X or /X
  179.         get_option( arg );
  180.     else if ( *arg == '@' ) {               // @filename
  181.         if ( ! get_param_file( arg + 1 )  )
  182.             error( ERR_RUNTIME, arg + 1 );
  183.     }
  184.     else
  185.         get_source( arg );             // file.ext
  186. }
  187. void error( int exitcode, char *msg ) {
  188.     switch ( exitcode ) {
  189.         case ERR_NO: break;
  190.         case ERR_FATAL: fprintf( stderr, "Fatal : %sn", msg );
  191.             break;
  192.         case ERR_RUNTIME: fprintf( stderr, "%s : %s", msg, strerror( errno ) );
  193.             break;
  194.         default: fprintf( stderr, "Program error : %s !n", msg );
  195.             break;
  196.     }
  197.     exit( exitcode );
  198. }
  199. static int setop( char *param, int *option ) {
  200.     if ( param[2] == '-' && param[3] == '' )
  201.         *option = FALSE;
  202.     else if ( ( param[2] == '+' && param[3] == '' ) || param[2] == '' )
  203.         *option = TRUE;
  204.     else
  205.         return FALSE;
  206.     return TRUE;
  207. }
  208. void get_option( char *param ) {
  209.     int len;
  210.     switch( param[ 1 ] ) {
  211.         case 'i' : // dump preprocessed file
  212.             if ( setop( param, &_dump_cpp ) )
  213.                 return;
  214.             break;
  215.         case 'e' : // dump errors to file
  216.             if ( setop( param, &_dump_err ) )
  217.                 return;
  218.             else
  219.                 strupr( strncpy( name_exe, param + 2, _MAX_PATH ) );
  220.             break;
  221.          case 'l' : // dump listing file
  222.             if ( setop( param, &_dump_lst ) )
  223.                 return;
  224.             break;
  225.         case 'A' : // disable extensions
  226.             if ( setop( param, &_ansi ) )
  227.                 return;
  228.             break;
  229.         case 'm' : // gen map file
  230.             if ( setop( param, &_map_file ) )
  231.                 return;
  232.             break;
  233.         case 'n' : // no default lib
  234.             if ( setop( param, &_nodef_lib ) )
  235.                 return;
  236.             break;
  237.         case 'v' : // debug info
  238.             if ( setop( param, &_debug ) )
  239.                 return;
  240.             break;
  241.         case 'K' : // keep response files
  242.             if ( setop( param, &_keep_rsp ) )
  243.                 return;
  244.             break;
  245.         case 'k' : // keep generate files
  246.             if ( setop( param, &_keep_gen ) )
  247.                 return;
  248.             break;
  249.         case 'B' : // building all
  250.             if ( setop( param, &_build_all ) )
  251.                 return;
  252.             break;
  253.         case 'M' : // run make, else ONLY generate MAKEFILE.
  254.             if ( setop( param, &_make_run ) )
  255.                 return;
  256.             break;
  257.         case 'a' :
  258.             if ( param[2] == '' ) {
  259.                 _compile = TRUE;
  260.                 _assemble = _link = FALSE;
  261.                 return;
  262.             }
  263.             break;
  264.         case 'c' :
  265.             if ( param[2] == '' ) {
  266.                 _compile = _assemble = TRUE;
  267.                 _link = FALSE;
  268.                 return;
  269.             }
  270.             break;
  271.         case '?' :
  272.         case 'h' :
  273.         case 'H' :
  274.             help(); /* Not return ! */
  275.         case 'D' : // define
  276.             ParamAdd( &l_def, param + 2 );
  277.             return;
  278.         case 'I' : // include path
  279.             ParamAdd( &l_inc, param + 2 );
  280.             return;
  281.         case 'L' : // lib path
  282.             strupr( strncpy( path_lib, param + 2, _MAX_PATH ) );
  283.             len = strlen( path_lib );
  284.             if ( len > 0 && path_lib[ len - 1 ] == '\' )
  285.                 path_lib[ len - 1 ] = '';
  286.             return;
  287.         case 'o' : // output obj path
  288.             strupr( strncpy( path_obj, param + 2, _MAX_PATH ) );
  289.             len = strlen( path_obj );
  290.             if ( len > 0 && path_obj[ len - 1 ] == '\' )
  291.                 path_obj[ len - 1 ] = '';
  292.             return;
  293.         case 'w' :
  294.         case 'C' :
  295.         case 'E' :
  296.         case 'O' :
  297.             ParamAdd( &l_cc386, param );
  298.             return;
  299.         case 'T' :
  300.             if ( param[3] == '' )
  301.                 if ( param[2] == 'p' || param[2] == 'l' || 
  302.                 param[2] == 'w' || param[2] == 'd' ) {
  303.                     _output = param[2]; return;
  304.                 }
  305.             break;
  306.     }
  307.     fprintf( stderr, "Warning! Parameter error : %sn", param );
  308. }
  309. Item *ItemCreate( char *dat ) {
  310.     Item *item;
  311.     int len;
  312.     if ( empty_string( dat ) )
  313.         return NULL;
  314.     len = strlen( dat );
  315.     if ( (item = (Item *)malloc( sizeof( Item ) + len )) != NULL ) {
  316.         item->next = NULL;
  317.         strcpy( item->data, dat );
  318.     }
  319.     return item;
  320. }
  321. void ListDelete( List *list ) {
  322.     Item *p, *q;
  323.     chkNULL( list, "Pointer is NULL !" );
  324.     for( p = list->head; p; p = q ) {
  325.         q = p->next;
  326.         free(p);
  327.     }
  328.     list->head = list->tail = NULL;
  329.     list->count = 0;
  330. }
  331. void ListAdd( List *list, char *file ) {
  332.     Item *item;
  333.     chkNULL( list, "Pointer is NULL !" );
  334.     item = ItemCreate( file );
  335.     chkNULL( item, "Out of memory !" );
  336.     if ( list->count == 0 )
  337.         list->head = list->tail = item;
  338.     else {
  339.         (list->tail)->next = item;
  340.         list->tail = item;
  341.     }
  342.     list->count++;
  343. }
  344. void ListIter( List *list, void (*iter)( Item *) ) {
  345.     Item *p;
  346.     chkNULL( list, "Pointer is NULL !" );
  347.     if ( list->count && iter ) {
  348.         for ( p = list->head; p; p = p->next )
  349.             (*iter)(p);
  350.     }
  351. }
  352. static char *need;
  353. static int found = 0;
  354. static void find( Item *item ) {
  355.     if ( strcmp( item->data, need ) == 0 )
  356.         found = 1;
  357. }
  358. int  ListFind( List *list, char *data ) {
  359.     found = 0;
  360.     need = data;
  361.     ListIter( list, find );
  362.     return found;
  363. }
  364. char findpath[ _MAX_PATH ];
  365. char findname[ _MAX_PATH ];
  366. void get_source( char *filename ) {
  367.     _splitpath( filename, fdisk, fpath, fname, fext );
  368.     if ( strchr( filename, '?' ) || strchr( filename, '*' ) ) {  /* Check for '*' and '?' */
  369.         _makepath( findpath, fdisk, fpath, NULL, NULL );
  370.         _makepath( findname, NULL, NULL, fname, fext );
  371.         find_source( findpath, findname );
  372.     }
  373.     else
  374.         get_one_source( filename );
  375. }
  376. #ifdef __TURBOC__
  377. void find_source( char *fpath, char *fname ) {
  378.     int fpath_len = strlen( fpath );
  379.     struct ffblk fb;
  380.     if ( !findfirst( strcat( fpath, fname), &fb, FA_ARCH) )
  381.     do {
  382.         fpath[ fpath_len ] = '';
  383.         get_one_source( strcat( fpath, fb.ff_name) );
  384.     } while (! findnext(&fb) );
  385. }
  386. #else
  387. void find_source( char *fpath, char *fname ) {
  388.     int fpath_len = strlen( fpath );
  389.     struct find_t fb;
  390.     if (!_dos_findfirst( strcat( fpath, fname), _A_NORMAL, &fb ) )
  391.     do {
  392.         fpath[ fpath_len ] = '';
  393.         get_one_source( strcat( fpath, fb.name) );
  394.     } while( ! _dos_findnext( &fb ) );
  395. }
  396. #endif
  397. void get_one_source( char *srcfile ) {
  398.     char file[ _MAX_PATH ];
  399.     strupr( strncpy( file, srcfile, _MAX_PATH ) );
  400.     FileAdd( &files, file );
  401. }
  402. void cleanup( void ) {   // for atexit()
  403.     ListDelete( &files );
  404.     ListDelete( &l_def );
  405.     ListDelete( &l_inc );
  406.     ListDelete( &l_cc386 );
  407. }
  408. #define Def(v) ( (v) ? 'D' : 'U' )
  409. void make( char *maker ) {
  410.     static char make_opt[ _MAX_PATH ];
  411. //  static char *args[3];
  412.     int err;
  413.     sprintf( make_opt,
  414. " -%cMAP -%cDEBUG -%cNODEFLIB -%cKEEP_SRC -%cKEEP_LST -%cLINK -%cASSEMBLE -%cCOMPILE",
  415.         Def( _map_file), Def( _debug), Def( _nodef_lib),
  416.         Def( _keep_gen ), Def( _dump_lst ),
  417.         Def( _link), Def( _assemble ), Def( _compile ) );
  418.     if ( _keep_rsp )
  419.         strcat( make_opt, " -K" );
  420.     if ( _build_all )
  421.         strcat( make_opt, " -B" );
  422.     printf( "%s%sn", maker, make_opt );
  423.     err = spawnlp( P_OVERLAY, maker, maker, make_opt, NULL );
  424.     if ( err <  0 )
  425.         error( ERR_RUNTIME, maker );
  426.     else if ( err > 0 )
  427.         error( err, maker );
  428. }
  429. char *name( void ) {
  430.     if ( strlen( name_exe ) > 0 )
  431.         return name_exe;
  432.     _splitpath( files.head->data, fdisk, fpath, fname, fext );
  433.     return fname;
  434. }
  435. char *libpath( char *lib ) {
  436.     if ( strlen( path_lib ) == 0 )
  437.         return lib;
  438.     strcpy( _file, path_lib );
  439.     strcat( _file, "\" );
  440.     return strcat( _file, lib );
  441. }
  442. #define L_( s ) fprintf( frsp, "t%s", (s) )
  443. #define L0( s ) fprintf( frsp, "%s", (s) )
  444. #define L1( s ) fprintf( frsp, "%sn", (s) )
  445. static FILE *frsp;
  446. static void compile_inc  ( Item *p ) { fprintf( frsp, "%s;", p->data );   }
  447. static void compile_def  ( Item *p ) { fprintf( frsp, " /D%s", p->data ); }
  448. static void compile_opt  ( Item *p ) { fprintf( frsp, " %s", p->data );   }
  449. static void assemble_def( Item *p ) { fprintf( frsp, " /d%s", p->data ); }
  450. static void assemble_inc( Item *p ) { fprintf( frsp, " /i%s", p->data ); }
  451. static void get_obj( Item *p ) {
  452.     _splitpath( p->data, fdisk, fpath, fname, fext );
  453.     if ( strcmp( fext, ".OBJ" ) == 0 )
  454.         fprintf( frsp, "%s \n", p->data );
  455.     else if ( strcmp( fext, ".ASM" ) == 0 ) {
  456.         fprintf( frsp, "$(PATH_OBJ)\%s.OBJ \n", fname );
  457.     }
  458.     else if ( strcmp( fext, ".LIB" ) != 0 ) {
  459.         fprintf( frsp, "$(PATH_OBJ)\%s.OBJ \n", fname );
  460.     }
  461. }
  462. static void get_asm( Item *p ) {
  463.     _splitpath( p->data, fdisk, fpath, fname, fext );
  464.     if ( strcmp( fext, ".OBJ" ) == 0 || strcmp( fext, ".LIB" ) == 0 )
  465.         return;
  466.     else if ( strcmp( fext, ".ASM" ) == 0 )
  467.         fprintf( frsp, "%s \n", p->data );
  468.     else
  469.         fprintf( frsp, "%s.ASM \n", fname );
  470. }
  471. static void get_lib( Item *p ) {
  472.     _splitpath( p->data, fdisk, fpath, fname, fext );
  473.     if ( strcmp( fext, ".LIB" ) == 0 ) {
  474.         fprintf( frsp, "%s \n", p->data );
  475.     }
  476. }
  477. static void get_dep( Item *p ) {
  478.     _splitpath( p->data, fdisk, fpath, fname, fext );
  479.     if ( strcmp( fext, ".LIB" ) == 0 )
  480.         return; // .LIB file
  481.     else if ( strcmp( fext, ".OBJ" ) == 0 )
  482.         return; // .OBJ file
  483.     else if ( strcmp( fext, ".ASM" ) == 0 ) {   // .ASM file
  484.         fprintf( frsp, "$(PATH_OBJ)\%s.OBJ : %sn", fname, p->data );
  485.         fprintf( frsp, "  $(AS) %s,$(PATH_OBJ)\%s.OBJ,$(PATH_OBJ)\%s.LST,NULn",
  486.             p->data, fname, fname );
  487.         fprintf( frsp, "  $(DEL_LST) $(PATH_OBJ)\%s.LSTn", fname );
  488.     }
  489.     else {  // .CPP file
  490.         fprintf( frsp, "$(PATH_OBJ)\%s.OBJ : %s.ASMn", fname, fname );
  491.         fprintf( frsp, "  $(AS) %s.ASM,$(PATH_OBJ)\%s.OBJ,$(PATH_OBJ)\%s.LST,NULn",
  492.             fname, fname, fname );
  493.         fprintf( frsp, "  $(DEL_LST) $(PATH_OBJ)\%s.LSTn", fname );
  494.         fprintf( frsp, "  $(DEL_SRC) %s.ASMn", fname );
  495.         fprintf( frsp, "%s.ASM : %sn", fname, p->data );
  496.         fprintf( frsp, "  $(CC) %sn",  p->data );
  497.     }
  498. }
  499. static void wout_obj( Item *p) {
  500.     _splitpath( p->data, fdisk, fpath, fname, fext );
  501.     if ( strcmp( fext, ".LIB" ) == 0 )
  502.         return;
  503.     else if ( strcmp( fext, ".OBJ" ) == 0 )
  504.         fprintf( frsp, "file %sn", p->data );
  505.     else if ( strcmp( fext, ".ASM" ) == 0 )
  506.         fprintf( frsp, "file $(PATH_OBJ)\%s.OBJn", fname );
  507.     else
  508.         fprintf( frsp, "file $(PATH_OBJ)\%s.OBJn", fname );
  509. }
  510. static void wout_lib( Item *p) {
  511.     _splitpath( p->data, fdisk, fpath, fname, fext );
  512.     if ( strcmp( fext, ".LIB" ) == 0 )
  513.         fprintf( frsp, "library %sn", p->data );
  514. }
  515. static void delete_obj( Item *p ) {
  516.     _splitpath( p->data, fdisk, fpath, fname, fext );
  517.     if ( strcmp( fext, ".LIB" ) == 0 || strcmp( fext, ".OBJ" ) == 0 )
  518.         return;
  519.     else
  520.         fprintf( frsp, "  $(DEL_SRC) $(PATH_OBJ)\%s.OBJn", fname );
  521. }
  522. void gen_makefile( void ) {
  523.     int tlink = ( _output == 'p' || _output == 'l' );
  524.     frsp = fopen( "MAKEFILE.", "wt" );
  525.     if ( frsp == NULL )
  526.         error( ERR_RUNTIME, "MAKEFILE." );
  527. L1( "#" );
  528. L1( "#  this MAKEFILE. generate MK386.EXE program"  );
  529. L1( "#" );
  530. L1( ".AUTODEPEND" );
  531. L1( ".SWAP" );
  532. L1( "# LINK     = # define LINK for COMPILE, ASSEMBLE & LINK" );
  533. L1( "# ASSEMBLE = # define ASSEMBLE for COMPILE & ASSEMBLE" );
  534. L1( "# COMPILE  = # define COMPILER for ONLY COMPILE" );
  535. L1( "!ifndef LINK" );
  536. L1( "!ifndef ASSEMBLE" );
  537. L1( "!ifndef COMPILE" );
  538. L1( "LINK       =" );
  539. L1( "!endif" );
  540. L1( "!endif" );
  541. L1( "!endif" );
  542. L1( "# DEBUG    = # define DEBUG for debug info and debug startup module" );
  543. L1( "# MAP      = # define MAP for generate .MAP file" );
  544. L1( "# NODEFLIB = # define NODEFLIB for NO link default .OBJ & .LIB" );
  545. L1( "# KEEP_SRC = # define KEEP_SRC for save generate .ASM & .OBJ files" );
  546. L1( "# KEEP_LST = # define KEEP_LST for save generate .LST files" );
  547. L1( "" );
  548. L1( "                                       ### name of .EXE file" );
  549. L0( "NAME = " ); L1( name() );
  550. L1( "                                       ### define tools" );
  551. L1( "CC  = CC386.EXE" );
  552. L1( "AS  = TASM.EXE" );
  553. L1( "                                       ### define options for CC" );
  554. L0( "CC_INC = " );
  555.     if ( l_inc.count > 0 ) {
  556.         L0( "/I" ); ListIter( &l_inc, compile_inc );
  557.     }
  558. L1( "" );
  559. L0( "CC_DEF = " );
  560.     ListIter( &l_def, compile_def );
  561. L1( "" );
  562. L0( "CC_OPT = " );
  563.     fprintf( frsp, "%ci %ce %cA",
  564. ( _dump_cpp ? '+' : '-' ), ( _dump_err ? '+' : '-' ), ( !_ansi ? '+' : '-' ) );
  565.     ListIter( &l_cc386, compile_opt );
  566. L1( "" );
  567. L1( "!ifdef KEEP_LST" );
  568. L1( "CC_OPT = $(CC_OPT) +l" );
  569. L1( "!endif" );
  570. L1( "" );
  571. L1( "CC = $(CC) $(CC_OPT) $(CC_DEF) $(CC_INC)" );
  572. L1( "                                       ### define options for AS" );
  573. L0( "AS_INC = " );
  574.     ListIter( &l_inc, assemble_inc );
  575. L1( "" );
  576. L0( "AS_DEF = " );
  577.     ListIter( &l_def, assemble_def );
  578. L1( "" );
  579. L1( "!ifdef DEBUG");
  580. L1( "AS_OPT = /t /m3 /ml /zi" );
  581. L1( "!else" );
  582. L1( "AS_OPT = /t /m3 /ml /zn" );
  583. L1( "!endif");
  584. L1( "!ifdef KEEP_LST" );
  585. L1( "AS_OPT = $(AS_OPT) /la" );
  586. L1( "!endif" );
  587. L1( "" );
  588. L1( "AS = $(AS) $(AS_OPT) $(AS_DEF) $(AS_INC)" );
  589. L1( "                                       ### .LIB & output .OBJ path" );
  590. L0( "PATH_LIB = " ); L1( path_lib );
  591. L0( "PATH_OBJ = " );
  592.     if ( strlen( path_obj ) > 0 )
  593.         L1( path_obj );
  594.     else
  595.         L1( "." );
  596. L1( "                                       ### default .OBJ & .LIB" );
  597. L1( "!ifdef NODEFLIB");
  598. L1( "DEFAULT_OBJS =" );
  599. L1( "DEFAULT_LIBS =" );
  600. L1( "WLINK_OBJS   =" );
  601. L1( "WLINK_LIBS   =" );
  602. L1( "!else" );
  603. L1( "DEFAULT_LIBS = $(PATH_LIB)\CLDOS.LIB" );
  604. L1( "WLINK_LIBS   = library $(DEFAULT_LIBS)" );
  605. L1( "!ifdef DEBUG" );
  606.     if ( _output == 'l' )
  607.         L1( "DEFAULT_OBJS = $(PATH_LIB)\C0DOSLD.OBJ " );
  608.     else if ( _output == 'p' )
  609.         L1( "DEFAULT_OBJS = $(PATH_LIB)\C0DOSD.OBJ " );
  610.     else
  611.         L1( "DEFAULT_OBJS = $(PATH_LIB)\C0DOSWD.OBJ " );
  612. L1( "!else" );
  613.     if ( _output == 'l' )
  614.         L1( "DEFAULT_OBJS = $(PATH_LIB)\C0DOSL.OBJ " );
  615.     else if ( _output == 'p' )
  616.         L1( "DEFAULT_OBJS = $(PATH_LIB)\C0DOS.OBJ " );
  617.     else
  618.         L1( "DEFAULT_OBJS = $(PATH_LIB)\C0DOSW.OBJ " );
  619. L1( "!endif" );
  620. L1( "WLINK_OBJS   = file $(DEFAULT_OBJS)" );
  621. L1( "!endif" );
  622. L1( "                                       ### define macro for KEEP_SRC" );
  623. L1( "!ifdef KEEP_SRC");
  624. L1( "DEL_SRC = @rem" );
  625. L1( "!else" );
  626. L1( "DEL_SRC = -del" );
  627. L1( "!endif");
  628. L1( "                                       ### define macro for KEEP_LST" );
  629. L1( "!ifdef KEEP_LST");
  630. L1( "DEL_LST = @rem" );
  631. L1( "!else" );
  632. L1( "DEL_LST = -del" );
  633. L1( "!endif");
  634. L1( "                                       ### define macro for MAP" );
  635. L1( "!ifdef MAP");
  636. L1( "TLINK_OPT = /3/d/c/m/l/s" );
  637. L1( "WLINK_OPT = option map" );
  638. L1( "!else" );
  639. L1( "TLINK_OPT = /3/d/c/x" );
  640. L1( "WLINK_OPT = " );
  641. L1( "!endif");
  642. L1( "                                       ### define macro for DEBUG" );
  643. L1( "!ifdef DEBUG");
  644. L1( "TLINK_DBG = /v" );
  645. L1( "WLINK_DBG = debug option symf" );
  646. L1( "!else" );
  647. L1( "TLINK_DBG = " );
  648. L1( "WLINK_DBG = option quiet" );
  649. L1( "!endif");
  650. L1( "                                       ### .ASM files" );
  651.     fprintf( frsp, "ASMS = \n" );
  652.     ListIter( &files, get_asm );
  653. L1( "                                       ### .OBJ files" );
  654. fprintf( frsp, "OBJS = $(DEFAULT_OBJS) \n" );
  655. ListIter( &files, get_obj );
  656. L1( "                                       ### .LIB files" );
  657. fprintf( frsp, "LIBS = $(DEFAULT_LIBS) \n" );
  658. ListIter( &files, get_lib );
  659. L1( "                                       ###  main make depend" );
  660. L1( "!ifdef LINK" );
  661. L1( "$(NAME).EXE : $(OBJS) $(LIBS) makefile." );
  662. if ( tlink )
  663. {
  664. L1( "  TLINK.EXE @&&|" );
  665. L1( "$(TLINK_OPT) $(TLINK_DBG) $(OBJS), $(NAME), $(NAME), $(LIBS)" );
  666. }
  667. else
  668. {
  669. L1( "  WLINK.EXE @&&|" );
  670. L1( "$(WLINK_OPT) $(WLINK_DBG)" );
  671. L1( "format os2 le" );
  672. L1( "option nod" );
  673. if ( _output == 'w' ) {
  674. L1( "option osname='CC386+PMODE/W'" );
  675. L1( "option stub=$(PATH_LIB)\PMODEW.EXE" );
  676. }
  677. else {
  678. L1( "option osname='CC386+DOS/4GW'" );
  679. L1( "option stub=$(PATH_LIB)\D4GWSTUB.EXE" );
  680.         }
  681.         L1( "name $(NAME)" );
  682.         L1( "$(WLINK_OBJS)" );
  683.         ListIter( &files, wout_obj );
  684.         L1( "$(WLINK_LIBS)" );
  685.         ListIter( &files, wout_lib );
  686.     }
  687. L1( "|" );
  688.     ListIter( &files, delete_obj );
  689. L1( "!else" );
  690. L1( "!ifdef ASSEMBLE");
  691. L1( "assemble : $(OBJS) " );
  692. L1( "!else" );
  693. L1( "!ifdef COMPILE");
  694. L1( "compile : $(ASMS) " );
  695. L1( "!endif" );
  696. L1( "!endif" );
  697. L1( "!endif" );
  698. L1( "                                       ### files depend" );
  699.     ListIter( &files, get_dep );
  700.     fclose( frsp );
  701. }