Skip to content

Commit a123422

Browse files
committed
Build: Express absolute include paths as relative to project dir
1 parent f0b3043 commit a123422

File tree

5 files changed

+57
-20
lines changed

5 files changed

+57
-20
lines changed

Libraries/Build/Build.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,14 +249,24 @@ SC::Result SC::Build::DefinitionCompiler::fillPathsList(StringView path, const V
249249
// Collects root paths to build a stat map
250250
SC::Result SC::Build::DefinitionCompiler::collectUniqueRootPaths(VectorMap<String, VectorSet<Project::File>>& paths)
251251
{
252-
String buffer;
252+
String buffer;
253+
SmallVector<StringView, 16> components;
253254
for (const Workspace& workspace : definition.workspaces)
254255
{
255256
for (const Project& project : workspace.projects)
256257
{
257258
for (const Project::File& file : project.files)
258259
{
259260
SC_TRY(buffer.assign(project.rootDirectory.view()));
261+
if (Path::isAbsolute(file.base.view(), Path::Type::AsNative))
262+
{
263+
Project::File absFile;
264+
absFile.operation = file.operation;
265+
SC_TRY(Path::normalize(file.base.view(), components, &absFile.base, Path::Type::AsPosix));
266+
SC_TRY(absFile.mask.assign(file.mask.view()));
267+
SC_TRY(paths.getOrCreate(absFile.base.view())->insert(absFile));
268+
continue;
269+
}
260270
if (file.base.view().isEmpty())
261271
{
262272
if (not file.mask.isEmpty())

Libraries/Build/Internal/BuildWriter.h

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,28 @@ struct SC::Build::WriterInternal
9999
return true;
100100
}
101101

102-
[[nodiscard]] static bool getPathsRelativeTo(StringView referenceDirectory,
103-
const DefinitionCompiler& definitionCompiler, const Project& project,
104-
Vector<RenderItem>& outputFiles)
102+
[[nodiscard]] static Result getPathsRelativeTo(StringView referenceDirectory,
103+
const DefinitionCompiler& definitionCompiler, const Project& project,
104+
Vector<RenderItem>& outputFiles)
105105
{
106-
String renderedFile;
106+
String renderedFile;
107+
Vector<StringView> components;
107108
for (const auto& file : project.files)
108109
{
109-
SC_TRY(Path::join(renderedFile, {project.rootDirectory.view(), file.base.view(), file.mask.view()},
110-
Path::Posix::SeparatorStringView(), true)); // skipEmpty == true
110+
if (Path::isAbsolute(file.base.view(), Path::AsNative))
111+
{
112+
SC_TRY(Path::normalize(file.base.view(), components, &renderedFile, Path::AsPosix));
113+
SC_TRY(Path::append(renderedFile, {file.mask.view()}, Path::AsPosix));
114+
}
115+
else
116+
{
117+
StringView paths[3];
118+
paths[0] = project.rootDirectory.view();
119+
paths[1] = file.base.view();
120+
paths[2] = file.mask.view();
121+
SC_TRY(
122+
Path::join(renderedFile, {paths}, Path::Posix::SeparatorStringView(), true)); // skipEmpty == true
123+
}
111124
const auto* res = definitionCompiler.resolvedPaths.get(renderedFile.view());
112125
if (res)
113126
{
@@ -156,12 +169,12 @@ struct SC::Build::WriterInternal
156169
}
157170
else
158171
{
159-
return false;
172+
return Result::Error("BuildWriter::getPathsRelativeTo - Cannot find path");
160173
}
161174
}
162175
Algorithms::bubbleSort(outputFiles.begin(), outputFiles.end(),
163176
[](const RenderItem& a1, const RenderItem& a2)
164177
{ return a1.path.view().compare(a2.path.view()) == StringView::Comparison::Smaller; });
165-
return true;
178+
return Result(true);
166179
}
167180
};

Libraries/Build/Internal/BuildWriterMakefile.inl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,12 @@ endif
203203
for (auto& it : *includesArray)
204204
{
205205
SC_TRY(builder.append(" \"-I"));
206-
if (Path::isAbsolute(it.view(), Path::AsPosix))
206+
if (Path::isAbsolute(it.view(), Path::AsNative))
207207
{
208-
builder.append(it.view());
208+
String relative;
209+
SC_TRY(Path::relativeFromTo(directories.projectsDirectory.view(), it.view(), relative,
210+
Path::AsNative));
211+
builder.append("$(CURDIR)/{}", relative);
209212
}
210213
else
211214
{

Libraries/Build/Internal/BuildWriterVisualStudio.inl

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -437,18 +437,18 @@ struct SC::Build::ProjectWriter::WriterVisualStudio
437437
return true;
438438
}
439439

440-
[[nodiscard]] bool prepare(const Project& project, Renderer& renderer)
440+
[[nodiscard]] Result prepare(const Project& project, Renderer& renderer)
441441
{
442442
renderer.renderItems.clear();
443443
SC_TRY(fillVisualStudioFiles(directories.projectsDirectory.view(), project, renderer.renderItems));
444-
return true;
444+
return Result(true);
445445
}
446446

447-
[[nodiscard]] bool fillVisualStudioFiles(StringView projectDirectory, const Project& project,
448-
Vector<RenderItem>& outputFiles)
447+
[[nodiscard]] Result fillVisualStudioFiles(StringView projectDirectory, const Project& project,
448+
Vector<RenderItem>& outputFiles)
449449
{
450450
SC_TRY(WriterInternal::getPathsRelativeTo(projectDirectory, definitionCompiler, project, outputFiles));
451-
return true;
451+
return Result(true);
452452
}
453453

454454
// Project
@@ -688,11 +688,19 @@ struct SC::Build::ProjectWriter::WriterVisualStudio
688688

689689
[[nodiscard]] bool appendProjectRelative(StringBuilder& builder, StringView text)
690690
{
691-
if (not Path::isAbsolute(text, Path::AsWindows) and not text.startsWith("$(PROJECT_DIR)"))
691+
if (Path::isAbsolute(text, Path::AsNative))
692+
{
693+
String relative;
694+
SC_TRY(Path::relativeFromTo(directories.projectsDirectory.view(), text, relative, Path::AsNative,
695+
Path::AsWindows));
696+
SC_TRY(builder.append("$(ProjectDir){}\\", relative));
697+
return true;
698+
}
699+
else
692700
{
693701
SC_TRY(builder.append("$(ProjectDir){}\\", relativeDirectories.relativeProjectsToProjectRoot));
702+
return appendVariable(builder, text);
694703
}
695-
return appendVariable(builder, text);
696704
}
697705

698706
[[nodiscard]] bool appendVariable(StringBuilder& builder, StringView text)

Libraries/Build/Internal/BuildWriterXCode.inl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,12 @@ struct SC::Build::ProjectWriter::WriterXCode
424424
for (auto it : *includes)
425425
{
426426
// TODO: Escape double quotes for include paths
427-
if (Path::isAbsolute(it.view(), Path::AsPosix))
427+
if (Path::isAbsolute(it.view(), Path::AsNative))
428428
{
429-
SC_TRY(builder.append("\n \"{}\",", it.view()));
429+
String relative;
430+
SC_TRY(Path::relativeFromTo(directories.projectsDirectory.view(), it.view(), relative,
431+
Path::AsNative));
432+
SC_TRY(builder.append("\n \"$(PROJECT_DIR)/{}\",", relative));
430433
}
431434
else
432435
{

0 commit comments

Comments
 (0)