1 /*
   2  * Copyright (c) 2005, 2010, 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 }