char *dstFileName; /* destination file name without extension */
char *dstPath = ""; /* path for the output files; */
/* "" is equivalent with cwd */
-char *moduleName; /* module name is source file without path and extension */
+char *moduleNameBase; /* module name base is source file without path and extension */
/* can be NULL while linking without compiling */
+char *moduleName; /* module name is same as module name base, but with all */
+ /* non-alphanumeric characters replaced with underscore */
int currRegBank = 0;
int RegBankUsed[4] = {1, 0, 0, 0}; /*JCF: Reg Bank 0 used by default*/
struct optimize optimize;
#define OPTION_USE_STDOUT "--use-stdout"
#define OPTION_STACK_SIZE "--stack-size"
#define OPTION_PACK_IRAM "--pack-iram"
+#define OPTION_NO_PEEP_COMMENTS "--no-peep-comments"
static const OPTION
optionsTable[] = {
{ 0, OPTION_NO_XINIT_OPT, &options.noXinitOpt, "don't memcpy initialized xram from code"},
{ 0, OPTION_NO_CCODE_IN_ASM, &options.noCcodeInAsm, "don't include c-code as comments in the asm file"},
{ 0, OPTION_ICODE_IN_ASM, &options.iCodeInAsm, "include i-code as comments in the asm file"},
+ { 0, OPTION_NO_PEEP_COMMENTS, &options.noPeepComments, "don't include peephole optimizer comments"},
{ 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"},
fext--;
}
#endif
+ moduleNameBase = Safe_strdup ( fext );
moduleName = Safe_strdup ( fext );
+
+ for (fext = moduleName; *fext; fext++)
+ if (!isalnum (*fext))
+ *fext = '_';
return;
}
if (!port->parseOption (&argc, argv, &i))
{
werror (W_UNKNOWN_OPTION, argv[i]);
+ continue;
}
else
{
/* use the modulename from the C-source */
if (fullSrcFileName)
{
- size_t bufSize = strlen (dstPath) + strlen (moduleName) + 1;
+ size_t bufSize = strlen (dstPath) + strlen (moduleNameBase) + 1;
dstFileName = Safe_alloc (bufSize);
strncpyz (dstFileName, dstPath, bufSize);
- strncatz (dstFileName, moduleName, bufSize);
+ strncatz (dstFileName, moduleNameBase, bufSize);
}
/* use the modulename from the first object file */
else if ((s = peekSet(relFilesSet)) != NULL)
if (port->linker.cmd)
{
char buffer2[PATH_MAX];
- set *libSet=NULL;
+ char buffer3[PATH_MAX];
+ set *tempSet=NULL, *libSet=NULL;
+ strcpy(buffer3, dstFileName);
if(TARGET_IS_PIC16) {
- /* use $3 to set the linker include directories */
- libSet = appendStrSet(libDirsSet, "-I\"", "\"");
-
- /* now add the libraries from command line */
+
+ /* use $l to set the linker include directories */
+ tempSet = appendStrSet(libDirsSet, "-I\"", "\"");
+ mergeSets(&linkOptionsSet, tempSet);
+
+ tempSet = appendStrSet(libPathsSet, "-I\"", "\"");
+ mergeSets(&linkOptionsSet, tempSet);
+
+ /* use $3 for libraries from command line --> libSet */
mergeSets(&libSet, libFilesSet);
+
+ tempSet = appendStrSet(relFilesSet, "", "");
+ mergeSets(&libSet, tempSet);
+// libSet = reverseSet(libSet);
+
+ if(fullSrcFileName) {
+// strcpy(buffer3, strrchr(fullSrcFileName, DIR_SEPARATOR_CHAR)+1);
+ /* if it didn't work, revert to old behaviour */
+ if(!strlen(buffer3))strcpy(buffer3, dstFileName);
+ strcat(buffer3, port->linker.rel_ext);
+
+ } else strcpy(buffer3, "");
}
- buildCmdLine (buffer2, port->linker.cmd, dstFileName, scratchFileName, (libSet?joinStrSet(libSet):NULL), linkOptionsSet);
- if(libSet)deleteSet(&libSet);
+ buildCmdLine (buffer2, port->linker.cmd, buffer3, scratchFileName, (libSet?joinStrSet(libSet):NULL), linkOptionsSet);
buildCmdLine2 (buffer, sizeof(buffer), buffer2);
}
addSetHead(&binPathSet, Safe_strdup(buf));
}
+#if 0
if (options.printSearchDirs) {
printf("programs:\n");
fputStrSet(stdout, binPathSet);
}
+#endif
}
/* Set system include path */
if ((p = getenv(SDCC_INCLUDE_NAME)) != NULL)
addSetHead(&includeDirsSet, p);
+#if 0
if (options.printSearchDirs) {
printf("includedir:\n");
fputStrSet(stdout, includeDirsSet);
}
+#endif
}
/* Set system lib path */
if ((p = getenv(SDCC_LIB_NAME)) != NULL)
addSetHead(&libDirsSet, p);
+#if 0
if (options.printSearchDirs) {
printf("libdir:\n");
fputStrSet(stdout, libDirsSet);
}
+#endif
}
/* Set data path */
addSet(&dataDirsSet, Safe_strdup(DATADIR));
#endif
+#if 0
if (options.printSearchDirs) {
printf("datadir:\n");
fputStrSet(stdout, dataDirsSet);
}
+#endif
setIncludePath();
setLibPath();
}
+static void doPrintSearchDirs(void)
+{
+ printf("programs:\n");
+ fputStrSet(stdout, binPathSet);
+
+ printf("datadir:\n");
+ fputStrSet(stdout, dataDirsSet);
+
+ printf("includedir:\n");
+ fputStrSet(stdout, includeDirsSet);
+
+ printf("libdir:\n");
+ fputStrSet(stdout, libDirsSet);
+ fputStrSet(stdout, libPathsSet);
+}
+
+
static void
sig_handler (int signal)
{
setBinPaths(argv[0]);
setDataPaths(argv[0]);
+ if(port->initPaths)
+ port->initPaths();
+
+ if(options.printSearchDirs)
+ doPrintSearchDirs();
+
/* if no input then printUsage & exit */
if (!options.c1mode && !fullSrcFileName && peekSet(relFilesSet) == NULL) {
if (!options.printSearchDirs)
yyparse ();
- pclose(yyin);
+ if (pclose(yyin))
+ fatalError = 1;
deleteSetItem(&pipeSet, yyin);
if (fatalError) {