1
|
1 |
/*
|
|
2 |
* Copyright 1999-2001 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
20 |
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
21 |
* have any questions.
|
|
22 |
*
|
|
23 |
*/
|
|
24 |
|
|
25 |
// This program reads an include file database.
|
|
26 |
// The database should cover each self .c and .h file,
|
|
27 |
// but not files in /usr/include
|
|
28 |
// The database consists of pairs of nonblank words, where the first word is
|
|
29 |
// the filename that needs to include the file named by the second word.
|
|
30 |
// For each .c file, this program generates a fooIncludes.h file that
|
|
31 |
// the .c file may include to include all the needed files in the right order.
|
|
32 |
// It also generates a foo.dep file to include in the makefile.
|
|
33 |
// Finally it detects cycles, and can work with two files, an old and a new one.
|
|
34 |
// To incrementally write out only needed files after a small change.
|
|
35 |
//
|
|
36 |
// Based on a suggestion by Roland Conybeare, algorithm suggested by Craig
|
|
37 |
// Chambers, written by David Ungar, 3/1/89.
|
|
38 |
// Added PREFIX, {DEP/INC}_DIR, smaller dep output 10/92 -Urs
|
|
39 |
|
|
40 |
// Add something for precompiled headers
|
|
41 |
|
|
42 |
// To handle different platforms, I am introducing a platform file.
|
|
43 |
// The platform file contains lines like:
|
|
44 |
// os = svr4
|
|
45 |
//
|
|
46 |
// Then, when processing the includeDB file, a token such as <os>
|
|
47 |
// gets replaced by svr4. -- dmu 3/25/97
|
|
48 |
|
|
49 |
// Modified to centralize Dependencies to speed up make -- dmu 5/97
|
|
50 |
|
|
51 |
public class MakeDeps {
|
|
52 |
|
|
53 |
public static void usage() {
|
|
54 |
System.out.println("usage:");
|
|
55 |
System.out.println("\tmakeDeps platform-name platform-file database-file [MakeDeps args] [platform args]");
|
|
56 |
System.out.println("\tmakeDeps diffs platform-name old-platform-file old-database-file new-platform-file new-database-file [MakeDeps args] [platform args]");
|
|
57 |
System.out.println("where platform-name is the name of a platform MakeDeps supports");
|
|
58 |
System.out.println("(currently \"WinGammaPlatform\" or \"UnixPlatform\")");
|
|
59 |
System.out.println("MakeDeps options:");
|
|
60 |
System.out.println(" -firstFile [filename]: Specify the first file in link order (i.e.,");
|
|
61 |
System.out.println(" to have a well-known function at the start of the output file)");
|
|
62 |
System.out.println(" -lastFile [filename]: Specify the last file in link order (i.e.,");
|
|
63 |
System.out.println(" to have a well-known function at the end of the output file)");
|
|
64 |
System.err.println("WinGammaPlatform platform-specific options:");
|
|
65 |
System.err.println(" -sourceBase <path to directory (workspace) " +
|
|
66 |
"containing source files; no trailing slash>");
|
|
67 |
System.err.println(" -dspFileName <full pathname to which .dsp file " +
|
|
68 |
"will be written; all parent directories must " +
|
|
69 |
"already exist>");
|
|
70 |
System.err.println(" -envVar <environment variable to be inserted " +
|
|
71 |
"into .dsp file, substituting for path given in " +
|
|
72 |
"-sourceBase. Example: HotSpotWorkSpace>");
|
|
73 |
System.err.println(" -dllLoc <path to directory in which to put " +
|
|
74 |
"jvm.dll and jvm_g.dll; no trailing slash>");
|
|
75 |
System.err.println(" If any of the above are specified, "+
|
|
76 |
"they must all be.");
|
|
77 |
System.err.println(" Additional, optional arguments, which can be " +
|
|
78 |
"specified multiple times:");
|
|
79 |
System.err.println(" -absoluteInclude <string containing absolute " +
|
|
80 |
"path to include directory>");
|
|
81 |
System.err.println(" -relativeInclude <string containing include " +
|
|
82 |
"directory relative to -envVar>");
|
|
83 |
System.err.println(" -define <preprocessor flag to be #defined " +
|
|
84 |
"(note: doesn't yet support " +
|
|
85 |
"#define (flag) (value))>");
|
|
86 |
System.err.println(" -perFileLine <file> <line>");
|
|
87 |
System.err.println(" -conditionalPerFileLine <file> <line for " +
|
|
88 |
"release build> <line for debug build>");
|
|
89 |
System.err.println(" (NOTE: To work around a bug in nmake, where " +
|
|
90 |
"you can't have a '#' character in a quoted " +
|
|
91 |
"string, all of the lines outputted have \"#\"" +
|
|
92 |
"prepended)");
|
|
93 |
System.err.println(" -startAt <subdir of sourceBase>");
|
|
94 |
System.err.println(" -ignoreFile <file which won't be able to be " +
|
|
95 |
"found in the sourceBase because it's generated " +
|
|
96 |
"later>");
|
|
97 |
System.err.println(" -additionalFile <file not in database but " +
|
|
98 |
"which should show up in .dsp file, like " +
|
|
99 |
"includeDB_core>");
|
|
100 |
System.err.println(" -additionalGeneratedFile <environment variable of " +
|
|
101 |
"generated file's location> <relative path to " +
|
|
102 |
"directory containing file; no trailing slash> " +
|
|
103 |
"<name of file generated later in the build process>");
|
|
104 |
System.err.println(" -prelink <build> <desc> <cmds>:");
|
|
105 |
System.err.println(" Generate a set of prelink commands for the given BUILD");
|
|
106 |
System.err.println(" (\"Debug\" or \"Release\"). The prelink description and commands");
|
|
107 |
System.err.println(" are both quoted strings.");
|
|
108 |
System.err.println(" Default includes: \".\"");
|
|
109 |
System.err.println(" Default defines: WIN32, _WINDOWS, \"HOTSPOT_BUILD_USER=$(USERNAME)\"");
|
|
110 |
}
|
|
111 |
|
|
112 |
public static void main(String[] args) {
|
|
113 |
try {
|
|
114 |
if (args.length < 3) {
|
|
115 |
usage();
|
|
116 |
System.exit(1);
|
|
117 |
}
|
|
118 |
|
|
119 |
int argc = 0;
|
|
120 |
boolean diffMode = false;
|
|
121 |
if (args[argc].equals("diffs")) {
|
|
122 |
diffMode = true;
|
|
123 |
++argc;
|
|
124 |
}
|
|
125 |
|
|
126 |
String platformName = args[argc++];
|
|
127 |
Class platformClass = Class.forName(platformName);
|
|
128 |
|
|
129 |
String plat1 = null;
|
|
130 |
String db1 = null;
|
|
131 |
String plat2 = null;
|
|
132 |
String db2 = null;
|
|
133 |
|
|
134 |
String firstFile = null;
|
|
135 |
String lastFile = null;
|
|
136 |
|
|
137 |
int numOptionalArgs =
|
|
138 |
(diffMode ? (args.length - 6) : (args.length - 3));
|
|
139 |
if (numOptionalArgs < 0) {
|
|
140 |
usage();
|
|
141 |
System.exit(1);
|
|
142 |
}
|
|
143 |
|
|
144 |
plat1 = args[argc++];
|
|
145 |
db1 = args[argc++];
|
|
146 |
|
|
147 |
if (diffMode) {
|
|
148 |
plat2 = args[argc++];
|
|
149 |
db2 = args[argc++];
|
|
150 |
}
|
|
151 |
|
|
152 |
// argc now points at start of optional arguments, if any
|
|
153 |
|
|
154 |
try {
|
|
155 |
boolean gotOne = true;
|
|
156 |
while (gotOne && (argc < args.length - 1)) {
|
|
157 |
gotOne = false;
|
|
158 |
String arg = args[argc];
|
|
159 |
if (arg.equals("-firstFile")) {
|
|
160 |
firstFile = args[argc + 1];
|
|
161 |
argc += 2;
|
|
162 |
gotOne = true;
|
|
163 |
} else if (arg.equals("-lastFile")) {
|
|
164 |
lastFile = args[argc + 1];
|
|
165 |
argc += 2;
|
|
166 |
gotOne = true;
|
|
167 |
}
|
|
168 |
}
|
|
169 |
}
|
|
170 |
catch (Exception e) {
|
|
171 |
e.printStackTrace();
|
|
172 |
usage();
|
|
173 |
System.exit(1);
|
|
174 |
}
|
|
175 |
|
|
176 |
Platform platform = (Platform) platformClass.newInstance();
|
|
177 |
platform.setupFileTemplates();
|
|
178 |
long t = platform.defaultGrandIncludeThreshold();
|
|
179 |
|
|
180 |
String[] platformArgs = null;
|
|
181 |
int numPlatformArgs = args.length - argc;
|
|
182 |
if (numPlatformArgs > 0) {
|
|
183 |
platformArgs = new String[numPlatformArgs];
|
|
184 |
int offset = argc;
|
|
185 |
while (argc < args.length) {
|
|
186 |
platformArgs[argc - offset] = args[argc];
|
|
187 |
++argc;
|
|
188 |
}
|
|
189 |
}
|
|
190 |
|
|
191 |
// If you want to change the threshold, change the default
|
|
192 |
// "grand include" threshold in Platform.java, or override
|
|
193 |
// it in the platform-specific file like UnixPlatform.java
|
|
194 |
|
|
195 |
Database previous = new Database(platform, t);
|
|
196 |
Database current = new Database(platform, t);
|
|
197 |
|
|
198 |
previous.canBeMissing();
|
|
199 |
|
|
200 |
if (firstFile != null) {
|
|
201 |
previous.setFirstFile(firstFile);
|
|
202 |
current.setFirstFile(firstFile);
|
|
203 |
}
|
|
204 |
if (lastFile != null) {
|
|
205 |
previous.setLastFile(lastFile);
|
|
206 |
current.setLastFile(lastFile);
|
|
207 |
}
|
|
208 |
|
|
209 |
if (diffMode) {
|
|
210 |
System.out.println("Old database:");
|
|
211 |
previous.get(plat1, db1);
|
|
212 |
previous.compute();
|
|
213 |
System.out.println("New database:");
|
|
214 |
current.get(plat2, db2);
|
|
215 |
current.compute();
|
|
216 |
System.out.println("Deltas:");
|
|
217 |
current.putDiffs(previous);
|
|
218 |
} else {
|
|
219 |
System.out.println("New database:");
|
|
220 |
current.get(plat1, db1);
|
|
221 |
current.compute();
|
|
222 |
current.put();
|
|
223 |
}
|
|
224 |
|
|
225 |
if (platformArgs != null) {
|
|
226 |
// Allow the platform to write platform-specific files
|
|
227 |
platform.writePlatformSpecificFiles(previous, current,
|
|
228 |
platformArgs);
|
|
229 |
}
|
|
230 |
}
|
|
231 |
catch (Exception e) {
|
|
232 |
e.printStackTrace();
|
|
233 |
System.exit(1);
|
|
234 |
}
|
|
235 |
}
|
|
236 |
}
|