13892
|
1 |
import static java.nio.file.FileVisitResult.CONTINUE;
|
|
2 |
|
|
3 |
import java.io.IOException;
|
|
4 |
import java.nio.file.FileSystems;
|
|
5 |
import java.nio.file.FileVisitResult;
|
|
6 |
import java.nio.file.Files;
|
|
7 |
import java.nio.file.Path;
|
|
8 |
import java.nio.file.attribute.BasicFileAttributes;
|
|
9 |
import java.util.Stack;
|
|
10 |
import java.util.Vector;
|
|
11 |
|
|
12 |
public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|
13 |
|
|
14 |
public FileTreeCreatorVC10(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatformVC10 wg) {
|
|
15 |
super(startDir, allConfigs, wg);
|
|
16 |
}
|
|
17 |
|
|
18 |
@Override
|
|
19 |
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
|
|
20 |
DirAttributes currentFileAttr = attributes.peek().clone();
|
|
21 |
boolean usePch = false;
|
|
22 |
boolean disablePch = false;
|
|
23 |
boolean useIgnore = false;
|
|
24 |
String fileName = file.getFileName().toString();
|
|
25 |
|
|
26 |
// TODO hideFile
|
|
27 |
|
|
28 |
// usePch applies to all configs for a file.
|
|
29 |
if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) {
|
|
30 |
usePch = true;
|
|
31 |
}
|
|
32 |
|
|
33 |
for (BuildConfig cfg : allConfigs) {
|
|
34 |
if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
|
|
35 |
useIgnore = true;
|
|
36 |
currentFileAttr.setIgnore(cfg);
|
|
37 |
} else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) {
|
|
38 |
useIgnore = true;
|
|
39 |
currentFileAttr.setIgnore(cfg);
|
|
40 |
}
|
|
41 |
|
|
42 |
if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) {
|
|
43 |
disablePch = true;
|
|
44 |
currentFileAttr.setDisablePch(cfg);
|
|
45 |
}
|
|
46 |
|
|
47 |
Vector<String> rv = new Vector<String>();
|
|
48 |
cfg.collectRelevantVectors(rv, "AdditionalFile");
|
|
49 |
for(String addFile : rv) {
|
|
50 |
if (addFile.equals(fileName)) {
|
|
51 |
// supress any ignore
|
|
52 |
// TODO - may need some adjustments
|
|
53 |
if (file.toAbsolutePath().toString().contains(cfg.get("Flavour"))) {
|
|
54 |
currentFileAttr.removeFromIgnored(cfg);
|
|
55 |
}
|
|
56 |
}
|
|
57 |
}
|
|
58 |
}
|
|
59 |
|
|
60 |
String tagName = wg.getFileTagFromSuffix(fileName);
|
|
61 |
String fileLoc = vcProjLocation.relativize(file).toString();
|
|
62 |
|
|
63 |
if (!useIgnore && !disablePch && !usePch) {
|
|
64 |
wg.tag(tagName, new String[] { "Include", fileLoc});
|
|
65 |
} else {
|
|
66 |
wg.startTag(
|
|
67 |
tagName,
|
|
68 |
new String[] { "Include", fileLoc});
|
|
69 |
|
|
70 |
for (BuildConfig cfg : allConfigs) {
|
|
71 |
boolean ignore = currentFileAttr.hasIgnore(cfg);
|
|
72 |
if (ignore) {
|
|
73 |
wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
|
|
74 |
}
|
|
75 |
if (usePch) {
|
|
76 |
wg.tagData("PrecompiledHeader", "Create", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
|
|
77 |
}
|
|
78 |
if (disablePch) {
|
|
79 |
wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
|
|
80 |
}
|
|
81 |
}
|
|
82 |
wg.endTag();
|
|
83 |
}
|
|
84 |
|
|
85 |
String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
|
|
86 |
wg.addFilterDependency(fileLoc, filter);
|
|
87 |
|
|
88 |
return CONTINUE;
|
|
89 |
}
|
|
90 |
|
|
91 |
@Override
|
|
92 |
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
|
|
93 |
throws IOException {
|
|
94 |
Boolean hide = false;
|
|
95 |
// TODO remove attrs, if path is matched in this dir, then it is too in every subdir.
|
|
96 |
// And we will check anyway
|
|
97 |
DirAttributes newAttr = attributes.peek().clone();
|
|
98 |
|
|
99 |
// check per config ignorePaths!
|
|
100 |
for (BuildConfig cfg : allConfigs) {
|
|
101 |
if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) {
|
|
102 |
newAttr.setIgnore(cfg);
|
|
103 |
}
|
|
104 |
|
|
105 |
// Hide is always on all configs. And additional files are never hiddden
|
|
106 |
if (cfg.matchesHidePath(path.toAbsolutePath().toString())) {
|
|
107 |
hide = true;
|
|
108 |
break;
|
|
109 |
}
|
|
110 |
}
|
|
111 |
|
|
112 |
if (!hide) {
|
|
113 |
String name = startDir.relativize(path.toAbsolutePath()).toString();
|
|
114 |
if (!"".equals(name)) {
|
|
115 |
wg.addFilter(name);
|
|
116 |
}
|
|
117 |
|
|
118 |
attributes.push(newAttr);
|
|
119 |
return super.preVisitDirectory(path, attrs);
|
|
120 |
} else {
|
|
121 |
return FileVisitResult.SKIP_SUBTREE;
|
|
122 |
}
|
|
123 |
}
|
|
124 |
|
|
125 |
@Override
|
|
126 |
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
|
|
127 |
//end matching attributes set by ignorepath
|
|
128 |
attributes.pop();
|
|
129 |
return CONTINUE;
|
|
130 |
}
|
|
131 |
|
|
132 |
@Override
|
|
133 |
public FileVisitResult visitFileFailed(Path file, IOException exc) {
|
|
134 |
return CONTINUE;
|
|
135 |
}
|
|
136 |
|
|
137 |
public void writeFileTree() throws IOException {
|
|
138 |
Files.walkFileTree(this.startDir, this);
|
|
139 |
}
|
|
140 |
|
|
141 |
|
|
142 |
} |