+extern set *libFilesSet;
+extern set *libDirsSet;
+extern set *libPathsSet;
+extern set *includeDirsSet;
+extern set *userIncDirsSet;
+extern set *dataDirsSetSet;
+extern set *relFilesSet;
+extern set *linkOptionsSet;
+
+static void _pic14_do_link (void)
+{
+ hTab *linkValues=NULL;
+ char lfrm[256];
+ char *lcmd;
+ char temp[128];
+ set *tSet=NULL;
+ int ret;
+ char * procName;
+
+ /*
+ * link command format:
+ * {linker} {incdirs} {lflags} -o {outfile} {spec_ofiles} {ofiles} {libs}
+ *
+ */
+
+ sprintf(lfrm, "{linker} {incdirs} {sysincdirs} {lflags} -w -r -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}");
+
+ shash_add(&linkValues, "linker", "gplink");
+
+ /* LIBRARY SEARCH DIRS */
+ mergeSets(&tSet, libPathsSet);
+ mergeSets(&tSet, libDirsSet);
+ shash_add(&linkValues, "incdirs", joinStrSet(appendStrSet(tSet, "-I\"", "\"")));
+
+ SNPRINTF (&temp[0], 128, "%cpic\"", DIR_SEPARATOR_CHAR);
+ joinStrSet(appendStrSet(libDirsSet, "-I\"", &temp[0]));
+ shash_add(&linkValues, "sysincdirs", joinStrSet(appendStrSet(libDirsSet, "-I\"", &temp[0])));
+
+ shash_add(&linkValues, "lflags", joinStrSet(linkOptionsSet));
+
+ shash_add(&linkValues, "outfile", fullDstFileName ? fullDstFileName : dstFileName);
+
+ if(fullSrcFileName) {
+ sprintf(temp, "%s.o", fullDstFileName ? fullDstFileName : dstFileName );
+ shash_add(&linkValues, "user_ofile", temp);
+ }
+
+ shash_add(&linkValues, "ofiles", joinStrSet(relFilesSet));
+
+ /* LIBRARIES */
+ procName = processor_base_name();
+ if (!procName) {
+ procName = "16f877";
+ }
+
+ addSet(&libFilesSet, "libsdcc.lib");
+ SNPRINTF(&temp[0], 128, "pic%s.lib", procName);
+ addSet(&libFilesSet, temp);
+ shash_add(&linkValues, "libs", joinStrSet(libFilesSet));
+
+ lcmd = msprintf(linkValues, lfrm);
+
+ ret = my_system( lcmd );
+
+ Safe_free( lcmd );
+
+ if(ret)
+ exit(1);
+}
+