}
}
+enum IntermediateFileType { none, ec, c, sym, imp, bowl, o };
+
class ProjectNode : ListItem
{
public:
return buffer;
}
+ char * GetObjectFileName(char * buffer, Map<String, NameCollisionInfo> namesInfo, IntermediateFileType type, bool dotMain)
+ {
+ if(buffer && (this.type == file || (this.type == project && dotMain == true)))
+ {
+ bool collision;
+ char extension[MAX_EXTENSION];
+ char moduleName[MAX_FILENAME];
+ NameCollisionInfo info;
+
+ GetExtension(name, extension);
+ ReplaceSpaces(moduleName, name);
+ StripExtension(moduleName);
+ info = namesInfo[moduleName];
+ collision = info ? info.IsExtensionColliding(extension) : false;
+
+ if(dotMain)
+ {
+ ReplaceSpaces(buffer, project.moduleName);
+ StripExtension(buffer);
+ strcat(buffer, ".main.ec");
+ }
+ else
+ strcpy(buffer, name);
+ if(!strcmp(extension, "ec") || dotMain)
+ {
+ if(type == c)
+ ChangeExtension(buffer, "c", buffer);
+ else if(type == sym)
+ ChangeExtension(buffer, "sym", buffer);
+ else if(type == imp)
+ ChangeExtension(buffer, "imp", buffer);
+ else if(type == bowl)
+ ChangeExtension(buffer, "bowl", buffer);
+ }
+ if(type == o)
+ {
+ if(collision)
+ strcat(buffer, ".o");
+ else
+ ChangeExtension(buffer, "o", buffer);
+ }
+ }
+ return buffer;
+ }
+
char * GetFileSysMatchingPath(char * buffer)
{
if(buffer)
ProjectNode FindByFullPath(char * path, bool includeResources)
{
+ if(files)
+ {
+ char name[MAX_FILENAME];
+ GetLastDirectory(path, name);
+ return InternalFindByFullPath(path, includeResources, name);
+ }
+ return null;
+ }
+
+ ProjectNode InternalFindByFullPath(char * path, bool includeResources, char * lastDirName)
+ {
ProjectNode result = null;
if(files)
{
{
if(includeResources || child.type != resources)
{
- if(child.type != folder && child.name)
+ if(child.type != file)
+ result = child.InternalFindByFullPath(path, includeResources, lastDirName);
+ else if(child.name && !strcmpi(lastDirName, child.name))
{
char p[MAX_LOCATION];
child.GetFullFilePath(p);
break;
}
}
- result = child.FindByFullPath(path, includeResources);
if(result)
break;
}
return result;
}
+ ProjectNode FindByObjectFileName(char * fileName, IntermediateFileType type, bool dotMain, Map<String, NameCollisionInfo> namesInfo)
+ {
+ char p[MAX_LOCATION];
+ ProjectNode result = null;
+ if(dotMain == true && this.type == project)
+ {
+ GetObjectFileName(p, namesInfo, type, dotMain);
+ if(!strcmpi(p, fileName))
+ result = this;
+ }
+ else if(files)
+ {
+ for(child : files; child.type != resources)
+ {
+ if(child.type != file && (result = child.FindByObjectFileName(fileName, type, dotMain, namesInfo)))
+ break;
+ else if(child.type == file && child.name)
+ {
+ child.GetObjectFileName(p, namesInfo, type, dotMain);
+ if(!strcmpi(p, fileName))
+ {
+ result = child;
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+
ProjectNode FindSpecial(char * name, bool recursive, bool includeResources, bool includeFolders)
{
ProjectNode result = null;
ProjectNode Add(Project project, char * filePath, ProjectNode after, NodeTypes type, NodeIcons icon, bool checkIfExists)
{
ProjectNode node = null;
- char temp[MAX_LOCATION];
- Map<Platform, SetBool> exclusionInfo { };
-
- GetLastDirectory(filePath, temp);
- //if(!checkIfExists || !project.topNode.Find(temp, false))
-
- // TOCHECK: Shouldn't this apply either for all configs or none?
- CollectExclusionInfo(exclusionInfo, project.config);
- if(!checkIfExists || !project.topNode.FindSameNameConflict(temp, false, exclusionInfo, project.config))
+ if(!project.topNode.FindByFullPath(filePath, true))
{
- // Do the check for folder in the same parent or resource files only here
- if(type == folder || !checkIfExists)
+ char temp[MAX_LOCATION];
+ Map<Platform, SetBool> exclusionInfo { };
+
+ GetLastDirectory(filePath, temp);
+ //if(!checkIfExists || !project.topNode.Find(temp, false))
+
+ // TOCHECK: Shouldn't this apply either for all configs or none?
+ CollectExclusionInfo(exclusionInfo, project.config);
+ if(!checkIfExists || type == folder || !project.topNode.FindSameNameConflict(temp, false, exclusionInfo, project.config))
{
- for(node : files)
+ // Do the check for folder in the same parent or resource files only here
+ if(type == folder || !checkIfExists)
{
- if(node.name && !strcmpi(node.name, temp))
- return null;
+ for(node : files)
+ {
+ if(node.name && !strcmpi(node.name, temp))
+ return null;
+ }
}
- }
- node = ProjectNode { parent = this, indent = indent + 1, type = type, icon = icon, name = CopyString(temp) };
- if(type != file)
- {
- node.files = { };
- node.nodeType = folder;
- }
- if(type != folder)
- {
- if(filePath)
+ node = ProjectNode { parent = this, indent = indent + 1, type = type, icon = icon, name = CopyString(temp) };
+ if(type != file)
{
- StripLastDirectory(filePath, temp);
- MakePathRelative(temp, project.topNode.path, temp);
- node.path = CopyUnixPath(temp);
+ node.files = { };
+ node.nodeType = folder;
}
- node.nodeType = file;
- }
- else
- {
- strcpy(temp, (type == NodeTypes::project) ? "" : path);
- PathCatSlash(temp, node.name);
- node.path = CopyString(temp);
+ if(type != folder)
+ {
+ if(filePath)
+ {
+ StripLastDirectory(filePath, temp);
+ MakePathRelative(temp, project.topNode.path, temp);
+ node.path = CopyUnixPath(temp);
+ }
+ node.nodeType = file;
+ }
+ else
+ {
+ strcpy(temp, (type == NodeTypes::project) ? "" : path);
+ PathCatSlash(temp, node.name);
+ node.path = CopyString(temp);
+ }
+ files.Insert(after, node);
}
- files.Insert(after, node);
+ delete exclusionInfo;
}
- delete exclusionInfo;
return node;
}
strcpy(tempPath, path);
PathCatSlash(tempPath, name);
}
- ReplaceSpaces(modulePath, tempPath);
+ EscapeForMake(modulePath, tempPath, false, true, false);
sprintf(s, "%s%s%s%s", ts.a, useRes ? "$(RES)" : "", modulePath, ts.b);
items.Add(CopyString(s));
}
!strcmpi(extension, "m") || !strcmpi(extension, "mm"))
{
char modulePath[MAX_LOCATION];
- ReplaceSpaces(modulePath, path);
- ReplaceSpaces(moduleName, name);
+ EscapeForMake(modulePath, path, false, true, false);
+ EscapeForMake(moduleName, name, false, true, false);
sprintf(s, "%s%s%s%s%s", ts.a, modulePath, path[0] ? SEPS : "", moduleName, ts.b);
items.Add(CopyString(s));
}
if(!strcmpi(extension, "ec"))
{
char modulePath[MAX_LOCATION];
- ReplaceUnwantedMakeChars(modulePath, path);
- ReplaceUnwantedMakeChars(moduleName, name);
+ EscapeForMake(modulePath, path, true, true, false);
+ EscapeForMake(moduleName, name, true, true, false);
sprintf(s, "%s%s%s%s%s", ts.a, modulePath, path[0] ? SEPS : "", moduleName, ts.b);
items.Add(CopyString(s));
count++;
if(!strcmpi(extension, "rc"))
{
char modulePath[MAX_LOCATION];
- ReplaceUnwantedMakeChars(modulePath, path);
- ReplaceUnwantedMakeChars(moduleName, name);
+ EscapeForMake(modulePath, path, false, true, false);
+ EscapeForMake(moduleName, name, false, true, false);
sprintf(s, "%s%s%s%s%s", ts.a, modulePath, path[0] ? SEPS : "", moduleName, ts.b);
items.Add(CopyString(s));
count++;
bool collision;
NameCollisionInfo info;
count++;
- ReplaceSpaces(moduleName, name);
+ EscapeForMake(moduleName, name, false, true, false);
StripExtension(moduleName);
info = namesInfo[moduleName];
collision = info ? info.IsExtensionColliding(extension) : false;
GenMakePrintNodeFlagsVariable(this, nodeCFlagsMapping, "PRJ_CFLAGS", f);
f.Printf(" -c %s%s.%s -o $@\n",
- modulePath, moduleName, extension, moduleName);
+ modulePath, moduleName, extension);
if(ifCount) f.Puts("endif\n");
f.Puts("\n");
#if 0
f.Puts(" $(FVISIBILITY)");
f.Printf(" -c %s%s.%s -o $@ -symbols $(OBJ)\n",
- modulePath, moduleName, extension, moduleName);
+ modulePath, moduleName, extension);
if(ifCount) f.Puts("endif\n");
f.Puts("\n");
}
if(!strcmpi(extension, "cc") || !strcmpi(extension, "cpp") || !strcmpi(extension, "cxx"))
f.Printf("\t$(CXX)");
else if(!strcmpi(extension, "rc"))
- f.Printf("\t$(GCC_PREFIX)windres $< $@\n"); //$(WINDRES) // TODO: implement CompilerConfig::windresCommand
+ f.Printf("\t$(WINDRES) $(WINDRES_FLAGS) $< $@\n");
else
f.Printf("\t$(CC)");
GenMakePrintNodeFlagsVariable(this, nodeCFlagsMapping, "PRJ_CFLAGS", f);
if(!strcmpi(extension, "ec"))
- f.Printf(" $(FVISIBILITY) -c $(OBJ)%s.c -o $@\n", moduleName, moduleName);
+ f.Printf(" $(FVISIBILITY) -c $(OBJ)%s.c -o $@\n", moduleName);
else
f.Printf(" -c %s%s.%s -o $@\n",
- modulePath, moduleName, !strcmpi(extension, "ec") ? "c" : extension, moduleName,
- collision ? "." : "", collision ? extension : "");
+ modulePath, moduleName, !strcmpi(extension, "ec") ? "c" : extension);
}
if(ifCount) f.Puts("endif\n");
f.Puts("\n");
char tempPath[MAX_LOCATION];
char resPath[MAX_LOCATION];
- char * quotes;
-
// $(EAR) aw%s --- /*quiet ? "q" : */""
if(count == 0)
f.Printf("\t%s$(EAR) aw$(EARFLAGS) $(TARGET)", ts.a);
strcpy(tempPath, child.path);
PathCatSlash(tempPath, child.name);
}
- ReplaceSpaces(resPath, tempPath);
- if(strchr(tempPath, ' '))
- quotes = "\"";
- else
- quotes = "";
- f.Printf(" %s%s%s%s", quotes, useRes ? "$(RES)" : "", tempPath, quotes);
+ EscapeForMake(resPath, tempPath, false, true, false);
+ f.Printf(" %s%s", useRes ? "$(RES)" : "", resPath);
count++;
}
if(count == 10 || (count > 0 && (ts || !child.next)))
void GetTargets(ProjectConfig prjConfig, Map<String, NameCollisionInfo> namesInfo, char * objDir, DynamicString output)
{
+ char moduleName[MAX_FILENAME];
if(type == file)
{
bool headerAltFailed = false;
bool collision;
char extension[MAX_EXTENSION];
- char moduleName[MAX_FILENAME];
NameCollisionInfo info;
Project prj = property::project;
Map<String, String> headerToSource { [ { "eh", "ec" }, { "h", "c" }, { "hh", "cc" }, { "hpp", "cpp" }, { "hxx", "cxx" } ] };
output.concat("\"");
}
}
+ else if(type == project && ContainsFilesWithExtension("ec"))
+ {
+ Project prj = property::project;
+
+ ReplaceSpaces(moduleName, prj.moduleName);
+ strcat(moduleName, ".main.ec");
+ output.concat(" \"");
+ output.concat(objDir);
+ output.concat("/");
+ output.concat(moduleName);
+ output.concat("\"");
+
+ ChangeExtension(moduleName, "c", moduleName);
+ output.concat(" \"");
+ output.concat(objDir);
+ output.concat("/");
+ output.concat(moduleName);
+ output.concat("\"");
+
+ ChangeExtension(moduleName, "o", moduleName);
+ output.concat(" \"");
+ output.concat(objDir);
+ output.concat("/");
+ output.concat(moduleName);
+ output.concat("\"");
+ }
else if(files)
{
for(child : files)
}
if(options && options.preprocessorDefinitions)
- ListOptionToDynamicString("D", options.preprocessorDefinitions, false, lineEach, "\t\t\t", false, s);
+ ListOptionToDynamicString(s, _D, options.preprocessorDefinitions, false, lineEach, "\t\t\t");
if(options && options.includeDirs)
- ListOptionToDynamicString("I", options.includeDirs, true, lineEach, "\t\t\t", true, s);
+ ListOptionToDynamicString(s, _I, options.includeDirs, true, lineEach, "\t\t\t");
}
static void GenECFlagsFromProjectOptions(ProjectOptions options, bool prjWithEcFiles, DynamicString s)
s.concatf(" -defaultns %s", options.defaultNameSpace);
}
-static void ListOptionToDynamicString(char * option, Array<String> list, bool prioritize,
- ListOutputMethod method, String newLineStart, bool noSpace, DynamicString s)
+static void ListOptionToDynamicString(DynamicString output, ToolchainFlag flag, Array<String> list, bool prioritize,
+ LineOutputMethod lineMethod, String newLineStart)
{
if(list.count)
{
- if(method == newLine)
+ if(lineMethod == newLine)
{
- s.concat(" \\\n");
- s.concat(newLineStart);
+ output.concat(" \\\n");
+ output.concat(newLineStart);
}
if(prioritize)
{
for(mn = sortedList.root.minimum; mn; mn = mn.next)
{
char * start = strstr(mn.key, "\n");
- if(method == lineEach)
+ if(lineMethod == lineEach)
{
- s.concat(" \\\n");
- s.concat(newLineStart);
+ output.concat(" \\\n");
+ output.concat(newLineStart);
}
- s.concat(" -");
- s.concat(option);
- if(noSpace)
- StringNoSpaceToDynamicString(s, start ? start+1 : mn.key);
- else
- s.concat(start ? start+1 : mn.key);
+ output.concat(" ");
+ output.concat(flagNames[flag]);
+ EscapeForMakeToDynString(output, start ? start+1 : mn.key, false, true, flag == _D);
}
delete sortedList;
}
{
for(item : list)
{
- if(method == lineEach)
+ if(lineMethod == lineEach)
{
- s.concat(" \\\n");
- s.concat(newLineStart);
+ output.concat(" \\\n");
+ output.concat(newLineStart);
}
- s.concat(" -");
- s.concat(option);
- if(noSpace)
- StringNoSpaceToDynamicString(s, item);
- else
- s.concat(item);
+ output.concat(" ");
+ output.concat(flagNames[flag]);
+ EscapeForMakeToDynString(output, item, false, true, flag == _D);
}
}
}