#include "SDCCerr.h"
#include "BuildCmd.h"
#include "MySystem.h"
+#include "SDCCmacro.h"
+#include "SDCCutil.h"
#if NATIVE_WIN32
#include <process.h>
#include "spawn.h"
#endif
-// This is a bit messy because we define link ourself
#if !defined(__BORLANDC__) && !defined(_MSC_VER)
-
+#include <sys/stat.h>
#include <unistd.h>
-
-#else
-// No unistd.h in Borland C++
-/*
-extern int access (const char *, int);
-#define X_OK 1
-*/
-
#endif
+/** Name of the environment variable checked for other instalations. */
+#define SDCCDIR_NAME "SDCCDIR"
+
//REMOVE ME!!!
extern int yyparse ();
bool verboseExec = FALSE;
char *preOutName;
+/* uncomment JAMIN_DS390 to always override and use ds390 port
+ for mcs51 work. This is temporary, for compatibility testing. */
+/* #define JAMIN_DS390 */
+#ifdef JAMIN_DS390
+int ds390_jammed = 0;
+#endif
+
// Globally accessible scratch buffer for file names.
char scratchFileName[FILENAME_MAX];
+char buffer[FILENAME_MAX];
// In MSC VC6 default search path for exe's to path for this
#define OPTION_NO_LOOP_IND "--noinduction"
#define OPTION_LESS_PEDANTIC "--lesspedantic"
#define OPTION_NO_GCSE "--nogcse"
-#define OPTION_SHORT_IS_CHAR "--short-is-char"
+#define OPTION_SHORT_IS_8BITS "--short-is-8bits"
/** Table of all options supported by all ports.
This table provides:
{ 'C', NULL, NULL, "Preprocessor option" },
{ 'M', NULL, NULL, "Preprocessor option" },
{ 'V', NULL, &verboseExec, "Execute verbosely. Show sub commands as they are run" },
- { 'S', NULL, &noAssemble, "Assemble only" },
+ { 'S', NULL, &noAssemble, "Compile only; do not assemble or link" },
{ 'W', NULL, NULL, "Pass through options to the assembler (a) or linker (l)" },
{ 'L', NULL, NULL, "Add the next field to the library search path" },
- { 0, OPTION_LARGE_MODEL, NULL, "Far functions, far data" },
- { 0, OPTION_MEDIUM_MODEL, NULL, "Far functions, near data" },
- { 0, OPTION_SMALL_MODEL, NULL, "Small model (default)" },
- { 0, OPTION_FLAT24_MODEL, NULL, NULL },
+ { 'l', NULL, NULL, "Include the given library in the link" },
+ { 0, OPTION_LARGE_MODEL, NULL, "external data space is used" },
+ { 0, OPTION_MEDIUM_MODEL, NULL, "not supported" },
+ { 0, OPTION_SMALL_MODEL, NULL, "internal data space is used (default)" },
+ { 0, OPTION_FLAT24_MODEL, NULL, "use the flat24 model for the ds390 (default)" },
{ 0, "--stack-auto", &options.stackAuto, "Stack automatic variables" },
- { 0, OPTION_STACK_8BIT, NULL, NULL },
- { 0, "--stack-10bit", &options.stack10bit, NULL },
+ { 0, OPTION_STACK_8BIT, NULL, "use the 8bit stack for the ds390 (not supported yet)" },
+ { 0, "--stack-10bit", &options.stack10bit, "use the 10bit stack for ds390 (default)" },
{ 0, "--xstack", &options.useXstack, "Use external stack" },
{ 0, "--generic", &options.genericPtr, "All unqualified ptrs converted to '_generic'" },
{ 0, OPTION_NO_GCSE, NULL, "Disable the GCSE optimisation" },
{ 0, OPTION_NO_LOOP_IND, NULL, NULL },
{ 0, "--nojtbound", &optimize.noJTabBoundary, "Don't generate boundary check for jump tables" },
{ 0, "--noloopreverse", &optimize.noLoopReverse, "Disable the loop reverse optimisation" },
- { 0, "--regextend", &options.regExtend, NULL },
- { 'c', "--compile-only", &options.cc_only, "Compile only, do not assemble or link" },
+ { 'c', "--compile-only", &options.cc_only, "Compile and assemble, but do not link" },
{ 0, "--dumpraw", &options.dump_raw, "Dump the internal structure after the initial parse" },
{ 0, "--dumpgcse", &options.dump_gcse, NULL },
{ 0, "--dumploop", &options.dump_loop, NULL },
{ 0, "--dumpregpack", &options.dump_pack, NULL },
{ 0, "--dumpregassign", &options.dump_rassgn, NULL },
{ 0, OPTION_DUMP_ALL, NULL, "Dump the internal structure at all stages" },
- { 0, OPTION_XRAM_LOC, NULL, NULL },
+ { 0, OPTION_XRAM_LOC, NULL, "<nnnn> External Ram start location" },
{ 0, OPTION_IRAM_SIZE, NULL, "<nnnn> Internal Ram size" },
{ 0, OPTION_XSTACK_LOC, NULL, "<nnnn> External Ram start location" },
{ 0, OPTION_CODE_LOC, NULL, "<nnnn> Code Segment Location" },
{ 0, OPTION_STACK_LOC, NULL, "<nnnn> Stack pointer initial value" },
{ 0, OPTION_DATA_LOC, NULL, "<nnnn> Direct data start location" },
{ 0, OPTION_IDATA_LOC, NULL, NULL },
- { 0, OPTION_PEEP_FILE, NULL, NULL },
- { 0, OPTION_LIB_PATH, NULL, NULL },
+ { 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, OPTION_OUT_FMT_IHX, NULL, NULL },
{ 0, "--nooverlay", &options.noOverlay, NULL },
{ 0, "--main-return", &options.mainreturn, "Issue a return after main()" },
{ 0, "--no-peep", &options.nopeep, "Disable the peephole assembly file optimisation" },
+ { 0, "--no-reg-params", &options.noRegParams, "On some ports, disable passing some parameters in registers" },
{ 0, "--peep-asm", &options.asmpeep, NULL },
{ 0, "--debug", &options.debug, "Enable debugging symbol output" },
- { 0, "--nodebug", &options.nodebug, "Disable debugging symbol output" },
{ 'v', OPTION_VERSION, NULL, "Display sdcc's version" },
- { 0, "--stack-after-data", &options.stackOnData, NULL },
+ { 0, "--stack-after-data", &options.stackOnData, "initialize the stackpointer with the last byte use in DSEG" },
{ 'E', "--preprocessonly", &preProcOnly, "Preprocess only, do not compile" },
{ 0, "--c1mode", &options.c1mode, "Act in c1 mode. The input is preprocessed code, the output is assembly code." },
{ 0, "--help", NULL, "Display this help" },
- { 0, OPTION_CALLEE_SAVES, NULL, "Cause the called function to save registers insted of the caller" },
+ { 0, OPTION_CALLEE_SAVES, NULL, "<func[,func,...]> Cause the called function to save registers insted of the caller" },
{ 0, "--nostdlib", &options.nostdlib, "Do not include the standard library directory in the search path" },
- { 0, "--nostdinc", &options.nostdinc, NULL },
+ { 0, "--nostdinc", &options.nostdinc, "Do not include the standard include directory in the search path" },
{ 0, "--verbose", &options.verbose, "Trace calls to the preprocessor, assembler, and linker" },
{ 0, OPTION_LESS_PEDANTIC, NULL, "Disable some of the more pedantic warnings" },
- { 0, "--short-is-int", &options.shortisint, "Make short the same size as int" },
- { 0, OPTION_SHORT_IS_CHAR, NULL, "Make short the same size as char (default)" }
+ { 0, OPTION_SHORT_IS_8BITS, NULL, "Make short 8bits (for old times sake)" },
+ { 0, "--profile", &options.profile, "On supported ports, generate extra profiling information" }
};
/** Table of all unsupported options and help text to display when one
{ 'Y', NULL, "use -I instead" }
};
-static const char *_preCmd[] =
-{
- "sdcpp", "-Wall", "-lang-c++", "-DSDCC=1",
- "$l", "$1", "$2", NULL
+static const char *_baseValues[] = {
+ "cpp", "{bindir}/sdcpp",
+ "cppextraopts", "",
+ NULL
};
+static const char *_preCmd = "{cpp} -Wall -lang-c++ -DSDCC=1 {cppextraopts} {fullsrcfilename} {cppoutfilename}";
+
PORT *port;
static PORT *_ports[] =
{
if (_ports[i]->magic != PORT_MAGIC)
{
- printf ("Error: port %s is incomplete.\n", _ports[i]->target);
- wassert (0);
+ wassertl (0, "Port definition structure is incomplete");
}
}
}
+
+static void
+_findPort (int argc, char **argv)
+{
+ _validatePorts ();
+
+ while (argc--)
+ {
+ if (!strncmp (*argv, "-m", 2))
+ {
+ _setPort (*argv + 2);
+ return;
+ }
+ argv++;
+ }
+ /* Use the first in the list */
+ port = _ports[0];
+}
+
/*-----------------------------------------------------------------*/
/* printVersionInfo - prints the version info */
/*-----------------------------------------------------------------*/
#ifdef SDCC_SUB_VERSION_STR
"/" SDCC_SUB_VERSION_STR
#endif
-#ifdef __CYGWIN32__
- " (CYGWIN32)\n"
+ " (" __DATE__ ")"
+#ifdef __CYGWIN__
+ " (CYGWIN)\n"
#else
#ifdef __DJGPP__
" (DJGPP) \n"
);
}
-/*
- "\t-m<proc> - Target processor <proc>. Default %s\n"
- "\t Try --version for supported values of <proc>\n"
- "\t--model-large - Large Model\n"
- "\t--model-small - Small Model (default)\n"
- "\t--stack-auto - Stack automatic variables\n"
- "\t--xstack - Use external stack\n"
- "\t--xram-loc <nnnn> - External Ram start location\n"
- "\t--xstack-loc <nnnn> - Xternal Stack Location\n"
- "\t--code-loc <nnnn> - Code Segment Location\n"
- "\t--stack-loc <nnnn> - Stack pointer initial value\n"
- "\t--data-loc <nnnn> - Direct data start location\n"
- "\t--idata-loc <nnnn> - Indirect data start location\n"
- "\t--iram-size <nnnn> - Internal Ram size\n"
- "\t--nojtbound - Don't generate boundary check for jump tables\n"
- "\t--generic - All unqualified ptrs converted to '_generic'\n"
- "PreProcessor Options :-\n"
- "\t-Dmacro - Define Macro\n"
- "\t-Ipath - Include \"*.h\" path\n"
- "Note: this is NOT a complete list of options see docs for details\n",
-*/
/*-----------------------------------------------------------------*/
/* printUsage - prints command line syntax */
/*-----------------------------------------------------------------*/
{
int i;
printVersionInfo();
- fprintf (stderr,
+ fprintf (stdout,
"Usage : sdcc [options] filename\n"
"Options :-\n"
);
for (i = 0; i < LENGTH(optionsTable); i++) {
- fprintf(stderr, " %c%c %-20s %s\n",
+ fprintf(stdout, " %c%c %-20s %s\n",
optionsTable[i].shortOpt !=0 ? '-' : ' ',
optionsTable[i].shortOpt !=0 ? optionsTable[i].shortOpt : ' ',
optionsTable[i].longOpt != NULL ? optionsTable[i].longOpt : "",
{
int i = 0;
- strtok (src, "\n \t");
+ strtok (src, "\r\n \t");
/* skip the initial white spaces */
while (isspace (*src))
src++;
options.nostdlib = 0;
options.nostdinc = 0;
options.verbose = 0;
- options.shortisint = 0;
+ options.shortis8bits = 0;
options.stack10bit=0;
}
}
-static void
-_addToList (const char **list, const char *str)
-{
- /* This is the bad way to do things :) */
- while (*list)
- list++;
- *list = strdup (str);
- if (!*list)
- {
- werror (E_OUT_OF_MEM, __FILE__, 0);
- exit (1);
- }
- *(++list) = NULL;
-}
-
static void
_setModel (int model, const char *sz)
{
then for input of '--optxyz' or '--opt xyz' returns xyz.
*/
static char *
-getStringArg(const char *szStart, char **argv, int *pi)
+getStringArg(const char *szStart, char **argv, int *pi, int argc)
{
- if (argv[*pi][strlen(szStart)]) {
- return &argv[*pi][strlen(szStart)];
+ if (argv[*pi][strlen(szStart)])
+ {
+ return &argv[*pi][strlen(szStart)];
}
- else {
- return argv[++(*pi)];
+ else
+ {
+ ++(*pi);
+ if (*pi >= argc)
+ {
+ werror (E_ARGUMENT_MISSING, szStart);
+ /* Die here rather than checking for errors later. */
+ exit(-1);
+ }
+ else
+ {
+ return argv[*pi];
+ }
}
}
getStringArg.
*/
static int
-getIntArg(const char *szStart, char **argv, int *pi)
+getIntArg(const char *szStart, char **argv, int *pi, int argc)
{
- return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi)));
+ return (int)floatFromVal(constVal(getStringArg(szStart, argv, pi, argc)));
+}
+
+static void
+verifyShortOption(const char *opt)
+{
+ if (strlen(opt) != 2)
+ {
+ werror (W_EXCESS_SHORT_OPTIONS, opt);
+ }
}
static bool
}
for (i = 0; i < LENGTH(optionsTable); i++)
- {
- if (optionsTable[i].shortOpt == shortOpt ||
- (longOpt && optionsTable[i].longOpt && strcmp(optionsTable[i].longOpt, longOpt) == 0))
- {
- // If it is a flag then we can handle it here
- if (optionsTable[i].pparameter != NULL)
- {
- (*optionsTable[i].pparameter)++;
- return 1;
- }
- else {
- // Not a flag. Handled manually later.
- return 0;
- }
- }
- }
+ {
+ if (optionsTable[i].shortOpt == shortOpt ||
+ (longOpt && optionsTable[i].longOpt &&
+ strcmp(optionsTable[i].longOpt, longOpt) == 0))
+ {
+
+ // If it is a flag then we can handle it here
+ if (optionsTable[i].pparameter != NULL)
+ {
+ if (optionsTable[i].shortOpt == shortOpt)
+ {
+ verifyShortOption(argv[*pi]);
+ }
+
+ (*optionsTable[i].pparameter)++;
+ return 1;
+ }
+ else {
+ // Not a flag. Handled manually later.
+ return 0;
+ }
+ }
+ }
// Didn't find in the table
return 0;
}
if (strcmp (argv[i], OPTION_PEEP_FILE) == 0)
{
- options.peep_file = getStringArg(OPTION_PEEP_FILE, argv, &i);
+ options.peep_file = getStringArg(OPTION_PEEP_FILE, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_LIB_PATH) == 0)
{
- libPaths[nlibPaths++] = getStringArg(OPTION_LIB_PATH, argv, &i);
+ libPaths[nlibPaths++] = getStringArg(OPTION_LIB_PATH, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_CALLEE_SAVES) == 0)
{
- parseWithComma (options.calleeSaves, getStringArg(OPTION_CALLEE_SAVES, argv, &i));
+ parseWithComma (options.calleeSaves, getStringArg(OPTION_CALLEE_SAVES, argv, &i, argc));
continue;
}
if (strcmp (argv[i], OPTION_XSTACK_LOC) == 0)
{
- options.xstack_loc = getIntArg(OPTION_XSTACK_LOC, argv, &i);
+ options.xstack_loc = getIntArg(OPTION_XSTACK_LOC, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_STACK_LOC) == 0)
{
- options.stack_loc = getIntArg(OPTION_STACK_LOC, argv, &i);
+ options.stack_loc = getIntArg(OPTION_STACK_LOC, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_XRAM_LOC) == 0)
{
- options.xdata_loc = getIntArg(OPTION_XRAM_LOC, argv, &i);
+ options.xdata_loc = getIntArg(OPTION_XRAM_LOC, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_IRAM_SIZE) == 0)
{
- options.iram_size = getIntArg(OPTION_IRAM_SIZE, argv, &i);
+ options.iram_size = getIntArg(OPTION_IRAM_SIZE, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_DATA_LOC) == 0)
{
- options.data_loc = getIntArg(OPTION_DATA_LOC, argv, &i);
+ options.data_loc = getIntArg(OPTION_DATA_LOC, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_IDATA_LOC) == 0)
{
- options.idata_loc = getIntArg(OPTION_IDATA_LOC, argv, &i);
+ options.idata_loc = getIntArg(OPTION_IDATA_LOC, argv, &i, argc);
continue;
}
if (strcmp (argv[i], OPTION_CODE_LOC) == 0)
{
- options.code_loc = getIntArg(OPTION_CODE_LOC, argv, &i);
+ options.code_loc = getIntArg(OPTION_CODE_LOC, argv, &i, argc);
continue;
}
}
if (strcmp (argv[i], OPTION_LESS_PEDANTIC) == 0)
- {
- setErrorLogLevel(ERROR_LEVEL_WARNING);
- continue;
- }
+ {
+ options.lessPedantic = 1;
+ setErrorLogLevel(ERROR_LEVEL_WARNING);
+ continue;
+ }
- if (strcmp (&argv[i][1], OPTION_SHORT_IS_CHAR) == 0) {
- options.shortisint=0;
- continue;
- }
+ if (strcmp (&argv[i][1], OPTION_SHORT_IS_8BITS) == 0)
+ {
+ options.shortis8bits=1;
+ continue;
+ }
if (!port->parseOption (&argc, argv, &i))
{
switch (argv[i][1])
{
case 'h':
+ verifyShortOption(argv[i]);
+
printUsage ();
exit (0);
break;
break;
case 'c':
+ verifyShortOption(argv[i]);
+
options.cc_only = 1;
break;
case 'L':
- libPaths[nlibPaths++] = getStringArg("-L", argv, &i);
+ libPaths[nlibPaths++] = getStringArg("-L", argv, &i, argc);
+ break;
+
+ case 'l':
+ libFiles[nlibFiles++] = getStringArg("-l", argv, &i, argc);
break;
case 'W':
/* linker options */
if (argv[i][2] == 'l')
{
- parseWithComma(linkOptions, getStringArg("-Wl", argv, &i));
+ parseWithComma(linkOptions, getStringArg("-Wl", argv, &i, argc));
}
else
{
/* assembler options */
if (argv[i][2] == 'a')
{
- parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i));
+ parseWithComma ((char **) asmOptions, getStringArg("-Wa", argv, &i, argc));
}
else
{
break;
case 'v':
+ verifyShortOption(argv[i]);
+
printVersionInfo ();
exit (0);
break;
case 'M':
{
preProcOnly = 1;
- _addToList (preArgv, "-M");
+ addToList (preArgv, "-M");
break;
}
case 'C':
{
- _addToList (preArgv, "-C");
+ addToList (preArgv, "-C");
break;
}
case 'd':
sOpt = 'I';
sprintf (buffer, "-%c%s", sOpt, rest);
- _addToList (preArgv, buffer);
+ addToList (preArgv, buffer);
}
break;
options.xstack_loc = options.xdata_loc;
/* if debug option is set the open the cdbFile */
- if (!options.nodebug && srcFileName)
+ if (options.debug && srcFileName)
{
sprintf (scratchFileName, "%s.cdb", srcFileName);
if ((cdbFile = fopen (scratchFileName, "w")) == NULL)
if (options.iram_size)
fprintf (lnkfile, "-a 0x%04x\n", options.iram_size);
- /*if (options.debug) */
- fprintf (lnkfile, "-z\n");
+ if (options.debug)
+ fprintf (lnkfile, "-z\n");
#define WRITE_SEG_LOC(N, L) \
segName = strdup(N); \
/* standard library path */
if (!options.nostdlib)
{
+/****
if (TARGET_IS_DS390)
{
c = "ds390";
}
else
+*****/
{
switch (options.model)
{
c = "large";
break;
case MODEL_FLAT24:
- c = "flat24";
+ /* c = "flat24"; */
+ c = "ds390";
break;
default:
werror (W_UNKNOWN_MODEL, __FILE__, __LINE__);
fprintf (lnkfile, "-k %s/%s\n", SDCC_LIB_DIR /*STD_LIB_PATH */ , c);
/* standard library files */
- if (strcmp (port->target, "ds390") == 0)
+ /* if (strcmp (port->target, "ds390") == 0) */
+ if (options.model == MODEL_FLAT24)
{
fprintf (lnkfile, "-l %s\n", STD_DS390_LIB);
}
if (options.verbose)
printf ("sdcc: Calling linker...\n");
- buildCmdLine (buffer, port->linker.cmd, srcFileName, NULL, NULL, NULL);
+ if (port->linker.cmd)
+ {
+ buildCmdLine (buffer, port->linker.cmd, srcFileName, NULL, NULL, NULL);
+ }
+ else
+ {
+ printf("Here 1\n");
+ buildCmdLine2 (buffer, port->linker.mcmd);
+ }
+
if (my_system (buffer))
{
exit (1);
static void
assemble (char **envp)
{
- buildCmdLine (buffer, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions);
+ if (port->assembler.cmd)
+ {
+ buildCmdLine (buffer, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions);
+ }
+ else
+ {
+ buildCmdLine2 (buffer, port->assembler.mcmd);
+ }
+
if (my_system (buffer))
{
/* either system() or the assembler itself has reported an error
}
}
-
-
/*-----------------------------------------------------------------*/
/* preProcess - spawns the preprocessor with arguments */
/*-----------------------------------------------------------------*/
static int
preProcess (char **envp)
{
- char procDef[128];
-
preOutName = NULL;
if (!options.c1mode)
{
/* if using external stack define the macro */
if (options.useXstack)
- _addToList (preArgv, "-DSDCC_USE_XSTACK");
+ addToList (preArgv, "-DSDCC_USE_XSTACK");
/* set the macro for stack autos */
if (options.stackAuto)
- _addToList (preArgv, "-DSDCC_STACK_AUTO");
+ addToList (preArgv, "-DSDCC_STACK_AUTO");
/* set the macro for stack autos */
if (options.stack10bit)
- _addToList (preArgv, "-DSDCC_STACK_TENBIT");
+ addToList (preArgv, "-DSDCC_STACK_TENBIT");
/* set the macro for large model */
switch (options.model)
{
case MODEL_LARGE:
- _addToList (preArgv, "-DSDCC_MODEL_LARGE");
+ addToList (preArgv, "-DSDCC_MODEL_LARGE");
break;
case MODEL_SMALL:
- _addToList (preArgv, "-DSDCC_MODEL_SMALL");
+ addToList (preArgv, "-DSDCC_MODEL_SMALL");
break;
case MODEL_COMPACT:
- _addToList (preArgv, "-DSDCC_MODEL_COMPACT");
+ addToList (preArgv, "-DSDCC_MODEL_COMPACT");
break;
case MODEL_MEDIUM:
- _addToList (preArgv, "-DSDCC_MODEL_MEDIUM");
+ addToList (preArgv, "-DSDCC_MODEL_MEDIUM");
break;
case MODEL_FLAT24:
- _addToList (preArgv, "-DSDCC_MODEL_FLAT24");
+ addToList (preArgv, "-DSDCC_MODEL_FLAT24");
break;
default:
werror (W_UNKNOWN_MODEL, __FILE__, __LINE__);
break;
}
+ /* add port (processor information to processor */
+ addToList (preArgv, "-DSDCC_{port}");
+ addToList (preArgv, "-D__{port}");
+
/* standard include path */
if (!options.nostdinc) {
- _addToList (preArgv, "-I" SDCC_INCLUDE_DIR);
+ addToList (preArgv, "-I{includedir}");
}
- /* add port (processor information to processor */
- sprintf (procDef, "-DSDCC_%s", port->target);
- _addToList (preArgv, procDef);
- sprintf (procDef, "-D__%s", port->target);
- _addToList (preArgv, procDef);
-
+ setMainValue ("cppextraopts", join(preArgv));
+
if (!preProcOnly)
preOutName = strdup (tmpnam (NULL));
+ setMainValue ("cppoutfilename", preOutName);
+
if (options.verbose)
printf ("sdcc: Calling preprocessor...\n");
- buildCmdLine (buffer, _preCmd, fullSrcFileName,
- preOutName, srcFileName, preArgv);
+ buildCmdLine2 (buffer, _preCmd);
+
if (my_system (buffer))
{
// @FIX: Dario Vecchio 03-05-2001
return 0;
}
-static void
-_findPort (int argc, char **argv)
+static bool
+_setPaths (const char *pprefix)
{
- _validatePorts ();
+ /* Logic:
+ Given the prefix and how the directories were layed out at
+ configure time, see if the library and include directories are
+ where expected. If so, set.
+ */
+ getStringDifference (buffer, PREFIX, SDCC_INCLUDE_DIR);
+ strcpy (scratchFileName, pprefix);
+ strcat (scratchFileName, buffer);
+
+ if (pathExists (scratchFileName))
+ {
+ setMainValue ("includedir", scratchFileName);
+ }
+ else
+ {
+ return FALSE;
+ }
+
+ getStringDifference (buffer, PREFIX, SDCC_LIB_DIR);
+ strcpy (scratchFileName, pprefix);
+ strcat (scratchFileName, buffer);
- argc--;
- while (argc)
+ if (pathExists (scratchFileName))
{
- if (!strncmp (*argv, "-m", 2))
- {
- _setPort (*argv + 2);
- return;
- }
- argv++;
- argc--;
+ setMainValue ("libdir", scratchFileName);
}
- /* Use the first in the list */
- port = _ports[0];
+ else
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+_discoverPaths (const char *argv0)
+{
+ /* Logic:
+ 1. Try the SDCCDIR environment variable.
+ 2. If (1) fails, and if the argv[0] includes a path, attempt to find the include
+ and library paths with respect to that. Note that under win32
+ argv[0] is always the full path to the program.
+ 3. If (1) and (2) fail, fall back to the compile time defaults.
+
+ Detecting assumes the same layout as when configured. If the
+ directories have been further moved about then discovery will
+ fail.
+ */
+
+ /* Some input cases:
+ "c:\fish\sdcc\bin\sdcc"
+ "../bin/sdcc"
+ "/home/fish/bin/sdcc"
+
+ Note that ./sdcc is explicitly not supported as there isn't
+ enough information.
+ */
+ /* bindir is handled differently to the lib and include directories.
+ It's rather unfortunate, but required due to the different
+ install and development layouts. Logic is different as well.
+ Sigh.
+ */
+ if (strchr (argv0, DIR_SEPARATOR_CHAR))
+ {
+ strcpy (scratchFileName, argv0);
+ *strrchr (scratchFileName, DIR_SEPARATOR_CHAR) = '\0';
+ setMainValue ("bindir", scratchFileName);
+ ExePathList[0] = gc_strdup (scratchFileName);
+ }
+ else if (getenv (SDCCDIR_NAME) != NULL)
+ {
+ getStringDifference (buffer, PREFIX, BINDIR);
+ strcpy (scratchFileName, getenv (SDCCDIR_NAME));
+ strcat (scratchFileName, buffer);
+ setMainValue ("bindir", scratchFileName);
+ ExePathList[0] = gc_strdup (scratchFileName);
+ }
+ else
+ {
+ setMainValue ("bindir", BINDIR);
+ ExePathList[0] = BINDIR;
+ }
+
+ do
+ {
+ /* Case 1 */
+ if (getenv (SDCCDIR_NAME) != NULL)
+ {
+ if (_setPaths (getenv (SDCCDIR_NAME)))
+ {
+ /* Successfully set. */
+ break;
+ }
+ else
+ {
+ /* Include and lib wern't where expected. */
+ }
+ }
+ /* Case 2 */
+ if (strchr (argv0, DIR_SEPARATOR_CHAR))
+ {
+ char *pbase = getPrefixFromBinPath (argv0);
+
+ if (pbase == NULL)
+ {
+ /* A bad path. Skip. */
+ }
+ else
+ {
+ if (_setPaths (pbase))
+ {
+ /* Successfully set. */
+ break;
+ }
+ else
+ {
+ /* Include and lib weren't where expected. */
+ }
+ }
+ }
+ /* Case 3 */
+ setMainValue ("includedir", SDCC_INCLUDE_DIR);
+ setMainValue ("libdir", SDCC_LIB_DIR);
+ } while (0);
+}
+
+static void
+initValues (void)
+{
+ populateMainValues (_baseValues);
+ setMainValue ("port", port->target);
+ setMainValue ("fullsrcfilename", fullSrcFileName);
+ setMainValue ("srcfilename", srcFileName);
+ setMainValue ("objext", port->linker.rel_ext);
+ setMainValue ("asmext", port->assembler.file_ext);
}
/*
}
_findPort (argc, argv);
+#ifdef JAMIN_DS390
+ if (strcmp(port->target, "mcs51") == 0) {
+ printf("DS390 jammed in A\n");
+ _setPort ("ds390");
+ ds390_jammed = 1;
+ }
+#endif
/* Initalise the port. */
if (port->init)
port->init ();
// Create a default exe search path from the path to the sdcc command
-
- if (strchr (argv[0], DIR_SEPARATOR_CHAR))
- {
- strcpy (DefaultExePath, argv[0]);
- *(strrchr (DefaultExePath, DIR_SEPARATOR_CHAR)) = 0;
- ExePathList[0] = DefaultExePath;
- }
-
-
setDefaultOptions ();
+#ifdef JAMIN_DS390
+ if (ds390_jammed) {
+ options.model = MODEL_SMALL;
+ options.stack10bit=0;
+ }
+#endif
parseCmdLine (argc, argv);
- initMem ();
-
- port->finaliseOptions ();
-
/* if no input then printUsage & exit */
if ((!options.c1mode && !srcFileName && !nrelFiles) ||
(options.c1mode && !srcFileName && !options.out_name))
if (srcFileName)
{
+ initValues ();
+ _discoverPaths (argv[0]);
+
preProcess (envp);
+ initMem ();
+
+ port->finaliseOptions ();
+
initSymt ();
initiCode ();
initCSupport ();
// EndFix
return 1;
}
- if (!options.c1mode)
+ if (!options.c1mode && !noAssemble)
{
if (options.verbose)
printf ("sdcc: Calling assembler...\n");
free (preOutName);
}
// EndFix
+ #if defined (__MINGW32__) || defined (__CYGWIN__) || defined (_MSC_VER)
+ rm_tmpfiles();
+ #endif
return 1;
}
if (cdbFile)
fclose (cdbFile);
+ if (preOutName && !options.c1mode)
+ {
+ unlink (preOutName);
+ free (preOutName);
+ }
+
if (!options.cc_only &&
!fatalError &&
!noAssemble &&
if (yyin && yyin != stdin)
fclose (yyin);
- if (preOutName && !options.c1mode)
- {
- unlink (preOutName);
- free (preOutName);
- }
-
return 0;
}