/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program 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 program 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 at /legal/license.txt). * * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package makedep; // This program reads an include file database. // The database should cover each self .c and .h file, // but not files in /usr/include // The database consists of pairs of nonblank words, where the first word is // the filename that needs to include the file named by the second word. // For each .c file, this program generates a fooIncludes.h file that // the .c file may include to include all the needed files in the right order. // It also generates a foo.dep file to include in the makefile. // Finally it detects cycles, and can work with two files, an old and a new one. // To incrementally write out only needed files after a small change. // // Added PREFIX, {DEP/INC}_DIR, smaller dep output 10/92 -Urs // Add something for precompiled headers // To handle different platforms, I am introducing a platform file. // The platform file contains lines like: // os = svr4 // // Then, when processing the includeDB file, a token such as <os> // gets replaced by svr4. -- dmu 3/25/97 // Modified to centralize Dependencies to speed up make -- dmu 5/97 import java.util.*; import util.*; public class Main { static void usage() { System.out.print(usage_string); } static final String usage_string = "Usage:\n" + "makeDeps platform-name platform-file database-file [MakeDeps args]\n" + " [platform args]\n" + "\n" + "Supported values for platform-name: \n" + " WinGammaPlatform, WinCEGammaPlatform, UnixPlatform\n" + "\n" + "MakeDeps args:\n" + " -firstFile [filename]: Specify the first file in link order (i.e.,\n" + " to have a well-known function at the start of the output file)\n" + " -lastFile [filename]: Specify the last file in link order (i.e.,\n" + " to have a well-known function at the end of the output file)\n" + " -checkIncludeDB: Disable precompiled headers and/or source file merging\n" + " to check if includeDB has missing entries\n" ; public static void main(String[] args) throws Throwable { try { if (args.length < 3) { usage(); System.exit(1); } int argc = 0; String platformName = args[argc++]; Class platformClass = Class.forName("makedep." + platformName); String plat1 = null; String db1 = null; String plat2 = null; String db2 = null; String firstFile = null; String lastFile = null; boolean resolveVpath = false; int sourceMergerLimit = 0; boolean checkIncludeDB = false; String workspace = null; String genDir = null; Properties globalProps = new Properties(); getEnableFlags(globalProps); int numOptionalArgs = (args.length - 3); if (numOptionalArgs < 0) { usage(); System.exit(1); } plat1 = args[argc++]; db1 = args[argc++]; // argc now points at start of optional arguments, if any try { boolean gotOne = true; while (gotOne && (argc <= args.length - 1)) { String arg = args[argc]; if (arg.equals("-firstFile")) { firstFile = args[argc + 1]; argc += 2; } else if (arg.equals("-lastFile")) { lastFile = args[argc + 1]; argc += 2; } else if (arg.equals("-resolveVpath")) { resolveVpath = args[argc + 1].equals("true"); argc += 2; } else if (arg.equals("-checkIncludeDB")) { checkIncludeDB = true; argc += 1; } else if (arg.equals("-sourceMergerLimit")) { // Merge multiple .cpp files into a single .cpp file to speed // up GCC compilation. For more info, see // Database.createMergedOuterFiles() try { sourceMergerLimit = Integer.parseInt(args[argc + 1]); } catch (Throwable t) { System.err.println("invalid integer value \"" + args[argc + 1] + "\" for -sourceMergerLimit"); System.exit(-1); } argc += 2; } else if (arg.equals("-workspace")) { workspace = args[argc + 1]; argc += 2; } else if (arg.equals("-gendir")) { genDir = args[argc + 1]; argc += 2; } else if (arg.indexOf('=') != -1) { String propName = arg.substring(0, arg.indexOf('=')); String propValue = arg.substring(arg.indexOf('=') + 1); globalProps.setProperty(propName, propValue); argc++; } else { gotOne = false; } } } catch (Exception e) { e.printStackTrace(); usage(); System.exit(1); } Platform platform = (Platform) platformClass.newInstance(); if (checkIncludeDB) { System.out.println("\n***\n"); System.out.println("checking include DB -- precompiled headers/" + "merged sources disabled"); System.out.println("\n***"); platform.setUsePrecompiledHeader(false); } else { platform.setUsePrecompiledHeader(true); } platform.setupFileTemplates(); long t = platform.defaultGrandIncludeThreshold(); String[] platformArgs = null; int numPlatformArgs = args.length - argc; if (numPlatformArgs > 0) { platformArgs = new String[numPlatformArgs]; int offset = argc; while (argc < args.length) { platformArgs[argc - offset] = args[argc]; ++argc; } } // If you want to change the threshold, change the default // "grand include" threshold in Platform.java, or override // it in the platform-specific file like UnixPlatform.java Database previous = new Database(platform, t); Database current = new Database(platform, t); previous.canBeMissing(); if (firstFile != null) { previous.setFirstFile(firstFile); current.setFirstFile(firstFile); } if (lastFile != null) { previous.setLastFile(lastFile); current.setLastFile(lastFile); } previous.setResolveVpath(resolveVpath); current.setResolveVpath(resolveVpath); if (checkIncludeDB) { sourceMergerLimit = 0; } previous.setSourceMergerLimit(sourceMergerLimit); current.setSourceMergerLimit(sourceMergerLimit); if (workspace != null) { previous.setWorkspace(workspace); current.setWorkspace(workspace); } if (genDir != null) { previous.setGenDir(genDir); current.setGenDir(genDir); } if (resolveVpath) { if (workspace == null) { System.out.println("-resolveVpath is set but " + "-workspace is not set"); usage(); System.exit(1); } } current.get(plat1, db1, globalProps); current.compute(); current.put(); if (platformArgs != null) { // Allow the platform to write platform-specific files platform.writePlatformSpecificFiles(previous, current, platformArgs); } } catch (Exception e) { e.printStackTrace(); } } static void getEnableFlags(Properties globalProps) throws Throwable { Hashtable env = Util.getenv(); boolean verbose = (env.get("VERBOSE") != null); for (Enumeration e = env.keys(); e.hasMoreElements() ;) { String key = (String)e.nextElement(); if (key.startsWith("ENABLE_") && !key.endsWith("__BY")) { String propName = key; String propValue = (String)env.get(key); globalProps.setProperty(propName, propValue); if (verbose) { System.out.println(propName + " = " + propValue); } } } } }