hotspot/src/share/tools/ProjectCreator/WinGammaPlatformVC6.java
changeset 13909 9b94bf4dcc0c
parent 13908 6fa036b39eb9
parent 13907 52873e4bbeaa
child 13911 e59cfb5f223b
equal deleted inserted replaced
13908:6fa036b39eb9 13909:9b94bf4dcc0c
     1 /*
       
     2  * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  *
       
    23  */
       
    24 
       
    25 import java.io.*;
       
    26 import java.util.*;
       
    27 
       
    28 public class WinGammaPlatformVC6 extends WinGammaPlatform {
       
    29     public void writeProjectFile(String projectFileName, String projectName,
       
    30                                  Vector allConfigs) throws IOException {
       
    31         Vector allConfigNames = new Vector();
       
    32 
       
    33         printWriter = new PrintWriter(new FileWriter(projectFileName));
       
    34         String cfg = ((BuildConfig)allConfigs.get(0)).get("Name");
       
    35 
       
    36         printWriter.println("# Microsoft Developer Studio Project File - Name=\"" + projectName + "\" - Package Owner=<4>");
       
    37         printWriter.println("# Microsoft Developer Studio Generated Build File, Format Version 6.00");
       
    38         printWriter.println("# ** DO NOT EDIT **");
       
    39         printWriter.println("");
       
    40         printWriter.println("# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102");
       
    41         printWriter.println("CFG=" + cfg);
       
    42         printWriter.println("");
       
    43 
       
    44         printWriter.println("!MESSAGE This is not a valid makefile. To build this project using NMAKE,");
       
    45         printWriter.println("!MESSAGE use the Export Makefile command and run");
       
    46         printWriter.println("!MESSAGE ");
       
    47         printWriter.println("!MESSAGE NMAKE /f \"" + projectName + ".mak\".");
       
    48         printWriter.println("!MESSAGE ");
       
    49         printWriter.println("!MESSAGE You can specify a configuration when running NMAKE");
       
    50         printWriter.println("!MESSAGE by defining the macro CFG on the command line. For example:");
       
    51         printWriter.println("!MESSAGE ");
       
    52         printWriter.println("!MESSAGE NMAKE /f \"" + projectName + ".mak\" CFG=\"" + cfg + "\"");
       
    53         printWriter.println("!MESSAGE ");
       
    54         printWriter.println("!MESSAGE Possible choices for configuration are:");
       
    55         printWriter.println("!MESSAGE ");
       
    56         for (Iterator i = allConfigs.iterator(); i.hasNext(); ) {
       
    57             String name = ((BuildConfig)i.next()).get("Name");
       
    58             printWriter.println("!MESSAGE \""+ name + "\" (based on \"Win32 (x86) Dynamic-Link Library\")");
       
    59             allConfigNames.add(name);
       
    60         }
       
    61         printWriter.println("!MESSAGE ");
       
    62         printWriter.println("");
       
    63 
       
    64         printWriter.println("# Begin Project");
       
    65         printWriter.println("# PROP AllowPerConfigDependencies 0");
       
    66         printWriter.println("# PROP Scc_ProjName \"\"");
       
    67         printWriter.println("# PROP Scc_LocalPath \"\"");
       
    68         printWriter.println("CPP=cl.exe");
       
    69         printWriter.println("MTL=midl.exe");
       
    70         printWriter.println("RSC=rc.exe");
       
    71 
       
    72 
       
    73         String keyword = "!IF";
       
    74         for (Iterator i = allConfigs.iterator(); i.hasNext(); ) {
       
    75             BuildConfig bcfg = (BuildConfig)i.next();
       
    76             printWriter.println(keyword + "  \"$(CFG)\" == \"" + bcfg.get("Name") + "\"");
       
    77             writeConfigHeader(bcfg);
       
    78             keyword = "!ELSEIF";
       
    79             if (!i.hasNext()) printWriter.println("!ENDIF");
       
    80         }
       
    81 
       
    82 
       
    83         TreeSet sortedFiles = sortFiles(computeAttributedFiles(allConfigs));
       
    84 
       
    85         printWriter.println("# Begin Target");
       
    86 
       
    87         for (Iterator i = allConfigs.iterator(); i.hasNext(); ) {
       
    88             printWriter.println("# Name \"" + ((BuildConfig)i.next()).get("Name") + "\"");
       
    89         }
       
    90         printWriter.println("# Begin Group \"Header Files\"");
       
    91         printWriter.println("# PROP Default_Filter \"h;hpp;hxx;hm;inl;fi;fd\"");
       
    92 
       
    93         Iterator i = sortedFiles.iterator();
       
    94 
       
    95         while (i.hasNext()) {
       
    96             FileInfo fi = (FileInfo)i.next();
       
    97 
       
    98             // skip sources
       
    99             if (!fi.isHeader()) {
       
   100                 continue;
       
   101             }
       
   102 
       
   103             printFile(fi, allConfigNames);
       
   104         }
       
   105         printWriter.println("# End Group");
       
   106         printWriter.println("");
       
   107 
       
   108         printWriter.println("# Begin Group \"Source Files\"");
       
   109         printWriter.println("# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90\"");
       
   110 
       
   111         i = sortedFiles.iterator();
       
   112         while (i.hasNext()) {
       
   113             FileInfo fi = (FileInfo)i.next();
       
   114 
       
   115             // skip headers
       
   116             if (fi.isHeader()) {
       
   117                 continue;
       
   118             }
       
   119 
       
   120             printFile(fi, allConfigNames);
       
   121         }
       
   122         printWriter.println("# End Group");
       
   123         printWriter.println("");
       
   124 
       
   125 
       
   126         printWriter.println("# Begin Group \"Resource Files\"");
       
   127         printWriter.println("# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe\"");
       
   128         printWriter.println("# End Group");
       
   129         printWriter.println("");
       
   130         printWriter.println("# End Target");
       
   131 
       
   132         printWriter.println("# End Project");
       
   133 
       
   134         printWriter.close();
       
   135     }
       
   136 
       
   137 
       
   138     void printFile(FileInfo fi, Vector allConfigNames) {
       
   139         printWriter.println("# Begin Source File");
       
   140         printWriter.println("");
       
   141         printWriter.println("SOURCE=\"" + fi.full + "\"");
       
   142         FileAttribute attr = fi.attr;
       
   143 
       
   144         if (attr.noPch) {
       
   145             printWriter.println("# SUBTRACT CPP /YX /Yc /Yu");
       
   146         }
       
   147 
       
   148         if (attr.pchRoot) {
       
   149             printWriter.println("# ADD CPP /Yc\"incls/_precompiled.incl\"");
       
   150         }
       
   151         if (attr.configs != null) {
       
   152             String keyword = "!IF";
       
   153             for (Iterator j=allConfigNames.iterator(); j.hasNext();) {
       
   154                 String cfg = (String)j.next();
       
   155                 if (!attr.configs.contains(cfg)) {
       
   156                     printWriter.println(keyword+" \"$(CFG)\" == \"" + cfg +"\"");
       
   157                     printWriter.println("# PROP BASE Exclude_From_Build 1");
       
   158                     printWriter.println("# PROP Exclude_From_Build 1");
       
   159                     keyword = "!ELSEIF";
       
   160                 }
       
   161             }
       
   162             printWriter.println("!ENDIF");
       
   163         }
       
   164 
       
   165         printWriter.println("# End Source File");
       
   166     }
       
   167 
       
   168     void writeConfigHeader(BuildConfig cfg) {
       
   169         printWriter.println("# Begin Special Build Tool");
       
   170         printWriter.println("SOURCE=\"$(InputPath)\"");
       
   171         printWriter.println("PreLink_Desc=" +  BuildConfig.getFieldString(null, "PrelinkDescription"));
       
   172         printWriter.println("PreLink_Cmds=" +
       
   173                             cfg.expandFormat(BuildConfig.getFieldString(null, "PrelinkCommand")));
       
   174         printWriter.println("# End Special Build Tool");
       
   175         printWriter.println("");
       
   176 
       
   177         for (Iterator i = cfg.getV("CompilerFlags").iterator(); i.hasNext(); ) {
       
   178             printWriter.println("# "+(String)i.next());
       
   179         }
       
   180 
       
   181 
       
   182         printWriter.println("LINK32=link.exe");
       
   183 
       
   184         for (Iterator i = cfg.getV("LinkerFlags").iterator(); i.hasNext(); ) {
       
   185             printWriter.println("# "+(String)i.next());
       
   186         }
       
   187 
       
   188         printWriter.println("ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32");
       
   189         printWriter.println("ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32");
       
   190         printWriter.println("ADD BASE RSC /l 0x409 /d \"_DEBUG\"");
       
   191         printWriter.println("ADD RSC /l 0x409 /d \"_DEBUG\"");
       
   192         printWriter.println("BSC32=bscmake.exe");
       
   193         printWriter.println("ADD BASE BSC32 /nologo");
       
   194         printWriter.println("ADD BSC32 /nologo");
       
   195         printWriter.println("");
       
   196     }
       
   197 
       
   198     protected String getProjectExt() {
       
   199         return ".dsp";
       
   200     }
       
   201 }
       
   202 
       
   203 
       
   204 class CompilerInterfaceVC6  extends CompilerInterface {
       
   205     Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) {
       
   206         Vector rv = new Vector();
       
   207 
       
   208         rv.add("PROP BASE Use_MFC 0");
       
   209         rv.add("PROP Use_MFC 0");
       
   210         rv.add("ADD CPP /nologo /MT /W3 /WX /GX /YX /Fr /FD /c");
       
   211         rv.add("PROP BASE Output_Dir \""+outDir+"\"");
       
   212         rv.add("PROP Output_Dir \""+outDir+"\"");
       
   213         rv.add("PROP BASE Intermediate_Dir \""+outDir+"\"");
       
   214         rv.add("PROP Intermediate_Dir \""+outDir+"\"");
       
   215         rv.add("PROP BASE Target_Dir \"\"");
       
   216         rv.add("PROP Target_Dir \"\"");
       
   217         rv.add("ADD BASE CPP "+Util.prefixed_join(" /I ", includes, true));
       
   218         rv.add("ADD CPP "+Util.prefixed_join(" /I ", includes, true));
       
   219         rv.add("ADD BASE CPP "+Util.prefixed_join(" /D ", defines, true));
       
   220         rv.add("ADD CPP "+Util.prefixed_join(" /D ", defines, true));
       
   221         rv.add("ADD CPP /Yu\"incls/_precompiled.incl\"");
       
   222 
       
   223         return rv;
       
   224     }
       
   225 
       
   226     Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
       
   227         Vector rv = new Vector();
       
   228 
       
   229         rv.add("PROP Ignore_Export_Lib 0");
       
   230         rv.add("ADD BASE CPP /MD");
       
   231         rv.add("ADD CPP /MD");
       
   232         rv.add("ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib " +
       
   233                "           advapi32.lib shell32.lib ole32.lib oleaut32.lib winmm.lib");
       
   234         String machine = "/machine:I386";
       
   235         if (platformName.equals("x64")) {
       
   236                 machine = "/machine:X64";
       
   237         }
       
   238         rv.add("ADD LINK32      /out:\""+outDll+"\" "+
       
   239                "                /nologo /subsystem:windows /machine:" + machine +
       
   240                "                /nologo /base:\"0x8000000\" /subsystem:windows /dll" +
       
   241                "                /export:JNI_GetDefaultJavaVMInitArgs /export:JNI_CreateJavaVM /export:JNI_GetCreatedJavaVMs "+
       
   242                "                /export:jio_snprintf /export:jio_printf /export:jio_fprintf /export:jio_vfprintf "+
       
   243                "                /export:jio_vsnprintf ");
       
   244         rv.add("SUBTRACT LINK32 /pdb:none /map");
       
   245 
       
   246         return rv;
       
   247     }
       
   248 
       
   249     Vector getDebugCompilerFlags(String opt) {
       
   250         Vector rv = new Vector();
       
   251 
       
   252         rv.add("ADD BASE CPP /Gm /Zi /O"+opt);
       
   253 
       
   254         return rv;
       
   255     }
       
   256 
       
   257     Vector getDebugLinkerFlags() {
       
   258         Vector rv = new Vector();
       
   259 
       
   260         rv.add("PROP BASE Use_Debug_Libraries 1");
       
   261         rv.add("PROP Use_Debug_Libraries 1");
       
   262         rv.add("ADD LINK32 /debug");
       
   263 
       
   264         return rv;
       
   265     }
       
   266 
       
   267     void getAdditionalNonKernelLinkerFlags(Vector rv) {}
       
   268 
       
   269     Vector getProductCompilerFlags() {
       
   270         Vector rv = new Vector();
       
   271 
       
   272         rv.add("ADD CPP /O"+getOptFlag());
       
   273 
       
   274         return rv;
       
   275     }
       
   276 
       
   277     Vector getProductLinkerFlags() {
       
   278         Vector rv = new Vector();
       
   279 
       
   280         rv.add("PROP BASE Use_Debug_Libraries 0");
       
   281         rv.add("PROP Use_Debug_Libraries 0");
       
   282 
       
   283         return rv;
       
   284     }
       
   285 
       
   286     String getOptFlag() {
       
   287         return "2";
       
   288     }
       
   289 
       
   290     String getNoOptFlag() {
       
   291         return "d";
       
   292     }
       
   293 
       
   294     String makeCfgName(String flavourBuild, String platform) {
       
   295         return "vm - "+ platform + " " + flavourBuild;
       
   296     }
       
   297 }