2004-01-08 Vangelis Rokas <vrokas@otenet.gr>
[fw/sdcc] / src / SDCCmain.c
index 84310c15d46b8aa9ae540869779e2fbee58a219c..d864adb91a1e0b725fbf600f380fb6beceb5637c 100644 (file)
@@ -123,7 +123,7 @@ char buffer[PATH_MAX * 2];
 #define OPTION_ICODE_IN_ASM    "--i-code-in-asm"
 #define OPTION_PRINT_SEARCH_DIRS "--print-search-dirs"
 #define OPTION_MSVC_ERROR_STYLE "--vc"
-#define OPTION_USE_STDOUT "--use-stdout"
+#define OPTION_USE_STDOUT       "--use-stdout"
 
 static const OPTION
 optionsTable[] = {
@@ -182,7 +182,7 @@ optionsTable[] = {
     { 0,    OPTION_PEEP_FILE,       NULL, "<file> use this extra peep-hole file" },
     { 0,    OPTION_LIB_PATH,        NULL, "<path> use this path to search for libraries" },
     { 0,    "--int-long-reent",     &options.intlong_rent, "Use reenterant calls on the int and long support functions" },
-    { 0,    "--float-reent",        &options.float_rent, "Use reenterant calls on the floar support functions" },
+    { 0,    "--float-reent",        &options.float_rent, "Use reenterant calls on the float support functions" },
     { 0,    OPTION_OUT_FMT_IHX,     NULL, NULL },
     { 0,    "--out-fmt-s19",        &options.out_fmt, NULL },
     { 0,    "--cyclomatic",         &options.cyclomatic, NULL },
@@ -225,11 +225,10 @@ optionsTable[] = {
     { 0,    OPTION_PRINT_SEARCH_DIRS, &options.printSearchDirs, "display the directories in the compiler's search path"},
     { 0,    OPTION_MSVC_ERROR_STYLE, &options.vc_err_style, "messages are compatible with Micro$oft visual studio"},
     { 0,    OPTION_USE_STDOUT, &options.use_stdout, "send errors to stdout instead of stderr"},
-    /* End of options */
-#if 0 /* 10jun03 !OPT_DISABLE_PIC16 */
-    { 0,    "--no-movff",          &options.no_movff, "disable generating MOVFF opcode in PIC16 port"},
-    { 0,    "--gen-banksel",       &options.gen_banksel, "enable the generation of banksel assembler directives in PIC16 port"},
+#if !OPT_DISABLE_Z80 || !OPT_DISABLE_GBZ80
+    { 0,    "--no-std-crt0", &options.no_std_crt0, "For the z80/gbz80 do not link default crt0.o"},
 #endif
+    /* End of options */
     { 0,    NULL }
 };
 
@@ -287,12 +286,12 @@ static PORT *_ports[] =
 #if !OPT_DISABLE_DS390
   &ds390_port,
 #endif
-#if !OPT_DISABLE_PIC
-  &pic_port,
-#endif
 #if !OPT_DISABLE_PIC16
   &pic16_port,
 #endif
+#if !OPT_DISABLE_PIC
+  &pic_port,
+#endif
 #if !OPT_DISABLE_TININative
   &tininative_port,
 #endif
@@ -301,7 +300,10 @@ static PORT *_ports[] =
 #endif
 #if !OPT_DISABLE_DS400
   &ds400_port, 
-#endif 
+#endif
+#if !OPT_DISABLE_HC08
+  &hc08_port,
+#endif
 };
 
 #define NUM_PORTS (sizeof(_ports)/sizeof(_ports[0]))
@@ -370,13 +372,7 @@ _findPort (int argc, char **argv)
     }
 
   /* Use the first in the list */
-#if defined(DEFAULT_PORT)
-       /* VR - 13/5/2003 DEFAULT_PORT is defined in port.h */
-       port = &DEFAULT_PORT;
-#else
        port = _ports[0];
-#endif
-
 }
 
 /* search through the command line options for the processor */
@@ -406,12 +402,8 @@ printVersionInfo (void)
 
   fprintf (stderr,
           "SDCC : ");
-  for (i = 0; i < NUM_PORTS; i++) {
+  for (i = 0; i < NUM_PORTS; i++)
     fprintf (stderr, "%s%s", i == 0 ? "" : "/", _ports[i]->target);
-#ifdef DEFAULT_PORT
-       fprintf(stderr, "%s", (&DEFAULT_PORT == _ports[i])?"*":"");
-#endif
-  }
   
   fprintf (stderr, " " SDCC_VERSION_STR
 #ifdef SDCC_SUB_VERSION_STR
@@ -483,10 +475,16 @@ void
 setParseWithComma (set **dest, char *src)
 {
   char *p;
+  int length;
 
   /* skip the initial white spaces */
   while (isspace(*src))
     src++;
+  
+  /* skip the trailing white spaces */
+  length = strlen(src);
+  while (length && isspace(src[length-1]))
+    src[--length] = '\0';
 
   for (p = strtok(src, ","); p != NULL; p = strtok(NULL, ","))
     addSet(dest, Safe_strdup(p));
@@ -639,7 +637,7 @@ _setModel (int model, const char *sz)
 /** Gets the string argument to this option.  If the option is '--opt'
     then for input of '--optxyz' or '--opt xyz' returns xyz.
 */
-static char *
+char *
 getStringArg(const char *szStart, char **argv, int *pi, int argc)
 {
   if (argv[*pi][strlen(szStart)])
@@ -665,7 +663,7 @@ getStringArg(const char *szStart, char **argv, int *pi, int argc)
 /** Gets the integer argument to this option using the same rules as
     getStringArg.
 */
-static int
+int
 getIntArg(const char *szStart, char **argv, int *pi, int argc)
 {
     return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi, argc)));
@@ -1116,8 +1114,11 @@ parseCmdLine (int argc, char **argv)
            case 'M':
              {
                preProcOnly = 1;
-               addSet(&preArgvSet, Safe_strdup("-M"));
-               break;
+                if (argv[i][2] == 'M')
+                 addSet(&preArgvSet, Safe_strdup("-MM"));
+                else
+                 addSet(&preArgvSet, Safe_strdup("-M"));
+               break;
              }
            case 'C':
              {
@@ -1286,6 +1287,8 @@ linkEdit (char **envp)
   int system_ret;
   const char *s;
 
+
+  if(port->linker.needLinkerScript) {
   /* first we need to create the <filename>.lnk file */
   SNPRINTF (scratchFileName, sizeof(scratchFileName),
            "%s.lnk", dstFileName);
@@ -1379,7 +1382,7 @@ linkEdit (char **envp)
   /* standard library path */
     if (!options.nostdlib)
     {
-        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80)) /*Not for the z80, gbz80*/
+        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80 || TARGET_IS_HC08)) /*Not for the z80, gbz80*/
         {
             switch (options.model)
             {
@@ -1418,7 +1421,9 @@ linkEdit (char **envp)
         }
         else /*for the z80, gbz80*/
         {
-            if (TARGET_IS_Z80)
+            if (TARGET_IS_HC08)
+                c = "hc08";
+            else if (TARGET_IS_Z80)
                 c = "z80";
             else
                 c = "gbz80";
@@ -1457,13 +1462,18 @@ linkEdit (char **envp)
         }
 #endif
 #endif
-        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80)) /*Not for the z80, gbz80*/
+        if (!(TARGET_IS_Z80 || TARGET_IS_GBZ80
+              || TARGET_IS_HC08)) /*Not for the z80, gbz80*/
         { /*Why the z80 port is not using the standard libraries?*/
             fprintf (lnkfile, "-l %s\n", STD_LIB);
             fprintf (lnkfile, "-l %s\n", STD_INT_LIB);
             fprintf (lnkfile, "-l %s\n", STD_LONG_LIB);
             fprintf (lnkfile, "-l %s\n", STD_FP_LIB);
         }
+        else if (TARGET_IS_HC08)
+        {
+            fprintf (lnkfile, "-l hc08\n");
+        }
         else if (TARGET_IS_Z80)
         {
             fprintf (lnkfile, "-l z80\n");
@@ -1481,7 +1491,8 @@ linkEdit (char **envp)
   /*For the z80 and gbz80 ports, try to find where crt0.o is...
   It is very important for this file to be first on the linking proccess
   so the areas are set in the correct order, expecially _GSINIT*/
-  if (TARGET_IS_Z80 || TARGET_IS_GBZ80) /*For the z80, gbz80*/
+  if ((TARGET_IS_Z80 || TARGET_IS_GBZ80) &&
+      !options.no_std_crt0 && !options.nostdlib) /*For the z80, gbz80*/
   {
       char crt0path[PATH_MAX];
       FILE * crt0fp;
@@ -1519,6 +1530,7 @@ linkEdit (char **envp)
 
   fprintf (lnkfile, "\n-e\n");
   fclose (lnkfile);
+  }    /* if(port->linker.needLinkerScript) */
 
   if (options.verbose)
     printf ("sdcc: Calling linker...\n");
@@ -1597,6 +1609,8 @@ linkEdit (char **envp)
       strncatz (scratchFileName,
                options.out_fmt ? ".S19" : ".ihx",
                sizeof(scratchFileName));
+      if (strcmp (fullDstFileName, scratchFileName))
+       unlink (fullDstFileName);
       rename (scratchFileName, fullDstFileName);
 
       strncpyz (buffer, fullDstFileName, sizeof(buffer));
@@ -1611,12 +1625,32 @@ linkEdit (char **envp)
       strncatz (scratchFileName, ".map", sizeof(scratchFileName));
       *q = 0;
       strncatz(buffer, ".map", sizeof(buffer));
+      if (strcmp (scratchFileName, buffer))
+       unlink (buffer);
       rename (scratchFileName, buffer);
       *p = 0;
       strncatz (scratchFileName, ".mem", sizeof(scratchFileName));
       *q = 0;
       strncatz(buffer, ".mem", sizeof(buffer));
+      if (strcmp (scratchFileName, buffer))
+        unlink (buffer);
       rename (scratchFileName, buffer);
+      if (options.debug)
+        {
+          *p = 0;
+          strncatz (scratchFileName, ".cdb", sizeof(scratchFileName));
+          *q = 0;
+          strncatz(buffer, ".cdb", sizeof(buffer));
+          if (strcmp (scratchFileName, buffer))
+            unlink (buffer);
+          rename (scratchFileName, buffer);
+          /* and the OMF file without extension: */
+          *p = 0;
+          *q = 0;
+          if (strcmp (scratchFileName, buffer))
+            unlink (buffer);
+          rename (scratchFileName, buffer);
+        }
     }
   if (system_ret)
     {
@@ -1666,6 +1700,8 @@ assemble (char **envp)
         strncatz (scratchFileName, 
                  port->linker.rel_ext,
                  sizeof(scratchFileName));
+        if (strcmp (scratchFileName, fullDstFileName))
+          unlink (fullDstFileName);
         rename (scratchFileName, fullDstFileName);
     }
 }
@@ -2076,6 +2112,10 @@ main (int argc, char **argv, char **envp)
           glue();
         }
 
+      if (fatalError) {
+        exit (1);
+      }
+
       if (!options.c1mode && !noAssemble)
         {
           if (options.verbose)