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