/* * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ package build.tools.projectcreator; import static java.nio.file.FileVisitResult.CONTINUE; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.Stack; import java.util.Vector; public class FileTreeCreatorVC10 extends FileTreeCreator { public FileTreeCreatorVC10(Path startDir, Vector allConfigs, WinGammaPlatformVC10 wg) { super(startDir, allConfigs, wg); } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { DirAttributes currentFileAttr = attributes.peek().clone(); boolean usePch = false; boolean disablePch = false; boolean useIgnore = false; boolean isAltSrc = false; // only needed as a debugging crumb boolean isReplacedByAltSrc = false; String fileName = file.getFileName().toString(); // TODO hideFile // usePch applies to all configs for a file. if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) { usePch = true; } String fileLoc = vcProjLocation.relativize(file).toString(); // isAltSrc and isReplacedByAltSrc applies to all configs for a file if (BuildConfig.matchesRelativeAltSrcInclude( file.toAbsolutePath().toString())) { // current file is an alternate source file so track it isAltSrc = true; BuildConfig.trackRelativeAltSrcFile( file.toAbsolutePath().toString()); } else if (BuildConfig.matchesRelativeAltSrcFile( file.toAbsolutePath().toString())) { // current file is a regular file that matches an alternate // source file so yack about replacing the regular file isReplacedByAltSrc = true; System.out.println("INFO: alternate source file '" + BuildConfig.getMatchingRelativeAltSrcFile( file.toAbsolutePath().toString()) + "' replaces '" + fileLoc + "'"); } for (BuildConfig cfg : allConfigs) { if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) { useIgnore = true; currentFileAttr.setIgnore(cfg); } else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) { useIgnore = true; currentFileAttr.setIgnore(cfg); } if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) { disablePch = true; currentFileAttr.setDisablePch(cfg); } Vector rv = new Vector(); cfg.collectRelevantVectors(rv, "AdditionalFile"); for(String addFile : rv) { if (addFile.equals(fileName)) { // supress any ignore // TODO - may need some adjustments if (file.toAbsolutePath().toString().contains(cfg.get("Flavour"))) { currentFileAttr.removeFromIgnored(cfg); } } } } String tagName = wg10.getFileTagFromSuffix(fileName); if (!useIgnore && !disablePch && !usePch && !isReplacedByAltSrc) { wg.tag(tagName, new String[] { "Include", fileLoc}); } else { wg.startTag( tagName, new String[] { "Include", fileLoc}); for (BuildConfig cfg : allConfigs) { boolean ignore = currentFileAttr.hasIgnore(cfg); if (ignore) { wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'"); } if (usePch) { wg.tagData("PrecompiledHeader", "Create", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'"); } if (disablePch) { wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'"); } if (isReplacedByAltSrc) { wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'"); } } wg.endTag(); } String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString(); wg10.addFilterDependency(fileLoc, filter); return CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs) throws IOException { Boolean hide = false; // TODO remove attrs, if path is matched in this dir, then it is too in every subdir. // And we will check anyway DirAttributes newAttr = attributes.peek().clone(); // check per config ignorePaths! for (BuildConfig cfg : allConfigs) { if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) { newAttr.setIgnore(cfg); } // Hide is always on all configs. And additional files are never hiddden if (cfg.matchesHidePath(path.toAbsolutePath().toString())) { hide = true; break; } } if (!hide) { String name = startDir.relativize(path.toAbsolutePath()).toString(); if (!"".equals(name)) { wg10.addFilter(name); } attributes.push(newAttr); return super.preVisitDirectory(path, attrs); } else { return FileVisitResult.SKIP_SUBTREE; } } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) { //end matching attributes set by ignorepath attributes.pop(); return CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) { return CONTINUE; } public void writeFileTree() throws IOException { Files.walkFileTree(this.startDir, this); } }