/* * * * 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; /** Defines what must be specified for each platform. This class must have a no-arg constructor. */ import java.io.*; public abstract class Platform { // The next three must be instantiated in subclasses' constructors /** An incl file is produced per .c file and contains all the includes it needs */ protected FileName inclFileTemplate; /** A GI (grand-include) file has any file used more than N times for precompiled headers */ protected FileName giFileTemplate; /** A GD (grand-dependencies) file that tells Unix make all the .o's needed for linking and the include dependencies */ protected FileName gdFileTemplate; // Accessors public FileName getInclFileTemplate() { return inclFileTemplate; } public FileName getGIFileTemplate() { return giFileTemplate; } public FileName getGDFileTemplate() { return gdFileTemplate; } // an incl file is the file included by each.c file that includes // all needed header files public void setupFileTemplates() { String inclsDir = "incls" + fileSeparator(); inclFileTemplate = new FileName(this, inclsDir, "_", "", ".incl", "", ""); giFileTemplate = new FileName(this, inclsDir, "", "_precompiled", ".incl", "", ""); gdFileTemplate = new FileName(this, "", "", "Dependencies", "", "", ""); } public abstract String[] outerSuffixes(); public abstract String fileSeparator(); /** empty file name -> no grand include file */ public boolean haveGrandInclude() { return usePrecompiledHeader && (giFileTemplate.nameOfList().length() > 0); } public boolean writeDeps() { return (gdFileTemplate.nameOfList().length() > 0); } /** <p> A gi file is the grand-include file. It includes in one file any file that is included more than a certain number of times. </p> <p> It is used for precompiled header files. </p> <p> It has a source name, that is the file that this program generates, and a compiled name; that is the file that is included by other files. </p> <p> Some platforms have this program actually explicitly include the preprocessed gi file-- see includeGIInEachIncl(). </p> <p> Also, some platforms need a pragma in the GI file. </p> */ public boolean includeGIInEachIncl() { return false; } /** For some platforms, e.g. Solaris, include the grand-include dependencies in the makefile. For others, e.g. Windows, do not. */ public boolean includeGIDependencies() { return false; } /** Default implementation does nothing */ public void writeGIPragma(PrintWriter out) { } /** A line with a filename and the noGrandInclude string means that this file cannot use the precompiled header. */ public String noGrandInclude() { return "no_precompiled_headers"; } /** A line with a filename and the generatePlatformDependentInclude means that an include file for the header file must be generated. Does not effect the dependency computation. */ public String generatePlatformDependentInclude() { return "generate_platform_dependent_include"; } /** Prefix and suffix strings for emitting Makefile rules */ public abstract String objFileSuffix(); public abstract String asmFileSuffix(); public abstract String dependentPrefix(); // Exit routines: /** Abort means an internal error */ public void abort() { throw new RuntimeException("Internal error"); } /** fatalError is used by clients to stop the system */ public void fatalError(String msg) { System.err.println(msg); System.exit(1); } /** Default implementation performs case-sensitive comparison */ public boolean fileNameStringEquality(String s1, String s2) { return s1.equals(s2); } public void fileNamePortabilityCheck(String name) { // Empty for now } public void fileNamePortabilityCheck(String name, String matchingName) { if (!name.equals(matchingName)) { fatalError("Error: file " + name + " also appears as " + matchingName + ". Case must be consistent for " + "portability."); } } /** max is 31 on mac, so warn */ public int fileNameLengthLimit() { return 40; } public int defaultGrandIncludeThreshold() { return 30; } /** Not very general, but this is a way to get platform-specific files to be written. Default implementation does nothing. */ public void writePlatformSpecificFiles(Database previousDB, Database currentDB, String[] args) throws IllegalArgumentException, IOException { } /* A platform may use this to process the name of a file. E.g., Symbian * strips leading DOS drive names */ public String translateFileName(String name) { return name; } boolean usePrecompiledHeader = true; public void setUsePrecompiledHeader(boolean value) { usePrecompiledHeader = value; } boolean getUsePrecompiledHeader() { return usePrecompiledHeader; } }